Linuxサーバーを安全に運用するためのセキュリティチェックリスト:詳細な説明
Linuxサーバーは、Webサイト、アプリケーション、データベースなど、様々な重要なサービスを提供する基盤として広く利用されています。その重要性ゆえに、常に攻撃者からの標的となりやすく、セキュリティ対策は不可欠です。本記事では、Linuxサーバーを安全に運用するために実施すべきセキュリティチェックリストを詳細に解説します。これらのチェックリストは、新規サーバーのセットアップから日々の運用まで、あらゆる段階で活用できるように構成されています。
I. 初期設定:サーバー構築時のセキュリティ強化
サーバー構築時こそ、セキュリティを意識した設定を行う絶好の機会です。初期設定を怠ると、後々大きな脆弱性につながる可能性があります。
1. 強固なパスワードポリシーの適用:
- デフォルトパスワードの変更: サーバー構築後、最初に実施すべきことは、rootアカウントや他の管理者アカウントのデフォルトパスワードを変更することです。推測されやすいパスワード(password, 123456など)は絶対に避けるべきです。
- 複雑なパスワードの要件: 新規ユーザーの作成時やパスワード変更時には、以下の要件を満たす複雑なパスワードを設定するようにポリシーを強制します。
- 最小文字数: 12文字以上
- 大文字、小文字、数字、記号の組み合わせ: それぞれを必ず含める
- 辞書に登録されている単語や個人情報の回避: ユーザー名、誕生日、ペットの名前など、推測されやすい単語や情報を使用しない
- /etc/login.defs の設定: パスワードの複雑性や有効期限に関するポリシーは、
/etc/login.defs
ファイルで設定できます。以下に設定例を示します。
PASS_MAX_DAYS 90 # パスワードの最大有効期限(90日)
PASS_MIN_DAYS 7 # パスワードの最小有効期限(7日)
PASS_WARN_AGE 7 # パスワード有効期限切れの警告期間(7日)
PASS_MIN_LEN 12 # パスワードの最小文字数 - パスワード生成ツール: 強力なパスワードを生成するために、
openssl rand -base64 16
などのコマンドや、pwgen
などのツールを利用しましょう。
2. 不要なサービスとポートの無効化:
- 最小限のサービス稼働: サーバーの役割に必要なサービスのみを稼働させ、不要なサービスは停止します。不要なサービスは、攻撃対象となりうるポートを開放しており、セキュリティリスクを高めます。
systemctl
コマンド:systemctl
コマンドを使用して、サービスを管理できます。例えば、不要なtelnet
サービスを停止するには、以下のコマンドを実行します。
systemctl stop telnet.socket
systemctl disable telnet.socket
stop
は一時的にサービスを停止し、disable
は次回起動時から自動起動しないように設定します。- ポートスキャンの実施:
nmap
などのツールを使用して、サーバーで開いているポートを確認し、意図しないポートが開放されていないか確認します。
nmap localhost
- サービスごとのセキュリティ設定: 各サービスの設定ファイル(例:
/etc/ssh/sshd_config
、/etc/apache2/apache2.conf
)を確認し、セキュリティに関するオプション(暗号化アルゴリズム、接続制限など)を適切に設定します。
3. SSHのセキュリティ強化:
- ポート番号の変更: SSHのデフォルトポート(22番)は、攻撃者にとって格好の標的です。別のポート番号に変更することで、総当たり攻撃のリスクを軽減できます。
/etc/ssh/sshd_config
ファイルのPort
ディレクティブを変更します。
Port 2222 # 例:2222番ポートに変更
- ポート番号を変更したら、ファイアウォール設定も忘れずに更新してください。
- rootログインの禁止: rootアカウントでの直接ログインを禁止し、一般ユーザーアカウントでログイン後、
sudo
コマンドでroot権限を取得する方法を推奨します。/etc/ssh/sshd_config
ファイルのPermitRootLogin
ディレクティブをno
に設定します。
PermitRootLogin no
- パスワード認証の無効化と公開鍵認証の利用: パスワード認証は総当たり攻撃に弱いため、公開鍵認証に切り替えることを強く推奨します。
/etc/ssh/sshd_config
ファイルのPasswordAuthentication
ディレクティブをno
に設定します。
PasswordAuthentication no
- 公開鍵認証の設定は、
ssh-keygen
コマンドで鍵ペアを作成し、公開鍵をサーバーの~/.ssh/authorized_keys
ファイルに登録することで行います。
- 接続元IPアドレスの制限: 特定のIPアドレスからのSSH接続のみを許可することで、不正アクセスを防止できます。
/etc/ssh/sshd_config
ファイルのAllowUsers
またはAllowGroups
ディレクティブを使用します。
AllowUsers [email protected] [email protected]/24 # 例:特定のユーザーとネットワークからの接続のみ許可
- TCP KeepAliveの設定: アイドル状態のSSH接続を定期的にチェックし、ゾンビセッションを防止します。
/etc/ssh/sshd_config
ファイルのTCPKeepAlive
とClientAliveInterval
ディレクティブを設定します。
TCPKeepAlive yes
ClientAliveInterval 300 # 例:300秒ごとにクライアントに生存確認パケットを送信
4. ファイアウォールの設定:
- ファイアウォールの有効化: ファイアウォールは、不正なネットワークトラフィックを遮断し、サーバーへの攻撃を防ぐための重要な防御壁です。
iptables
、firewalld
、ufw
などのファイアウォールソフトウェアを利用して、適切なルールを設定します。 iptables
: より詳細な設定が可能ですが、設定が複雑になりがちです。firewalld
: ゾーンベースのファイアウォールで、設定が比較的容易です。
firewall-cmd --zone=public --add-service=ssh --permanent # SSHを許可
firewall-cmd --zone=public --add-port=80/tcp --permanent # HTTPを許可
firewall-cmd --reload # 設定を反映ufw
(Uncomplicated Firewall): 最もシンプルなファイアウォールで、初心者にも扱いやすいです。
ufw allow ssh # SSHを許可
ufw allow http # HTTPを許可
ufw enable # ファイアウォールを有効化- 最小限のポート開放: 必要なポートのみを開放し、不要なポートはすべて閉じるように設定します。
- Ingress/Egressルールの設定: Ingress(サーバーへの流入)とEgress(サーバーからの流出)の両方のトラフィックに対してルールを設定し、不正なトラフィックを遮断します。
5. ユーザーアカウントの管理:
- 不要なアカウントの削除: デフォルトで作成される不要なアカウント(テスト用アカウントなど)は削除します。
- ユーザー権限の最小化 (Principle of Least Privilege): 各ユーザーには、その業務に必要な最小限の権限のみを付与します。root権限が必要な場合は、
sudo
コマンドを使用して一時的に権限を昇格させます。 - グループの活用: ユーザーをグループにまとめ、グループ単位でファイルやディレクトリへのアクセス権を設定することで、管理を効率化できます。
- 定期的なアカウント監査: 定期的にユーザーアカウントを監査し、不要なアカウントや権限が付与されたアカウントがないか確認します。
- アカウントロックアウトポリシー: パスワードの連続失敗回数を制限し、アカウントをロックアウトするポリシーを設定することで、総当たり攻撃を防止できます。
/etc/pam.d/common-auth
ファイルに以下の設定を追加します。
auth required pam_tally2.so deny=3 unlock_time=600 # 3回失敗で10分ロック
6. ファイルシステムのセキュリティ:
- パーミッション設定の徹底: ファイルやディレクトリのパーミッションを適切に設定し、不要な書き込み権限を与えないようにします。
chmod
コマンドを使用して、パーミッションを変更します。chown
コマンドを使用して、ファイルやディレクトリの所有者を変更します。
- SUID/SGIDビットの確認: SUID/SGIDビットが設定されたファイルは、実行時にファイルの所有者またはグループの権限で実行されます。不用意に設定されたSUID/SGIDビットは、セキュリティホールとなりうるため、定期的に確認し、必要のない場合は削除します。
find / -perm +4000 -o -perm +2000 -print
コマンドでSUID/SGIDビットが設定されたファイルを検索できます。
/tmp
ディレクトリのセキュリティ:/tmp
ディレクトリは、一時ファイルを保存するために使用されますが、セキュリティ上のリスクがあります。以下の対策を講じます。- スティッキービットの設定: スティッキービットを設定することで、
/tmp
ディレクトリ内のファイルは、ファイルの所有者、rootユーザー、またはディレクトリの所有者のみが削除できるようになります。
chmod 1777 /tmp
noexec
オプション:/tmp
ディレクトリでプログラムを実行できないように、noexec
オプションをマウント時に指定します。/etc/fstab
ファイルを編集します。
- スティッキービットの設定: スティッキービットを設定することで、
- ファイルシステムの暗号化: 重要なデータを保存するファイルシステムは、暗号化することを検討します。
dm-crypt/LUKS
などのツールを使用して、ファイルシステムを暗号化できます。
7. ログ記録と監査:
- ログ記録の有効化: サーバーの活動を記録するために、適切なログ記録を有効化します。
- システムログ (syslog): システム全体のイベントを記録します。
- アプリケーションログ: 各アプリケーションのイベントを記録します。
- セキュリティログ (auditd): セキュリティ関連のイベント(ファイルへのアクセス、ユーザー認証など)を記録します。
- ログローテーション: ログファイルが肥大化するのを防ぐために、ログローテーションを設定します。
logrotate
ユーティリティを使用して、ログファイルを定期的に圧縮、削除、またはアーカイブできます。 - ログの定期的な分析: ログファイルを定期的に分析し、異常な活動やセキュリティインシデントの兆候がないか確認します。
- リモートログサーバーへの転送: ログファイルをリモートのログサーバーに転送することで、サーバーが侵害された場合でも、ログデータを保護できます。
II. 定期的な運用:継続的なセキュリティ維持
初期設定だけでなく、日々の運用においてもセキュリティを維持するための対策が必要です。
1. ソフトウェアのアップデート:
- OSとアプリケーションの定期的なアップデート: OSやアプリケーションには、セキュリティ上の脆弱性が発見されることがあります。ベンダーが提供するセキュリティパッチを適用することで、これらの脆弱性を修正し、サーバーを保護します。
- 自動アップデートの設定: セキュリティアップデートを自動的に適用するように設定することを推奨します。ただし、自動アップデートによってシステムが不安定になる可能性があるため、事前にテスト環境で検証することを推奨します。
apt-get autoupdate
(Debian/Ubuntu):
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgradeyum update
(CentOS/RHEL):
sudo yum update
- 不要なソフトウェアの削除: 使用していないソフトウェアは、セキュリティリスクを高める可能性があるため、削除します。
2. 脆弱性スキャンの実施:
- 脆弱性スキャナの導入: 定期的に脆弱性スキャンを実施し、サーバーに存在する脆弱性を検出します。
Nessus
、OpenVAS
、Qualys
などの商用またはオープンソースの脆弱性スキャナを利用できます。 - 検出された脆弱性への対応: 脆弱性スキャンで検出された脆弱性に対して、適切な対策を講じます。ベンダーが提供するパッチを適用する、設定を変更する、または脆弱性のあるソフトウェアを削除するなどの対応が必要です。
3. セキュリティ監視:
- IDS/IPSの導入: 侵入検知システム(IDS)および侵入防御システム(IPS)を導入し、不正なネットワークトラフィックや攻撃を検知および防御します。
Snort
、Suricata
、OSSEC
などのオープンソースのIDS/IPSを利用できます。 - セキュリティ情報イベント管理 (SIEM): SIEMシステムは、様々なソースからのセキュリティ関連情報を収集、分析、相関付けし、セキュリティインシデントの検出、分析、対応を支援します。
Splunk
、Elasticsearch
、Graylog
などのSIEMソリューションを利用できます。 - ファイル整合性監視 (FIM): ファイル整合性監視ツールは、重要なシステムファイルや設定ファイルの変更を検出し、不正な改ざんを防止します。
AIDE
、Tripwire
などのFIMツールを利用できます。
4. バックアップと復旧:
- 定期的なバックアップ: 重要なデータを定期的にバックアップし、万が一の事態(ハードウェア故障、データ破損、サイバー攻撃など)に備えます。
- バックアップデータの隔離: バックアップデータをサーバーとは別の場所に保管し、サーバーが侵害された場合でも、バックアップデータを保護します。
- バックアップのテスト: 定期的にバックアップからの復旧テストを実施し、バックアップデータが正常に復元できることを確認します。
5. インシデント対応計画:
- インシデント対応計画の策定: セキュリティインシデントが発生した場合の対応手順を明確に定めたインシデント対応計画を策定します。
- インシデント対応チームの編成: インシデント発生時に対応する担当者を明確にし、インシデント対応チームを編成します。
- インシデント対応訓練: 定期的にインシデント対応訓練を実施し、対応チームのスキルを向上させます。
III. その他のセキュリティ対策:
- Webアプリケーションファイアウォール (WAF) の導入: Webアプリケーションに対する攻撃(SQLインジェクション、クロスサイトスクリプティングなど)を防御するために、WAFを導入します。
- DDoS対策: 分散型サービス拒否(DDoS)攻撃からサーバーを保護するために、DDoS対策サービスを利用します。
- SSL/TLS証明書の利用: Webサイトやアプリケーションへのアクセスを暗号化するために、SSL/TLS証明書を導入します。
- セキュリティに関する教育: 従業員に対して、セキュリティに関する教育を実施し、セキュリティ意識を高めます。
- ペネトレーションテスト: 定期的にペネトレーションテストを実施し、サーバーのセキュリティ上の脆弱性を攻撃者の視点から評価します。
IV. まとめ
Linuxサーバーのセキュリティは、一度設定すれば終わりではありません。本記事で紹介したチェックリストを参考に、初期設定から日々の運用まで、継続的なセキュリティ対策を実施していくことが重要です。常に最新のセキュリティ情報を収集し、サーバー環境の変化に合わせて、セキュリティ対策を更新していくことが、安全なサーバー運用への鍵となります。