OCI BaseDB のファイル変更を AIDE + rsyslogd + Logging Analytics + Monitoring で取得する

※ 2023/07/30 編集
・概要に別記事へのリンクを追記
・3-2.ソースの作成 で指定する、Supplemental Filenameの正規表現が誤っていたため修正

# 概要
※aide.log の権限変更を行うことで、rsyslog, logrotateを利用しないで実施する方法を別の記事に記載しています。
[OCI BaseDB のファイル変更を AIDE + Logging Analytics + Monitoring で取得する ( rsyslogd無し版 )](https://qiita.com/nissinoillio/items/34934164dc9e7f6ccadd)

OCI BaseDB (Linux) の構成ファイル変更を検知するために、Linux 標準の AIDE (Advanced Intrusion Detection Environment) を使って監視してみる。

OCI の BaseDB では、デフォルトで AIDE がインストールされているため、その設定を流用する。
※Linuxコンピュートだとインストールされていないので、インストールが必要

なお、AIDEでは 結果が出力されるログが root 権限固定となってしまうため監視できなかった。
そのため、ローテート時の権限付与がやりやすい、rsyslogd 経由で AIDE のファイル変更検知ログを出力して監視を行った。

また、OCI Logging Anaytics の検索結果を OCI Monitoring でメトリックとして収集する、という情報があまりなかったため、AIDEの検知件数の Monitoring への連携もやってみた。

# 1.AIDE 設定
### 1-1.初期状態の確認

パッケージはデフォルトでインストールされている。
バージョンは 0.15 が入っている。( 2023/07現在 )
[このあたり](https://aide.github.io/)のバージョン情報を参照すると、少し古めのバージョンが入っている模様。
~~~
[root@dbvcn1 ~]# rpm -qa | grep aide
aide-0.15.1-13.0.1.el7.x86_64
~~~

1日1回チェック処理が動作している
~~~
[root@dbvcn1 cron.d]# cat /etc/cron.d/aide
# Generated by Chef. Changes will be overwritten.

28 02 * * * root  /usr/bin/systemctl restart aidescan.service
[root@dbvcn1 cron.d]# 
~~~

起動してみると、検知結果のログ（/var/log/aide/aide.log）が切り替わることが分かる。
~~~
[root@dbvcn1 cron.d]# /usr/bin/systemctl restart aidescan.service
[root@dbvcn1 cron.d]# 
-------
[root@dbvcn1 aide]# while :; do echo -n "$(date '+%Y/%m/%d %H:%M:%S') "; ls -l /var/log/aide/; sleep 5; done2023/07/17 07:10:39 total 8
-rw------- 1 root root 2390 Jul 17 06:51 aide.log
-rw------- 1 root root  168 Jul 13 02:28 aide.log.prev
2023/07/17 07:10:44 total 8
-rw------- 1 root root 2390 Jul 17 06:51 aide.log
-rw------- 1 root root  168 Jul 13 02:28 aide.log.prev
2023/07/17 07:10:49 total 8
-rw------- 1 root root 2390 Jul 17 06:51 aide.log
-rw------- 1 root root  168 Jul 13 02:28 aide.log.prev
2023/07/17 07:12:34 total 4
-rw------- 1 root root    0 Jul 17 07:10 aide.log ★切り替わった
-rw------- 1 root root 2390 Jul 17 06:51 aide.log.prev
2023/07/17 07:12:39 total 4
-rw------- 1 root root    0 Jul 17 07:10 aide.log
-rw------- 1 root root 2390 Jul 17 06:51 aide.log.prev
~~~

aide 自体の設定
~~~
cat /etc/aide.conf
----
< *** 省略 *** >
#p:      permissions
#i:      inode:
#n:      number of links
#u:      user
#g:      group
#s:      size
#b:      block count
#m:      mtime
#a:      atime
#c:      ctime
#S:      check for growing size
#acl:           Access Control Lists
#selinux        SELinux security context
#xattrs:        Extended file attributes
#md5:    md5 checksum
#sha1:   sha1 checksum
#sha256:        sha256 checksum
#sha512:        sha512 checksum
#rmd160: rmd160 checksum
#tiger:  tiger checksum
#n:       number of links
< *** 省略 *** >
# Only what PCI needs
# cannot use xattrs when FS do not support it
PCI = p+i+u+g+acl+xattrs+sha512
PCI_LOG = p+i+u+g+acl+xattrs+S+l+ftype+n
< *** 省略 *** >
# Core OS Rules
#
/etc            PCI
/bin            PCI
/sbin           PCI
/lib            PCI
/lib64          PCI
/usr/lib        PCI
/usr/lib64      PCI
/usr/bin        PCI
/usr/sbin       PCI
/boot           PCI
< *** 省略 *** >
# Logs that opc_logging writes
/var/log/kern.log$       LOGFILES
/var/log/local0.log$     LOGFILES
/var/log/local1.log$     LOGFILES
/var/log/local2.log$     LOGFILES
/var/log/local3.log$     LOGFILES
/var/log/local5.log$     LOGFILES
/var/log/local4.log$     LOGFILES
/var/log/local6.log$     LOGFILES
/var/log/local7.log$     LOGFILES
/var/log/news.log$       LOGFILES
/var/log/ftp.log$        LOGFILES
/var/log/daemon.log$     LOGFILES
/var/log/cron.log$       LOGFILES
/var/log/lpr.log$        LOGFILES
/var/log/user.log$       LOGFILES
/var/log/syslog.log$     LOGFILES
/var/log/uucp.log$       LOGFILES
/var/log/auth.log$       LOGFILES
/var/log/authpriv.log$   LOGFILES
/var/log/mail.log$       LOGFILES
/var/log/audit/audit.log$ LOGFILES
~~~
PCI や LOGFILES、PCI_LOG という検知の定義が設定されており、
/etc 等主要なディレクトリは、PCI による検知が設定されている。

■ デフォルト定義の比較
|設定値 |比較方法 |NORMAL|DIR|PCI|PCI_LOG|LOGFILES|
|:----|:----|:----|:----|:----|:----|:----|
|#p:      permissions|権限変更|〇|〇|〇|〇|〇|
|#i:      inode:|inode番号変更（移動など）| |〇|〇|〇| |
|#u:      user|所有者変更|〇|〇|〇|〇|〇|
|#g:      group|グループ変更|〇|〇|〇|〇|〇|
|#s:      size|サイズ変更|〇| | | | |
|#acl:           Access Control Lists|acl変更|〇|〇|〇|〇|〇|
|#xattrs:        Extended file attributes|拡張ファイル属性変更|〇|〇|〇|〇|〇|
|#sha512:        sha512 checksum|チェックサム変更|〇| |〇| | |
|#n:      number of links|リンク数変更| |〇| |〇|〇|
|#selinux        SELinux security context|selinux の acl変更|〇|〇| | | |
|#S:      check for growing size|ファイルサイズの増加| | | |〇| |
|#l:       link name|linkの名前変更| | | |〇| |
|#ftype:    type of file|ファイルタイプ変更| | | |〇|〇|

※ /var/log/xxx を PCI_LOG で監視しようとすると、ローテートされてサイズが変わった場合に検知されてしまうため、LOGFILES のままが良さそう。

### 1-2.AIDE設定変更
このまま /var/log/aide.log を監視したかったが、
チェックの都度、新しく作成される aide.log の権限が root:640 になってしまい、LoggingAnalytics 用ユーザに権限を付与する方法が簡単では無さそうだったため、諦めた。

※ aide.log に情報を追記するための、 report_append=true は [AIDE 0.17 から使える機能](https://github.com/aide/aide/issues/41) だったため、0.15 で設定するとエラーになってしまった。

そのため、rsyslogd 経由でログ出力し、logrotate でローテート＋権限付与することとした。

まずは、aide.conf の設定を変更し、rsyslogd 経由で出力する。
~~~
vi /etc/aide.conf
---
#report_url=syslog:LOG_LOCAL3
syslog_format=yes
report_url=file:@@{LOGDIR}/aide.log
---
★以下のように変更し、syslog 出力を有効化し、aide.log の出力を無効化
---
report_url=syslog:LOG_LOCAL3
syslog_format=yes
#report_url=file:@@{LOGDIR}/aide.log
~~~

### 1-3. rsyslogd 設定変更
rsyslogd は、LOCAL3 の出力設定がデフォルトで入っている。
/var/log/local3.log に出力されるため、そのまま使用する。
~~~
[root@dbvcn1 rsyslog.d]# cat /etc/rsyslog.d/opc.conf
# This file is managed by Chef. Local changes will be lost.
# Auto-populate the syslog config from the syslog_targets attribute
kern.*  -/var/log/kern.log
local0.*        -/var/log/local0.log
local1.*        -/var/log/local1.log
local2.*        -/var/log/local2.log
local3.*        -/var/log/local3.log
local5.*        -/var/log/local5.log
local4.*        -/var/log/local4.log
local6.*        -/var/log/local6.log
local7.*        -/var/log/local7.log
< *** 省略 *** >
~~~
この状態でチェックしてみると、検知されて、/var/log/local3.log に出力された。
~~~
[root@dbvcn1 rsyslog.d]# date;/usr/bin/systemctl restart aidescan.service;date
Mon Jul 17 16:17:25 JST 2023
Mon Jul 17 16:19:27 JST 2023
----
[root@dbvcn1 tmp]# tail -f /var/log/local3.log
2023-07-17T16:19:15.844161+09:00 dbvcn1 aide: AIDE 0.15.1 found differences between database and filesystem!!2023-07-17T16:19:15.844299+09:00 dbvcn1 aide: summary;total_number_of_files=51382;added_files=1;removed_files=0;changed_files=2
2023-07-17T16:19:16.137066+09:00 dbvcn1 aide: file=/var/log/local3.log; added
2023-07-17T16:19:16.538271+09:00 dbvcn1 aide: file=/etc/aide.conf;Inode_old=1052278;Inode_new=1052277;SHA512_old=qG5AZNnzrCuvnVn1STUQpZvMKFpPyN2tp01RiOeASoiOEckgpER9HdFH7vw0+Hyw3ZT6oyRhU9steMJwCCp0dw==;SHA512_new=QTP0VOHKRTEK58jsXPqTNX/m3Hdi/gyqsdqaw/X34CLBEp6ys0t1cpR5iKE6dECFGbGxZ5ANAbEnzbm5U1uCrw==
2023-07-17T16:19:16.539302+09:00 dbvcn1 aide: file=/etc/sysconfig/network-scripts/ifcfg-ens3;SHA512_old=hT7AxHZyuCkE24bMOUS91pLjyQBk7TiOfOPve9ar6S/zCVSLbKWaIrVG2yB6fmwFwWqnRfe6XQYpBl+a1XKVdQ==;SHA512_new=CUrBl3Y6uSP+4YTH4vxU77yfXQZb6pjYG4fl8T3GGXK+9zQII2rBJ1I9u3XNE0ue8oMM8E9I4nLjERCVSqb77A==
~~~

### 1-4. logrotated 設定変更
Logging Analytics 用ユーザで監視ができるように、rsyslogd によるローテート後のログ権限を、640 -> 644 に変更する
~~~
[root@dbvcn1 logrotate.d]# vi /etc/logrotate.d/opc
# This file is managed by Chef. Local changes will be lost.
# Auto-populate syslog files from the syslog_targets attribute
/var/log/kern.log
/var/log/local0.log
/var/log/local1.log
/var/log/local2.log
/var/log/local3.log
< *** 省略 *** >
/var/log/seam.log
{
        sharedscripts
        daily
        rotate 7
 
        dateext
        dateformat -%s
        create 0640 root logs  ★ここを変更する
        missingok
        compress
< *** 省略 *** >

権限のマスクを、以下のように変更する
        create 0644 root logs
~~~

ローテートしてみる。その他の read 権限が付与された。
~~~
/usr/sbin/logrotate -fv /etc/logrotate.conf
結果
[root@dbvcn1 ~]#  ls -ltr /var/log/local*
-rw-r-----  1 root logs      0 Jul 17 07:01 /var/log/local7.log
-rw-r-----  1 root logs      0 Jul 17 07:01 /var/log/local2.log
-rw-r-----  1 root logs   1813 Jul 17 08:56 /var/log/local0.log-1689551922.gz
-rw-r-----  1 root logs    559 Jul 17 09:17 /var/log/local0.log-1689553055.gz
-rw-r-----  1 root logs    316 Jul 17 16:08 /var/log/local4.log-1689578736.gz
-rw-r-----  1 root logs    641 Jul 17 16:19 /var/log/local3.log-1689578736.gz
-rw-r-----  1 root logs   6893 Jul 17 16:25 /var/log/local0.log-1689578736.gz
-rw-r--r--  1 root logs      0 Jul 17 16:25 /var/log/local4.log ★ 644 になっている
-rw-r--r--  1 root logs   3471 Jul 17 18:09 /var/log/local3.log ★ 644 になっている
-rw-r--r--  1 root logs 100030 Jul 17 20:50 /var/log/local0.log ★ 644 になっている
~~~

# 2.OCI Logging Analytics エージェントインストール
### 2-1. BaseDB にエージェントをインストール
[OCI Logging AnalyticsでOracle Databaseの関連ログを取り込んで分析する](https://qiita.com/western24/items/409d93b911c7094f5137)
こちらのサイトを参考にさせて頂き、
RPM のダウンロード、およびインストールを行う。
※Logging Analytics 用プラグインのデプロイが必要だと思ったので、次の項番で実施。

### 2-2. プラグインのデプロイ
OCI WEB コンソールより、
管理エージェント　⇒　対象のエージェントを選択　で詳細画面へ遷移
「プラグインのデプロイ」ボタンを押下し、Logging Analytics にチェックを入れて更新。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/f29f0896-4157-4470-e0bd-c950dc4096eb.png)

デプロイ完了して少し待ってから、「プラグインのデプロイ」を押下すると、チェックが付く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/ad64c225-cd71-5366-4483-59f0bf181801.png)


# 3.OCI Logging Analytics 監視設定

### 3-1.ロググループの作成
ログ・グループを作成する。
　管理 ⇒ ログ・グループ ⇒ 作成
### 3-2.パーサーの作成
AIDE 用のパーサーを作成する。
　管理 ⇒ パーサー ⇒ パーサーの作成 ⇒ 正規表現タイプ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/c757dd39-62e7-05eb-b282-682606c88110.png)

実際に取得したサンプルログを貼り付けて次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/2bade742-54b1-bc7c-eb31-258f5a5071a2.png)

検知した行を選択して次へ　（図の例だと、1行目はサマリのため、2行目以降を選択する必要あり）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/e70e32f3-d247-dd41-a8f9-866f8e80b8f4.png)

