AlmaLinux 9 総合ガイド 第8章

第8章: セキュリティ設定と強化


8.1 SELinux(Security-Enhanced Linux)の概要と設定

SELinuxはLinuxカーネルに組み込まれたMandatory Access Control(MAC)の実装で、従来のディスクリショナリ権限(DAC)を補完し、プロセスやオブジェクトにラベル(セキュリティコンテキスト)を付与してアクセスを制御します。デフォルトで“deny”が原則となり、ポリシーに明示的に許可された操作のみを実行できるため、システム全体のセキュリティが飛躍的に向上します。

8.1.1 SELinuxアーキテクチャの詳細

SELinuxはLSM(Linux Security Modules)フレームワークを介してカーネルに統合され、システムコールごとにHookを挿入してアクセスをチェックします。ポリシーはユーザー空間でコンパイルされ、起動時にカーネルにロードされます。このアーキテクチャにより、以下の機能が実現されます。

  • カーネルレベルのセキュリティ判断(Hook)
  • ユーザー空間でのポリシー管理と動的更新
  • ラベルベースのアクセス制御(Process, File, Socketなど)

8.1.2 セキュリティコンテキストとポリシー構成

SELinuxでは、各オブジェクト(ファイル、プロセス、ソケットなど)に4つ組のセキュリティコンテキスト(user:role:type:level)が付与されます。

  • user: SELinuxユーザー(例: unconfined_u, system_u)
  • role: 操作ロール(例: object_r, system_r)
  • type: ドメインやオブジェクトクラス(例: httpd_t, sshd_t)
  • level: MLS/MCS用セキュリティレベル

ポリシーはモジュール(.pp)単位で管理され、標的型(targeted)、MLS、MCSなどのタイプがあります。標的型では主要なデーモンのみを制限対象とし、運用負荷を低減します。

8.1.3 モードの確認と切り替え

実行ユーザー: root または sudo 権限ユーザー
前提条件: policycoreutilsパッケージがインストール済み
期待結果: SELinuxモードを確認・一時切替・永続設定を実行

# 現在のSELinuxモードを動的に確認
getenforce                # Enforcing, Permissive, Disabled を表示  # モード確認
sestatus                  # モードやポリシータイプなど詳細ステータスを表示  # 詳細情報取得

# 一時的にモードを変更(再起動で元に戻る)
sudo setenforce 0         # Permissiveモードに切り替え  # 一時的に警告ログのみ
sudo setenforce 1         # Enforcingモードに戻す      # 制御を強制

# 永続的にモードを設定
sudo sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config   # 再起動後もEnforcing
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config  # 再起動後Permissive
💡 補足:まずPermissiveモードで問題ログを確認し、許可が想定通りの場合にEnforcingに切り替えると安全です。

8.1.4 SELinuxブール値による動的制御

SELinuxではブール値(Booleans)で機能単位の有効化/無効化が可能です。デフォルトポリシーのカスタマイズに最適です。

# 現在のすべてのブール値を確認
getsebool -a                # on/off 状態一覧を表示  # Boolean確認

# ブール値を永続的に変更
sudo setsebool -P httpd_can_network_connect on   # HTTPDの外向きアクセス許可  # 永続書き込み

# ファイルコンテキスト設定例
sudo semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'  # ファイルをHTTPD用にラベル
sudo restorecon -Rv /var/www/html                      # 設定を反映し再ラベル

# ポリシー情報の検索
seinfo -t httpd_sys_content_t                           # タイプ定義を表示       # ポリシー情報
sesearch -t httpd_sys_content_t -A allow                # 許可ルールを検索      # ルール確認
💡 補足:ブール値変更後、必要に応じて対象サービスの再起動や再接続を行ってください。

8.1.5 カスタムポリシモジュールの作成

運用中に発生した拒否ログ(AVC)を基に、audit2allowツールでカスタムポリシーモジュールを生成し、適用できます。

# AVCログを解析し、allowルールを抽出
sudo ausearch -m AVC -ts today | audit2allow -M mycustom   # mycustom.pp モジュール作成

# ポリシーモジュールをインストール
sudo semodule -i mycustom.pp   # カスタムモジュールを適用  # ポリシー拡張

# 適用済みモジュール一覧を確認
sudo semodule -l              # ロード済みモジュール表示  # モジュール一覧
💡 補足:モジュール名にスペースを含めず、バージョン管理下で変更履歴を追跡するとメンテしやすくなります。

