AlmaLinux 9 を企業のサーバー運用で使う場合、OS インストール直後のデフォルト設定のままでは防御が不十分です。本記事では、暗号化ポリシーの統一管理から不要サービスの無効化、カーネルパラメータによるハードニング(OS レベルの防御強化)、ブルートフォース対策、ファイル整合性チェック、監査ログ、SELinux のポリシー管理、OpenSCAP(CIS Benchmark 等のセキュリティ基準に対する自動スキャンツール)によるコンプライアンスチェックまでを、企業のハードニング要件に沿って手順化しています。外部からの防御→内部の監視→コンプライアンスチェックの順に進めます。
- コマンド早見表
- 前提条件
- 1. 暗号化ポリシーの統一管理(update-crypto-policies)
- 2. 不要サービスの無効化とポート確認
- 3. カーネルパラメータによるハードニング(sysctl)
- 4. ブルートフォース対策(fail2ban)
- 5. 自動セキュリティアップデート(dnf-automatic)
- 6. ファイル整合性チェック(AIDE)
- 7. 監査ログの強化(auditd)
- 8. SELinux の実践的ポリシー管理
- 9. 物理・起動時セキュリティ
- 10. TCP Wrappers の廃止と代替手段
- 11. セキュリティスキャン(OpenSCAP)
- 12. セキュリティ強化チェックリスト
- 13. トラブルシューティング
- AlmaLinux 9 総合リファレンスガイド シリーズ一覧
コマンド早見表
| 目的 | コマンド |
|---|---|
| 暗号化ポリシー確認 | update-crypto-policies –show |
| 暗号化ポリシー変更 | update-crypto-policies –set FUTURE |
| 稼働中サービス一覧 | systemctl list-units –type=service –state=running |
| リッスンポート確認 | ss -tlnp |
| サービス無効化 | systemctl disable –now サービス名 |
| sysctl 設定再読み込み | sysctl –system |
| fail2ban 状態確認 | fail2ban-client status sshd |
| fail2ban 手動解除 | fail2ban-client set sshd unbanip IP |
| dnf-automatic 通知のみ | systemctl enable –now dnf-automatic-notifyonly.timer |
| AIDE 初期DB作成 | aide –init |
| AIDE 整合性チェック | aide –check |
| auditd ルール確認 | auditctl -l |
| 監査ログ検索 | ausearch -k キー名 |
| SELinux ブール値確認 | getsebool -a |
| SELinux コンテキスト復元 | restorecon -Rv パス |
| OpenSCAP スキャン | oscap xccdf eval –profile プロファイル … |
前提条件
| 項目 | 値 |
|---|---|
| OS | AlmaLinux 9.6(Sage Margay) |
| SELinux | Enforcing |
| 暗号化ポリシー | DEFAULT |
| AIDE | 0.16 |
| fail2ban | 1.1.0(EPEL) |
| OpenSCAP | 1.3.13 |
| 実行ユーザー | root 権限 |
1. 暗号化ポリシーの統一管理(update-crypto-policies)
AlmaLinux 9 では、システム全体の暗号化アルゴリズムを update-crypto-policies で一括管理できます。SSH だけでなく、OpenSSL(TLS 通信)、GnuTLS、NSS、IPsec(Libreswan)など、暗号化ライブラリを使うすべてのアプリケーションに適用されるため、個別設定の漏れを防げます。SSH設定編では SSH 単体の暗号化設定を扱いましたが、ここではシステム全体への影響を含めた管理方法を解説します。
現在のポリシーを確認する
実行コマンド:
# update-crypto-policies --show
実行結果:
DEFAULT
DEFAULT は、AlmaLinux 9 のインストール直後に適用されるポリシーです。現在の主要な暗号化要件を満たしつつ、互換性も確保しています。
ポリシーレベルの比較
| ポリシー | 最小TLSバージョン | SHA-1 | RSA最小鍵長 | 用途 |
|---|---|---|---|---|
| LEGACY | TLS 1.0 | 許可 | 1024bit | 古いシステムとの互換性が必要な場合 |
| DEFAULT | TLS 1.2 | 許可(署名のみ) | 2048bit | 標準的な運用(インストール直後の設定) |
| FUTURE | TLS 1.2 | 禁止 | 3072bit | 将来の脅威に備えた厳格な設定 |
| FIPS | TLS 1.2 | 禁止 | 2048bit | FIPS 140-2 準拠が求められる環境 |
ポリシーを FUTURE に変更する
セキュリティを強化する場合は FUTURE ポリシーが有効です。SHA-1 の使用を禁止し、RSA の最小鍵長を 3072bit に引き上げます。
実行コマンド:
# update-crypto-policies --set FUTURE
実行結果:
Setting system policy to FUTURE
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.
変更後はシステムを再起動して、すべてのサービスに新しいポリシーを反映させてください。
FUTURE ポリシーの適用前に確認すること
FUTURE ポリシーを適用すると、SHA-1 証明書を使っている古いクライアントや、2048bit RSA 鍵を使用している接続先との通信が失敗します。適用前に、接続先の証明書や鍵長を確認してください。切り戻しは update-crypto-policies --set DEFAULT で元に戻せます。
サブポリシーで個別の制限を追加する
ポリシーレベル全体を変えずに、特定のアルゴリズムだけを無効化することもできます。たとえば DEFAULT ポリシーを維持しつつ SHA-1 だけを禁止するには、以下のように指定します。
実行コマンド:
# update-crypto-policies --set DEFAULT:NO-SHA1
コロン区切りでサブポリシーモジュールを指定します。利用可能なサブポリシーは /usr/share/crypto-policies/policies/modules/ に配置されています。
カスタムポリシーモジュールを作成する
自社のセキュリティ基準に合わせたカスタムモジュールを作成する場合は、/etc/crypto-policies/policies/modules/ にファイルを配置します。たとえば CBC モードの暗号を無効化するモジュールを作成する例です。
設定ファイル /etc/crypto-policies/policies/modules/NO-CBC.pmod:
cipher = -AES-128-CBC -AES-256-CBC
実行コマンド:
# update-crypto-policies --set DEFAULT:NO-CBC
切り戻しは update-crypto-policies --set DEFAULT でカスタムモジュールの適用を解除できます。
2. 不要サービスの無効化とポート確認
サーバーで稼働するサービスは、業務に必要なものだけに絞ることが原則です。不要なサービスが動いていると、攻撃対象が増え、脆弱性が発見された場合のリスクも高くなります。
稼働中サービスの確認
実行コマンド:
# systemctl list-units --type=service --state=running
実行結果(抜粋):
UNIT LOAD ACTIVE SUB DESCRIPTION
auditd.service loaded active running Security Auditing Service
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
dbus-broker.service loaded active running D-Bus System Message Bus
firewalld.service loaded active running firewalld - dynamic firewall daemon
NetworkManager.service loaded active running Network Manager
sshd.service loaded active running OpenSSH server daemon
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running User Login Management
systemd-udevd.service loaded active running Rule-based Manager for Device Events
リッスンポートの確認
外部からアクセス可能なポートを確認します。意図しないポートが開いていないかを確かめます。
実行コマンド:
# ss -tlnp
実行結果:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=4))
この例では SSH(ポート 22)のみがリッスンしています。最小構成では正常な状態です。
企業サーバーで不要になりやすいサービス
| サービス名 | 機能 | サーバーで不要な理由 |
|---|---|---|
| cups | 印刷サービス | サーバーから印刷することはない |
| avahi-daemon | mDNS/DNS-SD(自動検出) | 企業ネットワークでは DNS を使う |
| bluetooth | Bluetooth デバイス管理 | サーバーに Bluetooth デバイスは不要 |
| rpcbind | RPC ポートマッピング | NFS を使わないなら不要 |
| ModemManager | モデム管理 | サーバーにモデムは接続しない |
| sssd | リモート認証 | AD/LDAP 連携しない場合は不要 |
サービスの無効化
disable --now でサービスの停止と自動起動の無効化を同時に行います。
実行コマンド:
# systemctl disable --now cups
将来的にも誤って起動されないようにするには、mask を使います。mask されたサービスは systemctl start でも起動できなくなります。
実行コマンド:
# systemctl mask cups
切り戻しは systemctl unmask cups && systemctl enable --now cups で元に戻せます。
3. カーネルパラメータによるハードニング(sysctl)
カーネルパラメータを調整することで、IP スプーフィング(送信元 IP の偽装)や MITM(中間者攻撃)、Smurf 攻撃(ブロードキャストを悪用した DoS 攻撃)など、ネットワーク層の攻撃への耐性を高められます。設定は /etc/sysctl.d/ ディレクトリにファイルを配置して管理します。
デフォルト値の確認
変更前に現在の値を確認しておきます。
実行コマンド:
# sysctl net.ipv4.conf.all.accept_redirects net.ipv4.conf.all.rp_filter net.ipv4.conf.all.log_martians net.ipv4.tcp_syncookies net.ipv4.ip_forward
実行結果:
net.ipv4.conf.all.accept_redirects = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
accept_redirects = 1(ICMP リダイレクト受け入れが有効)、rp_filter = 0(送信元アドレス検証が無効)など、デフォルトではセキュリティ上望ましくない設定があります。
ハードニング設定ファイルの作成
設定ファイル /etc/sysctl.d/99-hardening.conf:
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
kernel.randomize_va_space = 2
kernel.dmesg_restrict = 1
fs.suid_dumpable = 0
各パラメータの役割は以下の通りです。
| パラメータ | 値 | 役割 |
|---|---|---|
| net.ipv4.conf.all.rp_filter | 1 | 送信元アドレスの逆引き検証を行い、IP スプーフィングを防ぐ |
| net.ipv4.conf.all.accept_redirects | 0 | ICMP リダイレクトを無視し、MITM(中間者攻撃)を防ぐ |
| net.ipv4.conf.all.send_redirects | 0 | ICMP リダイレクトの送信を停止する |
| net.ipv4.conf.all.log_martians | 1 | 送信元が不正なパケットをログに記録する |
| net.ipv4.icmp_echo_ignore_broadcasts | 1 | ブロードキャスト宛の ping を無視し、Smurf 攻撃を防ぐ |
| kernel.randomize_va_space | 2 | ASLR(Address Space Layout Randomization)を有効化し、メモリ上のアドレス配置をランダム化してバッファオーバーフロー攻撃を緩和する |
| kernel.dmesg_restrict | 1 | 一般ユーザーからの dmesg 閲覧を制限し、カーネル情報の漏洩を防ぐ |
| fs.suid_dumpable | 0 | SUID プロセスのコアダンプを禁止し、特権情報の漏洩を防ぐ |
設定を反映する
実行コマンド:
# sysctl --system
実行結果(末尾部分):
* Applying /etc/sysctl.d/99-hardening.conf ...
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
kernel.randomize_va_space = 2
kernel.dmesg_restrict = 1
fs.suid_dumpable = 0
sysctl --system は /etc/sysctl.d/、/run/sysctl.d/、/usr/lib/sysctl.d/ の全設定ファイルを再読み込みします。
切り戻しは設定ファイル /etc/sysctl.d/99-hardening.conf を削除してから sysctl --system を実行するか、個別に元の値を設定します(例: sysctl -w net.ipv4.conf.all.rp_filter=0)。
4. ブルートフォース対策(fail2ban)
fail2ban は、ログファイルを監視して、認証失敗が一定回数を超えた IP アドレスを自動で遮断するツールです。SSH へのブルートフォース攻撃(パスワードの総当たり攻撃)対策として導入します。
インストール
fail2ban は EPEL リポジトリから提供されています。
実行コマンド:
# dnf install -y epel-release
実行コマンド:
# dnf install -y fail2ban fail2ban-firewalld
fail2ban-firewalld パッケージを併せてインストールすると、ban アクションが firewalld と連携します。iptables ではなく firewalld のルールで遮断されるため、ファイアウォール編の設定と一貫性を保てます。
jail.local の作成
/etc/fail2ban/jail.conf はパッケージ更新で上書きされるため、直接編集しません。jail.local に設定を記述します。
設定ファイル /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = firewallcmd-rich-rules[actiontype=]
banaction_allports = firewallcmd-rich-rules[actiontype=]
[sshd]
enabled = true
port = ssh
logpath = /var/log/secure
backend = auto
各設定値の意味は以下の通りです。
- bantime = 3600:ban 期間は 3600 秒(1 時間)
- findtime = 600:600 秒(10 分)以内に
- maxretry = 3:3 回認証に失敗したら ban する
- banaction = firewallcmd-rich-rules:firewalld の rich rule で遮断する
fail2ban の起動と有効化
実行コマンド:
# systemctl enable --now fail2ban
状態の確認
実行コマンド:
# fail2ban-client status sshd
実行結果:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
Currently banned が現在 ban されている IP の数、Banned IP list に ban 中の IP アドレスが表示されます。
ban された IP を手動で解除する
自分の IP アドレスが誤って ban された場合は、別の接続経路(コンソール等)から以下のコマンドで解除します。
実行コマンド:
# fail2ban-client set sshd unbanip 192.168.1.100
自分の IP が ban されるのを防ぐ
jail.local の [DEFAULT] セクションに ignoreip = 127.0.0.1/8 192.168.1.0/24 のように管理用ネットワークを追加しておくと、そのネットワークからの接続は ban 対象外になります。ただし、その IP からの攻撃も素通りになるため、信頼できるネットワークのみを指定してください。
5. 自動セキュリティアップデート(dnf-automatic)
脆弱性が公開されてからパッチが適用されるまでの時間を短縮するために、dnf-automatic を導入します。企業の本番環境では自動適用ではなく通知のみとし、検証後に手動で適用するフローが一般的です。
インストール
実行コマンド:
# dnf install -y dnf-automatic
設定ファイルの編集
設定ファイル /etc/dnf/automatic.conf の主要な設定項目です。
[commands]
upgrade_type = security
apply_updates = no
[emitters]
emit_via = stdio
upgrade_type = security はセキュリティ関連のアップデートのみを対象にします。apply_updates = no はダウンロードのみ行い、自動適用はしない設定です。
タイマーの有効化
本番環境では通知のみのタイマーを使います。
実行コマンド:
# systemctl enable --now dnf-automatic-notifyonly.timer
検証環境で自動適用まで行いたい場合は、代わりに以下を使います。
実行コマンド:
# systemctl enable --now dnf-automatic-install.timer
本番環境では自動適用を避ける
自動適用を有効にすると、カーネルの更新など再起動が必要なパッチも自動で適用されます。意図しないタイミングでのサービス停止やアプリケーションの互換性問題を防ぐため、本番環境では通知のみ(dnf-automatic-notifyonly.timer)を使い、パッチ内容を確認してから手動で適用してください。
6. ファイル整合性チェック(AIDE)
AIDE(Advanced Intrusion Detection Environment)は、ファイルのハッシュ値やパーミッション、所有者などの情報をデータベースに記録し、後から変更がないかをチェックするツールです。設定ファイルの改ざんや不正なバイナリの配置を検知できます。
インストール
実行コマンド:
# dnf install -y aide
初期データベースの作成
AIDE を使い始めるには、まず現在のファイル状態をデータベースに記録します。
実行コマンド:
# aide --init
実行結果:
Start timestamp: 2026-03-25 10:00:00 +0900 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz
Number of entries: 45231
---------------------------------------------------
The attributes of the (checksums of the) databases(s):
---------------------------------------------------
/var/lib/aide/aide.db.new.gz
SHA256 : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
初期化には時間がかかる
aide --init はシステム全体のファイルをスキャンしてハッシュを計算するため、ファイル数やディスク性能によっては数分から十数分かかります。初回はサーバー構築時やメンテナンスウィンドウ内に実行してください。
データベースの配置
初期化で作成されたファイルをチェック用データベースとして配置します。
実行コマンド:
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
整合性チェックの実行
実行コマンド:
# aide --check
実行結果(変更がない場合):
Start timestamp: 2026-03-25 10:30:00 +0900 (AIDE 0.16)
AIDE found NO differences between database and filesystem. Looks okay!!
変更が検出された場合は、変更されたファイルのパス、属性の変化(サイズ、ハッシュ値、パーミッション等)が一覧で出力されます。
正当な変更後のデータベース更新
パッケージの更新や設定変更など、意図した変更を行った後は、データベースを更新して新しい状態を基準にします。
実行コマンド:
# aide --update
実行コマンド:
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
--update は現在のファイル状態と既存データベースを比較した結果を表示しつつ、新しいデータベースを生成します。生成後に mv で配置するのを忘れないでください。
監視対象のカスタマイズ
/etc/aide.conf で監視対象や除外対象を設定できます。一時ファイルやログファイルなど頻繁に変更されるディレクトリを除外すると、チェック時間の短縮と誤検知の削減に役立ちます。
!/var/log/.*
!/tmp/.*
!/var/tmp/.*
行頭の ! は除外を意味します。
cron での定期実行
AIDE チェックを毎日定時に実行し、結果をメールで受け取る設定例です。
設定ファイル /etc/cron.d/aide-check:
0 3 * * * root /usr/sbin/aide --check | /usr/bin/mail -s "AIDE Report $(hostname)" admin@example.corp
毎日 3:00 に AIDE チェックを実行し、結果を管理者にメール送信します。
7. 監査ログの強化(auditd)
auditd は Linux カーネルレベルの監査フレームワークです。ファイルへのアクセス、特権コマンドの実行、ユーザーの操作などを詳細に記録できます。セキュリティインシデントの調査や、コンプライアンス要件への対応に使います。
現在のルール確認
実行コマンド:
# auditctl -l
実行結果:
No rules
デフォルトではルールが設定されていないため、必要なルールを追加します。
ファイル監視ルールの追加
重要なファイルへの書き込みや属性変更を監視します。-w で監視対象ファイル、-p で監視するアクセス種別(w=書き込み、a=属性変更)、-k で検索用のキーを指定します。
実行コマンド:
# auditctl -w /etc/passwd -p wa -k passwd_changes
実行コマンド:
# auditctl -w /etc/shadow -p wa -k shadow_changes
実行コマンド:
# auditctl -w /etc/sudoers -p wa -k sudoers_changes
特権コマンドの監視
root 権限で実行されたすべてのコマンドを記録します。セキュリティインシデント時に「誰が何を実行したか」を追跡するために必要です。
実行コマンド:
# auditctl -a always,exit -F arch=b64 -S execve -F euid=0 -k privileged_cmds
-a always,exit はすべてのシステムコール終了時に記録、-F arch=b64 は 64bit アーキテクチャ、-S execve はコマンド実行のシステムコール、-F euid=0 は実効UID が root の場合に限定、という意味です。
恒久的なルール設定
auditctl で追加したルールは再起動すると消えます。恒久的に適用するには /etc/audit/rules.d/ にルールファイルを配置します。
設定ファイル /etc/audit/rules.d/hardening.rules:
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes
-a always,exit -F arch=b64 -S execve -F euid=0 -k privileged_cmds
ルールファイルを配置したら、auditd を再読み込みします。
実行コマンド:
# augenrules --load
監査ログの検索
ausearch コマンドでキーを指定してログを検索します。
実行コマンド:
# ausearch -k passwd_changes
実行結果(例):
----
time->Tue Mar 25 11:00:00 2026
type=CONFIG_CHANGE msg=audit(1711335600.123:456): auid=1000 ses=1 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=add_rule key="passwd_changes" list=4 res=1
レポートの生成
aureport コマンドで監査ログのサマリーを確認できます。
実行コマンド:
# aureport --summary
認証関連のレポートを確認する場合は以下を使います。
実行コマンド:
# aureport --auth
ログイン履歴のレポートは以下の通りです。
実行コマンド:
# aureport --login
実務で役立つ監査ルール
| ルール | 監視対象 | 用途 |
|---|---|---|
| -w /etc/passwd -p wa -k passwd_changes | ユーザー情報ファイル | ユーザーの追加・変更の追跡 |
| -w /etc/shadow -p wa -k shadow_changes | パスワードハッシュファイル | パスワード変更の追跡 |
| -w /etc/sudoers -p wa -k sudoers_changes | sudo 設定 | 権限昇格設定の変更追跡 |
| -w /etc/ssh/sshd_config -p wa -k sshd_config_changes | SSH 設定 | SSH 設定変更の追跡 |
| -w /var/log/lastlog -p wa -k logins | ログイン記録 | ログイン記録の改ざん検知 |
| -a always,exit -F arch=b64 -S execve -F euid=0 -k privileged_cmds | root 実行コマンド | 特権操作の全記録 |
切り戻しは /etc/audit/rules.d/hardening.rules を削除してから augenrules --load を実行します。
8. SELinux の実践的ポリシー管理
本シリーズの初期設定編では SELinux が Enforcing であることの確認方法を扱いました。この章では、SELinux が原因でサービスが動作しない場合に、Permissive に変更せずに問題を解決する手順を解説します。
ブール値による制御
SELinux のブール値は、特定の機能の許可/拒否をスイッチのように切り替える仕組みです。たとえば、httpd がネットワーク接続を行う必要がある場合は、以下のブール値を変更します。
実行コマンド:
# getsebool -a | grep httpd_can_network_connect
実行結果:
httpd_can_network_connect --> off
off になっているため、httpd からの外部ネットワーク接続は SELinux によって拒否されます。これを許可するには以下のコマンドを実行します。
実行コマンド:
# setsebool -P httpd_can_network_connect on
-P オプションを付けると再起動後も設定が永続化されます。切り戻しは setsebool -P httpd_can_network_connect off で元に戻せます。
セキュリティコンテキストの確認と復元
SELinux はファイルやプロセスに「セキュリティコンテキスト」というラベルを付けてアクセス制御を行います。ファイルを移動したりコピーしたりすると、コンテキストが不正になることがあります。
実行コマンド:
# ls -Z /var/www/html/
実行結果(コンテキストが正しい場合):
unconfined_u:object_r:httpd_sys_content_t:s0 index.html
プロセスのコンテキストを確認する場合は以下を使います。
実行コマンド:
# ps -eZ | grep httpd
コンテキストが不正な場合は restorecon で正しいコンテキストに復元します。
実行コマンド:
# restorecon -Rv /var/www/html/
-R は再帰的に処理、-v は変更内容を表示するオプションです。
Permissive にせずに SELinux の問題を解決する手順
SELinux が原因でサービスが動作しない場合の解決フローは以下の通りです。
手順 1: AVC 拒否ログを確認する
実行コマンド:
# ausearch -m avc -ts recent
手順 2: 原因を特定する
実行コマンド:
# ausearch -m avc -ts recent | audit2why
audit2why は AVC メッセージを解析し、拒否の原因と解決策を提示します。「was caused by: The boolean … was set incorrectly.」と表示された場合は、ブール値の変更で解決できます。
手順 3: ブール値で解決できるか確認する
audit2why の出力にブール値の変更が提案された場合は、setsebool -P で対応します。
手順 4: カスタムポリシーで解決する
ブール値では解決できない場合は、カスタムポリシーモジュールを生成して適用します。
実行コマンド:
# ausearch -m avc -ts recent | audit2allow -a -M mypolicy
実行コマンド:
# semodule -i mypolicy.pp
audit2allow は AVC ログから許可ルールを自動生成し、-M でコンパイル済みポリシーモジュール(.pp ファイル)を作成します。semodule -i でモジュールをインストールします。
SELinux を Permissive や Disabled にしない
SELinux を無効化すると、プロセスがファイルシステムやネットワークに無制限にアクセスできるようになります。脆弱性を突かれた場合の被害範囲が大幅に拡大するため、上記の手順で原因を特定し、必要最小限の許可ルールを追加する方法をとってください。切り戻しは semodule -r mypolicy でカスタムモジュールを削除できます。
9. 物理・起動時セキュリティ
ネットワーク経由の攻撃だけでなく、物理アクセスによるセキュリティリスクにも対策が必要です。データセンターに設置するサーバーでは、以下の設定を検討してください。
USB ストレージの無効化
USB メモリからの情報持ち出しや、不正なデバイスの接続を防ぎます。
設定ファイル /etc/modprobe.d/disable-usb-storage.conf:
install usb-storage /bin/true
この設定により、usb-storage カーネルモジュールのロード時に /bin/true(何もしないコマンド)が実行され、モジュールが読み込まれなくなります。切り戻しはこのファイルを削除します。
GRUB パスワード保護
GRUB ブートローダーにパスワードを設定し、起動パラメータの不正な変更を防ぎます。パスワード未設定の場合、物理アクセスがあればシングルユーザーモードで起動して root パスワードをリセットされるリスクがあります。
実行コマンド:
# grub2-setpassword
パスワードの入力を求められるので、設定するパスワードを入力します。設定後は GRUB メニューの編集時にパスワードが要求されるようになります。
ログインバナーの設定
不正アクセスに対する法的な警告文を表示するために、ログインバナーを設定します。
設定ファイル /etc/issue(ローカルログイン時に表示):
*** WARNING ***
This system is the property of example.corp.
Unauthorized access is prohibited and will be prosecuted.
設定ファイル /etc/motd(ログイン成功後に表示):
All activities on this system are monitored and recorded.
SSH 接続時のバナー設定についてはSSH設定編を参照してください。
10. TCP Wrappers の廃止と代替手段
RHEL 8 以降(AlmaLinux 9 を含む)では、tcp_wrappers パッケージが削除されています。従来 /etc/hosts.allow や /etc/hosts.deny でアクセス制御を行っていた場合、これらの設定ファイルを配置しても機能しません。
代替手段 1: firewalld の rich rule
特定の IP アドレスからの SSH 接続のみを許可する例です。
実行コマンド:
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
実行コマンド:
# firewall-cmd --reload
firewalld の詳細な設定方法についてはファイアウォール編を参照してください。
代替手段 2: systemd の IP アクセス制御
systemd のユニットファイルで IPAddressAllow / IPAddressDeny を使い、サービス単位でアクセス制御を行う方法もあります。
実行コマンド:
# systemctl edit sshd
エディタが開いたら以下を記述します。
[Service]
IPAddressAllow=192.168.1.0/24
IPAddressDeny=any
切り戻しは systemctl revert sshd でオーバーライド設定を削除できます。
11. セキュリティスキャン(OpenSCAP)
OpenSCAP は、CIS Benchmark(Center for Internet Security が策定するセキュリティ設定の基準)や DISA STIG(米国防情報システム局のセキュリティ技術実装ガイド)などのセキュリティ基準に対して、サーバーの設定がどの程度準拠しているかを自動でスキャンするツールです。
インストール
実行コマンド:
# dnf install -y openscap-scanner scap-security-guide
openscap-scanner がスキャンエンジン、scap-security-guide が AlmaLinux 9 向けのセキュリティプロファイル(ルール集)です。
バージョンと利用可能なプロファイルの確認
実行コマンド:
# oscap version
実行結果:
OpenSCAP command line tool (oscap) 1.3.13
利用可能なプロファイルを確認します。
実行コマンド:
# oscap info /usr/share/xml/scap/ssg/content/ssg-almalinux9-ds.xml
実行結果(抜粋):
Document type: Source Data Stream
Imported: 2026-01-15T00:00:00
Generated: 2026-01-15
Version: 0.1.75
Profiles:
Title: CIS AlmaLinux OS 9 Benchmark for Level 1 - Server
Id: xccdf_org.ssgproject.content_profile_cis
Title: CIS AlmaLinux OS 9 Benchmark for Level 2 - Server
Id: xccdf_org.ssgproject.content_profile_cis_server_l1
Title: ANSSI-BP-028 (enhanced)
Id: xccdf_org.ssgproject.content_profile_anssi_bp28_enhanced
CIS Benchmark の Level 1(基本的なセキュリティ設定)や Level 2(より厳格な設定)など、複数のプロファイルが利用できます。
スキャンの実行
CIS Benchmark Level 1 プロファイルでスキャンを実行し、結果を XML と HTML レポートで出力します。
実行コマンド:
# oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis --results /root/oscap-results.xml --report /root/oscap-report.html /usr/share/xml/scap/ssg/content/ssg-almalinux9-ds.xml
スキャン完了後、/root/oscap-report.html をブラウザで開くと、各チェック項目の Pass/Fail が一覧で確認できます。
レポートの読み方
HTML レポートには以下の情報が含まれています。
- Score:全体の準拠率(パーセンテージ)
- Rule Results:各ルールの Pass(合格)/ Fail(不合格)/ Not Applicable(該当なし)
- Description:各ルールの説明と根拠
- Remediation:Fail 項目の修正手順
全項目を Pass にする必要はない
OpenSCAP のスキャン結果で多数の Fail が出ることは珍しくありません。すべての項目に対応する必要はなく、自社のセキュリティポリシーや業務要件に合わせて優先度を判断してください。たとえば、USB ストレージの無効化が Fail になっていても、仮想マシン環境で物理 USB デバイスが接続できない場合は対応不要です。
12. セキュリティ強化チェックリスト
本記事および過去の記事で扱ったセキュリティ関連の設定を統合したチェックリストです。ハードニング作業の漏れ防止に活用してください。
| 項目 | 確認内容 | 参照先 |
|---|---|---|
| パスワードポリシー | 有効期限・最小文字数・複雑性が企業ポリシーに合致している | ユーザー管理編 |
| SSH 鍵認証 | パスワード認証を無効化し、鍵認証のみで運用している | SSH設定編 |
| SSH ポート変更 | デフォルトのポート 22 から変更している | SSH設定編 |
| firewalld | 必要なポートのみ許可し、不要なサービスを閉じている | ファイアウォール編 |
| SELinux Enforcing | Enforcing モードで稼働し、必要なポリシーを追加している | 本記事 第8章 |
| 暗号化ポリシー | DEFAULT 以上のポリシーを適用している | 本記事 第1章 |
| fail2ban | SSH に対するブルートフォース対策が有効になっている | 本記事 第4章 |
| auditd | 重要ファイルと特権コマンドの監査ルールが設定されている | 本記事 第7章 |
| AIDE | 初期データベースを作成し、定期チェックを実施している | 本記事 第6章 |
| 不要サービス | 業務に不要なサービスを停止・無効化している | 本記事 第2章 |
| カーネルハードニング | sysctl でネットワーク・メモリ保護のパラメータを設定している | 本記事 第3章 |
| セキュリティアップデート | dnf-automatic で通知または自動適用を設定している | 本記事 第5章 |
13. トラブルシューティング
fail2ban で自分の IP が ban された
SSH でパスワードを連続で間違えると、管理者自身の IP が ban される場合があります。サーバーのコンソール(物理コンソールや仮想マシンのコンソール機能)から接続し、以下のコマンドで解除します。
実行コマンド:
# fail2ban-client set sshd unbanip 192.168.1.100
再発防止として、jail.local の ignoreip に管理用 IP アドレスを追加してください。
SELinux でサービスが動かない
サービスの起動や動作が SELinux によって拒否されている場合は、まず AVC ログを確認します。
実行コマンド:
# ausearch -m avc -ts recent | audit2why
audit2why がブール値の変更を提案した場合は setsebool -P で対応します。提案がない場合は audit2allow でカスタムポリシーを生成してください。第8章の手順に沿って対応します。
AIDE –check で大量の変更が検出された
パッケージ更新(dnf update)を実行した後に aide --check を行うと、更新されたファイルがすべて変更として検出されます。これは正常な動作です。パッケージ更新後は以下の手順でデータベースを更新してください。
実行コマンド:
# aide --update
実行コマンド:
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
OpenSCAP で多数の Fail が出た
OpenSCAP のスキャン結果で Fail が多数出ることは、初回スキャンでは一般的です。すべての項目に対応する必要はありません。自社のセキュリティポリシーに照らして、対応が必要な項目を選定してください。HTML レポートの Remediation セクションに修正手順が記載されているため、優先度の高い項目から順に対応します。
sysctl の設定が再起動後に戻る
sysctl -w コマンドで設定した値は再起動すると元に戻ります。恒久的に設定するには、/etc/sysctl.d/ ディレクトリにファイルを配置してください。/etc/sysctl.conf への直接記述は非推奨です。
実行コマンド:
# sysctl --system
/etc/sysctl.d/ に配置した設定ファイルが正しく読み込まれているかを、上記コマンドの出力で確認してください。
