OCI Logging AnalyticsでOracle Databaseの関連ログを取り込んで分析する

OCI Logging Analyticsは、OCIのサービス・ログやVMインスタンスの内の様々なログを取り込んで分析することができるサービスです。Oracle Databaseを対象に考えた場合、DBの監査表・ログやアラート・ログ、トレース・ログ、リスナーログなど様々なDatabase関連のログを対象に取り込んで分析するという運用が考えられます。

データベースのログを定期的に収集し、Logging Analyticsにアップロードする役目を持つのが、管理エージェントと呼ばれるプログラムです。これを対象のDBサーバにインストールし、Logging Analyticsへのアウトバウンド通信が確立するようにネットワークの事前設定が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/7ddda592-a6ef-b3cc-a73f-a89bd18e9457.png)

BaseDBやExaDB-DなどのOracle Cloud Databaseは、Service GatewayやNAT Gateway経由でアクセスできるようにVCNを設定します。また、オンプレミスのDatabaseを対象とする際に、管理エージェントが直接Logging Analyticsと通信できない制限がある場合は、[ゲートウェイ](https://qiita.com/western24/items/d0e923ba0a9f03956d87)という方式を取ることも可能です。
Autnomous Databaseの場合は、異なる設定方法になりますので、詳しくは[こちら](https://qiita.com/western24/items/ab8344ed9d5361998a5b)を参照下さい。

また、管理エージェントのインストールできるLinuxやWindowsのバージョンは[こちら](https://docs.oracle.com/ja-jp/iaas/management-agents/doc/perform-prerequisites-deploying-management-agents.html#GUID-BC5862F0-3E68-4096-B18E-C4462BC76271)

今回は、BaseDBに管理エージェントのインストールからLogging Analyticsの設定までの手順を紹介します。ExaDB-Dも場合も手順はほぼ同じです。

※ここでは、設定を実施するOCIユーザーは、Cloud Admin相当の権限を持っていることを前提にしています。設定途中でエラーメッセージが表示される場合は、必要な権限が自身に付与されているか以下のマニュアルを参照して管理者に確認して下さい。


管理エージェントの [IAMポリシー](https://docs.cloud.oracle.com/en-us/iaas/management-agents/doc/perform-prerequisites-deploying-management-agents.html#GUID-EFD288F4-55C4-4DEF-900D-0DEAA24360A2__GUID-610CF895-1F37-4A25-B19E-64AF2AF743EA)
ログ・アナリティクスの[IAMポリシー](https://docs.cloud.oracle.com/en-us/iaas/logging-analytics/doc/perform-prerequisite-configuration-tasks.html#GUID-EEB0A32F-9D33-4CF6-9FE7-F254C92BB2C0)

## 管理エージェントに必要な動的グループ、ポリシーの作成
管理エージェントとLogging Analyticsを動作させるための動的グループとポリシーを作成


- 動的グループの作成
    - 名前：ManagemntAgentAdmins
    - ルール：All {resource.type = 'managementagent', resource.compartment.id = '対象のコンパートメントOCID'}


- ポリシーの作成
Logging Analyticsのサービスと作成した動的グループに対するポリシーを定義
allow service loganalytics to {LOG_ANALYTICS_LIFECYCLE_INSPECT, LOG_ANALYTICS_LIFECYCLE_READ} in tenancyallow service loganalytics to read loganalytics-features-family in tenancy
allow dynamic-group ManagemntAgentAdmins to MANAGE management-agents IN COMPARTMENT コンパートメント名
allow dynamic-group ManagemntAgentAdmins to USE METRICS IN COMPARTMENT コンパートメント名
allow dynamic-group ManagemntAgentAdmins to {LOG_ANALYTICS_LOG_GROUP_UPLOAD_LOGS} IN COMPARTMENT コンパートメント名


## 管理エージェントをインストール

- OCIメニューから、監視及び管理 -> 管理エージェント -> ダウンロードとキーからLinuxエージェントのRPMをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/276e72c6-1757-ad0d-9ada-7bd7020c9bc1.png)

- 同ページにあるインストール・キーからキーを新規作成し、キーファイルをダウンロードしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/c4aa0a61-8ba4-ddbe-8d21-c77ab9ce3db6.png)

- 管理エージェントのインストール
各プラットフォームにインストール手順は[こちら](https://docs.oracle.com/ja-jp/iaas/management-agents/doc/install-management-agent-chapter.html)
```
#BaseDBにopcでログイン

#ダウンロードしたエージェントをインストール(Java SDK 8u281が必要)
sudo rpm -ivh oracle.mgmt_agent.xxxx.xxxx.Linux-x86_64

#input.rspファイルを作成し、ダウンロードしたキーファイルの内容を貼り付ける
sudo vi /opt/oracle/mgmt_agent/agent_inst/bin/input.rsp

#主に必要となるパラメータは以下。ManagementAgentInstallKeyは記述されているはずなので、CredentialWalletPasswordに好きな値を設定
ManagementAgentInstallKey = xxxxxxxxxxxxxxxxxxxxxx
CredentialWalletPassword = xxxxxxxxxxxxxxxxxxxxxxx

#ファイル所有者変更
sudo chown  mgmt_agent:mgmt_agent /opt/oracle/mgmt_agent/agent_inst/bin/input.rsp

#エージェントインストール実行
sudo /opt/oracle/mgmt_agent/agent_inst/bin/setup.sh opts=/opt/oracle/mgmt_agent/agent_inst/bin/input.rsp

#ステータス確認
sudo systemctl status mgmt_agent

#OSのログファイルをまとめて読み取り可能にする 
sudo chmod -R 755 /var/log

#ファイルにエージェント・ユーザー(mgmt_agent)でアクセスできるか確認
sudo -u mgmt_agent head -5 /var/log/messages
```

- mgmt_agentユーザーにDatabaseのファイルへのアクセス権限を個別に付与する方法 (※同様にchmodでも可)　
```
例) アラートログにsetfaclでmgmt_agentにread権限の付与 
sudo setfacl -R -m u:mgmt_agent:rx /u01/app/oracle/diag/rdbms/db001_fz7_iad

#File Readできるか確認しておく
sudo -u mgmt_agent head -5  /u01/app/oracle/diag/rdbms/db001_fz7_iad/DB0011/trace/alert_DB0011.log
```

## Logging AnalyticsにOracle Databaseのアラートログを取りこむ
- まず、Oracle Databaseのエンティティを作成する。ログ・アナリティクス -> 管理 -> エンティティの作成をクリック

- エンティティの作成項目。赤字の部分は必須入力項目 
    - エンティティ・タイプはOracle Databaes Instanceを指定する
    - Host/Port/ServiceNameは、Unified Auditのアクセスの際に必要になるので間違えないように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/079e331b-c913-4ca4-c1b6-04de3584ecf4.png)


- ログ・グループを作成する。管理 -> ログ・グループ -> 作成

- ソースにエンティティを追加する。管理 -> ソース -> Database Alert Logsのソースを見つけてクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d57a0685-7417-721d-7eaa-d68e3a706828.png)

- 編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/656ac64e-63d3-1fab-2052-79b2b83779e1.png)

- アラートログへのパスを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/8f274e53-c3f9-61cc-40f4-742b05f3b440.png)