8.1.6 トラブルシューティングとログ解析

SELinux拒否ログは/var/log/audit/audit.log/var/log/messagesに記録されます。setroubleshootサーバとsealertで可視化し、原因分析を効率化します。

# 拒否ログを解析レポートで生成
sudo sealert -a /var/log/audit/audit.log           # 人間可読レポート作成  # setroubleshoot必須

# audit.logから直接フィルタリング
sudo ausearch -m AVC -ts yesterday                 # 昨日以降のAVCログを抽出  # 期間指定

# /var/log/messagesの最新拒否メッセージを確認
sudo grep "SELinux is preventing" /var/log/messages | tail -n 20  # メッセージ確認
注意:sealertが未導入の場合は sudo dnf install -y setroubleshoot-server で追加してください。

8.2 SSH強化

AlmaLinux9でサーバに安全にリモート接続するため、SSHの公開鍵認証導入とデーモン設定のチューニングを詳しく解説します。

8.2.1 公開鍵認証の導入

パスワード認証はブルートフォース攻撃に弱いため、公開鍵認証を導入してSSHアクセスのセキュリティを強化します。

実行ユーザー: 任意の一般ユーザー(鍵生成後は root に切り替え)
前提条件: openssh-clients パッケージがインストール済み
期待結果: SSH鍵ペアが生成され、サーバ側に公開鍵が配置される

# openssh-clients をインストール
sudo dnf install -y openssh-clients            # 鍵生成や ssh-copy-id を利用するためにクライアントを導入

# SSH鍵ペアを生成(ed25519 推奨)
ssh-keygen -t ed25519 \
  -f ~/.ssh/id_ed25519 \
  -C "almalinux9@yourdomain"                  # 鍵ファイル名とコメントを指定して ed25519 鍵を作成

# 公開鍵をサーバにコピー
ssh-copy-id \
  -i ~/.ssh/id_ed25519.pub \
  user@server.example.com                      # server.example.com の authorized_keys に公開鍵を登録
💡 補足:鍵生成時にパスフレーズを設定すると、秘密鍵の流出リスクをさらに低減できます。

8.2.2 SSHサーバの設定チューニング

公開鍵認証導入後は、サーバ側の /etc/ssh/sshd_config を最適化し、不要な認証方式を無効化、アルゴリズムを強化します。

実行ユーザー: root または sudo 権限保持ユーザー
前提条件: openssh-server サービスが起動中
期待結果: 安全な SSH 設定でデーモンを再読み込みし、設定が反映される

# 設定ファイルを編集
sudo vi /etc/ssh/sshd_config                 # SSH デーモンの設定を開く

# 以下を追加・変更して保存
Port 22                                      # SSH 接続ポートを指定(変更可)
Protocol 2                                  # SSH プロトコル v2 のみを許可
PermitRootLogin no                           # root ログインを禁止
PasswordAuthentication no                    # パスワード認証を無効化
ChallengeResponseAuthentication no           # チャレンジレスポンス認証を無効化
KexAlgorithms curve25519-sha256              # 鍵交換アルゴリズムを強化
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com   # 推奨暗号スイートを指定
MACs hmac-sha2-512,hmac-sha2-256             # メッセージ認証コードを強化

# デーモンを再読み込みして設定を適用
sudo systemctl reload sshd                  # 再起動不要で設定を反映
# 動作状況を確認
sudo systemctl status sshd                  # デーモンが正常起動しているか検証
注意:カスタムポートに変更した場合、クライアント接続時に -p オプションで指定するのを忘れないようにしてください。

8.3 Fail2Banによる不正アクセス対策

AlmaLinux9でのブルートフォース攻撃や不正ログイン試行を自動的に検知・遮断するFail2Banを、基礎から高度運用まで詳しく解説します。

8.3.1 Fail2Banの概要

Fail2BanはPython製のIntrusion Prevention System(IPS)で、ログファイルを監視して一定回数以上の失敗ログを検知すると、firewalldやiptablesを通じて該当IPを自動ブロックします。動的なIP遮断により、SSHやHTTP、メールサーバなど多彩なサービスを保護し、AlmaLinux9のセキュリティ設定を強化します。

💡 補足:Fail2Banは軽量かつ拡張性が高く、独自フィルタやアクションをカスタマイズして多様なログソースに対応できます。

8.3.2 EPELリポジトリ有効化とFail2Banインストール