各フィールドを対象に、ドラッグして属性を入力する。

画面イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/186c26e0-4ce2-4fe5-5b60-6d323611ca3d.png)
※最後のフィールドは、オプションのチェックは「無し」なので注意
|                                          |                        |                       |           |              | 
| ---------------------------------------- | ---------------------- | --------------------- | --------- | ------------ | 
| 対象                                     | ラジオボタン           | フィールド            | 正規表現  | オプション   | 
| 日付部分（緑？）                         | フィールドとして       | TIME                  | [^\s]+    | チェック無し | 
| ホスト名部分（オレンジ）                 | フィールドとして       | Host Name (Server)    | [^\s]+    | チェック無し | 
| facilityっぽい aide 固定部分（青）       | リテラルテキストとして | ー                    | aide\:    | チェック無し | 
| file=　固定文字（緑）                    | リテラルテキストとして | ー                    | file=     | チェックあり | 
| ファイル名　セミコロンまで（黄色）       | フィールドとして       | Supplemental Filename | [^;]* | チェックあり | 
| セミコロン（緑）                         | リテラルテキストとして | ー                    | ;         | チェックあり | 
| セミコロンより後ろの文字全て（オレンジ） | フィールドとして       | Message               | .*        | チェック無し | 

最終的な正規表現
~~~
[^\s]+\s+([^\s]+)\s+([^\s]+)\s+(?:file=)?([^;]*)?(?:;)?(.*)
~~~

