SSHキーベース認証の安全な設定手順ガイド

ED25519鍵、authorized_keys、ssh-agent、安全なsshd設定を使用して、SSHキーベース認証を安全に設定します。

SSHキーベース認証の安全な設定手順ガイド

SSHキーベース認証は、多くのパスワードベースの攻撃からサーバーを保護しますが、鍵を慎重に生成し、公開鍵を正しくインストールし、サーバー設定を変更する前にアクセスをテストする場合に限ります。

このガイドでは、ED25519鍵の生成、公開鍵のインストール、ログインテスト、安全なSSHデーモン設定について説明します。

SSHキーベース認証について

SSHキーベース認証は、暗号的にリンクされた鍵のペア、秘密鍵公開鍵に依存します。

  • 秘密鍵: この鍵は秘密に保ち、ローカルマシン上で安全に保管する必要があります。これは、あなただけが持つ非常に複雑なパスワードのようなものです。
  • 公開鍵: この鍵は自由に共有でき、アクセスしたいリモートサーバーに配置されます。サーバーはこれを使用してあなたの身元を確認します。

接続を試みると、サーバーは公開鍵を使用してローカルマシンにチャレンジを送信します。ローカルマシンは秘密鍵を使用してこのチャレンジに応答し、ネットワーク経由で秘密鍵を送信することなく身元を証明します。この方法はより安全であるだけでなく、一度正しく設定すれば接続のたびにパスワードを入力する必要がなくなるため、より便利です。

ステップ1: SSH鍵ペアの生成

ssh-keygenユーティリティは、新しいSSH鍵ペアを作成するために使用されます。ED25519のような最新の強力なアルゴリズムを使用することをお勧めします。

鍵の種類と強度の選択

RSA鍵はまだ広く使用されていますが、ED25519は短い鍵長で優れたセキュリティと高速な操作を提供します。新しいセットアップでは、ED25519が一般的に推奨されます。

鍵ペアの生成

ローカルマシン(クライアント)でターミナルを開き、次のコマンドを実行します。

ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519: 鍵の種類をED25519に指定します。
  • -C "[email protected]": 公開鍵にコメントを追加します。これは識別のために使用されることがよくあります。実際のメールアドレスまたは説明ラベルに置き換えてください。

コマンドは、鍵を保存する場所とオプションのパスフレーズを求めます。

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/youruser/.ssh/id_ed25519
Your public key has been saved in /home/youruser/.ssh/id_ed25519.pub
The key fingerprint is: SHA256:...
The key's randomart image is: ...

強力なパスフレーズの設定(強く推奨)

プロンプトが表示されたら、秘密鍵には常に強力なパスフレーズを設定してください。このパスフレーズはローカルマシン上の秘密鍵を暗号化し、追加のセキュリティ層を提供します。秘密鍵が悪意のある手に渡った場合でも、パスフレーズがなければ無価値です。ssh-agentを使用すると、パスフレーズを繰り返し入力する手間を省くことができます(ステップ4を参照)。

鍵ファイルの場所

デフォルトでは、ssh-keygenは秘密鍵を~/.ssh/id_ed25519に、公開鍵を~/.ssh/id_ed25519.pubに保存します。

秘密鍵のパーミッション

秘密鍵ファイルには非常に厳格なパーミッションを設定することが重要です。所有者のみが読み取り可能である必要があります。ssh-keygenは通常これを正しく設定しますが、確認することをお勧めします。

chmod 600 ~/.ssh/id_ed25519

ステップ2: サーバーへの公開鍵の配布

鍵ペアを生成したら、公開鍵をアクセスしたいリモートサーバーにコピーする必要があります。リモートサーバーのユーザーの~/.ssh/ディレクトリ内のauthorized_keysというファイルに配置する必要があります。

方法1: ssh-copy-idの使用(推奨)

ssh-copy-idは最も簡単で安全な方法です。リモートサーバーにログインし(パスワードを使用)、~/.sshディレクトリが存在しない場合は作成し、正しいパーミッションを設定し、公開鍵を~/.ssh/authorized_keysに追加します。

ssh-copy-id user@your_server_ip

userをリモートサーバーのユーザー名に、your_server_ipをサーバーのIPアドレスまたはホスト名に置き換えてください。リモートサーバーのパスワードを求められます。

方法2: 手動コピー

ssh-copy-idが利用できない場合は、公開鍵を手動でコピーできます。

  1. ローカルマシンから公開鍵の内容をコピーします:

    cat ~/.ssh/id_ed25519.pub
    

    出力全体をクリップボードにコピーします(ssh-ed25519 ...で始まります)。

  2. パスワードを使用してリモートサーバーにログインします:

    ssh user@your_server_ip
    
  3. ~/.sshディレクトリが存在しない場合は作成し、パーミッションを設定します:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  4. 公開鍵をauthorized_keysに追加します:

    echo "PASTE_YOUR_PUBLIC_KEY_HERE" >> ~/.ssh/authorized_keys
    

    PASTE_YOUR_PUBLIC_KEY_HEREを実際にコピーした内容に置き換えてください。 既存の鍵がある場合に上書きしないよう、>>(追加)を使用することが重要です。

  5. authorized_keysに正しいパーミッションを設定します:

    chmod 600 ~/.ssh/authorized_keys
    
    • 警告: ~/.sshまたは~/.ssh/authorized_keysのパーミッションが正しくないと、キーベース認証が機能しなくなります。

ステップ3: SSHキーベース認証のテスト

パスワード認証を無効にする前に、キーベース認証が正しく機能することを確認することが絶対に重要です。手動コピーの手順でまだ接続している場合は、リモートサーバーからログアウトします。

ローカルマシンから、パスワードを指定せずにサーバーへの接続を試みます。

ssh user@your_server_ip
  • 秘密鍵にパスフレーズを設定した場合は、その入力を求められます。
  • パスワードプロンプトなしで接続が成功した場合(該当する場合はパスフレーズの後)、キーベース認証が機能しています。リモートサーバーのプロンプトが表示されるはずです。

SSHキーを使用してログインできない場合は、ステップ4に進まないでください。 パスワード認証を無効にする前に問題をトラブルシューティングしてください。そうしないと、サーバーからロックアウトされるリスクがあります。

ステップ4: セキュリティの強化 - パスワード認証の無効化

SSHキーベース認証が機能することを確認したら、サーバーでのパスワードベースのログインを無効にして、セキュリティを大幅に向上させることができます。これにより、パスワードに対するブルートフォース攻撃を防ぎ、有効なSSHキーを持つユーザーのみがサーバーにアクセスできるようになります。

  1. SSHキーを使用してリモートサーバーにログインします。

    ssh user@your_server_ip
    
  2. SSHデーモン設定ファイルを編集します。 このファイルは通常/etc/ssh/sshd_configにあります。

    sudo nano /etc/ssh/sshd_config
    

    nanoの代わりにviやお好みのテキストエディタを使用できます。)

  3. 次のディレクティブを見つけて変更します:

    • PasswordAuthenticationを見つけ、値をnoに変更します。

      #PasswordAuthentication yes
      PasswordAuthentication no
      

      #でコメントアウトされている場合は、行のコメントを解除します)

    • KbdInteractiveAuthenticationを見つけ、値をnoに変更します。古いOpenSSHリリースでは、同等のディレクティブはChallengeResponseAuthenticationの場合があります。

      KbdInteractiveAuthentication no
      
    • (オプションですが推奨)通常ユーザーとしてログインした後にsudoを使用する予定がある場合は、SSH経由でのrootログインを直接無効にすることを検討してください。

      PermitRootLogin no
      
    • (オプション)デフォルトのSSHポートを22から標準外の高いポート(例:2222)に変更することを検討してください。これは標的型攻撃に対するセキュリティを追加するものではありませんが、自動ポートスキャナーからのノイズを減らすことができます。

      #Port 22
      Port 2222
      

      ポートを変更した場合は、接続時に-pフラグで指定することを忘れないでください(例:ssh -p 2222 user@your_server_ip)。

  4. 変更を保存し、テキストエディタを終了します。

  5. 新しい設定を適用するためにSSHサービスを再起動します。 コマンドはオペレーティングシステムによって多少異なります(例:Ubuntu/Debian vs. CentOS/RHEL)。

    • Systemdベースのシステム(最新のLinuxディストリビューションのほとんど):

      sudo sshd -t
      sudo systemctl restart sshd
      
    • 古いSysVinitベースのシステム:

      sudo service ssh restart
      
  6. *重要なのは、新しいターミナルウィンドウを開き(現在のアクティブなSSHセッションは閉じないでください!)、キーを使用してログインを試みることです。* これにより、問題が発生した場合にロックアウトされることなく、新しい設定をテストできます。

    ssh user@your_server_ip
    

    ポートを変更した場合:

    ssh -p 2222 user@your_server_ip
    

    接続が成功した場合は、元のSSHセッションを安全に閉じることができます。

    新しいログインが失敗した場合は、元のアクティブなSSHセッションでsshd_configの変更をすぐに元に戻し、SSHサービスを再度再起動してから、再評価してください。

ベストプラクティスとヒント

  • 秘密鍵には常に強力なパスフレーズを使用してください。 これは、秘密鍵が侵害された場合の最後の防御線です。
  • 秘密鍵を保護してください。 決して共有せず、厳格なファイルパーミッション(chmod 600 ~/.ssh/id_ed25519)で安全に保管してください。究極の保護のために、ハードウェアセキュリティモジュール(HSM)やYubiKeyの使用を検討してください。
  • 利便性のためにssh-agentを使用してください。 ssh-agentを使用すると、秘密鍵をメモリにロードし、複数のSSH接続にわたってセッションごとに一度だけパスフレーズを入力できます。ssh-add ~/.ssh/id_ed25519でエージェントに鍵を追加します。
  • 定期的にSSHキーをローテーションしてください。 定期的に新しい鍵ペアを生成し、サーバーから古い公開鍵を削除します。特に、チームメンバーが退職した場合や、鍵のセキュリティが侵害された疑いがある場合に行います。
  • PermitRootLoginnoまたはprohibit-passwordに制限してください。 通常ユーザーとしてログインし、管理タスクにはsudoを使用する方が一般的に優れています。
  • ファイアウォールを設定してください。 SSHポートなどの必要なポートのみがインターネットに開放されていることを確認してください。ufwfirewalldなどのツールが役立ちます。

最後に

秘密鍵が主要なログイン認証情報になりますので、パスフレーズと厳格なファイルパーミッションで保護してください。sshd_configを変更する際は、テスト済みのSSHセッションを1つ開いたままにし、sshd -tで設定を検証し、新しいキーベースのログインが機能した後にのみ古いセッションを閉じてください。