SSHセキュリティのベストプラクティス: サーバーとクライアントの強化

鍵認証、最小特権アクセス、安全なクライアント習慣、ファイアウォールルール、多要素認証、ブルートフォース対策を用いてSSHを堅牢化します。

SSHセキュリティのベストプラクティス:サーバーとクライアントの堅牢化

SSHセキュリティのベストプラクティスが重要なのは、SSHがサーバーへの玄関口であることが多いからです。脆弱なSSH設定は、推測されたパスワード、盗まれた鍵、信頼されたホストのミスを、完全なシェルアクセスに変えてしまう可能性があります。

SSHを適切に堅牢化するために、特別な設定は必要ありません。鍵ベースのログイン、制限されたユーザー、直接のrootログイン禁止、注意深いクライアントの動作、そして何か問題があったときに通知するログから始めましょう。

サーバー側のセキュリティ強化

SSHサーバーの設定(sshd_config)は、クライアントがどのように接続し認証するかのルールを定めます。

1. パスワード認証を無効にする

パスワード認証は本質的にブルートフォース攻撃に対して脆弱です。これをSSH鍵認証に置き換えることは、最も効果的なセキュリティ強化の一つです。

  • 理由: SSH鍵はパスワードよりもはるかに複雑で、ブルートフォース手法で簡単に推測されたり解読されたりすることはありません。はるかに強力な認証形式を提供します。

  • 方法: sshd_configファイル(通常は/etc/ssh/sshd_configにあります)を編集し、PasswordAuthentication noを設定します。変更後、SSHサービスを再起動します:

    sudo sshd -t
    sudo systemctl reload sshd
    

    重要: パスワード認証を無効にする前に、SSH鍵認証が正常に設定されテストされていることを確認し、ロックアウトされないようにしてください。

一部のディストリビューションでは、サービス名はsshdではなくsshです。システムが提供するサービス名を使用し、新しいログインをテストしている間は既存のセッションを開いたままにしておいてください。

2. ポート変更をノイズ低減として扱う

デフォルトのSSHポートを22から変更すると、自動化されたスキャンノイズを減らすことができます。これは鍵、パッチ適用、アクセス制御の代わりにはなりません。

  • 方法: sshd_configPortディレクティブを変更します。例えば、ポート2222を使用する場合:

    Port 2222
    

    新しいポートのトラフィックを許可するようにファイアウォールルールを更新し、クライアントから接続する際にポートを指定することを忘れないでください:

    ssh -p 2222 user@your_server_ip
    

3. ユーザーとグループのアクセスを制限する

SSH経由でのログインを許可するユーザーとグループを制御します。

  • AllowUsersAllowGroups sshd_configでこれらのディレクティブを使用して、接続できるユーザーを明示的に指定します。
    AllowUsers admin user1
    AllowGroups sshusers
    
  • DenyUsersDenyGroups 代わりに、これらを使用して特定のユーザーやグループをブロックします。

4. rootログインを無効にする

SSH経由の直接rootログインは、攻撃者が最も強力なアカウントを即座に標的にするのを防ぐために無効にする必要があります。代わりに、ユーザーは自分のアカウントでログインし、管理タスクにはsudoを使用する必要があります。

  • 方法: sshd_configPermitRootLogin noを設定します。

5. アイドルタイムアウトとキープアライブを設定する

放置されたアクティブなSSHセッションが無期限に開いたままになるのを防ぎます。

  • ClientAliveIntervalClientAliveCountMax これらのサーバー側の設定は、接続がまだ生きているかどうかを確認するために、定期的にクライアントにヌルパケットを送信します。ClientAliveCountMax回の試行後にクライアントが応答しない場合、サーバーはセッションを切断します。
    ClientAliveInterval 300  # 5分ごとにパケットを送信
    ClientAliveCountMax 2    # 2回の応答なし(10分)で切断
    

6. ホスト鍵を強化する

サーバーのホスト鍵が保護され、適切に管理されていることを確認します。

  • パーミッション: ホスト鍵ファイル(例:/etc/ssh/ssh_host_rsa_key)のパーミッションが制限的(例:600)で、rootが所有していることを確認します。
  • アルゴリズム: クライアントがサポートしている場合は、Ed25519などの最新のホスト鍵を優先します。計画なしに既存のホスト鍵を削除しないでください。クライアントはそれをホストIDの変更と見なすためです。
  • ローテーション: ホスト鍵を意図的にローテーションし、新しいフィンガープリントを信頼できるチャネルを通じて通知します。

クライアント側のセキュリティベストプラクティス

クライアントマシンとSSH鍵を保護することは、サーバー側の強化と同じくらい重要です。

1. 秘密鍵を保護する

秘密SSH鍵はサーバーへのゲートウェイです。細心の注意を払って扱ってください。

  • パーミッション: 秘密鍵ファイル(例:~/.ssh/id_rsa)のパーミッションが厳格(例:600または400)で、自分だけが読み取れるようにします。
    chmod 600 ~/.ssh/id_rsa
    
  • パスフレーズ: 秘密鍵を暗号化するために、常に強力なパスフレーズを使用します。これにより、鍵ファイルが侵害された場合でもパスフレーズが必要となり、セキュリティの層が追加されます。
  • コピーを避ける: 秘密鍵を誰とも共有したり、安全でない場所に保存したりしないでください。

2. SSHエージェント転送を注意深く使用する

SSHエージェント転送を使用すると、秘密鍵をリモートサーバーにコピーすることなく、ローカルのSSH鍵を使用してリモートサーバーに認証できます。便利ですが、リモートサーバーが侵害された場合、セキュリティリスクになる可能性があります。

  • 有効化: ssh -A user@your_server_ip
  • ベストプラクティス: エージェント転送はデフォルトで無効にします。信頼するホストにのみ使用し、ワークフローに合う場合は、デプロイ鍵、踏み台ProxyJump、または短期間の認証情報などの代替手段を優先します。

3. ホスト鍵のフィンガープリントを確認する

初めてSSHサーバーに接続するとき、クライアントはサーバーのホスト鍵フィンガープリントを確認するよう促します。これは中間者攻撃を防ぐのに役立ちます。

  • 方法: クラウドコンソール、プロビジョニングログ、管理者などの信頼できる情報源とフィンガープリントを常に照合します。フィンガープリントが予期せず変更された場合は、受け入れる前に停止して調査します。

4. SSHクライアントソフトウェアを最新に保つ

SSHクライアントソフトウェア(OpenSSH、PuTTYなど)を最新の状態に保ち、最新のセキュリティパッチと機能の恩恵を受けられるようにします。

高度なセキュリティ対策

基本的な手順に加えて、以下の高度なテクニックを検討してください:

1. 多要素認証

環境がサポートしている場合、人間のSSHアクセスに多要素認証を追加します。これは通常、SSH鍵とワンタイムコード、プッシュ承認、またはハードウェアバックアップ認証を組み合わせます。

  • ツール: PAMモジュール、Duo、認証アプリ、ハードウェアセキュリティキーはすべてSSH多要素認証設計の一部になり得ます。

2. Fail2ban

Fail2banはログをスキャンして繰り返しの認証失敗を検出し、ソースIPに対する一時的なファイアウォールブロックを追加できます。ログのパスはディストリビューションによって異なります。DebianとUbuntuは一般的に/var/log/auth.logを使用しますが、多くのRHEL系システムはjournaldまたは/var/log/secureを介してログを記録します。

  • インストール: 通常、パッケージマネージャーから利用可能です(sudo apt install fail2ban または sudo yum install fail2ban)。
  • 設定: /etc/fail2ban/jail.localでjailを設定し、SSHログを監視し、禁止時間としきい値を定義します。

3. ファイアウォール設定

ファイアウォール(ufwfirewalldiptablesなど)を使用して、SSHポート(デフォルトまたはカスタム)へのアクセスを信頼できるIPアドレスまたは範囲のみに制限します。

  • 例(ufw):
    sudo ufw allow from trusted_ip to any port 22
    sudo ufw enable
    

まとめ

SSHのセキュリティ確保は継続的な習慣です。鍵ベースの認証を使用し、直接のrootログインを無効にし、接続できるユーザーを制限し、秘密鍵を保護し、ホストフィンガープリントを確認します。そして、リスクが追加の設定を正当化する場合は、ファイアウォール制限、多要素認証、ブルートフォース対策を追加します。