AlmaLinux 9 総合ガイド 第8章

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


8.1 この章で解説する主要な技術・概念

AlmaLinux 9のサーバー環境を安全に運用するためには、単なるパスワード管理に留まらず、多層的な防御を行う必要があります。本章では、以下のセキュリティ関連の要素をさらに掘り下げ、システムを堅牢化するためのベストプラクティスを解説します。

  1. SELinux (Security-Enhanced Linux) の高度な使い方
  2. SSHのセキュリティ強化 (鍵認証、ポート変更、rootログイン制限など)
  3. Fail2Banによる不正アクセス対策
  4. firewalldの応用的な設定 (リッチルールでの特定トラフィック制御やマスカレード)
  5. パスワードポリシーやアカウント保護 (pam_faillock、chage)
  6. 監査ログ (Auditd) とログ分析 (setroubleshootなども含む)

8.2 SELinuxの高度な使い方

8.2.1 SELinuxモードの確認と設定

sestatus
  • enforcing : ポリシーを適用し、違反をブロック (推奨)
  • permissive: 違反を許可するがログを記録
  • disabled : 完全無効 (非推奨)

SELinuxのモードは /etc/selinux/config で設定。再起動が必要なため、本番環境でdisableにするのは最後の手段と考えるべき。

SELINUX=enforcing
SELINUXTYPE=targeted

8.2.2 コンテキスト管理とchcon

SELinuxはコンテキスト (context) ベースでアクセス制御を行います。HTTPサーバーが読むファイルにはhttpd_sys_content_t、FTPサーバー用にはftp_home_dir_tなどのタイプを正しく割り当てる必要があります。

# ls -Z でコンテキストを確認
ls -Z /var/www/html/

# chcon で一時的にコンテキストを変更
sudo chcon -t httpd_sys_content_t /var/www/html/index.html

しかし、chconは再ラベリングで元に戻ることがあるため、恒久的に設定する際はsemanage fcontext を利用すると良い。

sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/mysite(/.*)?"
sudo restorecon -Rv /var/www/mysite
  • semanage fcontext: SELinuxポリシーへの永続登録
  • restorecon: 既存ファイル・ディレクトリにラベルを適用

8.2.3 setroubleshootとログ解析

sudo dnf install setroubleshoot setools-console
sudo journalctl -f -t setroubleshoot
  • SELinuxでブロックされた操作があると、その対処法を提案してくれるログが出力される。
  • audit2whyaudit2allow を使うことで、ポリシーの違反内容と解決策を自動生成できる場合がある。

注意: むやみに audit2allow の結果を適用すると、潜在的にセキュリティリスクを拡大するケースもある。必ず内容をチェックしてからカスタムポリシーを導入すること。


8.3 SSHのセキュリティ強化

8.3.1 パスワード認証から鍵認証へ

ssh-keygen -t ed25519 -C "almalinux-secure-key"
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
  • Ed25519はRSAより鍵サイズが小さく、高速でセキュリティも十分。
  • PasswordAuthentication no にする前に鍵認証が確実に機能するかをテスト。

8.3.2 rootログイン制限

/etc/ssh/sshd_config:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
  • 一般ユーザーでログインし、sudo でroot権限を必要時だけ使う運用が推奨される。
  • ポート変更 (Port 2222 など) は根本的な防御ではないが、ブルートフォース攻撃を減らす効果はある。

8.3.3 SSH接続の監査

  • /var/log/secure または journalctl -u sshd にログが残り、成功/失敗のIPやユーザーが分かる。
  • 異常なログイン試行が多い場合、Fail2Banなどと組み合わせてブロックを検討。

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

8.4.1 Fail2Banの仕組み

Fail2Banはログを監視し、指定回数以上の認証失敗があれば、そのIPを一時的にファイアウォールでブロックする。SSHやApacheなど、様々なサービスに対応したフィルタが用意されている。

sudo dnf install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

8.4.2 jail.conf と jail.local

  • /etc/fail2ban/jail.conf にはデフォルト設定
  • /etc/fail2ban/jail.local にカスタム設定を加える
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 5
bantime = 600
  • maxretry = 5: 5回失敗でブロック
  • bantime = 600: 600秒(10分)間ブロック
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip <IP_ADDRESS>
  • fail2ban-client コマンドでステータスや手動アンバンなどが行える。

