[RDS] Oracle Database の監査ログを定期的にS3に保存する
こんにちは、菊池です。
今回はタイトルの通りです。RDS Oracle では、パラーメータグループでaudit_trail
をOS
またはXML
と指定することで、標準監査の監査ファイルが保存されます。オンプレミスやEC2にOracle Databaseをインストールして実行する場合には、適時、このファイルを保存・参照可能ですが、RDSではOS上のファイルに直接することができません。RDSの場合、マネジメントコンソール、またはAPIを利用してダウンロードすることが可能です。
この監査ファイルですが、公式ドキュメントによると7日間は保存されますが、それ以上は削除される可能性があります。
そのため、運用要件上、長期間の保存が必要な場合には、ダウンロードして外部に保存しておく必要があります。
やってみた
という訳で実際にやってみます。
Lambda関数を毎時実行し、RDSのAPIからログを取得、S3に保存します。
Lambda関数の作成
Python 2.7で以下のコードを作成しました。
import boto3 import datetime import time import json import os BUCKET_NAME = os.environ["BUCKET_NAME"] rds = boto3.client('rds') s3 = boto3.resource('s3') def lambda_handler(event,context): DB_NAME = event['DB_INSTANCE_NAME'] LOG_TYPE = event['DB_LOG_TYPE'] BUCKET_PLEFIX = DB_NAME + "/" + datetime.datetime.now().strftime('%Y-%m-%d') + "/" + datetime.datetime.now().strftime('%H') + "/" SINCE = datetime.datetime.now().replace(minute=0,second=0,microsecond=0) - datetime.timedelta(hours=1) SINCE_U = int(time.mktime(SINCE.timetuple())) * 1000 #指定時間以降のログファイル一覧を取得 loglist = rds.describe_db_log_files( DBInstanceIdentifier = DB_NAME, FilenameContains = LOG_TYPE, FileLastWritten = SINCE_U ) #対象のログファイルを取得しS3に保存 for logs in loglist["DescribeDBLogFiles"]: LOGFILE_NAME = logs["LogFileName"] log = rds.download_db_log_file_portion( DBInstanceIdentifier = DB_NAME, LogFileName = LOGFILE_NAME ) OBJECT_KEY = BUCKET_PLEFIX + LOGFILE_NAME obj = s3.Object(BUCKET_NAME,OBJECT_KEY) r = obj.put(Body = json.dumps(log))
実行された時刻の分秒を切り捨てた1時間前以降に出力されたログを保存します。例えば、17:15に実行された場合には、最終書き込みが16:00以降のログを保存します。
環境変数で、保存先のS3バケットを指定します。
また、実行する関数のIAMロールには、RDSの読み取りとS3バケットへの書き込み権限を付与しておきます。
CloudWatch Eventsの作成
CloudWatch Eventsで毎時実行させるイベントを作成します。
毎時01分に実行させるよう、Cron式で1 * * * ? *
を指定します。イベントの入力には、対象のRDSインスタンスの識別子(名前)と対象のログ種別(今回はaudit)を指定します。
{ "DB_INSTANCE_NAME" : "test", "DB_LOG_TYPE" : "audit" }
実行結果
実行結果です。指定したS3にコピーされた監査ファイルが保存されています。(バケット)/ (RDSインスタンス名)/YYYY-MM-DD/HH/audit/にログが保存されます。
まとめ
以上です。auditの部分をtraceなどに変更することで、他のログにも適用は可能かもしれません。
ただし、実際の環境に適用する場合、ワークロードによっては大量の監査ファイルが出力されるため、1時間に1回の実行では実行時間が長くなり、Lamdbaでの実行が適さないこともあります。運用環境に適用するにあたっては、ログファイルの量のモニタリングや、実行頻度の調整を検討ください。