標準リポジトリに含まれないFail2Banを導入するため、まずEPELリポジトリを有効化し、dnfでインストールします。

実行ユーザー: root または sudo 権限保持ユーザー
前提条件: firewalldなどの基本ファイアウォールが稼働中
期待結果: EPELリポジトリの追加とFail2Banの導入完了

# EPELリポジトリを有効化
sudo dnf install -y epel-release             # EPELリポジトリパッケージをインストール

# Fail2Ban本体をインストール
sudo dnf install -y fail2ban                  # fail2banパッケージを導入

# firewalld連携パッケージを追加インストール(任意)
sudo dnf install -y fail2ban-firewalld        # fail2banとfirewalldの連携用モジュール

8.3.3 基本設定:jail.local のカスタマイズ

デフォルト設定を残さず、jail.localを作成して運用することで、アップデート時の上書きを防ぎます。

実行ユーザー: root
前提条件: /etc/fail2ban/jail.conf が存在
期待結果: カスタム設定ファイル jail.local の生成と編集準備完了

# 設定ファイルをコピーしてローカル設定を作成
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local    # jail.confをjail.localにコピー

# fail2ban.confも同様にバックアップ(必要なら)
sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local  # メイン設定のバックアップ

jail.localの先頭に、共通設定を記述します(例):

[DEFAULT]
# ブロック時間と監視期間の指定
bantime  = 3600                 # 1時間ブロック
findtime = 600                  # 10分以内の試行回数を監視
maxretry = 5                    # 5回失敗でブロック

# メール通知設定(MTAが必要)
destemail = root@localhost      # 通知先メールアドレス
sender    = fail2ban@localhost  # 送信元メールアドレス
mta       = sendmail            # メール送信コマンド(sendmail, mail等)

# アクション指定
action   = %(action_mwl)s       # whois情報とログを添付して通知

8.3.4 SSHおよび他サービス用Jailの設定例

代表的なSSH保護用のJail定義を追加し、他サービス向けに応用します。

[sshd]
enabled  = true                  # SSHプロテクトを有効化
port     = ssh                   # SSHポートを監視
filter   = sshd                  # sshd用フィルタを使用
logpath  = /var/log/secure       # ログファイルを指定
maxretry = 5                     # 失敗試行回数

[postfix]
enabled  = true                  # Postfix保護を有効化
port     = smtp                  # SMTPポートを監視
filter   = postfix                # postfix用フィルタを使用
logpath  = /var/log/maillog      # メールログを指定
maxretry = 3                     # 3回失敗でブロック
注意:サービスごとにfilterを定義するフィルタファイル(例:/etc/fail2ban/filter.d/postfix.conf)が必要です。

8.3.5 サービス起動・ステータス確認・アンバン操作

Fail2Banを有効化し、運用中のステータス確認や誤検知時の解除方法を解説します。

# Fail2Banサービスを起動&自動起動設定
sudo systemctl enable --now fail2ban   # 起動とブート時自動開始を設定

# 全体ステータスの確認
sudo fail2ban-client status            # 有効なJail一覧を表示

# SSH Jailの詳細ステータス確認
sudo fail2ban-client status sshd       # sshd JailのブロックIP等を表示

# 誤ってブロックしたIPを解除
sudo fail2ban-client set sshd unbanip 203.0.113.45   # 指定IPのブロックを解除

8.3.6 ログローテーション対応

ログローテート後もFail2Banが新しいログファイルを監視し続けるには、postrotateで再読み込みを行います。

# /etc/logrotate.d/fail2ban の例
/var/log/fail2ban.log {
    weekly                         # 週次でローテート
    rotate 4                       # 4世代分保持
    compress                       # 圧縮保存
    missingok                      # ファイルが無くてもエラーにしない
    notifempty                     # 空ファイルはローテートしない
    postrotate
        /usr/bin/fail2ban-client reload  # ログローテート後にFail2Banを再読み込み
    endscript
}
💡 補足:ログ量や保持ポリシーに応じてrotateweeklyを調整してください。

8.3.7 モニタリングと運用のポイント

  • journalctl -u fail2ban -f でリアルタイムログを確認
  • ✅ 定期的にfail2ban-client statusをスクリプト化し、監査ログと合わせてレポート生成
  • ✅ 独自サービス向けフィルタは/etc/fail2ban/filter.d/に定義し、正規表現を最適化

8.3.8 まとめ

