リモートアクセス用のSSHキーを生成し、安全に管理する方法
Secure Shell (SSH) は、リモートサーバーやシステムに安全に接続するための標準的なプロトコルです。パスワード認証が一般的ですが、SSHキーペアを使用すると、より強力で、便利で、回復力のある認証方法が提供されます。この包括的なガイドでは、堅牢なSSHキーペアの生成、パスフレーズによる保護、そしてシームレスで安全なリモートアクセスのためのssh-agentの活用について説明します。
キー管理を理解することは、インフラストラクチャのセキュリティを維持するために不可欠です。脆弱なパスワードを暗号鍵に置き換えることで、ブルートフォース攻撃やクレデンシャルスタッフィングに関連するリスクを軽減し、安全なリモート接続の基盤を確立します。
SSHキーペアの理解
SSHキーペアは、次の2つの異なるコンポーネントで構成されています。
- 秘密鍵(The Private Key): この鍵は決して共有してはいけません。ローカルマシンに安全に保管され、リモートサーバーに対してあなたの身元を証明するために使用されます。
- 公開鍵(The Public Key): この鍵は自由に共有され、アクセスしたいリモートサーバーの
~/.ssh/authorized_keysファイルにアップロードされます。サーバーは、この鍵を使用して秘密鍵によって生成された署名を検証します。
適切なアルゴリズムの選択
キーを生成する際には、最新で強力な暗号アルゴリズムを選択することが不可欠です。RSAは依然として広く使用されていますが、Ed25519はその速度と強力なセキュリティ保証からしばしば推奨されます。
ステップ 1: SSHキーペアの生成
ssh-keygenユーティリティは、Linux、macOS、およびWindows(Git BashまたはWSL経由)でSSHキーペアを作成するための標準ツールです。
Ed25519キーの生成(推奨)
最新のEd25519キーを作成するには、次のコマンドを使用します。キーのタイプ(-t ed25519)を指定し、キーの目的や所有者を識別するのに役立つコメント(-C)を提供します。
ssh-keygen -t ed25519 -C "[email protected]_or_host_name"
プロンプトが表示されたら、以下のように入力します。
- Enter file in which to save the key: Enterを押してデフォルトの場所(
/home/user/.ssh/id_ed25519)を受け入れます。 - Enter passphrase (recommended): 必ず強力なパスフレーズを設定してください。これにより秘密鍵が暗号化されるため、誰かにファイルが盗まれても、パスフレーズなしでは使用できません。
RSAキーの生成(代替)
非常に古いシステムとの互換性が必要な場合は、RSAキーを生成できます。この際、十分な鍵の長さ(最低4096ビット)を指定するようにしてください。
ssh-keygen -t rsa -b 4096 -C "your_rsa_key_comment"
キーの出力ファイル
生成後、~/.ssh/ディレクトリに2つのファイルが作成されます(デフォルトの場合を想定)。
id_ed25519(またはid_rsa): 秘密鍵id_ed25519.pub(またはid_rsa.pub): 公開鍵
セキュリティのベストプラクティス:
.pub拡張子のないファイルを共有しないでください。秘密鍵には厳格なパーミッションを設定してください(chmod 600 ~/.ssh/id_ed25519)。
ステップ 2: 公開鍵をサーバーにコピーする
リモートサーバーは、アクセスを許可するために、~/.ssh/authorized_keysファイルにあなたの公開鍵を持っている必要があります。
ssh-copy-idの使用(最も簡単な方法)
ssh-copy-idユーティリティは、リモートサーバー上でのディレクトリ作成とパーミッション設定を処理し、プロセスを自動化します。この初期設定のために、あなたはパスワードを使って最後にもう一度だけ認証する必要があります。
ssh-copy-id user@remote_host_ip
成功すると、コマンドは鍵が追加されたことを通知します。これでログインを試みることができます。
手動でのコピー(ssh-copy-idが利用できない場合)
ssh-copy-idを使用できない場合は、公開鍵の内容を手動で追記できます。まず、公開鍵を表示します。
cat ~/.ssh/id_ed25519.pub
次に、パスワードを使用してリモートサーバーにログインし、出力をauthorized_keysファイルに追記します。
# リモートサーバー上にて
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# <PASTE_YOUR_PUBLIC_KEY_HERE> を実際の鍵の内容に置き換えてください
echo "<PASTE_YOUR_PUBLIC_KEY_HERE>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ステップ 3: ssh-agentでアクセスを保護する
サーバーに接続するたびにパスフレーズを入力するのは面倒です。ssh-agentは、復号化された秘密鍵をメモリに安全に保持するバックグラウンドプログラムであり、パスフレーズを繰り返し入力することなく鍵を使用できるようにします。
ssh-agentの開始と使用
-
エージェントが実行されていることを確認: ほとんどの最新のLinux/macOSシステムでは、ログイン時にエージェントが自動的に起動します。環境変数を調べることで、そのステータスを確認できます。
bash echo $SSH_AUTH_SOCK -
エージェントに鍵を追加:
ssh-addコマンドを使用して秘密鍵をロードします。パスフレーズを求められるのは一度だけです。```bash
ssh-add ~/.ssh/id_ed25519Enter passphrase for /home/user/.ssh/id_ed25519: ****
Identity added: /home/user/.ssh/id_ed25519 (comment)
```
-
ロードされた鍵の確認:
bash ssh-add -l
これで、ssh user@remote_host_ipを実行すると、エージェントが保持している鍵を使用して接続が認証され、再度パスフレーズを求められることはありません(エージェントセッションが終了するまで)。
重要な ssh-agent の注意点
- セッション依存: エージェントにロードされた鍵は、通常、現在のターミナルセッションまたはデスクトップログインセッションでのみ利用可能です。ログアウトしてから再度ログインした後は、
ssh-addを再実行する必要があります。 - 鍵の有効期間:
-tフラグを使用して、エージェントに保持される鍵の最大有効期間を設定できます(例:ssh-add -t 1h ~/.ssh/id_ed25519は鍵を1時間ロード状態に保ちます)。
高度なセキュリティ: パスワード認証の無効化
必要なすべてのサーバーで鍵ベースの認証が完全に機能することを確認したら、最も強力なセキュリティ対策として、パスワードベースのログインを完全に無効にすることです。これにより、パスワードに対するブルートフォース攻撃を防ぐことができます。
- 鍵を使用してSSH経由でサーバーに接続します。
-
通常
/etc/ssh/sshd_configにあるSSHデーモン設定ファイルを編集します。bash sudo nano /etc/ssh/sshd_config -
次のディレクティブを見つけて設定します。
```config
これが yes に設定されていることを確認します (通常はデフォルト)
PubkeyAuthentication yes
パスワードログインを無効化
PasswordAuthentication no
``` -
変更を適用するためにSSHサービスを再起動します。
```bash
sudo systemctl restart sshd # systemdベースのシステム (ほとんどの最新Linux)または
sudo service ssh restart # 古いシステム
```
警告: パスワード認証を無効にする前に、必ず新しい鍵を使用して一度は正常にログインできたことを確認してください。設定エラーによりロックアウトされるのはよくある間違いであり、回復可能ですが、コンソールアクセスまたは代替アクセスが必要になります。
まとめと次のステップ
SSHキーの生成と管理は、安全なシステム管理における基本的なスキルです。これらのステップ、すなわち最新のEd25519キーの生成、強力なパスフレーズによる秘密鍵の保護、ターゲットサーバーへの公開鍵の安全なインストール、およびssh-agentの活用を行うことで、非常に安全で効率的な認証メカニズムを確立できます。
次のステップ:
- アクセスする主要なシステムまたはサービスごとに一意のキーペアを生成します。
- 重要なサーバーの
authorized_keysファイルを定期的に監査します。 - 可能であれば、異なるキーペアに対して異なるパスフレーズを使用するか、少なくともそれらが複雑であることを確認してください。