auditctlコマンドでLinuxの監査ルールを設定する方法|ファイルアクセスとコマンド実行の記録手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, セキュリティ > auditctlコマンドでLinuxの監査ルールを設定する方法|ファイルアクセスとコマンド実行の記録手順
「rootが本当にそのファイルを変更したのかどうか、後から証明できるようにしたい」
「セキュリティ監査で "誰が 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 でファイル変更の証跡を検索できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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

audit.log が存在して出力があれば、auditd は正常に動いています。

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

-p オプションに指定できるアクセス種別は次の4種類です。

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

-a の第1引数は「always(常に)」または「never(しない)」を、第2引数はログの記録タイミング(exit=システムコール終了時が一般的)を指定します。

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

RHEL 9 / Rocky Linux 9 では /etc/audit/audit.rules ではなく /etc/audit/rules.d/*.rules にルールを書くのが推奨です。augenrules コマンドが rules.d/ 配下のファイルをまとめて /etc/audit/audit.rules に変換します。

実践例:/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" ...

uid=root・exe="/usr/sbin/visudo" から「root ユーザーが visudo で /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サーバー構築の「型」を体系的に身につけたい方へ、Linux の auditd・auditctl を含む実践的なサーバー管理技術を体系的に学びたい方は、20年以上の現場経験を持つ講師が直接指導するセミナーをご検討ください。
Linux Master Pro Seminar 詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。