本節では、EPEL有効化からFail2Banのインストール、jail.localによる詳細設定、メール通知・ログローテーション対応、運用時のモニタリング方法までを網羅しました。これらを組み合わせることで、AlmaLinux9サーバの不正アクセス対策は飛躍的に向上します。

8.4 firewalldの応用設定

AlmaLinux9に標準搭載されるfirewalldを活用し、基本的なゾーン管理から高度なリッチルール、ポリシー設定、NAT制御まで、実務レベルで必要となる応用テクニックを詳しく解説します。

8.4.1 ゾーンとサービス管理

firewalldではネットワークインターフェースやIPソースをゾーンに紐付け、ゾーンに許可されたサービスやポートのみ通信を許可する方式を採用します。ゾーンは信頼レベルに応じたプリセット(public, home, workなど)が用意されており、柔軟にカスタマイズできます。

# すべてのゾーン設定を一覧表示(ランタイム環境)
firewall-cmd --list-all-zones                # 現在定義されているゾーンごとの設定を表示 

# デフォルトゾーンを取得
firewall-cmd --get-default-zone              # 新規接続に適用されるゾーン名を表示 

# HTTPサービスをpublicゾーンに永久追加
sudo firewall-cmd --permanent \
  --zone=public \
  --add-service=http                         # webサーバ(HTTP)へのアクセスを許可 

# ポート番号を直接指定してSSHを許可
sudo firewall-cmd --permanent \
  --zone=public \
  --add-port=22/tcp                          # TCPポート22番(SSH)を許可 

# 設定を反映(reload)
sudo firewall-cmd --reload                   # 永続設定をランタイムに適用 

8.4.2 リッチルールで細粒度制御

rich languageを用いることで、ソースアドレス・宛先ポート・アクション・ログ出力などを一つの文字列で記述できます。iptables直接記述を抽象化しつつ、高度な制御が可能です。

# 特定IPv4サブネットからのSSHアクセスを許可(優先度100)
sudo firewall-cmd --permanent \
  --zone=public \
  --add-rich-rule='rule family="ipv4" \
                   source address="203.0.113.0/24" \
                   port protocol="tcp" port="22" \
                   accept priority="100"'     # richルールでSSHを許可・優先度指定 

# 設定済みのrichルールを一覧表示
sudo firewall-cmd --list-rich-rules           # 登録されたrichルールを表示 

8.4.3 インターフェイスとソースの動的割り当て

ネットワークインターフェースやIPレンジをゾーンに動的に割り当て、環境に応じた信頼レベルを運用できます。再起動不要かつランタイム/永続両方で設定可能です。

# インターフェースeth1をhomeゾーンに割り当て
sudo firewall-cmd --permanent \
  --zone=home \
  --add-interface=eth1                       # eth1接続をhomeゾーン扱いに設定 

# ソースネットワーク192.0.2.128/25をhomeゾーンに追加
sudo firewall-cmd --permanent \
  --zone=home \
  --add-source=192.0.2.128/25                # 特定IPレンジをhomeゾーンに設定

# ランタイム設定の確認
firewall-cmd --zone=home --list-all          # homeゾーンの詳細設定を表示 

8.4.4 ポリシーベース設定

Zonesは入力方向のみフィルタリングしますが、policiesは入力・出力・転送すべての方向を制御でき、仮想マシンやコンテナのトラフィック制御に最適です。

# 新規ポリシーを作成(my-policy)
sudo firewall-cmd --permanent \
  --new-policy=my-policy                     # ポリシーオブジェクトを定義 

# ポリシーにインターフェースを割り当て
sudo firewall-cmd --permanent \
  --policy=my-policy \
  --add-interface=eth2                       # eth2をmy-policyの制御下に設定

# ポリシーにrichルールを追加
sudo firewall-cmd --permanent \
  --policy=my-policy \
  --add-rich-rule='rule family="ipv4" \
                   source address="10.0.0.0/8" \
                   forward-port port="8080" \
                   protocol="tcp" to-port="80" \
                   accept'                   # ポリシーベースでポートフォワードを定義

# 設定反映
sudo firewall-cmd --reload                   # ポリシー変更を適用

8.4.5 Masqueradingとポートフォワーディング

NAT機能を使ってプライベートネットワークをインターネットに接続したり、特定ポートを別ポートに転送できます。webアプリ公開やコンテナNATで必須です。

