はじめに
Linux サーバーの運用や開発中、「誰がいつ sudo でコマンドを実行したか」「過去にどんな特権操作を行ったか」を確認したい場面はよくあります。
systemd を採用しているLinux ディストリビューションでは、journalctl を使うことで sudo の実行記録を簡単に取得・抽出できます。
この記事では、Ubuntu 環境における journalctl を使った基本的な sudo ログの参照方法から、障害調査やセキュリティ監査で役立つ応用テクニックまでを解説します。
1. 基本的な参照と検索の高速化
journalctl で sudo のログを絞り込む際、バイナリパス(/usr/bin/sudo)を指定する方法のほかに systemd フィールド変数 を指定する方法があります。
パス指定とフィールド指定の違い
-
パス指定:
journalctl /usr/bin/sudo -
フィールド指定:
journalctl _COMM=sudo
Ubuntu では内部インデックスを直接検索する フィールド指定(_COMM=sudo) を使うのがおすすめです。ログが大量にある場合でも高速に抽出できます。
# 高速で確実なフィールド指定検索
journalctl _COMM=sudo
件数の制御とソート
# 先頭の10件だけ表示(パイプ渡し)
journalctl _COMM=sudo | head -10
# 直近(最新)の10件を表示(-n オプション)
journalctl _COMM=sudo -n 10
# 新しい順(降順)で最新10件を表示(-r オプション)
journalctl _COMM=sudo -r -n 10
2. sudo ログの解読(成功ログと失敗ログ)
Ubuntu の sudo ログには、コマンドの実行成功だけでなく「認証失敗(パスワード間違い・権限なし)」も記録されます。
① 実行成功ログの形式
Aug 11 15:00:00 ubuntu-server sudo[12345]: ubuntu : TTY=pts/0 ; PWD=/home/ubuntu ; USER=root ; COMMAND=/bin/systemctl restart nginx
| 項目 | 説明 | ログの例 |
|---|---|---|
| 実行元 |
sudo を実行した Ubuntu ユーザー |
ubuntu |
| TTY | 操作が行われた端末 | pts/0 |
| PWD | コマンド実行時のディレクトリ | /home/ubuntu |
| USER | 昇格先のターゲットユーザー | root |
| COMMAND | 実際に実行されたコマンド | /bin/systemctl restart nginx |
② 認証失敗・不正アクセス試行のログ形式
パスワードの入力ミスや、sudo グループに所属していないユーザーが実行を試みた場合は以下のように記録されます。
# パスワード入力ミス・認証失敗(Ubuntu の PAM 認証ログ)
Aug 11 15:05:00 ubuntu-server sudo[12346]: pam_unix(sudo:auth): authentication failure; logname= user=ubuntu ruser= rhost=
Aug 11 15:05:03 ubuntu-server sudo[12346]: ubuntu : 3 incorrect password attempts ; TTY=pts/0 ; PWD=/home/ubuntu ; USER=root ; COMMAND=/bin/ls
# sudoers / sudoグループに登録されていないユーザーによる実行試行
Aug 11 15:10:00 ubuntu-server sudo[12350]: guestuser : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/guestuser ; USER=root ; COMMAND=/bin/cat /etc/shadow
3. 実践:時間軸・条件での絞り込み
① 日時・期間を指定して検索(--since / --until)
特定作業のタイムラインや、障害発生時刻に合わせて絞り込みます。
# 本日分の sudo ログを取得
journalctl _COMM=sudo --since today
# 過去2時間分のログを取得
journalctl _COMM=sudo --since "2 hours ago"
# 日時範囲をピンポイントで指定
journalctl _COMM=sudo --since "2026-08-11 10:00:00" --until "2026-08-11 12:00:00"
② 再起動前のログを追跡(-b)
Ubuntu サーバーが不審な挙動で再起動した場合でも、-b オプションを使えば過去の起動セッション(ブート単位)に絞り込んで調査できます。
# 前回の起動セッション(再起動直前まで)の sudo ログ
journalctl _COMM=sudo -b -1
# 2回前の起動セッションのログ
journalctl _COMM=sudo -b -2
補足:
journalctl --list-bootsを実行すると、Ubuntu に保存されている過去のブート一覧とIDが確認できます。
4. 応用編(監査・自動化)
① 認証失敗・不正な sudo 試行のみを抽出
不正アクセスや権限外操作の兆候を検知するために、エラーパターンのみを抽出します。
# パスワード間違え・認証失敗のログを抽出
journalctl _COMM=sudo | grep -E "authentication failure|incorrect password"
# sudo権限のないユーザーの実行試行(NOT in sudoers)を抽出
journalctl _COMM=sudo | grep "NOT in sudoers"
② 特定ユーザーの操作ログのみを追跡
特定オペレーター(例: ubuntu)が行った特権操作のみを監査したい場合:
journalctl _COMM=sudo | grep " ubuntu :"
③ リアルタイムで sudo 操作を監視(-f)
別端末からの特権操作をリアルタイムで監視したい場合は -f(follow)を使用します。
journalctl _COMM=sudo -f
まとめ
-
高速検索: Ubuntu では
journalctl _COMM=sudoでのフィールド検索が高速で確実 -
権限管理: 一般ユーザーに閲覧許可を出すなら
admグループを活用 -
セキュリティ監査: 実行成功(
COMMAND=)だけでなく、失敗ログ(authentication failure/NOT in sudoers) も併せて確認する -
障害解析: 再起動前のログは
-b -1、時間指定は--sinceで追尾
Ubuntu 環境におけるサーバー運用に役立てていただけますと幸いです!