大柳です。
前回はLinuxのauditd機能とAWSのCloudWatch Logsを利用してファイル監査の仕組みを作ることができましたが、ログにユーザ名が出なかったり、タイムスタンプがUnix時間だったりと課題がありました。
前回記事:EC2でファイル監査を設定する(CloudWatch Logs設定編)
今回はさらにfluentdも組み合わせて、この課題を解消したいと思います。
ゴール
auditログをfluentdで取り込んで、タイムスタンプとユーザ名をPythonスクリプトで追加した後、CloudWatch Logsに出力させます。
やりたいことのイメージは以下のようなものです。
fluentdの導入
fluentdをインスタンスに導入します。
公式ワンライナーからインストール可能です。
1 |
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh |
fluentdとCloudWatch Logsを連携させるためのプラグインfluent-plugin-cloudwatch-logsも導入します。
1 |
sudo /opt/td-agent/embedded/bin/gem install fluent-plugin-cloudwatch-logs --no-ri --no-rdoc |
fluentdは以下のコマンドで起動します。
1 2 |
$ sudo /etc/init.d/td-agent start Starting td-agent: [ OK ] |
Statusオプションを付けることで、稼働していることが確認できます。
1 2 |
$ sudo /etc/init.d/td-agent status td-agent (pid 21678) is running... |
fluentdの設定
fluentdの設定ファイルに以下の修正を行います。
実行ユーザのrootへの変更はauditログを読み込むために必要です。今回はrootとしていますがセキュリティ要件に応じてここは変えてください。
1 2 3 4 5 6 7 |
$ sudo vi /etc/init.d/td-agent #リージョン指定を追加 export AWS_REGION=ap-northeast-1 #実行ユーザの変更(デフォルトはtd-agent) TD_AGENT_USER=root |
fluentdのログ操作設定
まずはaudit.logをそのままCloudWatch Logsに転送する設定を行ってみます。
td-agent.confに以下の設定を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sudo vi /etc/td-agent/td-agent.conf <source> type tail path /var/log/audit/audit.log pos_file /var/log/td-agent/audit.log.pos tag audit_log format none </source> <match audit_log> type cloudwatch_logs log_group_name DevServer/audit/audit_log log_stream_name fluentd_audit_log auto_create_stream true </match> |
sourceブロック内のtype tail指定はログへの出力内容を随時入力させる設定です。
pathで監視対象のログファイルを、tagでこのルールに対する名前を設定しています。
フォーマット変更は行わないため、format none指定としています。
matchブロック内ではaudit_logタグのついたものに対して、type cloudwatch_logsでCloudWatch Logsに連携させるようにしています。log_group_name、log_stream_nameでロググループ名、ログストリーム名を指定しています。
CloudWatch Logsへのログ出力確認
監査対象の操作を行ってから、CloudWatch Logsを確認すると、ログストリームが追加され、ログが連携されていることが確認できます。
なお、fluentd内部でメッセージはJSON形式で扱われるため、format none指定の場合でも{“message”:”メッセージ本文”}のJSON形式に変換されてCloudWatch Logsに出力されます。
まとめ
auditログをfluentd経由でCloudWatch Logsに連携できることが確認できました。
次回記事ではexec_filter Output Pluginを使ってログを加工してCloudWatch Logsに連携してみます。
次回もお楽しみに。