- 関連付られていないエンティティからアソシエーションの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/565e836a-f5d2-a9a9-a128-d16af62807d3.png)


- 正しく設定できていれば、アラートログがログ・エクスプローラに表示されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/26895b23-2d4d-2096-dbf4-5d2ed8ee5a25.png)

アラートログ以外のトレースログやXML、ファイル形式の監査ログの取り込み手順は、同様にログ・ソースからOracle Database関連のものを検索し、エンティティを紐づけていくという流れになります



## Logging AnalyticsにOracle Databaseの監査ログ(Unified Audit)を取りこむ
- Unified Auditは、データベース内にある監査表のため、まずクレデンシャルを準備する必要がある

```
#opcユーザでagent_dbcreds.jsonというファイル名で以下の情報を含むJSONファイルを作成
エンティティ名は前述で作成した名前、DBユーザーはUnified Auditビューにアクセスできるユーザーを指定
SYSTEMユーザなどでもOK

{
    "source": "lacollector.la_database_sql",
    "name": "LCAgentDBCreds.エンティティ名",
      "type": "DBCreds",
    "usage": "LOGANALYTICS",
    "disabled": "false",
    "properties": [
        {
            "name": "DBUserName",
            "value": "CLEAR[DBユーザ]"
        },
        {
            "name": "DBPassword",
            "value": "CLEAR[パスワード]"
        },
        {
            "name": "DBRole",
            "value": "CLEAR[normal]"
        }
    ]
}

#管理エージェントをインストールしたサーバーで作成したJSONファイルを使って実行
cat agent_dbcreds.json | sudo -u mgmt_agent /opt/oracle/mgmt_agent/agent_inst/bin/credential_mgmt.sh -o upsertCredentials -s logan

    Effect Credential         Source
---------- ------------------ -------------------------------------------------
     ADDED LCAgentDBCreds.OracleDB1 lacollector.la_database_sql
             Type: DBCreds [DBUserName, DBPassword, DBRole]
1 credential(s) added to the logan service.
```

- ソースからUnified DB Audit Log Scorce Stored in Database 12.2を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/5f9ec31d-9019-1e3b-7b7a-42f10c3730bb.png)

- アラートログの場合と同様に、関連づけられていないエンティティからアソシエーションの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/c5f9fcf1-f588-3df8-e86f-98a25796eb2a.png)


- 正しく設定できていれば、Unified Auditのログ・エクスプローラに表示されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/11d68b92-8819-d34a-5f70-07a0e2dc58a4.png)

Unified Audit以外の表からデータを取り込む場合は、自身でソースを作成することで可能です。詳しくは[こちら](https://qiita.com/western24/items/ab8344ed9d5361998a5b)を参照下さい。

管理 -> ソースには、エンティティ・タイプがLinuxやWindowsのログを対象にした様々なソースがされています。OSのログも合わせて取り込み、下記のようなDatabaseの監査ダッシュボードを作成するという使い方もできるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/e3807828-f388-fceb-e798-e72dd10dd358.png)

## 補足
BaseDBのRAC構成やExaDB-Dの場合、管理エージェントをすべてのノードにインストールするべきかという疑問があるかと思います。各ノードのディレクトリに出力されるログに関しては、それぞれに管理エージェントをインストールしてログを収集する必要があります。
Unified Auditや共有ファイルシステムにある共通ファイルの場合は、いずれかの管理エージェントのみを起動し取得させるというのも可能です。

また、管理エージェントがLogging Analyticsにログをアップロードするインターバルやレコード数は基本的にチューニングすることはできません。ファイル形式のログは大量・高速に処理されるのですが、Unified AuditのようなDB表は、環境によりますが約1000レコード/分程度の処理スピードになることがあります。
ターゲットのログが遅延なくLogging Analyticsにアップロードされているかを確認し、Unified Auditログ > 転送量を大幅に超える場合は、Unified Auditの絞り込みやData Safeのサービスの検討が必要かもしれません。