# externalゾーンでマスカレードを有効化
sudo firewall-cmd --permanent \
  --zone=external \
  --add-masquerade                         # 送信パケットのアドレスをNAT変換 

# TCP8080を80に転送
sudo firewall-cmd --permanent \
  --zone=external \
  --add-forward-port=port=8080:proto=tcp:toport=80   # 外部8080を内部80へフォワード

# 設定を反映
sudo firewall-cmd --reload                   # NAT設定を適用

8.4.6 IPv6とIPSetの活用

IPv6サービス許可やIPSetによる大量IPの一括管理が可能です。セキュリティ設定の自動化に役立ちます。

# IPv6 DHCPクライアントを許可
sudo firewall-cmd --permanent \
  --zone=public \
  --add-service=dhcpv6-client             # IPv6ネットワーク設定を許可

# IPSet「blacklist」を作成
sudo firewall-cmd --permanent \
  --new-ipset=blacklist --type=hash:ip     # hash:ip型でIPセットを生成

# blacklistにIPを追加
sudo firewall-cmd --permanent \
  --ipset=blacklist --add-entry=198.51.100.23   # 危険IPを登録

# IPSetをゾーンに紐付け
sudo firewall-cmd --permanent \
  --zone=public \
  --add-source=ipset:blacklist              # IPセットをソース指定

# 設定を反映
sudo firewall-cmd --reload                   # IPSet設定を適用

8.4.7 Directインターフェースを使った高度設定

firewalldのdirect機能で、iptables/nftablesルールを直接記述できます。既存の複雑ルールを移行する際に有効です。

# 直接iptablesルールを追加
sudo firewall-cmd --permanent \
  --direct --add-rule ipv4 filter INPUT 0 \
  -p tcp --dport 1234 -j ACCEPT         # TCP1234番ポートをALLOW

# directルールを確認
sudo firewall-cmd --direct --get-all-rules  # directで定義された全ルールを表示

# 設定を反映
sudo firewall-cmd --reload                   # directルールを適用

8.4.8 永続設定と一時設定の比較

–permanentなしはランタイム設定、一時的に有効です。–permanentをつけると再起動後も有効ですが、反映にreloadが必要です。本文例で使い分けを確認してください。

# 一時的にHTTPを許可(再起動まで有効)
sudo firewall-cmd --zone=public --add-service=http   # ランタイム設定のみ

# 永続的にSSHを許可(reload後に反映)
sudo firewall-cmd --permanent --zone=public --add-service=ssh  # 永続設定
sudo firewall-cmd --reload                                   # 永続設定を適用

8.5 パスワードポリシーとアカウント保護

パスワードポリシーはユーザーアカウントを保護し、ブルートフォース攻撃や辞書攻撃などのリスクを低減します。AlmaLinux9ではPAMモジュールやログイン設定、chageコマンドによる有効期限管理を組み合わせることで、包括的なアカウント保護が可能です。

8.5.1 PAMモジュールでパスワード複雑度とロックアウト管理

AlmaLinux9では、pam_pwqualityモジュールでパスワードの複雑度を評価し、pam_faillockで一定回数以上の認証失敗時にアカウントをロックできます。さらにpam_pwhistoryを併用することで過去使用パスワードの再利用を防止し、強固なポリシーを実現します。

RHEL9以降はPAM構成をauthselectで管理するのが推奨されます。以下ではauthselectを使った機能有効化方法と、直接編集による設定例を示します。


# sssdプロファイルを選択してPAM管理を開始
sudo authselect select sssd --force                          # sssdプロファイルに切り替え

# パスワード品質チェック機能を有効化
sudo authselect enable-feature with-pwquality                # pam_pwqualityモジュールをPAMに組み込む

# アカウントロック機能を有効化
sudo authselect enable-feature with-faillock                 # pam_faillockモジュールをPAMに組み込む

# 変更を適用してPAM設定ファイルを再生成
sudo authselect apply-changes                                # PAMおよびnsswitch.confを更新

# /etc/security/pwquality.conf の設定例
minlen = 12         # パスワード最小長を12文字に設定
dcredit = -1        # 数字を最低1文字必須に設定
ucredit = -1        # 大文字を最低1文字必須に設定
lcredit = -1        # 小文字を最低1文字必須に設定
ocredit = -1        # 特殊文字を最低1文字必須に設定
minclass = 4        # 4種類以上の文字クラスを要求
maxrepeat = 3       # 同一文字の連続を最大3文字に制限
difok = 4           # 過去パスワードとの差分を4文字以上要求
enforce_for_root    # rootユーザーにも品質チェックを適用

