LinuC レベル1 102試験対策シリーズの第7回です。前回は定期実行と時刻同期を扱い、「いつ動かすか」と「正しい時刻か」を整えました。今回は 「動いた結果をどう残し、どう調べるか」 ── つまり ログ管理 です。Linux のログには systemd-journald と rsyslog の2系統があり、現代の RHEL系は 両者を併用 しています。
本記事では journalctl の絞り込み技、/etc/rsyslog.conf の facility / severity 構文、logger でシェルから書く方法、リモート syslog 転送、そして logrotate までを実機で読み解きます。
環境前提
- ディストロ:AlmaLinux 9.6(Minimal Install)
- ユーザー:developer(sudo NOPASSWD)
- 検証環境:Hyper-V on Windows 11
- 関連VM:linuc-alma(10.0.10.132、ログ送信元)、linuc-ubuntu(10.0.10.133、リモート syslog 受信先の想定)
- 導入済み:
systemd-journald(systemd 同梱)、rsyslog(既定)、logrotate(既定)。追加 dnf 不要 - 本記事のリモート syslog セクションは 設定ファイルの記法を読む ところまで。受信側 linuc-ubuntu の設定変更は本記事では行わない
- 今ここマップ
- この記事で身につくこと
- 第1章:なぜログが運用の生命線なのか
- 第2章:systemd-journald と rsyslog の2層構造
- 第3章:journalctl 使いこなし
- 第4章:rsyslog ── facility / severity / action
- 第5章:/var/log/ の主要ファイル
- 第6章:logger と systemd-cat ── シェルから書く
- 第7章:リモート syslog 転送
- 第8章:logrotate ── ログのサイズ管理
- 第9章:現場での使いどころ
- 第10章:ヒヤリハット
- 第11章:やってみよう
- 理解度チェック
- 次回予告
- LinuC 102 試験対策シリーズ(全12回)
今ここマップ
LinuC 102 試験対策シリーズ(全12回)
第1回 シェル環境のカスタマイズ
第2回 Bashスクリプト入門
第3回 ネットワーク基礎
第4回 ネットワークトラブルシューティングとDNS
第5回 ユーザ・グループ管理と sudo 設定
第6回 ジョブスケジューリングと時刻管理
▶ 第7回 ログ管理実践 ← いまここ
第8回 メール配送エージェント(MTA)の基本
第9回 ファイアウォールと SELinux 入門
第10回 暗号化によるデータ保護
第11回 クラウドセキュリティの基礎
第12回 オープンソースの文化
この記事で身につくこと
- systemd-journald と rsyslog の役割を区別して説明できる
journalctl -u/-p/-S/-U/-b/-fでログを絞り込める/etc/rsyslog.confの facility / severity / action を読めるloggerでシェルから syslog にログを書ける- リモート syslog 転送の書式(
@@host/@host)の意味を説明できる
第1章:なぜログが運用の生命線なのか
1.1 ログが無いと困る4つの場面
「動いている/動いていない」しか分からない状態を想像してみてください。「なぜ動かなくなったのか」「いつから」「誰が/何が起因したのか」 が一切分からない世界です。実際の現場では次のような場面でログが調査の起点になります。
- 運用担当のため:障害復旧。サービス停止直前のエラーメッセージ・カーネルログ・OOM Killer の動作を追う
- セキュリティ担当のため:不正アクセス調査。
/var/log/secureの認証失敗、sudo履歴、auditdの監視対象アクセス - 開発担当のため:性能問題の調査。アプリログのレスポンスタイム、エラー率、外部 API 失敗の頻度
- 監査担当のため:法的・コンプライアンス要求。「いつ・誰が・何にアクセスしたか」を一定期間保存する義務
第6回で扱った 時刻同期 が前提として効きます。複数台のサーバのログを時系列で並べるには、全サーバの時刻が NTP で揃っている必要があるからです。
第2章:systemd-journald と rsyslog の2層構造
2.1 役割分担
現代の RHEL系では、ログを扱う2つのソフトウェアが 連携して 動作しています。
| 項目 | systemd-journald | rsyslog |
|---|---|---|
| 形式 | バイナリ(独自形式) | テキスト(1行1イベント) |
| 保存場所 | /run/log/journal/(揮発・既定)、/var/log/journal/(永続・任意) | /var/log/messages 等 |
| 取得元 | カーネル・systemd・サービス標準出力・syslog 受信 | journald から受信(imjournal) |
| 操作 | journalctl コマンド | 設定ファイル + 標準ツール(tail/grep 等) |
| 強み | 構造化フィールド、ブート単位・優先度フィルタ | 歴史的互換、リモート転送、ファイル分離 |
| 弱み | テキスト系ツールで直接処理しにくい | 構造化情報が薄い |
両者が稼働中であることを実機で確認します。
実行コマンド(linuc-alma):
$ systemctl is-active systemd-journald
$ systemctl is-active rsyslog
$ systemctl is-enabled rsyslog
実行結果:
active
active
enabled
systemd-journald は static(systemd の一部として常駐、enable/disable の対象外)、rsyslog は enabled(独立サービス、再起動後も自動起動)になります。
2.2 「logger」 → journald → rsyslog のパス
AlmaLinux 9 の rsyslog は、imjournal モジュール 経由で journald からログを取り込み、/var/log/messages 等に書き出す構成です。logger コマンドの出力は次のパスをたどります。
logger / アプリ → systemd-journald → rsyslog (imjournal) → /var/log/messages 等

