[Oracle 初心者向け] 監査ログを CloudWatch Logs に出力する設定だけでは ログインの成功・失敗のログは取得できなかった…

みなさま Xin chao !

 

以下のブログで紹介されている通り、少し前のアップデートで RDS for Oracle が CloudWatch Logs へのログ出力をサポートしました。

[新機能] RDS for Oracle が CloudWatch Logs へのログ出力をサポートしました

Oracle 初心者である自分もこのアップデートのことを知っていたので、監査ログを使って RDS for Oracle へのログイン成功・失敗のログ取得し、ログを長期保管するために試してみました。

Oracle に (特に監査に) 詳しい方にとっては、ごく当たり前のことなのかもしれませんが、この設定だけでは RDS for Oracle へのログイン成功・失敗のログは取得できておらず、Oracle 側の設定も必要でした。 自分への備忘録として、そして、自分と同じように Oracle に詳しくない状態で悩まれている方のために、ログイン成功・失敗のログを取得するまでの設定を書き残しておこうと思います。

RDS for Oracle へのログイン成功・失敗ログを取得してみた

今回使用した RDS for Oracle インスタンスは、以下の通りです。

エディション Oracle Standard Edition Two
バージョン Oracle 12.2.0.1.ru-2019-04.rur-2019-04.r1

CloudWatch Logs へのログ出力設定

以下のブログを参考に、設定します。 今回長期保管したいのは、RDS for Oracle へのログイン成功・失敗のログなので、監査ログのみ CloudWatch Logs に出力するよう設定します。

[新機能] RDS for Oracle が CloudWatch Logs へのログ出力をサポートしました

 

設定が完了し少し待つと、CloudWatch Logs に監査ログが出力されてきます。

 

ログイン成功のログを記録するために、RDS for Oracle に sqlplus でログインします。 今回起動したインスタンスは、以下の通りとなっています。

マスターユーザー名 MASTER_USER
パスワード masterPassword
RDS エンドポイント, ポート oracle-audit-test.xxxxxxxxxxxx.xxxxxxxxxx.rds.amazonaws.com, 1521
データベース名 DB01
 sqlplus.exe MASTER_USER/masterPassword@"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-audit-test.xxxxxxxxxxxx.xxxxxxxxxx.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=DB01)))"

 

これで監査ログに、ログインしたことが記録されることを期待していました・・・。 しかし、いくら待っても CloudWatch Logs に出力されません。

RDS for Oracle のログを確認したところ、そもそも論として新しい監査ログが記録されていません。

 

これでは、CloudWatch Logs にも監査ログは出力されません。 まずは、RDS for Oracle で監査ログが正しく記録されている必要があります。

Oracle の監査設定

Oracle に詳しい社内の人間に訊いたり、いくつかのドキュメントを読む中で、Oracle 側の設定も必要であることが分かりました。

まず、RDS のパラメータグループで以下の設定を行います。 監査ログを OS ファイルとして出力する設定になります。

audit_trail (未設定) → OS に変更

 

パラメータグループを保存すると、RDS for Oracle に反映されますが、設定内容を適用するには RDS インスタンスの再起動が必要です

 

RDS インスタンスの再起動後、sqlplus でログインし、監査の設定状況を確認すると、何も設定されていないことが分かります。

sqlplus.exe MASTER_USER/masterPassword@"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-audit-test.xxxxxxxxxxxx.xxxxxxxxxx.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=DB01)))"

SQL> select * from dba_stmt_audit_opts;

 

全てのユーザーに対して、セッションの監査を有効化します。

SQL> audit session;

 

監査の設定状況を確認すると、ログイン成功、および、ログイン失敗の監査が行われるようになりました。

SQL> select * from dba_stmt_audit_opts;

 

いったん sqlplus の接続を切断します。

SQL> exit

 

ログイン成功のログを記録するために、再度 sqlplus で RDS for Oracle にログインし、切断します。

sqlplus.exe MASTRER_USER/masterPassword@"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-audit-test.xxxxxxxxxxxx.xxxxxxxxxx.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=DB01)))"

SQL> exit

 

今度は、ログイン失敗のログを記録するために、意図的に正しくないパスワードを指定して RDS for Oracle にログインしてみます。

sqlplus.exe MASTER_USER/hogehoge@"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-audit-test.xxxxxxxxxxxx.xxxxxxxxxx.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=DB01)))"

SQL> exit

 

少し待つと、RDS for Oracle で新しい監査ログファイルが生成されました。

 

内容を確認すると、先ほど試した sqlplus によるログイン成功のログが記録されていました。

 

また、ログイン失敗のログも記録されていました。

 

さらに少し待つと、ログイン成功、および、ログイン失敗のログが CloudWatch Logs にも出力されました。 これでログが長期保管可能になりました。

まとめ

Oracle の監査ログを使って RDS for Oracle へのログイン成功・失敗に関するログを取得し、CloudWatch Logs に出力しました。

CloudWatch Logs に出力できてしまえば、RDS のログローテーションで上書きされることもなくなるため、ログの長期保存が可能になります。 また、以下のブログでご紹介しているように、メトリクスフィルターと CloudWatch アラーム、SNS を組み合わせることにより、特定のログが特定の間隔内で n 件検出されたら通知させるようなことも可能です。

CloudWatch Logs を文字列検知してログ内容をメールを送信してみた

 

参考

1.23 AUDIT_TRAIL - Oracle Database Release 12.2 Database Reference

12.12 AUDIT (従来型監査) - Oracle Database Release 12.2 SQL Language Reference