# /etc/pam.d/password-auth に以下を追加
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900 fail_interval=900  # ロック前の事前チェック
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900 fail_interval=900  # 認証失敗時にロックアウト
auth sufficient pam_unix.so try_first_pass nullok                                 # UNIX認証成功で次へ進む
auth [default=die] pam_faillock.so authsucc                                       # 認証成功時に失敗カウンタをリセット

# passwordセクションの先頭に品質チェックを追加
password requisite pam_pwquality.so try_first_pass retry=3 local_users_only authtok_type=  # パスワード品質チェック

8.5.2 /etc/login.defsによるパスワード有効期限管理

/etc/login.defsでは、グローバルにパスワードの最大・最小有効日数や警告期間を定義できます。新規ユーザーには自動的に適用され、既存ユーザーにはchageコマンドで設定を反映します。


# /etc/login.defs の設定例
PASS_MAX_DAYS   90    # パスワード有効期限を90日に設定
PASS_MIN_DAYS   7     # パスワード変更間隔の最小日数を7日に設定
PASS_WARN_AGE   14    # 期限切れ14日前から警告を開始

# 新規ユーザー作成時の未使用自動無効化日数を設定
sudo useradd -D -f 30    # 30日間ログインがないアカウントを自動無効化

# 既存ユーザーのパスワード有効期限を設定
sudo chage -M 90 -m 7 -W 14 username    # 最大90日、最小7日、警告14日を設定

# 設定状況を確認
sudo chage -l username                  # usernameの期限情報を表示

# アカウントの有効期限を90日後に設定
sudo chage -E $(date -d "+90 days" +%Y-%m-%d) username  # 90日後にアカウント無効化

8.5.3 アカウント無効化とロック解除

長期間未使用のアカウントを自動的に無効化することで、休眠アカウントによるリスクを低減できます。chage -Iで未使用日数を設定し、useradd -D -f/etc/default/useraddINACTIVEでデフォルト値を管理します。


# 未使用日数30日でアカウントを自動ロック
sudo chage -I 30 username       # usernameが30日ログインしないと無効化

# デフォルト値を30日に変更
sudo useradd -D -f 30           # 新規アカウントのINACTIVE日数を30日に設定

8.6 監査ログ(auditd)による可視化

AlmaLinux9における監査ログシステムauditdは、カーネルから送られるセキュリティ関連イベントを記録し、詳細な操作履歴の追跡と可視化を可能にします。システムコールやファイルアクセス、ユーザー操作などを網羅的に監視し、インシデント対応やコンプライアンス要件の遵守に貢献します。

8.6.1 auditd のインストールとサービス管理

auditdはデフォルトでAlmaLinux9に含まれる場合がありますが、インストール状況を確認し、サービスを有効化・起動します。これによりシステム起動時から監査ログの収集が始まります。

# auditパッケージをインストールまたは確認
sudo dnf install -y audit                   # auditdと関連ツールを導入/最新化

# auditdサービスを起動+ブート時自動起動設定
sudo systemctl enable --now auditd          # システム起動時に自動でauditdを開始

# auditdのステータス確認
sudo systemctl status auditd                # auditdが正常に動作中か確認

8.6.2 /etc/audit/auditd.conf の最適化

/etc/audit/auditd.confにはログのローテーションやディスク容量不足時の動作など、auditdの動作パラメータが定義されています。デフォルトのままではログの肥大化やディスクフルによるログ欠損リスクがありますので、主要オプションをチューニングします。

# ログファイルの最大サイズ設定を変更
sudo sed -i 's/^max_log_file = .*/max_log_file = 100/' /etc/audit/auditd.conf   # ログファイルを100MBでローテート

# ログ満杯時の動作を設定(SYSLOGへ通知)
sudo sed -i 's/^space_left_action = .*/space_left_action = SYSLOG/' /etc/audit/auditd.conf

# ディスク残容量警告閾値設定(10MB以下でアラート)
sudo sed -i 's/^space_left = .*/space_left = 10/' /etc/audit/auditd.conf

# 管理者へのメール通知設定
sudo sed -i 's/^action_mail_acct = .*/action_mail_acct = root/' /etc/audit/auditd.conf

