「セキュリティ監査で "誰が sudoers を変更したか" の記録を求められているが、どこから手をつければいいか分からない」
こうしたニーズに応えるのが Linux の監査フレームワーク、auditd と auditctl コマンドです。
auditctl はカーネルレベルで動作する監査ルールを設定するツールです。「このファイルへのアクセスを記録する」「このシステムコールを実行したら記録する」というルールを設定すると、証跡として改ざんされにくいカーネルログに記録されます。
この記事では、auditd の起動確認から auditctl のルール設定、よく使う実践パターン(/etc/sudoers の監視、root コマンド実行の記録)までを RHEL 9.4 / Rocky Linux 9 の動作確認済み出力例とともに解説します。
動作確認環境:RHEL 9.4 / Rocky Linux 9.4
この記事のポイント
・auditctl -w でファイルへのアクセスをカーネルレベルで記録できる
・ルールは /etc/audit/rules.d/audit.rules に書くと再起動後も有効になる
・auditctl -l で現在有効なルールを一覧表示できる
・ausearch -f /etc/sudoers でファイル変更の証跡を検索できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Linuxの監査ログが必要な場面
Linux サーバーの運用では、次のような「あとから証明が必要な場面」が出てきます。・「誰が /etc/sudoers を変更したか」を調査したい
・「設定ファイルが意図せず変更されていないか」を定期確認したい
・PCI DSS や ISO 27001 の監査要件で、特権コマンドの実行記録を求められている
・不審なファイルアクセスがあった場合、いつ・どのプロセスが触れたかを追跡したい
こうした要件に対して、アプリのログや /var/log/secure だけでは「誰が」「いつ」「どのファイルに」アクセスしたかが追えないことがあります。
auditd はカーネルの内部でシステムコールを横断的に監視するため、アプリが独自にログを吐かない操作も記録できます。サーバーの監査ログを整備する第一歩として、まず auditd の設定から着手するのが定番です。
auditdとauditctlの関係(仕組みの概要)
auditd(Audit Daemon)はバックグラウンドで動くデーモンです。カーネルから受け取った監査イベントを /var/log/audit/audit.log に書き込みます。auditctl はそのカーネル監査サブシステムに「何を記録するか」のルールを追加・削除・確認するコマンドです。
・auditd — カーネルからイベントを受け取り、audit.log に書くデーモン
・auditctl — 監査ルールをカーネルに設定するコマンド(記録の対象・条件を決める)
・ausearch — audit.log を検索・フィルタリングして読みやすく表示するコマンド
・aureport — 監査ログの統計レポートを生成するコマンド
「auditd が器で、auditctl がルールセット」と理解しておくと分かりやすいです。
auditdの起動と基本確認
まず auditd が動いているか確認します。# auditd の状態を確認する [root@server01 ~]# systemctl status auditd | grep -E "Active|Loaded" Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled; preset: enabled) Active: active (running) since Thu 2026-07-10 09:00:12 JST; 2h 15min ago # 起動していない場合は起動して自動起動を有効化する [root@server01 ~]# systemctl enable --now auditd # audit.log の先頭を確認する [root@server01 ~]# head -5 /var/log/audit/audit.log type=DAEMON_START msg=audit(1752108012.342:1): op=start ver=3.0.7 format=enriched type=CONFIG_CHANGE msg=audit(1752108012.345:2): auid=0 ses=1 subj=system_u type=SYSCALL msg=audit(1752108012.349:3): arch=c000003e syscall=59 success=yes
auditctlコマンドの基本的な使い方
1. 現在有効なルールを確認する(-lオプション)
まず、現在どんなルールが入っているかを確認します。[root@server01 ~]# auditctl -l No rules # ルールが設定されている場合の表示例 [root@server01 ~]# auditctl -l -w /etc/sudoers -p wa -k sudoers_change -w /etc/passwd -p wa -k passwd_change -a always,exit -F arch=b64 -S execve -F uid=0 -k root_cmd
2. ファイル/ディレクトリへのアクセスを監視する(-wオプション)
ファイルやディレクトリを監視対象に追加するには -w(watch)を使います。# 基本構文 auditctl -w <パス> -p <アクセス種別> -k <キーワード> # /etc/sudoers の書き込み・属性変更を監視する例 [root@server01 ~]# auditctl -w /etc/sudoers -p wa -k sudoers_change # ルールが追加されたことを確認する [root@server01 ~]# auditctl -l -w /etc/sudoers -p wa -k sudoers_change
・r — 読み取り(read)
・w — 書き込み(write)
・x — 実行(execute)
・a — 属性変更(attribute change: chmod, chown 等)
-k に指定したキーワードは、後で ausearch -k キーワード で検索するための識別子になります。
3. システムコールを監視する(-aオプション)
ファイル単位ではなく、特定のシステムコールの実行を記録するには -a を使います。# 基本構文 auditctl -a always,exit -F arch=b64 -S <システムコール名> -F <条件> -k <キーワード> # root(uid=0)が実行したコマンド(execve)を記録する例 [root@server01 ~]# auditctl -a always,exit -F arch=b64 -S execve -F uid=0 -k root_cmd # 64ビット+32ビット両方を記録する場合は2行指定する [root@server01 ~]# auditctl -a always,exit -F arch=b64 -S execve -F uid=0 -k root_cmd [root@server01 ~]# auditctl -a always,exit -F arch=b32 -S execve -F uid=0 -k root_cmd
4. ルールを削除する(-Wオプション)
監視ルールを解除するには -w の大文字版 -W を使います。# /etc/sudoers の監視ルールを削除する [root@server01 ~]# auditctl -W /etc/sudoers -p wa -k sudoers_change # 全ルールを削除する(注意:監視が一切なくなる) [root@server01 ~]# auditctl -D
監査ルールを永続化する(再起動後も有効にする)
auditctl コマンドで設定したルールは再起動すると消えます。永続化するには /etc/audit/rules.d/ 配下にファイルを置きます。# 監査ルールファイルを作成する [root@server01 ~]# cat /etc/audit/rules.d/local.rules # === ローカル監査ルール === # sudoers の書き込み・属性変更を監視する -w /etc/sudoers -p wa -k sudoers_change -w /etc/sudoers.d/ -p wa -k sudoers_change # passwd・shadow の変更を監視する -w /etc/passwd -p wa -k passwd_change -w /etc/shadow -p wa -k shadow_change # root が実行したコマンドを記録する -a always,exit -F arch=b64 -S execve -F uid=0 -k root_cmd -a always,exit -F arch=b32 -S execve -F uid=0 -k root_cmd # auditd を再起動してルールを読み込む [root@server01 ~]# service auditd restart # または augenrules コマンドでルールを再生成して反映する [root@server01 ~]# augenrules --load # ルールが反映されたか確認する [root@server01 ~]# auditctl -l -w /etc/sudoers -p wa -k sudoers_change -w /etc/sudoers.d -p wa -k sudoers_change -w /etc/passwd -p wa -k passwd_change -w /etc/shadow -p wa -k shadow_change -a always,exit -F arch=b64 -S execve -F uid=0 -k root_cmd -a always,exit -F arch=b32 -S execve -F uid=0 -k root_cmd
実践例:/etc/sudoersの変更を検出する
実際に /etc/sudoers を変更して、監査ログに記録されるか確認してみます。# 1. 監視ルールを設定する(まだ設定していない場合) [root@server01 ~]# auditctl -w /etc/sudoers -p wa -k sudoers_change # 2. sudoers を意図的に変更する(実際の作業を模擬) [root@server01 ~]# visudo # (エディタで変更・保存) # 3. audit.log に記録されているか確認する [root@server01 ~]# ausearch -k sudoers_change --interpret ---- type=CONFIG_CHANGE msg=audit(1752123456.789:342): type=SYSCALL msg=audit(1752123456.790:343): arch=x86_64 syscall=openat success=yes a0=AT_FDCWD a1="/etc/sudoers.tmp" a2=O_WRONLY|O_CREAT|O_TRUNC a3=0 ppid=2311 pid=2312 uid=root gid=root euid=root comm="visudo" exe="/usr/sbin/visudo" type=PATH msg=audit(1752123456.791:343): item=0 name="/etc/sudoers.tmp" inode=... type=PATH msg=audit(1752123456.793:344): item=0 name="/etc/sudoers" ...
ausearch の詳しい検索方法(-ts で時刻絞り込み、--start today など)は関連記事 Linux ポート確認の全コマンド も参考にしてください。
よく使う監査ルールのサンプル集
実務でよく使うルールパターンをまとめます。/etc/audit/rules.d/local.rules に追記して利用してください。# === よく使う監査ルールサンプル === # SSH 設定の変更を監視 -w /etc/ssh/sshd_config -p wa -k sshd_config # cron 設定の変更を監視 -w /etc/crontab -p wa -k cron_change -w /etc/cron.d/ -p wa -k cron_change # ユーザー管理コマンドの実行を記録 -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/useradd -k user_mgmt -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/userdel -k user_mgmt -a always,exit -F arch=b64 -S execve -F path=/usr/bin/passwd -k user_mgmt # 特定ディレクトリへのアクセスを監視(読み取りも含む場合) -w /var/www/html/ -p rwxa -k webroot_access # su・sudo の実行を記録 -w /bin/su -p x -k su_exec -w /usr/bin/sudo -p x -k sudo_exec
トラブルシュート・よくある問題
【解決】ルールを設定したのに audit.log に記録されない
auditd が動いているか、ルールが正しく有効かを確認します。# 1. auditd の動作確認 [root@server01 ~]# systemctl is-active auditd active # 2. ルールが有効か確認 [root@server01 ~]# auditctl -l -w /etc/sudoers -p wa -k sudoers_change # 3. auditctl の現在のステータスを確認 [root@server01 ~]# auditctl -s enabled 1 failure 1 pid 1234 rate_limit 0 backlog_limit 8192 lost 0 backlog 0
【解決】backlogが満杯でイベントが欠落する
-S execve のような高頻度ルールを設定すると backlog が溢れることがあります。# backlog の上限を引き上げる [root@server01 ~]# auditctl -b 16384 # または /etc/audit/rules.d/local.rules に記述して永続化 -b 16384 # /etc/audit/auditd.conf の設定も見直す [root@server01 ~]# grep -E "max_log_file|num_logs|backlog" /etc/audit/auditd.conf num_logs = 5 max_log_file = 50 max_log_file_action = ROTATE
【解決】rules.d に書いたのに再起動後にルールが消える
augenrules が rules.d を読んでいるか確認します。# augenrules で rules.d を変換してから再起動する [root@server01 ~]# augenrules --check [root@server01 ~]# service auditd restart # 変換後の audit.rules を確認する [root@server01 ~]# cat /etc/audit/audit.rules | grep -v '^ '
本記事のまとめ
auditctl を使うと、ファイルアクセスやコマンド実行をカーネルレベルで記録できます。アプリログやシェル履歴では追えない「誰が・いつ・何をしたか」を証跡として残せるため、コンプライアンス要件のあるサーバーや本番環境での不正アクセス調査に活用できます。| やりたいこと | コマンド |
|---|---|
| 有効なルールを一覧表示 | auditctl -l |
| ファイルの書き込みを監視 | auditctl -w /etc/sudoers -p wa -k sudoers_change |
| root のコマンド実行を記録 | auditctl -a always,exit -F arch=b64 -S execve -F uid=0 -k root_cmd |
| 監視ルールを削除 | auditctl -W /etc/sudoers -p wa -k sudoers_change |
| 全ルールを削除 | auditctl -D |
| backlog 上限を変更 | auditctl -b 16384 |
| 監査状態を確認 | auditctl -s |
| ルールを永続化して反映 | augenrules --load |
Linux Master Pro Seminar 詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:GrafanaでLinuxサーバーの監視ダッシュボードを構築する方法|Prometheus連携からアラート設定まで
- この記事の属するカテゴリ:Linuxtips・セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます