本記事には広告(アフィリエイトリンク)が含まれます。

AlmaLinux 9 セキュリティ強化リファレンス

AlmaLinux 9 を企業のサーバー運用で使う場合、OS インストール直後のデフォルト設定のままでは防御が不十分です。本記事では、暗号化ポリシーの統一管理から不要サービスの無効化、カーネルパラメータによるハードニング(OS レベルの防御強化)、ブルートフォース対策、ファイル整合性チェック、監査ログ、SELinux のポリシー管理、OpenSCAP(CIS Benchmark 等のセキュリティ基準に対する自動スキャンツール)によるコンプライアンスチェックまでを、企業のハードニング要件に沿って手順化しています。外部からの防御→内部の監視→コンプライアンスチェックの順に進めます。

コマンド早見表

目的コマンド
暗号化ポリシー確認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 プロファイル …

前提条件

項目
OSAlmaLinux 9.6(Sage Margay)
SELinuxEnforcing
暗号化ポリシーDEFAULT
AIDE0.16
fail2ban1.1.0(EPEL)
OpenSCAP1.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-1RSA最小鍵長用途
LEGACYTLS 1.0許可1024bit古いシステムとの互換性が必要な場合
DEFAULTTLS 1.2許可(署名のみ)2048bit標準的な運用(インストール直後の設定)
FUTURETLS 1.2禁止3072bit将来の脅威に備えた厳格な設定
FIPSTLS 1.2禁止2048bitFIPS 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-daemonmDNS/DNS-SD(自動検出)企業ネットワークでは DNS を使う
bluetoothBluetooth デバイス管理サーバーに Bluetooth デバイスは不要
rpcbindRPC ポートマッピング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_filter1送信元アドレスの逆引き検証を行い、IP スプーフィングを防ぐ
net.ipv4.conf.all.accept_redirects0ICMP リダイレクトを無視し、MITM(中間者攻撃)を防ぐ
net.ipv4.conf.all.send_redirects0ICMP リダイレクトの送信を停止する
net.ipv4.conf.all.log_martians1送信元が不正なパケットをログに記録する
net.ipv4.icmp_echo_ignore_broadcasts1ブロードキャスト宛の ping を無視し、Smurf 攻撃を防ぐ
kernel.randomize_va_space2ASLR(Address Space Layout Randomization)を有効化し、メモリ上のアドレス配置をランダム化してバッファオーバーフロー攻撃を緩和する
kernel.dmesg_restrict1一般ユーザーからの dmesg 閲覧を制限し、カーネル情報の漏洩を防ぐ
fs.suid_dumpable0SUID プロセスのコアダンプを禁止し、特権情報の漏洩を防ぐ

設定を反映する

実行コマンド:

# 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_changessudo 設定権限昇格設定の変更追跡
-w /etc/ssh/sshd_config -p wa -k sshd_config_changesSSH 設定SSH 設定変更の追跡
-w /var/log/lastlog -p wa -k loginsログイン記録ログイン記録の改ざん検知
-a always,exit -F arch=b64 -S execve -F euid=0 -k privileged_cmdsroot 実行コマンド特権操作の全記録

切り戻しは /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 EnforcingEnforcing モードで稼働し、必要なポリシーを追加している本記事 第8章
暗号化ポリシーDEFAULT 以上のポリシーを適用している本記事 第1章
fail2banSSH に対するブルートフォース対策が有効になっている本記事 第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.localignoreip に管理用 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/ に配置した設定ファイルが正しく読み込まれているかを、上記コマンドの出力で確認してください。

AlmaLinux 9 総合リファレンスガイド シリーズ一覧

  1. システム基本情報の確認
  2. 初期設定
  3. ネットワーク設定(nmcli)
  4. パッケージ管理(dnf)
  5. ユーザー・グループ管理
  6. ファイアウォール(firewalld)
  7. SSH設定・鍵認証
  8. systemd / サービス管理
  9. ストレージ・LVM
  10. ログ管理(journalctl / rsyslog)
  11. cron / systemd timer
  12. セキュリティ強化(この記事)
  13. パフォーマンス監視
  14. コンテナ管理(Podman)
  15. バックアップ・リストア