RDS MySQLの監査ログでrdsadminのログを出力しないように設定してみた

2023.08.23

RDS MySQLで監査ログを出力する機会があったのですが、rdsadminユーザーのログが大量に出力されて邪魔だったので出力しないように設定してみました。

リソース作成

ブログの検証用のため以下の構成図の通りシングルAZで一台RDSを作成します。

作成には以下のCloudFormationテンプレートを使用しました。

CloudFormationテンプレート (ここをクリックしてください)
AWSTemplateFormatVersion: "2010-09-09"

Description: RDS Stack

Parameters:
# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------# 
  RdsInstanceClass:
    Default: db.t2.micro
    Type: String

  RdsStorageSize:
    Default: 20
    Type: Number

  RdsSubnet1:
    Type: AWS::EC2::Subnet::Id

  RdsSubnet2:
    Type: AWS::EC2::Subnet::Id

  RdsVpcId:
    Type: AWS::EC2::VPC::Id

Resources:
# ------------------------------------------------------------#
# RDS
# ------------------------------------------------------------# 
  RdsSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: rds-subnet-group
      DBSubnetGroupName: rds-subnet-group
      SubnetIds: 
        - !Ref RdsSubnet1
        - !Ref RdsSubnet2
      Tags:
        - Key: Name
          Value: rds-subnet-group

  RdsOptionGroup:
    Type: AWS::RDS::OptionGroup
    Properties:
      EngineName: mysql
      MajorEngineVersion: 8.0
      OptionConfigurations:
        - OptionName: MARIADB_AUDIT_PLUGIN
      OptionGroupDescription: rds-option-group
      OptionGroupName: rds-option-group

  Rdssg:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: for RDS
      GroupName: rds-sg
      SecurityGroupEgress: 
        - CidrIp: 0.0.0.0/0
          FromPort: -1
          IpProtocol: -1
          ToPort: -1
      SecurityGroupIngress:
        - FromPort: 3306
          IpProtocol: tcp
          CidrIp: 0.0.0.0/0
          ToPort: 3306
      Tags: 
        - Key: Name
          Value: rds-sg
      VpcId: !Ref RdsVpcId

  Password:
    Type: AWS::SecretsManager::Secret
    Properties: 
      Description: RDS Password
      GenerateSecretString:
        GenerateStringKey: password
        SecretStringTemplate: '{"username": "root"}'
        ExcludeCharacters: '"@/\'
      Name: rdspassword

  Rds:
    Type: AWS::RDS::DBInstance
    Properties:
      AllocatedStorage: !Ref RdsStorageSize
      BackupRetentionPeriod: 0
      DBInstanceClass: !Ref RdsInstanceClass
      DBInstanceIdentifier: rds
      DBSubnetGroupName: !Ref RdsSubnetGroup
      EnablePerformanceInsights: false
      Engine: mysql
      EngineVersion: 8.0.28
      EnableCloudwatchLogsExports:
        - audit
      MasterUsername: !Sub '{{resolve:secretsmanager:${Password}::username}}'
      MasterUserPassword: !Sub '{{resolve:secretsmanager:${Password}::password}}'
      OptionGroupName: !Ref RdsOptionGroup
      Port: 3306
      StorageType: gp2
      Tags: 
        - Key: Name
          Value: rds
      VPCSecurityGroups: 
        - !Ref Rdssg

上記のCloudFormationテンプレートをデプロイするとRDS MySQLインスタンスが1台作成されます。
サブネットやVPCは既存のものを使用しているため、デプロイ前に作成を行っておいてください。
また、監査ログ出力が有効になった状態でデプロイされるので、リソース作成後にCloudWatch Logsを確認すると出力されていることが確認できます。
デプロイは以下のコマンドで行いました。

aws cloudformation create-stack --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名 --parameters ParameterKey=RdsSubnet1,ParameterValue=サブネットグループに使用するサブネットのID ParameterKey=RdsSubnet2,ParameterValue=サブネットグループに使用するサブネットのID ParameterKey=RdsVpcId,ParameterValue=セキュリティグループに使用するVPC ID

デプロイ完了後にCloudWatch Logsを確認するとrdsadminのログが大量に出力されていることが確認できます。

rdsadminのログを出力させないようにする

MySQL の MariaDB 監査プラグインのサポート
上記のドキュメントを読むと「SERVER_AUDIT_EXCL_USERS」というオプションにrdsadminを追加することで停止できると記載されているのでCloudFormationテンプレートに追加してみました。
オプショングループの部分を以下のように修正してください。

  RdsOptionGroup:
    Type: AWS::RDS::OptionGroup
    Properties:
      EngineName: mysql
      MajorEngineVersion: 8.0
      OptionConfigurations:
        - OptionName: MARIADB_AUDIT_PLUGIN
          OptionSettings:
            - Name: SERVER_AUDIT_EXCL_USERS
              Value: rdsadmin
      OptionGroupDescription: rds-option-group
      OptionGroupName: rds-option-group

CloudFormationテンプレート修正後以下のコマンドでデプロイを行います。

aws cloudformation deploy --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名

デプロイ後、CloudWatch Logsを確認するとrdsadminのログが停止していることが分かります。
私の場合は23:53にCloudFormationの更新が完了したので、それ以降に出ていないことを確認します。

確認にはCloudWatch Logs Insightを使用しました。
以下のクエリを実行します。

filter @message like /rdsadmin/
| fields @timestamp, @message

実行すると以下のようにグラフで確認ができます。
23:53以降もrdsadminのログが出力されていますが、これは接続と切断のログのようです。

さいごに

確認する必要のないログが大量に出力されていると邪魔になるので極力不要なものは出力しないようにするのがよいと思います。