RHEL 上級 #5 セキュリティ強化 — auditd、OpenSCAP、FIPS
#4 SELinux 上級 で 1 つのドメインをどう束ねるかを見ました。この記事はその上、マシン全体をコンプライアンス/監査の観点で強化する領域です。システムに起きたあらゆる変化を漏れなく記録する auditd、業界標準に合わせてシステムを自動点検し自動修正する OpenSCAP、政府/金融認証で要求される FIPS モードを 1 サイクルで扱います。
RHEL 上級 シリーズでこの記事の位置:
- #1 ブートプロセス — GRUB2、dracut、レスキューモード
- #2 カーネルチューニング — sysctl、tuned、kdump
- #3 パフォーマンス分析 — sar、top/htop、iostat、vmstat、perf
- #4 SELinux 上級 — ポリシー作成と audit2allow
- #5 セキュリティ強化 — auditd、OpenSCAP、FIPS ← この記事
- #6 Subscription / Satellite / Insights
- #7 Cockpit による GUI 管理と Web Console
3 つのツールの位置づけ #
| ツール | 役割 | いつ使うか |
|---|---|---|
auditd | システムに起きた変化を記録 | 事後追跡、コンプライアンス証憑 |
OpenSCAP | セキュリティ標準の自動点検 + 修正 | 認証準備、定期監査 |
FIPS mode | 認証された暗号モジュールのみ使用 | 政府/金融契約の要求時 |
auditd は事が起きた後に「誰が何をしたか」を問うツール、OpenSCAP は「システムが標準に合っているか」を問うツール、FIPS は使える暗号アルゴリズム自体を制約するモードです。3 つを揃えてコンプライアンス要求を 1 サイクルで満たせます。
auditd — すべての変化のログ #
Linux カーネルの audit subsystem の上に乗るユーザ空間デーモン。RHEL 9 にデフォルトでインストールされ、ブート時に自動起動します。
$ sudo systemctl status auditd
$ sudo auditctl -s
enabled 1
failure 1
pid 1234
rate_limit 0
backlog_limit 8192
lost 0
backlog 0enabled 1 ならオン状態。SELinux 拒否 (#4) も結局 auditd に落ちるイベントです。
デフォルトログ位置 #
$ sudo tail /var/log/audit/audit.log
type=USER_LOGIN msg=audit(1714435200.123:1234): pid=2345 uid=0 ...
type=SYSCALL msg=audit(1714435201.456:1235): arch=c000003e syscall=2 success=yes ...直接読むのは難しいです。ausearch と aureport が標準の照会ツール。
ルール作成 — /etc/audit/rules.d/ #
ランタイム限定は auditctl 1 行、永続適用は /etc/audit/rules.d/*.rules。
# 通常先頭に書く整備項目
-D
-b 8192
-f 1| オプション | 意味 |
|---|---|
-D | 既存ルールをすべて削除 (再起動時に綺麗な状態) |
-b 8192 | バックログ上限 |
-f 1 | 失敗時動作 (0=静か、1=printk、2=panic) |
# /etc/passwd、/etc/shadow の変更監視
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k actions
-w /etc/sudoers.d/ -p wa -k actions
# SSH 設定変更監視
-w /etc/ssh/sshd_config -p wa -k sshd_config| オプション | 意味 |
|---|---|
-w <path> | watch — このパスへの変更を追跡 |
-p wa | 追跡する権限 (w=write、a=attribute change、r=read、x=execute) |
-k <key> | イベントに付けるタグ — 後で ausearch -k で照会 |
syscall 単位ルール #
特定システムコール呼び出しのたびに記録。
# 全ユーザ/グループ変更試行
-a always,exit -F arch=b64 -S setuid -S setgid -S setresuid -S setresgid -k privilege
# /sbin/insmod、/sbin/modprobe 実行時のモジュール読込追跡
-a always,exit -F path=/sbin/insmod -F perm=x -k modules
-a always,exit -F path=/sbin/modprobe -F perm=x -k modules| 部分 | 意味 |
|---|---|
-a always,exit | always (フィルタ通過時に常に記録)、exit (syscall 終了時点で) |
-F arch=b64 | アーキテクチャフィルタ (64-bit) |
-S <syscall> | 追跡する syscall |
-F path=... | パスフィルタ |
-k <key> | タグ |
ルール適用 #
# ルールファイルをまとめて /etc/audit/audit.rules にコンパイル
$ sudo augenrules --load
# あるいは再起動
$ sudo systemctl restart auditd
# 適用済みルールの確認
$ sudo auditctl -laugenrules --load が /etc/audit/rules.d/ のファイルをアルファベット順にまとめて適用します。
変更不可モード — -e 2 #
ルールをロックして再起動まで変えられないようにするオプション。コンプライアンス環境で必須。
-e 2-e 2 が適用されると、その後追加するルールはすべて拒否されます。必ずルールファイル群の最後に。
照会 — ausearch #
# キーで照会
$ sudo ausearch -k identity
# 時間範囲指定
$ sudo ausearch -k identity -ts today
$ sudo ausearch -k identity -ts 04/30/2026 09:00:00
# ユーザ指定
$ sudo ausearch -ua curtis -ts today
# 失敗した syscall のみ
$ sudo ausearch -sv no -ts today
# より親切な出力
$ sudo ausearch -k identity -i-i (interpret) が UID、syscall 番号などの数値を人が読める名前に変換します。
要約 — aureport #
$ sudo aureport --summary
$ sudo aureport -au # 認証試行
$ sudo aureport -l # ログインイベント
$ sudo aureport -f -i # ファイルイベント (解釈モード)
$ sudo aureport --failed # 失敗イベントのみ定期報告でよく使う 1 セット。
ログ保持と回転 #
/etc/audit/auditd.conf の主要キー:
log_file = /var/log/audit/audit.log
max_log_file = 100 # MB
num_logs = 10
max_log_file_action = ROTATE # KEEP_LOGS / ROTATE / SUSPEND
space_left = 200 # MB — この値以下で警告
space_left_action = SYSLOG
admin_space_left = 50 # MB — さらに下回ったら
admin_space_left_action = SUSPEND
disk_full_action = HALT # いっぱいになったらコンプライアンス環境では max_log_file_action = KEEP_LOGS に設定してログを絶対に失わないようにし、別収集システム (SIEM) に送るのが標準です。
OpenSCAP — セキュリティ標準の自動点検 #
SCAP (Security Content Automation Protocol) は NIST が定義したセキュリティ自動化標準。その上で動くツールが oscap です。RHEL は標準化されたセキュリティコンテンツを SCAP Security Guide パッケージで提供します。
$ sudo dnf install -y openscap-scanner scap-security-guide利用可能プロファイル #
$ ls /usr/share/xml/scap/ssg/content/
ssg-rhel9-ds.xml
...
$ sudo oscap info /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml | grep -E '^(Profile|Description)'
Profile: xccdf_org.ssgproject.content_profile_cis
Profile: xccdf_org.ssgproject.content_profile_cis_server_l1
Profile: xccdf_org.ssgproject.content_profile_pci-dss
Profile: xccdf_org.ssgproject.content_profile_stig
Profile: xccdf_org.ssgproject.content_profile_hipaa
Profile: xccdf_org.ssgproject.content_profile_cui
Profile: xccdf_org.ssgproject.content_profile_anssi_bp28_high
...| プロファイル | 誰が要求するか |
|---|---|
cis / cis_server_l1 | CIS Benchmark — 最も一般的 |
pci-dss | カード決済 (PCI-DSS) |
stig | 米国防総省 — DISA STIG |
hipaa | 米医療 |
cui | 米政府 非分類管理情報 |
anssi_bp28_high | フランス ANSSI |
点検実行 #
$ sudo oscap xccdf eval \
--profile xccdf_org.ssgproject.content_profile_cis \
--results-arf arf.xml \
--report report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xmlreport.html をブラウザで開くと人が読みやすいレポートが見えます。通過/失敗したルール、各ルールの説明、修正方法、そして bash または ansible 形式の自動修正スクリプトまで入っています。
結果カテゴリ #
| 結果 | 意味 |
|---|---|
pass | 通過 |
fail | 失敗 — 標準未準拠 |
notapplicable | このシステムに該当なし |
notchecked | 自動点検不可 (手動確認必要) |
自動修正 — remediation #
スキャン時に --remediate オプションを渡すと失敗ルールを自動修正します。
$ sudo oscap xccdf eval \
--profile xccdf_org.ssgproject.content_profile_cis \
--remediate \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml本番マシンで一度に --remediate を回すのは危険です。失敗ルールに sshd_config の PermitRootLogin no のような、作業者本人が root SSH で入っている場合に即座に切断されるパターンが含まれます。標準フロー:
- dry-run —
--results-arf arf.xml --report report.htmlのみ (修正なし) - レポート確認、影響評価
- remediation スクリプト抽出 —
oscap xccdf generate fix --result-id ... arf.xml > fix.sh - スクリプト確認後に段階的適用
Ansible playbook として抽出 #
$ sudo oscap xccdf generate fix \
--profile xccdf_org.ssgproject.content_profile_cis \
--fix-type ansible \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml \
> cis-remediate.yml生成された cis-remediate.yml を Ansible で実行すると同じ修正を多数のマシンに一貫して適用可能。RHCE トラックで再会するフロー。
インストール時に適用 — Kickstart #
サーバを新規構築するときから標準に合わせるには、Kickstart の %addon org_fedora_oscap セクションでプロファイルを指定します。
%addon org_fedora_oscap
content-type = scap-security-guide
profile = xccdf_org.ssgproject.content_profile_cis
%endインストール最終段階で OpenSCAP が自動で回るフロー。RHEL Image Builder で統合イメージを作るときも同じやり方です。
FIPS — 認証された暗号モジュールのみ #
FIPS (Federal Information Processing Standards) 140-2/140-3 は米政府が認める暗号モジュールの要件。政府/金融/医療契約で要求される場合が多いです。RHEL 9 は認証された OpenSSL/NSS/libgcrypt を提供します。
有効化 #
$ sudo fips-mode-setup --enable
$ sudo reboot
# 確認
$ sudo fips-mode-setup --check
FIPS mode is enabled.
$ cat /proc/sys/crypto/fips_enabled
1fips-mode-setup --enable が内部で次を行います:
dracut設定に fips モジュールを含めるinitramfs再生成- GRUB 引数
fips=1追加 - SSH ホスト鍵が FIPS 非対応ならバックアップ後に再生成
再起動後に適用されます。
何が変わるか #
- MD5、RC4、DES、3DES、Blowfish 等の弱いアルゴリズム使用拒否
- SHA-1 のデジタル署名用途を拒否 (ハッシュ単純比較は一部許可)
- SSH が弱い鍵交換/暗号を拒否 — 一部クライアント互換性に影響
- Java が BC-FIPS provider で動作 — 一部ライブラリに影響
- TLS 1.0/1.1 拒否、TLS 1.2/1.3 のみ
- 自前コンパイルの OpenSSL 等の迂回路 を遮断
運用に与える影響が大きいので有効化前に必ず互換性テストを。
FIPS とコンテナ #
ホストが FIPS モードならコンテナ内でもホストカーネルの crypto API を経由する呼び出しはすべて FIPS 制約下で動作します。コンテナ内 OpenSSL が独自アルゴリズムを使う場合は別の話。RHEL UBI の FIPS ビルド (ubi9/ubi-minimal + FIPS モジュール) が標準。
無効化 #
$ sudo fips-mode-setup --disable
$ sudo reboot運用中に有効/無効を頻繁に切り替えると鍵や証明書が壊れるリスクがあるので、一度決めたら維持するのが標準です。
3 つを束ねた運用フロー #
| 段階 | ツール | 成果物 |
|---|---|---|
| 1. マシン構築 | Kickstart + OpenSCAP CIS プロファイル | 標準に合わせた初期状態 |
| 2. 運用開始 | auditd ルール適用 + -e 2 ロック | あらゆる変化を記録 |
| 3. 定期監査 | OpenSCAP 毎週自動実行 → レポート | 標準逸脱を通知 |
| 4. 変更追跡 | ausearch / aureport | 誰が何をしたか |
| 5. 認証要件 | FIPS モード有効化 | 弱いアルゴリズムを遮断 |
各段階が次の段階を補強します。OpenSCAP で見つけた弱点を auditd で追跡し、FIPS でアルゴリズム自体を縛り、変化を監査ログで証憑。
よくある落とし穴 #
- auditd ルールファイルに
-e 2漏れ — 本番でルールを任意に変更可能。コンプライアンス環境の常連の指摘事項。 auditdディスクが満杯になりシステム停止 —disk_full_action = HALTがデフォルトの可能性。SIEM 連携または別ディスク/パーティション推奨。- OpenSCAP
--remediateを本番で直接 — sshd が切れたりユーザがロックされる可能性。dry-run → 確認 → 段階的に。 - FIPS 有効化後に突然ビルド失敗 — Java ビルド、Python
hashlib.md5(usedforsecurity=False)のように呼び出しサイトの修正が必要な場合。CI 環境で先に検証。 - ホストだけ FIPS、コンテナは非 FIPS イメージ — コンテナ内 OpenSSL が独自アルゴリズムで弱い暗号を使う可能性。UBI FIPS ビルド使用。
- SCAP レポートの
notcheckedを無視 — 自動点検不可なだけで手動確認必要な項目。認証時には必ず別途証憑。 - auditd ルールが多すぎる — すべての syscall を追跡するとパフォーマンス低下 + ディスク爆発。コンプライアンス標準が要求する最小集合のみ。
覚えておくコマンド #
| 作業 | コマンド |
|---|---|
| auditd 状態 | sudo auditctl -s |
| ルール適用 | sudo augenrules --load |
| ルール確認 | sudo auditctl -l |
| キーで照会 | sudo ausearch -k <key> -ts today -i |
| 要約レポート | sudo aureport --summary |
| OpenSCAP 点検 | sudo oscap xccdf eval --profile <id> --report report.html <ds.xml> |
| 自動修正 | sudo oscap xccdf eval --profile <id> --remediate <ds.xml> |
| Ansible 抽出 | sudo oscap xccdf generate fix --fix-type ansible --profile <id> <ds.xml> |
| FIPS 有効化 | sudo fips-mode-setup --enable && sudo reboot |
| FIPS 確認 | sudo fips-mode-setup --check / cat /proc/sys/crypto/fips_enabled |
まとめ #
- auditd — システム変化の記録装置。
/etc/audit/rules.d/に watch (-w) + syscall (-a) ルールを置きaugenrules --load。最後に-e 2でロック。照会はausearch -k、要約はaureport。 - OpenSCAP — 標準 (CIS、STIG、PCI-DSS、HIPAA など) 自動点検 + 自動修正。
oscap xccdf evalで HTML レポート、Ansible playbook を抽出して段階的に適用するのが推奨。 - FIPS モード — 認証された暗号モジュールのみ使用。
fips-mode-setup --enable後に再起動。弱いアルゴリズム拒否、TLS 1.2/1.3 のみ、SSH/Java 互換性に注意。 - 3 つを束ねて — 構築 (OpenSCAP) → 変化記録 (auditd) → 定期監査 (OpenSCAP) → 認証要件 (FIPS) のサイクル。
- 運用上の落とし穴の核心 —
-e 2ロック、ディスク満杯処理、OpenSCAP--remediateを直接適用しません。
次回はセキュリティから一歩離れ、RHEL の サブスクリプションと運用ツール です。Subscription Manager と Satellite、そしてクラウドマネージド SaaS の Insights を 1 サイクルで扱います。