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のログが出力されていますが、これは接続と切断のログのようです。
さいごに
確認する必要のないログが大量に出力されていると邪魔になるので極力不要なものは出力しないようにするのがよいと思います。