概要
ログの管理については様々な方法がありますが、今回は Azure VM 上で動作する Linux の監査ログ(audit.log)を、 LogAnalytics および Blob Storage で保存する方法についてご紹介します。
ログの管理を Azure だけで完結させたい場合や、監査対応等で長期間のログ保存が必要な場合に有用な方法となります。
構成イメージ
全体の流れ
設定の流れは以下のようなイメージです。
- Linux で audit の設定をする
- Linux VM へ LogAnalytics エージェントをインストールする
- エージェント経由で LogAnalyticsへログを収集
- 長期保存用のBlobストレージへログデータの転送設定をする
設定手順
Linux VM で audit の設定を実施する
今回は audit.log を収集するので、最初に audit の設定を実施します。
その他のログを収集する場合、本手順は読み飛ばしてください。
以下の手順は全てrootユーザで実施してください。
- 事前ルール確認
# auditctl -l
No rules
- 事前ルールファイルの確認
# grep -v "^#\|^$" /etc/audit/rules.d/audit.rules
-D
-b 8192
-f 1
- audit.rulesの編集
このケースでは、execve システムコールが発行された時のログをまるっと取得する例です。
# vi /etc/audit/rules.d/audit.rules
-D
-b 8192
-f 1
-a always,exit -F arch=b64 -S execve <- 追記
- 設定反映のためaudit.serviceを再起動
# service auditd restart
- 事後ルールの確認
# auditctl -l
-a always,exit -F arch=b64 -S execve
-a always,exit -F arch=b64 -S execve が表示されることを確認します。
- audit.log に execve システムコールに関するログが出力することを確認します。
# tail -f /var/log/audit/audit.log
type=SYSCALL msg=audit(1633917159.095:272483): arch=c000003e syscall=59 success=yes exit=0 a0=22878c0 a1=21ba720 a2=21b3d10 a3=7ffe7d126ee0 items=2 ppid=25078 pid=25976 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=7713 comm="tail" exe="/usr/bin/tail" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)
type=EXECVE msg=audit(1633917159.095:272483): argc=3 a0="tail" a1="-f" a2="/var/log/audit/audit.log"
type=CWD msg=audit(1633917159.095:272483): cwd="/root"
type=PATH msg=audit(1633917159.095:272483): item=0 name="/bin/tail" inode=16879639 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:bin_t:s0 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1633917159.095:272483): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=33715359 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:ld_so_t:s0 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1633917159.095:272483): proctitle=7461696C002D66002F7661722F6C6F672F61756469742F61756469742E6C6F67
これで audit の設定は完了です。
LogAnalytics ワークスペースを作成する
任意のサブスクリプションを選択し、 リソースグループ と インスタンス名 を入力して作成します。
Linux VM に LogAnalytics エージェントをインストール
作成したワークスペースの「エージェント管理」→「Linuxサーバー」タブを選択。
wgetのコマンドラインをコピーしておく。
- 対象VMでコマンドを実行しインストールする
# wget https://raw.githubusercontent.com/Microsoft/OMS-Agent-for-Linux/master/installer/scripts/onboard_agent.sh && sh onboard_agent.sh -w *********** -s *********** -d opinsights.azure.com
: (省略)
- インストール後の状態確認
# /opt/microsoft/omsagent/bin/omsadmin.sh -l
Primary Workspace: *********** Status: Onboarded(OMSAgent Running)
Status: Onboarded(OMSAgent Running) となっていることを確認する。
VM と LogAnalytics ワークスペースと関連付ける
接続ができていない場合は、「接続」をクリックしてVMと連携させます。
カスタムログ設定で audit.log を LogAnalytics で収集する
-
Azure Portal にログインし、対象のワークスペースを選択します。
-
画面左側の [カスタム ログ] ブレードを選択します。
-
[+ カスタム ログの追加] をクリックし、カスタム ログの作成画面を開きます。
-
[サンプル] タブより、サンプル ログ ファイルをアップロードします。
※ サンプル ログは、監視対象の端末より audit.log を取得の上指定する。
上記設定後、カスタムログの収集が開始されます。
INFO
カスタムログに定義されているポイントから開始されます。
カスタムログ作成中にアップロードしたエントリは保持されませんが、ログファイルに既に存在するエントリが収集される動作です。
なお、設定反映までに最大1時間程度かかる可能性がある点は注意が必要です。
対象の LogAnalytics ワークスペース上から以下のようなサンプルクエリを実行し、対象ログの検索が可能かを確認してください。
サンプル クエリ
〇〇_CL -> "〇〇" は、上記手順で入力したカスタムログ名です。
ログデータをBlobストレージへ配置する
ストレージ アカウントにコンテナーを作成する
- Azure Portal にアクセスし、ログの保存先としたいストレージ アカウントを開きます。
- 左側メニューの [コンテナー] をクリックし、画面上部の [+コンテナー] をクリックします。
- コンテナーの名前とアクセス レベルを設定します。
※ここでは、例として "loganalytics-data" の名前のコンテナーを作成します。
- [作成] をクリックします。
ロジック アプリを作成します
- Azure Portal にアクセスし、画面上部の検索欄から、ロジックアプリを開きます。
- 画面上部の [+追加] から、ロジックアプリリソースのデプロイを行います。
- 「ログ分析を有効化」を有効にして先に作った LogAnalytics を選択します。
ロジックアプリのワークフロー(トリガー)を作成する
作成したロジックアプリを開くと、[Logic Apps デザイナー] が展開されます。
「繰り返し」コネクターを作成することで、設定した頻度で以下に作成するワークフローを実行する事が可能です。
ここでは、1日1回実行されるように、[間隔]を"1"、[頻度]を"日"と設定します。
- Azure Monitor Logs アクションを設定する
- [+ 新しいステップ] をクリックし、検索欄で "azure monitor" と検索します。
"Azure Monitor ログ" をクリックし、[アクション] タブから 「クエリを実行して結果を一覧表示する」を選択します。 - 対象の Log Analytics ワークスペースが存在する [テナント] を選択し、[サインイン] をクリックします。
- [サブスクリプション] 、[リソースグループ]、[リソースの種類]、[リソース名] を選択します。
- 任意の [クエリ] 、 [時間範囲] を設定します。
- [+ 新しいステップ] をクリックし、検索欄で "azure monitor" と検索します。
この処理で Log Analytics ワークスペースで出力したいデータを検索できます。
サンプル クエリ
※現在日時の 1 日前のデータ 1 日分を検索します
let dt = now();
let year = datetime_part('year', dt);
let month = datetime_part('month', dt);
let day = datetime_part('day', dt);
let hour = datetime_part('hour', dt);
let startTime = startofday(make_datetime(year,month,day,0,0)) - 1d;
let endTime = startTime + 1d - 1tick;
Audit_Log_CL // カスタム ログ テーブル名を指定します
| where ingestion_time() between(startTime .. endTime)
本アクションは以下の制限があるので、注意してください。
・ ログ クエリで 500,000 より多い行を返すことはできません。
・ ログ クエリで 64,000,000 より多いバイト数を返すことはできません。
・ 既定では、ログ クエリの実行時間は 10 分を超えることはできません。
・ Log Analytics コネクタは、1 分あたり呼び出し 100 回に制限されます。
- Parse JSON アクティビティ ("JSON の解析") を設定する
- [+ 新しいステップ] をクリックし、検索欄で "json" と検索します。
- [ビルトイン] タブから、"JSON の解析" を選択します。
- [コンテンツ] をクリックし、[クエリを実行して結果を一覧表示する] から、"本文" を選択します。
- [サンプルのペイロードを使用してスキーマを生成する] をクリックし、サンプル ペイロードを入力します。
サンプル ペイロードの例
{
"TenantId": "e2af94d3-d574-490d-9c5c-7c722e32c2df",
"SourceSystem": "OpsManager",
"MG": "00000000-0000-0000-0000-000000000002",
"ManagementGroupName": "tmpVM01",
"TimeGenerated": "2021-10-27T22:30:14Z",
"Computer": "tmpVM01",
"RawData": "type=USER_START msg=audit(1635373794.205:129): pid=2340 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:unconfined_service_t:s0 msg='op=PAM:session_open grantors=pam_keyinit,pam_limits,pam_keyinit,pam_limits,pam_systemd,pam_unix acct=\"root\" exe=\"/usr/bin/sudo\" hostname=? addr=? terminal=? res=success'\r\n",
"Type": "Audit_Log_CL",
"_ResourceId": "/subscriptions/4db33d72-262b-4238-8de3-2fcd63ac074b/resourcegroups/2110050060000725/providers/microsoft.compute/virtualmachines/tmpvm01"
}
-
「作成」アクションを設定する
-
BLOB の作成アクションを設定する
INFO
[認証の種類] 、[アクセス キー] は、該当のストレージアカウントのメニューより確認できます。
[認証の種類] は、[Azure Portal] -> [ストレージ アカウント] -> [コンテナー] -> 該当のコンテナー で確認できます。
INFO
[アクセスキー] は、[Azure Portal] -> [アクセスキー]より確認できます。
ワークフローが実行されると、[フォルダーパス] の配下に [Blob名] にて指定をしたファイル名でログが出力されます。
例えば、[式] にて以下を指定すると、 1 日前の日付のファイル名でログが出力されます。
subtractFromTime(formatDateTime(utcNow(),'yyyy-MM-dd'), 1,'day')
ロジックアプリをテストする
- 画面上部の [保存] をクリックします。
- 画面上部の [トリガーの実行] をクリックします。ワークフローが開始されます。
なお、ワークフローの開始時刻、および成功したかの確認は、ロジックアプリの [概要] より確認できます。
「成功」 した場合は、Blob ストレージを確認し、ログファイルが出力されていることを確認します。
「失敗」 した場合は、"失敗" をクリックし、失敗箇所の詳細を確認し修正します。
設定は以上となります。
あとは、設定した通りにログが出力されるようになったことを見届ければ完了です!
まとめ
- LogAnalyticsに出力するまでは結構すぐいける
- BlobとLogic Appあたりで詰まってやめたくなる
- ワークフローでエラーになるとショックでかい
- 乗り越えたらあとは放置でハッピー
参考文献