# 管理者向け警告動作(SUSPENDではなくSYSLOGで継続記録)
sudo sed -i 's/^admin_space_left_action = .*/admin_space_left_action = SYSLOG/' /etc/audit/auditd.conf

8.6.3 監査ルールの定義と適用

auditルールはカーネルレベルのフィルタリング定義で、/etc/audit/rules.d/下のファイルに記述します。デフォルトのaugenrulesを用いて一元管理し、再起動時やルール再読込時に自動適用します。

# カスタムルールファイルを作成
sudo tee /etc/audit/rules.d/99-custom.rules > /dev/null << 'EOF'
## パスワードファイル操作監視
-w /etc/passwd -p wa -k identity          # /etc/passwdへの書き込み・属性変更を監査

## タイムスタンプ変更監視
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change  # 時刻設定システムコール監査
-a always,exit -F arch=b32 -S adjtimex -S settimeofday -k time-change

## sudoersファイル変更監視
-w /etc/sudoers -p wa -k actions           # sudoersファイルの不正編集を監査
-w /etc/sudoers.d/ -p wa -k actions       # sudoers.dディレクトリ監査

## ルールの不変化設定
-e 2                                       # ルールをイミュータブル(不変)に設定
EOF

# ルールをカーネルに読み込む
sudo augenrules --load                     # /etc/audit/rules.d/*.rulesを集約して読み込み

# auditdを再起動してルール適用を確実に
sudo systemctl restart auditd              # 新ルールでauditdを再起動

8.6.4 監査ログの検索と可視化

ausearchaureportを使うことで、大量のログから目的のイベントを抽出・集計できます。ausearchはフィルタ検索、aureportはサマリーレポート生成に適しており、インシデント調査や定期レポート作成に活用します。

# 直近24時間のパスワードファイル操作イベントを検索
sudo ausearch -k identity -ts recent         # 'identity'キーのログをタイムスタンプ指定で抽出

# 失敗ログイン試行をユーザー単位で集計
sudo aureport --login --failed --summary -i   # 失敗ログインのサマリーレポート

# システム呼び出し(execve)利用履歴を日別に集計
sudo aureport -x --summary --start today      # execveイベントを本日分で集計

# 日次レポートをファイルに出力
sudo aureport --summary > /var/log/audit/daily_audit_report.txt  # 標準レポートをテキスト保存

8.6.5 レポート自動化と運用ポイント

cronやAnsibleのジョブでaureportを定期実行し、メール送信や集中ログ基盤への転送を行います。ログ肥大化対策としては古いログのアーカイブ化や、logrotate連携が重要です。監査ルールの変更や動作検証はステージング環境で充分テストしてください。

💡 運用ポイント:
  • ✅ 定期的にausearch -m avcでSELinux拒否ログもチェック
  • ✅ ルール追加時はauditctl -lで反映確認
  • ✅ 重要ログは中央監視サーバへ転送(syslog/nginx転送プラグイン活用)

8.7 まとめ

本章では、AlmaLinux9のセキュリティ強化を6つのレイヤーに分けて解説しました。それぞれのポイントを振り返ると以下の通りです。

  • SELinux
    Mandatory Access Controlによりシステム全体をラベルベースで保護し、Enforcing/Permissiveモードやブール値操作で柔軟に制御できること。
  • SSH強化
    公開鍵認証の導入とsshd_configのチューニングで、パスワード攻撃や不要な認証方式を排除できること。
  • Fail2Ban
    EPELリポジトリからの導入後、jail.localで詳細設定し、不正ログイン試行を自動ブロック・通知・ログローテート対応まで構築できること。
  • firewalld応用
    ゾーン管理・richルール・ポリシーベース・NAT/Masquerade・IPv6/IPSet・direct機能を駆使し、柔軟かつ強固なファイアウォールを構築できること。
  • パスワードポリシーとアカウント保護
    pam_pwqualityやpam_faillockで複雑度とロックアウトを管理し、login.defsとchageで有効期限・未使用ロックを自動化できること。
  • auditd監査ログ
    auditd.confチューニング、カスタム監査ルール定義、ausearch/aureportによる可視化、レポート自動化で操作履歴を漏れなく追跡できること。

これらを組み合わせて適切に運用すれば、AlmaLinux9環境の攻撃対象面を大幅に縮小し、インシデント対応力を強化できます。各設定は変更前にステージング環境で動作検証を行い、本番適用時にはバックアップや手順書を準備してから実施することをおすすめします。