つまり同じイベントが journal にもファイルにも残る。journalctl で構造化検索、grep でファイル検索、どちらも可能というわけです。
2.3 journald の永続化 ── 既定は揮発
AlmaLinux 9 既定では /var/log/journal/ が 存在しません。この場合、journald は Storage=auto の動作として /run/log/journal/ に書きます。/run は tmpfs なので再起動でジャーナルが消えます。
実行コマンド(linuc-alma):
$ ls -la /var/log/journal/ 2>&1
$ ls /run/log/journal/
実行結果:
ls: '/var/log/journal/' にアクセスできません: そのようなファイルやディレクトリはありません
9675dfbf54f14d9ebfa704b59841fc8f
永続化したい場合は次の手順を踏みます(本記事では実行しない)。
$ sudo mkdir -p /var/log/journal
$ sudo systemd-tmpfiles --create --prefix /var/log/journal
$ sudo systemctl restart systemd-journald
運用上は、テキストでの長期保管は rsyslog 側に任せ、journald は直近の構造化ログ用 という分担が多いです。
📖 試験Tipsボックス1:journald と rsyslog の役割
主題:1.09.2(重要度:高)
出題パターン:「journald は何形式で保存する?」「rsyslog の役割は?」「永続化ディレクトリは?」「両者の連携モジュールは?」
暗記ポイント
- journald = バイナリ形式、揮発デフォルト(
/run/log/journal/) - 永続化は
/var/log/journal/を作ってsystemctl restart systemd-journald(または journald.conf でStorage=persistent) - rsyslog = テキスト形式で
/var/log/messages等 - 両者は併用が既定
- rsyslog は
imjournalモジュールで journald からログ取り込み - 操作は journald=
journalctl、rsyslog=設定ファイル + テキストツール
第3章:journalctl 使いこなし
3.1 最新数件と新しい順
引数なしの journalctl は全ログをページングして表示しますが、運用では「直近の数件だけ」「特定ユニットだけ」を見るケースがほとんどです。
実行コマンド(linuc-alma):
$ journalctl -n 5 --no-pager
実行結果(採取時点の例):
5月 14 08:03:59 linuc-alma systemd-logind[730]: Removed session 58.
5月 14 08:03:59 linuc-alma sshd[13146]: Accepted publickey for developer from 192.168.1.100 port 57494 ssh2: ED25519 SHA256:...
5月 14 08:03:59 linuc-alma systemd-logind[730]: New session 60 of user developer.
5月 14 08:03:59 linuc-alma systemd[1]: Started Session 60 of User developer.
5月 14 08:03:59 linuc-alma sshd[13146]: pam_unix(sshd:session): session opened for user developer(uid=1000) by developer(uid=0)
--no-pager はページングを止める(端末をクリアしない)。スクリプト・SSH 経由では必須です。-r を付けると新しい順になります。
3.2 ユニット指定 ── サービス単位で見る
実行コマンド(linuc-alma):
$ journalctl -u crond -n 5 --no-pager
実行結果(例):
5月 14 07:01:01 linuc-alma run-parts[13089]: (/etc/cron.hourly) finished 0anacron
5月 14 07:01:01 linuc-alma CROND[13079]: (root) CMDEND (run-parts /etc/cron.hourly)
5月 14 08:01:01 linuc-alma CROND[13102]: (root) CMD (run-parts /etc/cron.hourly)
5月 14 08:01:01 linuc-alma run-parts[13105]: (/etc/cron.hourly) starting 0anacron
5月 14 08:01:01 linuc-alma CROND[13101]: (root) CMDEND (run-parts /etc/cron.hourly)
-u "nginx*" のようにワイルドカードも使えます。sshd、NetworkManager、rsyslog、chronyd 等、調査対象のサービスを直接指定するのが定石です。
3.3 優先度フィルタ ── エラー以上を抽出
syslog の severity(重要度)8段階で絞れます。
| 数値 | キーワード | 意味 |
|---|---|---|
| 0 | emerg | システム不能 |
| 1 | alert | 即時対応 |
| 2 | crit | 致命的 |
| 3 | err | エラー |
| 4 | warning | 警告 |
| 5 | notice | 通知 |
| 6 | info | 情報 |
| 7 | debug | デバッグ |
-p err は「err(3)以上」、つまり err / crit / alert / emerg を意味します。
実行コマンド(linuc-alma):
$ journalctl -p err -b --no-pager | head
実行結果(例。表示される行は環境やブート以降の操作履歴によって異なる):
5月 09 19:04:16 linuc-alma kernel: Warning: Unmaintained driver is detected: ip_set
5月 09 19:17:32 linuc-alma sudo[950]: developer : a password is required ; PWD=/home/developer ; USER=root ; COMMAND=/bin/true
5月 09 19:24:23 linuc-alma systemd[1]: Failed to start dnf makecache.
journalctl -p err -b は障害調査の最初の一手です。今回のブート(-b)で発生した err 以上を一覧でき、原因の見当がつきやすくなります。表示される具体的な行は、そのブート以降に何が起きたかによって変わります(上記はインストール直後のブートの例で、SSH 接続失敗などがあればその行も並びます)。
3.4 時刻範囲とブート単位
| オプション | 意味 |
|---|---|
-S "2026-05-14 08:00" | since(〜以降) |
-U "2026-05-14 09:00" | until(〜以前) |
--since "1 hour ago" | 相対指定 |
--since yesterday | キーワード相対指定 |
-b | 今回ブート |
-b -1 | 1つ前のブート |
--list-boots | ブート履歴一覧 |
-f | フォロー(tail -f 相当) |
journalctl --since "1 hour ago" -u sshd のように複数フィルタを AND結合 できるのが journalctl の強みです。
3.5 ディスク使用量
実行コマンド(linuc-alma):
$ journalctl --disk-usage
実行結果(例):
Archived and active journals take up 9.9M in the file system.
容量が大きくなりすぎると SystemMaxUse=(既定はディスクの10%)で自動削除されます。手動削除は journalctl --vacuum-size=100M や --vacuum-time=2weeks で可能です。
📖 試験Tipsボックス2:journalctl 主要オプション
主題:1.09.2(重要度:高)
出題パターン:「直近5件は?」「サービス指定は?」「err 以上を見るには?」「今回ブートに絞るには?」「前回ブートを見るには?」
暗記ポイント
-n N直近N件-u UNITユニット指定(ワイルドカード可)-p PRI優先度(数値0-7またはキーワード emerg/alert/crit/err/warning/notice/info/debug、指定値「以上」が表示される)-S/-U "YYYY-MM-DD HH:MM"または--since "1 hour ago"時刻指定-b今回ブート、-b -1前回ブート--list-bootsブート履歴-fフォロー-r新しい順--disk-usage使用量--vacuum-size=/--vacuum-time=削除
第4章:rsyslog ── facility / severity / action
4.1 syslog の3要素
syslog プロトコル(RFC 5424 / RFC 3164)はメッセージを次の3要素で分類します。
- facility(出力元の分類):誰が出したか
- severity(重要度):どのくらい深刻か
- action(出力先):どこに書くか
4.2 facility 一覧
| facility | 意味 |
|---|---|
kern | カーネル |
user | 一般ユーザプロセス(logger の既定) |
mail | メール関連 |
daemon | システムデーモン |
auth | 認証(古い、平文ログ可) |
authpriv | 認証(特権、root のみ閲覧可) |
cron | cron / atd |
local0〜local7 | サイトローカル用(自由に使える8枠) |
* | すべて |
自社アプリは local0〜local7 を使うのが慣例です。auth と authpriv の違いは「authpriv は root しか読めない(パスワード関連の機密を扱う)」点で、現代ではほぼ全て authpriv に集約されています。
4.3 /etc/rsyslog.conf を読む
コメント・空行を除いた主要行を見ます。
実行コマンド(linuc-alma):
$ cat /etc/rsyslog.conf | grep -v '^#' | grep -v '^$'
実行結果:
global(workDirectory="/var/lib/rsyslog")
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
module(load="imuxsock" # provides support for local system logging (e.g. via logger command)
SysSock.Use="off") # Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
module(load="imjournal" # provides access to the systemd journal
UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
FileCreateMode="0644" # Set the access permissions for the state file
StateFile="imjournal.state") # File to store the position in the journal
include(file="/etc/rsyslog.d/*.conf" mode="optional")
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
下半分の7行が facility.severity action ルールです。重要な書式を解説します。
*.info;mail.none;authpriv.none;cron.none /var/log/messages:「info以上を /var/log/messages へ。ただし mail / authpriv / cron は.noneで除外」。;で複数条件を結合authpriv.* /var/log/secure:authpriv の全 severity を /var/log/secure へmail.* -/var/log/maillog:先頭の-は「同期書き込みしない」(性能優先、クラッシュ時の損失許容)*.emerg :omusrmsg:*:emerg は全ユーザ端末にwall通知local7.* /var/log/boot.log:local7 の全 severity を /var/log/boot.log へ(init/systemd の起動メッセージ用)
4.4 facility.severity の特殊指定
| 記法 | 意味 |
|---|---|
auth.info | auth の info 以上 |
auth.=info | auth の info のみ(等号) |
auth.!info | auth の info 未満(否定) |
auth.none | auth は除外 |
*.* | 全ファシリティの全 severity |
mail,news.info | mail と news の info 以上(カンマ列挙) |
4.5 /etc/rsyslog.d/ ── パッケージごとの分割
rsyslog.conf 末尾近くの include(file="/etc/rsyslog.d/*.conf" mode="optional") によって、/etc/rsyslog.d/ 配下の *.conf ファイルが自動的に読み込まれます。新規ルールは本体を編集せず、ここに新規ファイルを置くのが推奨です(第5回 sudoers の /etc/sudoers.d/ と同じ思想)。
📖 試験Tipsボックス3:facility と severity
主題:1.09.2(重要度:高)
出題パターン:「auth と authpriv の違いは?」「*.info;mail.none の意味は?」「先頭の - の意味は?」「local0〜local7 は何のため?」
暗記ポイント
- facility =
kern/user/mail/daemon/auth/authpriv/cron/local0-7 - severity = emerg(0)/alert(1)/crit(2)/err(3)/warning(4)/notice(5)/info(6)/debug(7)、数値が小さいほど深刻
auth.infoinfo以上、auth.=infoinfo のみ、auth.none除外、auth.!infoinfo 未満;結合、,ファシリティ列挙- ファイル先頭
-非同期書き込み(性能優先) :omusrmsg:*全ユーザ端末通知- local0〜local7 はサイト独自用
/etc/rsyslog.d/で分割管理
第5章:/var/log/ の主要ファイル
実行コマンド(linuc-alma):
$ sudo ls -la /var/log/{messages,secure,cron,maillog,boot.log} 2>&1
実行結果(例):
ls: '/var/log/boot.log' にアクセスできません: そのようなファイルやディレクトリはありません
-rw-------. 1 root root 6801 5月 14 08:01 /var/log/cron
-rw-------. 1 root root 0 5月 9 18:45 /var/log/maillog
-rw-------. 1 root root 287416 5月 14 08:03 /var/log/messages
-rw-------. 1 root root 45383 5月 14 08:03 /var/log/secure
パーミッションは 0600(root のみ)。boot.log は Minimal Install のサーバ用途では空のため作られていません。maillog は MTA 未稼働で0バイト(次回第8回で postfix を導入すると育ちます)。
| ファイル | 内容 |
|---|---|
/var/log/messages | 一般メッセージ(info 以上、ただし mail/authpriv/cron 除外) |
/var/log/secure | 認証関連(authpriv) |
/var/log/cron | cron / atd の実行ログ |
/var/log/maillog | メール送受信 |
/var/log/boot.log | システム起動メッセージ(local7) |
/var/log/audit/audit.log | auditd(journalctl では見えない、ausearch 使用) |
/var/log/dmesg | カーネルバッファのスナップショット |
ローテーション後の圧縮ファイル(messages-20260513.gz 等)は zcat zless zgrep で直接読めます。
第6章:logger と systemd-cat ── シェルから書く
6.1 logger コマンド
logger はシェルから syslog にメッセージを送るコマンドです。バックアップスクリプトや監視スクリプトから「実行した」「失敗した」を残すのに便利です。
実行コマンド(linuc-alma):
$ logger -p user.notice -t LinuC-test "LinuC test message from alma (notice)"
$ logger -p user.err -t LinuC-test "LinuC error test from alma"
主なオプションは次のとおりです。
| オプション | 意味 |
|---|---|
-p facility.severity | 優先度指定(既定は user.notice) |
-t TAG | タグ付け(journalctl -t で絞り込み可) |
-i | PID を付ける |
-s | 標準エラーにも出す(デバッグ用) |
journalctl で確認します。
実行コマンド(linuc-alma):
$ journalctl -t LinuC-test -n 5 --no-pager
実行結果:
5月 14 08:03:59 linuc-alma LinuC-test[13204]: LinuC test message from alma (notice)
5月 14 08:03:59 linuc-alma LinuC-test[13205]: LinuC error test from alma
同じメッセージが /var/log/messages にも届いていることを確認します。
実行コマンド(linuc-alma):
$ sudo tail -10 /var/log/messages | grep LinuC-test
実行結果:
May 14 08:03:59 linuc-alma LinuC-test[13204]: LinuC test message from alma (notice)
May 14 08:03:59 linuc-alma LinuC-test[13205]: LinuC error test from alma
これが 「logger → journald → rsyslog → /var/log/messages」 の2層構造を実機で見た瞬間です。同じ1行が2箇所に届いています。
6.2 systemd-cat ── 標準出力を journal にリダイレクト
シェルスクリプトの標準出力/標準エラー出力をまとめて journal に書き込むには systemd-cat が便利です。
$ systemd-cat -t mybackup -p info /opt/scripts/backup.sh
これで backup.sh の出力すべてが mybackup タグで journal に流れ、journalctl -t mybackup で後から確認できます。
第7章:リモート syslog 転送
7.1 なぜログを集約するのか
サーバが数十台・数百台あると、1台ずつログを見るのは現実的ではありません。すべてのログを1箇所に集約 して、検索・相関分析する仕組みが必要です。代表例は次のとおりです。
- rsyslog の
@@/@転送:もっとも軽量。ファイルに書く代わりにリモートホストへ syslog を送る - SIEM 製品(Splunk、Elastic SIEM 等):セキュリティ用途の集約+分析
- ログ基盤(Elasticsearch + Fluentd、Grafana Loki、CloudWatch Logs 等):開発・運用用途
7.2 rsyslog の転送書式
rsyslog で他サーバへ送る書式は次のとおりです。
| 書式 | 意味 |
|---|---|
*.* @@10.0.10.133:514 | 全ログを TCP で 10.0.10.133 のポート514へ転送 |
*.* @10.0.10.133:514 | 全ログを UDP で(@ 1文字) |
authpriv.* @@logserver.example.com | 認証ログだけ TCP 転送 |
覚え方は 「@ 2つで TCP」「@ 1つで UDP」。試験でも頻出です。ポート省略時の既定は 514。
7.3 設定例(送信側)
linuc-alma から linuc-ubuntu(10.0.10.133)に転送する場合の /etc/rsyslog.d/50-forward.conf の例(本記事では作成はしません、書式の例示のみ)。
# 全ログを TCP で linuc-ubuntu に転送(再接続バッファ付き)
*.* action(type="omfwd"
target="10.0.10.133"
port="514"
protocol="tcp"
action.resumeRetryCount="100"
queue.type="LinkedList"
queue.size="10000")
古い書式 *.* @@10.0.10.133:514 でも動きますが、現代の rsyslog では action() ベースの構文が推奨です。queue.type で「受信側ダウン時のメッセージを送信側で保持する」リトライ機構を組み込めます。
7.4 受信側の準備(参考)
受信側 linuc-ubuntu 側では、次の3点が必要です。本記事では実施しませんが、概念として把握してください。
- rsyslog の
imtcpモジュールを有効化(module(load="imtcp")+input(type="imtcp" port="514")) - firewalld / ufw でポート 514/tcp を開放
- 受信したログをホスト名ごとに分離するテンプレート設定(任意)
📖 試験Tipsボックス4:リモート syslog 転送
主題:1.09.2(重要度:高)
出題パターン:「TCP転送の記法は?」「UDP転送の記法は?」「ポート番号は?」「受信側で必要なモジュールは?」
暗記ポイント
- TCP転送は
@@host:514(@ 2つ) - UDP転送は
@host:514(@ 1つ) - 既定ポートは 514
- 受信側は
imtcp(TCP)またはimudp(UDP)モジュールを有効化 - ファイアウォール(firewalld / ufw)で 514/tcp(または udp)を開放
- 現代の rsyslog 構文は
action(type="omfwd" target=... port=... protocol=...) queue.type="LinkedList"でリトライ用バッファ
第8章:logrotate ── ログのサイズ管理
8.1 logrotate.conf の主要ディレクティブ
第6回で扱った logrotate.timer(systemd timer)の本体が logrotate コマンドで、/etc/logrotate.conf を読みます。
実行コマンド(linuc-alma):
$ cat /etc/logrotate.conf | grep -v '^#' | grep -v '^$' | head
実行結果(抜粋):
weekly
rotate 4
create
dateext
include /etc/logrotate.d
主なディレクティブの意味は次のとおりです。
| ディレクティブ | 意味 |
|---|---|
daily / weekly / monthly | ローテーション周期 |
rotate N | 世代数(古いものを N 世代まで保持) |
create | ローテーション後に空ファイルを作る(同 mode/owner/group) |
dateext | ローテーション後の名前に -YYYYMMDD を付ける |
compress | gzip 圧縮 |
missingok | 対象が無くてもエラーにしない |
notifempty | 空ファイルはローテーションしない |
postrotate ... endscript | ローテーション後に実行するコマンド(rsyslog の reload 等) |
8.2 /etc/logrotate.d/ の分割設定
パッケージごとの個別設定が並びます。
実行コマンド(linuc-alma):
$ ls /etc/logrotate.d/
実行結果:
btmp chrony dnf firewalld kvm_stat rsyslog sssd wtmp
新しいアプリを導入したら、必ず /etc/logrotate.d/<アプリ名> を追加するのが運用の鉄則です。
8.3 dry-run で安全に検証する
-d でデバッグ実行(実ファイル変更なし)できます。新規 logrotate 設定を追加した後に必ず走らせる定型操作です。
実行コマンド(linuc-alma):
$ sudo logrotate -d /etc/logrotate.conf 2>&1 | head -10
実行結果(抜粋):
WARNING: logrotate in debug mode does nothing except printing debug messages!
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file btmp
reading config file chrony
reading config file dnf
reading config file firewalld
reading config file kvm_stat
reading config file rsyslog
reading config file sssd
「設定ファイルの構文エラーが無い」「対象ログがどれか」を事前に確認できます。
第9章:現場での使いどころ
現場での使いどころ
- 障害調査の起点:
journalctl -p err -bでブート以降の err 以上を一覧。次にjournalctl -u 怪しいサービス --since "10 min ago"で時刻を絞る - 認証失敗の追跡:
sudo grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rnでブルートフォース攻撃の発信元IPを集計 - 集約ログ基盤への送信:rsyslog の
@@/@転送で Splunk / Elasticsearch / CloudWatch Logs / Grafana Loki にまとめる。1サーバあたりの保存はせず、保管・検索は集約側に任せる構成 - セキュリティインシデントの最初の20分:
/var/log/secureの認証ログ →sudo実行履歴 → 該当時刻のjournalctl -u sshd→ 該当IPからのアクセス全件 - アプリログを syslog に統合:自社アプリの開発時に「local0〜local7」のどれかを割り当て、
logger -p local0.infoで書く。集約基盤への送信ルートに乗る - logrotate の運用:新規アプリ追加時に
/etc/logrotate.d/<アプリ名>を必ず作る。logrotate -dで構文・対象を確認 - journald の永続化判断:本番サーバで再起動時のログを失いたくない場合は
/var/log/journal/を作成して永続化。クラウドの短命インスタンスや揮発させて構わない用途では既定のまま
第10章:ヒヤリハット
現場ヒヤリハット:logrotate 設定漏れで /var/log がディスクを食い尽くしてサービス停止
あるサービスでアプリ用の独自ログを /var/log/myapp/access.log に出力するようにした。アプリは正しく動作し、誰もログ周りを気にしていなかった。半年後の朝、突然サービスが応答を返さなくなった。
調査の第一歩は df -h。
$ df -h /var
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/... 20G 20G 0G 100% /var
/var が 100% で埋まっていた。du -sh /var/log/* で内訳を見ると /var/log/myapp/access.log が 18GB。logrotate の設定を作っていなかった ので、access.log は半年間ローテーションなしで肥大化し続けていた。アプリは「ログを書こうとして write に失敗 → ハング」していた。
応急対応:truncate -s 0 /var/log/myapp/access.log(プロセスが掴んでいるファイルは rm しても容量が戻らないため)→ サービス再起動。
恒久対応:/etc/logrotate.d/myapp を作成。
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 myapp myapp
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
教訓:
- 新規アプリを導入したら、設定ファイルを置いたタイミングで 必ず logrotate 設定も一緒に追加する
- 追加後は
sudo logrotate -d /etc/logrotate.confで dry-run で構文と対象を確認 - 監視には
df -hをしきい値(80%等)でアラートに入れておく rmではなくtruncate -s 0。プロセスが掴んでいるファイル inode はrmしても解放されない
「ログを書くという最も基本の動作」が「サーバを止める」という最大の事故につながる典型例。logrotate は後回しにせず、新規アプリ導入の必須セットとして組み込むこと。
第11章:やってみよう
linuc-alma にログインして次の4つの演習を順に実行してください。所要時間は20〜30分です。すべて読み取りまたは logger による軽量な書き込みのみで、システム設定は変更しません。
演習1:journalctl のフィルタを試す
実行コマンド(linuc-alma):
$ journalctl -n 5 --no-pager
$ journalctl -u sshd -n 5 --no-pager
$ journalctl -p err -b --no-pager | head
$ journalctl --since "1 hour ago" -n 5 --no-pager
$ journalctl --disk-usage
$ journalctl --list-boots --no-pager
確認ポイント:
- 直近5件と、sshd 関連だけ、err 以上だけ、それぞれ違う結果が出る
- disk-usage で journal の容量が見える
- list-boots で最初のブート以降1つしかブートIDが無い(このVMは再起動していない/永続化していないため)
演習2:rsyslog の設定を読む
実行コマンド(linuc-alma):
$ cat /etc/rsyslog.conf | grep -v '^#' | grep -v '^$'
$ ls /etc/rsyslog.d/
$ sudo ls -la /var/log/{messages,secure,cron,maillog} 2>&1
$ sudo tail -3 /var/log/messages
$ sudo tail -3 /var/log/secure
確認ポイント:
- 7行の facility.severity ルールがどのファイルに何を書いているか
/etc/rsyslog.d/は空(パッケージ追加時にここにファイルが増える)- 主要ログの所有者は root、パーミッションは 0600
演習3:logger でシェルから書く
実行コマンド(linuc-alma):
$ logger -p user.notice -t my-test "Hello from $(whoami)"
$ logger -p user.err -t my-test "Error simulation"
$ journalctl -t my-test -n 3 --no-pager
$ sudo tail -10 /var/log/messages | grep my-test
確認ポイント:
- journalctl と /var/log/messages の 両方 に同じメッセージが届く
- タグ
my-testが表示される - これが「logger → journald → rsyslog → /var/log/messages」の2層構造
演習4:logrotate を読む(dry-run)
実行コマンド(linuc-alma):
$ cat /etc/logrotate.conf | grep -v '^#' | grep -v '^$' | head -10
$ ls /etc/logrotate.d/
$ cat /etc/logrotate.d/rsyslog
$ sudo logrotate -d /etc/logrotate.conf 2>&1 | head -30
確認ポイント:
- 既定は週次・4世代・dateext
/etc/logrotate.d/rsyslogに主要ログのローテーション設定があるlogrotate -dの出力に「reading config file …」が並び、設定が解析できている
困ったらマニュアルを引きます。man journalctl man systemd.journal-fields man rsyslog.conf man logger man systemd-cat man logrotate。journalctl --help でオプションの俯瞰、logger --help で簡易ヘルプもあります。
理解度チェック
次の5問を ○×で答えてください。解答は記事末尾にあります。
- systemd-journald はテキスト形式でログを保存する。
journalctl -p errは err(数値3)以上の優先度、つまり err / crit / alert / emerg を表示する。/etc/rsyslog.confでmail.* /var/log/maillogと書くと、mail に関する全 severity が /var/log/maillog に書かれる。- リモート syslog 転送で TCP を使う書式は
@host:514(@ 1つ)である。 logger -t mytag "hello"で書いたメッセージはjournalctl -t mytagでも/var/log/messagesでも見つかる。
解答
- ×(バイナリ形式。テキスト形式は rsyslog 側の /var/log/messages 等)
- ○(severity は emerg(0)〜debug(7) で、
-p errは数値 3 以下、つまり emerg / alert / crit / err) - ○(
mail.*は mail facility の全 severity) - ×(@ 1つは UDP。TCP は @@ 2つ)
- ○(rsyslog が imjournal で journald から取り込み /var/log/messages に書き出すため)
次回予告
次回(第8回)は 「メール配送エージェント(MTA)の基本 — postfix の動作確認」 です。MTA / MUA / MDA の役割の違い、postfix の最小構成、mail コマンド、メールキューの確認(mailq)と再配送(postqueue -f)を扱います。今回学んだ /var/log/maillog が育つ現場を見ることができます。
LinuC 102 試験対策シリーズ(全12回)
- シェル環境のカスタマイズ:環境変数・エイリアス・履歴・ロケール
- Bashスクリプト入門:if/for/関数で書く現場の自動化スクリプト
- ネットワーク基礎:TCP/IP・ip コマンド・NetworkManager
- ネットワークトラブルシューティングとDNSクライアント設定
- ユーザ・グループ管理と sudo 設定の実務(useradd, visudo)
- ジョブスケジューリングと時刻管理:cron, systemd timer, chrony, NTP
- ログ管理実践:journalctl と rsyslog の使い分け
- メール配送エージェント(MTA)の基本:postfix の動作確認
- ファイアウォール(firewalld / ufw)と SELinux 入門
- 暗号化によるデータ保護:SSH鍵認証・GnuPG・OpenSSL
- クラウドセキュリティの基礎:IAM・公開鍵管理・SSH踏み台構成
- オープンソースの文化:主要ライセンス(GPL/MIT/Apache)とコミュニティ