エラーになっていないことを確認して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/9f420564-4c74-6b28-2566-bdfd7e8a139c.png)

パーサー作成完了。

### 3-3.ソースの作成
作成したパーサーを使った、Linux Host 用のソースを作成する。
　管理 ⇒ ソース ⇒ ソースの作成

エンティティタイプは、Host(Linux) を選択する。
パーサーは、作成した AIDE 用のパーサーを選択。
含まれているパターンには、
　/var/log/local3.log 
を指定する。
※ local3.log*  を指定すると、ローテートされた gz ファイルも読み込んでしまうため、アスタリスクは不要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/81082798-7bcb-09ec-17fc-ee2e44e40c73.png)

ソース作成後、「関連付けられていないエンティティ」に、インストールした Linux 用のエンティティが表示されているはずなので、選択して、「アソシエーションの追加」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/572f275e-dd40-6a11-379a-ed8a8b72c43a.png)

アソシエーションの追加をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/648f1442-f89e-1e16-6aa1-0bf94e085513.png)

「ログエクスプローラで表示」を押下し、ログ・エクスプローラに遷移すると、AIDE ログが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/89289484-f3a7-accc-d815-4d0d9d162f9d.png)


### 3-4.自動検索用のグループ作成とポリシーの追加
Logging Analytics の検索結果を OCI Monitoring で自動収集するために、グループ作成とポリシーの追加を行う。

