RHEL 上級 #5 セキュリティ強化 — auditd、OpenSCAP、FIPS

#4 SELinux 上級 で 1 つのドメインをどう束ねるかを見ました。この記事はその上、マシン全体をコンプライアンス/監査の観点で強化する領域です。システムに起きたあらゆる変化を漏れなく記録する auditd、業界標準に合わせてシステムを自動点検し自動修正する OpenSCAP、政府/金融認証で要求される FIPS モードを 1 サイクルで扱います。

RHEL 上級 シリーズでこの記事の位置:

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 0

enabled 1 ならオン状態。SELinux 拒否 (#4) も結局 auditd に落ちるイベントです。

デフォルトログ位置 #

/var/log/audit/audit.log
$ 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 ...

直接読むのは難しいです。ausearchaureport が標準の照会ツール。

ルール作成 — /etc/audit/rules.d/ #

ランタイム限定は auditctl 1 行、永続適用は /etc/audit/rules.d/*.rules

/etc/audit/rules.d/00-defaults.rules
# 通常先頭に書く整備項目
-D
-b 8192
-f 1
オプション意味
-D既存ルールをすべて削除 (再起動時に綺麗な状態)
-b 8192バックログ上限
-f 1失敗時動作 (0=静か、1=printk、2=panic)
/etc/audit/rules.d/10-watch.rules
# /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 単位ルール #

特定システムコール呼び出しのたびに記録。

/etc/audit/rules.d/20-actions.rules
# 全ユーザ/グループ変更試行
-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,exitalways (フィルタ通過時に常に記録)、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 -l

augenrules --load/etc/audit/rules.d/ のファイルをアルファベット順にまとめて適用します。

変更不可モード — -e 2 #

ルールをロックして再起動まで変えられないようにするオプション。コンプライアンス環境で必須。

/etc/audit/rules.d/99-finalize.rules
-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 の主要キー:

/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_l1CIS Benchmark — 最も一般的
pci-dssカード決済 (PCI-DSS)
stig米国防総省 — DISA STIG
hipaa米医療
cui米政府 非分類管理情報
anssi_bp28_highフランス ANSSI

点検実行 #

CIS プロファイルで点検
$ 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.xml

report.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 で入っている場合に即座に切断されるパターンが含まれます。標準フロー:

  1. dry-run--results-arf arf.xml --report report.html のみ (修正なし)
  2. レポート確認、影響評価
  3. remediation スクリプト抽出oscap xccdf generate fix --result-id ... arf.xml > fix.sh
  4. スクリプト確認後に段階的適用

Ansible playbook として抽出 #

ansible 形式
$ 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 セクションでプロファイルを指定します。

Kickstart 抜粋
%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 を提供します。

有効化 #

FIPS モードを有効化
$ sudo fips-mode-setup --enable
$ sudo reboot

# 確認
$ sudo fips-mode-setup --check
FIPS mode is enabled.

$ cat /proc/sys/crypto/fips_enabled
1

fips-mode-setup --enable が内部で次を行います:

  1. dracut 設定に fips モジュールを含める
  2. initramfs 再生成
  3. GRUB 引数 fips=1 追加
  4. 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 サイクルで扱います。

X