※ 2023/07/30 編集
・概要に別記事へのリンクを追記
・3-2.ソースの作成 で指定する、Supplemental Filenameの正規表現が誤っていたため修正
概要
※aide.log の権限変更を行うことで、rsyslog, logrotateを利用しないで実施する方法を別の記事に記載しています。
OCI BaseDB のファイル変更を AIDE + Logging Analytics + Monitoring で取得する ( rsyslogd無し版 )
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現在 )
このあたりのバージョン情報を参照すると、少し古めのバージョンが入っている模様。
[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 から使える機能 だったため、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の関連ログを取り込んで分析する
こちらのサイトを参考にさせて頂き、
RPM のダウンロード、およびインストールを行う。
※Logging Analytics 用プラグインのデプロイが必要だと思ったので、次の項番で実施。
2-2. プラグインのデプロイ
OCI WEB コンソールより、
管理エージェント ⇒ 対象のエージェントを選択 で詳細画面へ遷移
「プラグインのデプロイ」ボタンを押下し、Logging Analytics にチェックを入れて更新。
デプロイ完了して少し待ってから、「プラグインのデプロイ」を押下すると、チェックが付く
3.OCI Logging Analytics 監視設定
3-1.ロググループの作成
ログ・グループを作成する。
管理 ⇒ ログ・グループ ⇒ 作成
3-2.パーサーの作成
AIDE 用のパーサーを作成する。
管理 ⇒ パーサー ⇒ パーサーの作成 ⇒ 正規表現タイプ
検知した行を選択して次へ (図の例だと、1行目はサマリのため、2行目以降を選択する必要あり)
各フィールドを対象に、ドラッグして属性を入力する。
画面イメージ
※最後のフィールドは、オプションのチェックは「無し」なので注意
対象 | ラジオボタン | フィールド | 正規表現 | オプション |
日付部分(緑?) | フィールドとして | TIME | [^\s]+ | チェック無し |
ホスト名部分(オレンジ) | フィールドとして | Host Name (Server) | [^\s]+ | チェック無し |
facilityっぽい aide 固定部分(青) | リテラルテキストとして | ー | aide: | チェック無し |
file= 固定文字(緑) | リテラルテキストとして | ー | file= | チェックあり |
ファイル名 セミコロンまで(黄色) | フィールドとして | Supplemental Filename | [^;]* | チェックあり |
セミコロン(緑) | リテラルテキストとして | ー | ; | チェックあり |
セミコロンより後ろの文字全て(オレンジ) | フィールドとして | Message | .* | チェック無し |
最終的な正規表現
[^\s]+\s+([^\s]+)\s+([^\s]+)\s+(?:file=)?([^;]*)?(?:;)?(.*)
パーサー作成完了。
3-3.ソースの作成
作成したパーサーを使った、Linux Host 用のソースを作成する。
管理 ⇒ ソース ⇒ ソースの作成
エンティティタイプは、Host(Linux) を選択する。
パーサーは、作成した AIDE 用のパーサーを選択。
含まれているパターンには、
/var/log/local3.log
を指定する。
※ local3.log* を指定すると、ローテートされた gz ファイルも読み込んでしまうため、アスタリスクは不要
ソース作成後、「関連付けられていないエンティティ」に、インストールした Linux 用のエンティティが表示されているはずなので、選択して、「アソシエーションの追加」を押下。
「ログエクスプローラで表示」を押下し、ログ・エクスプローラに遷移すると、AIDE ログが表示される。
3-4.自動検索用のグループ作成とポリシーの追加
Logging Analytics の検索結果を OCI Monitoring で自動収集するために、グループ作成とポリシーの追加を行う。
マニュアルはこちら
保存済検索の問合せを自動的に実行するスケジュールの作成
グループと権限についての詳細はこちら
スケジュール済タスクに対するすべての操作の実行をユーザーに許可
まず以下の動的グループを作成する。
※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」をクリックして、検索から除外 を押下すると、検索結果から除外される。
同様に、集計行は Supplemetal Filename から「summary」を除外する。
3-6.ログエクスプローラで検索条件の保存
調整した検索結果を保存して、Monitoring のカスタムメトリックを作成する。
ログエクスプローラの画面右上のアクションから、「名前を付けて保存」で検索条件を保存。
次に、再度画面右上のアクションから、「検出ツールの作成」でルールを作成。
ターゲット・サービスで、モニタリングを指定する。
メトリック・ネームスペースは、任意の文字列を指定できる。
間隔は1時間とした。
これで定期的に検索が実行され、モニタリングに反映される。
モニタリング ⇒ メトリック・エクスプローラにて、
作成したカスタムメトリックを表示して結果を確認する。
この結果を、アラームなどに連携することで、構成ファイルが変更された場合に検知する、という事ができるはず。