第8章: セキュリティ設定と強化
8.1 この章で解説する主要な技術・概念
AlmaLinux 9のサーバー環境を安全に運用するためには、単なるパスワード管理に留まらず、多層的な防御を行う必要があります。本章では、以下のセキュリティ関連の要素をさらに掘り下げ、システムを堅牢化するためのベストプラクティスを解説します。
- SELinux (Security-Enhanced Linux) の高度な使い方
- SSHのセキュリティ強化 (鍵認証、ポート変更、rootログイン制限など)
- Fail2Banによる不正アクセス対策
- firewalldの応用的な設定 (リッチルールでの特定トラフィック制御やマスカレード)
- パスワードポリシーやアカウント保護 (pam_faillock、chage)
- 監査ログ (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でブロックされた操作があると、その対処法を提案してくれるログが出力される。
audit2why
やaudit2allow
を使うことで、ポリシーの違反内容と解決策を自動生成できる場合がある。
注意: むやみに
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 パッケージの
sesearch
やseinfo
でSELinuxポリシーの解析も可能。
8.8 学習のまとめ
- SELinuxの高度な設定: システムを守る強力な仕組みであり、コンテキスト管理やポリシーチューニングを正しく行えば高いセキュリティを実現できる。
- SSHのセキュリティ強化: パスワード認証は可能な限り無効化し、鍵認証+
PermitRootLogin no
が基本。ポート変更やログ監視で不正アクセスを低減。 - Fail2Ban: ログ解析によるブルートフォース対策。SSHや各種サービスの認証失敗を検出して、自動的に攻撃元IPをブロックできる。
- firewalld応用: リッチルールやゾーン機能で、細かなアクセス制御やポートフォワーディングを実装。ICMP制御やマスカレードも活用できる。
- パスワードポリシー: pam_faillockや
/etc/login.defs
で期限や失敗回数を設定し、人為的ミスや攻撃に備える。 - 監査ログ (Auditd): システムコールレベルでのアクセスやファイル操作を記録し、潜在的な不正操作やトラブルを追跡可能。
setroubleshoot
を併用してSELinux拒否をわかりやすく理解。
次章へのつながり
次の章(第9章)では、サーバー運用の中心となるWebサーバー(ApacheやNginx) やデータベースサーバー(MariaDB, PostgreSQL)、メールサーバー(Postfix, Dovecot)などのサービス構築と管理を深掘りします。これまで学んだセキュリティやネットワーク設定を組み合わせ、安全かつ効率的にサーバーを運用する手法を学習していきましょう。