マニュアルはこちら
　[保存済検索の問合せを自動的に実行するスケジュールの作成](https://docs.oracle.com/ja-jp/iaas/logging-analytics/doc/create-schedule-run-saved-search.html)

グループと権限についての詳細はこちら
　[スケジュール済タスクに対するすべての操作の実行をユーザーに許可](https://docs.oracle.com/ja-jp/iaas/logging-analytics/doc/create-schedule-run-saved-search.html#GUID-003170B0-3FDE-402C-A505-738844BA360D)

まず以下の動的グループを作成する。
※Logging Analytics の検索タスクを、モニタリング・サービスにメトリックを投稿できるようにする
~~~
ALL {resource.type='loganalyticsscheduledtask', resource.compartment.id='xxxx'}
~~~
次に、ポリシーの作成。
※ 動的グループが Logging Analytics の検索タスクを実行できるようにするポリシーを作成する
※ コンパートメントに絞っている
※ 1行目は自身が所属するグループを指定。それ以外は作成した動的グループを指定。
~~~
allow group <group name> to use loganalytics-scheduled-task in compartment <compartment_name>
allow dynamic-group <作成した動的グループ>  to use metrics in compartment <compartment_name>
allow dynamic-group <作成した動的グループ>  to read management-saved-search in compartment <compartment_name>
allow dynamic-group <作成した動的グループ>  to {LOG_ANALYTICS_QUERY_VIEW} in compartment <compartment_name>
allow dynamic-group <作成した動的グループ>  to {LOG_ANALYTICS_QUERYJOB_WORK_REQUEST_READ} in compartment <compartment_name>
allow dynamic-group <作成した動的グループ>  to READ loganalytics-log-group in compartment <compartment_name>
allow dynamic-group <作成した動的グループ>  to read compartments in compartment <compartment_name>
~~~

### 3-5.ログエクスプローラで検索条件の調整
検索条件を保存する前に、AIDE の抽出結果より不要なものを除く。

AIDE ではヘッダー行と集計行が出力されるため、検知された件数からは除外する必要がある。
ヘッダー行では、パースした結果 Supplemetal Filename に「AIDE」が格納されるため、「AIDE」の条件は検索から除外する。
図のように検索した結果の「AIDE」をクリックして、検索から除外　を押下すると、検索結果から除外される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/1506525f-7248-3c9a-1f8d-8a9367fbdd76.png)

同様に、集計行は Supplemetal Filename から「summary」を除外する。

除外した結果のクエリ文字列はこうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/f7999f11-d5d1-5941-9fe2-60e9a34e27c9.png)


### 3-6.ログエクスプローラで検索条件の保存
調整した検索結果を保存して、Monitoring のカスタムメトリックを作成する。

ログエクスプローラの画面右上のアクションから、「名前を付けて保存」で検索条件を保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/65c55e27-aadc-0245-4885-20684ef57a77.png)

次に、再度画面右上のアクションから、「検出ツールの作成」でルールを作成。
ターゲット・サービスで、モニタリングを指定する。
メトリック・ネームスペースは、任意の文字列を指定できる。
間隔は1時間とした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/31e2d2d5-01c5-bfc3-979a-f1114e78153b.png)

これで定期的に検索が実行され、モニタリングに反映される。

モニタリング　⇒　メトリック・エクスプローラにて、
作成したカスタムメトリックを表示して結果を確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576542/349c8ffe-e8a4-657b-8be3-b63dcc169d2f.png)

この結果を、アラームなどに連携することで、構成ファイルが変更された場合に検知する、という事ができるはず。