8.5 firewalldの応用的な設定

8.5.1 リッチルールとマスカレード

前章でも触れたが、セキュリティ強化においてソースIPや特定ポートへのアクセスを細かく制御することがある。例えば管理系ポート(SSH, 8080など)を特定IPのみ許可するなど。

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" port port="22" protocol="tcp" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" drop'
sudo firewall-cmd --reload
  • 上記例は先に特定IPからのSSHを許可し、その他をdropする構成

8.5.2 ICMP制御やポートフォワーディング

  • ICMPのecho-request(ping)を拒否する、または特定ゾーンのみ許可する設定も可能。
  • DMZゾーンで特定ポートのみ外部公開、その他ゾーンではフルアクセスなど、複雑なシナリオに対応しやすい。

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

8.6.1 PAM設定とpam_faillock

先述のとおり /etc/pam.d/password-auth/etc/pam.d/system-auth で FailLock モジュールを挿入してアカウントロックを導入。

詳細例

auth    required      pam_faillock.so preauth silent audit deny=5 unlock_time=600
auth    [success=1 default=bad] pam_unix.so
auth    [default=die] pam_faillock.so authfail audit deny=5 unlock_time=600
account required      pam_faillock.so
  • deny=5: 5回連続失敗でロック
  • unlock_time=600: 10分後に自動解除
  • 企業ポリシーによってはdeny=3など厳しめに設定する

8.6.2 /etc/login.defs によるパスワード期限など

PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_MIN_LEN    12
PASS_WARN_AGE   7
  • PASS_MAX_DAYSでパスワード有効期限を定義し、90日経過後は強制変更。
  • PASS_WARN_AGE 7で、期限7日前から警告が出る。

8.7 監査ログとログ分析

8.7.1 Auditdによるシステム監査

Auditd (Linux Audit Daemon)
システムコールレベルでのイベントを記録する監査フレームワーク。ファイルアクセスやコマンド実行などを細かく追跡可能。

sudo dnf install audit
sudo systemctl enable auditd
sudo systemctl start auditd

監査ルールの例

/etc/audit/rules.d/custom.rules:

-w /etc/passwd -p wa -k passwd_change
-w /etc/shadow -p wa -k shadow_change
  • -w : ウォッチ対象ファイル
  • -p : モニターする操作 (r=read, w=write, a=attribute change, x=execute)
  • -k : イベントキー

設定後、augenrules --loadでルールを適用。ausearch -k passwd_change などでログを検索できる。

8.7.2 SELinuxログとsetroubleshoot

  • 先述のsetroubleshoot がSELinux関連のAVC拒否ログを解釈して提案を表示
  • /var/log/audit/audit.log にSELinux拒否 (AVC denial) が詳細に記録される。
  • setools-console パッケージの sesearchseinfo でSELinuxポリシーの解析も可能。

8.8 学習のまとめ

  1. SELinuxの高度な設定: システムを守る強力な仕組みであり、コンテキスト管理やポリシーチューニングを正しく行えば高いセキュリティを実現できる。
  2. SSHのセキュリティ強化: パスワード認証は可能な限り無効化し、鍵認証+PermitRootLogin no が基本。ポート変更やログ監視で不正アクセスを低減。
  3. Fail2Ban: ログ解析によるブルートフォース対策。SSHや各種サービスの認証失敗を検出して、自動的に攻撃元IPをブロックできる。
  4. firewalld応用: リッチルールやゾーン機能で、細かなアクセス制御やポートフォワーディングを実装。ICMP制御やマスカレードも活用できる。
  5. パスワードポリシー: pam_faillockや/etc/login.defsで期限や失敗回数を設定し、人為的ミスや攻撃に備える。
  6. 監査ログ (Auditd): システムコールレベルでのアクセスやファイル操作を記録し、潜在的な不正操作やトラブルを追跡可能。setroubleshootを併用してSELinux拒否をわかりやすく理解。

次章へのつながり

次の章(第9章)では、サーバー運用の中心となるWebサーバー(ApacheやNginx)データベースサーバー(MariaDB, PostgreSQL)メールサーバー(Postfix, Dovecot)などのサービス構築と管理を深掘りします。これまで学んだセキュリティやネットワーク設定を組み合わせ、安全かつ効率的にサーバーを運用する手法を学習していきましょう。