リモートアクセス用のSSHキーの生成と保護方法
強固なSSHキーペアを `ssh-keygen` を使用して生成する方法を学ぶことで、安全なリモートアクセスをマスターしましょう。このガイドでは、キータイプ(Ed25519)の選択、パスフレーズによる秘密キーの保護、`ssh-copy-id` を使用した公開キーの効率的なデプロイ、およびシームレスな認証のための `ssh-agent` の活用に関するベストプラクティスをカバーしています。キーベースのアクセス制御を実装することで、ブルートフォース攻撃からインフラストラクチャを保護してください。
リモートアクセスのためのSSHキーの生成とセキュリティ保護方法
Secure Shell(SSH)は、リモートサーバーに接続するための標準的な方法です。日常的なアクセスにまだパスワードを使用している場合、SSHキーはより強力な認証を提供し、そのアカウントに対するパスワード推測のリスクを排除します。
このガイドでは、SSHキーの生成、パスフレーズによる秘密鍵の保護、サーバーへの公開鍵のインストール、そしてssh-agentを使用して接続のたびにパスフレーズを入力しなくて済むようにする方法を説明します。
SSHキーペアの理解
SSHキーペアは、2つの異なるコンポーネントで構成されています。
- 秘密鍵: この鍵は決して共有してはいけません。ローカルマシンに安全に保管され、リモートサーバーに対して自分の身元を証明するために使用されます。
- 公開鍵: この鍵は自由に共有され、アクセスしたいリモートサーバーの
~/.ssh/authorized_keysファイルにアップロードされます。サーバーはこの鍵を使用して、秘密鍵によって生成された署名を検証します。
適切なアルゴリズムの選択
キーを生成する際は、最新のアルゴリズムを選択してください。Ed25519は、高速でコンパクト、広くサポートされているため、現在のOpenSSHクライアントにとって適切なデフォルトです。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キーを押してデフォルトの場所(
/home/user/.ssh/id_ed25519)を受け入れます。 - パスフレーズを入力(推奨): 使い捨てのラボシステム以外で使用するキーには、強力なパスフレーズを設定します。これにより秘密鍵が暗号化され、鍵ファイルが盗まれてもすぐに使用できなくなります。
RSAキーの生成(代替案)
非常に古いシステムとの互換性が必要な場合は、十分な鍵長(少なくとも4096ビット)を指定してRSAキーを生成できます。
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ユーティリティはプロセスを自動化し、リモートサーバー上のディレクトリ作成とパーミッション設定を処理します。この初期設定では、最後の1回パスワード認証が必要になります。
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システムのほとんどでは、ログイン時にエージェントが自動的に起動します。環境変数を確認することでステータスを確認できます。
echo $SSH_AUTH_SOCKエージェントにキーを追加:
ssh-addコマンドを使用して秘密鍵をロードします。パスフレーズの入力を求められるのは1回だけです。ssh-add ~/.ssh/id_ed25519 # Enter passphrase for /home/user/.ssh/id_ed25519: ********** # Identity added: /home/user/.ssh/id_ed25519 (comment)ロードされたキーを確認:
ssh-add -l
これで、ssh user@remote_host_ipを実行すると、エージェントが保持するキーを使用して接続が認証され、パスフレーズを再度求められることはありません(エージェントセッションが終了するまで)。
重要なssh-agentの注意点
- セッション依存: エージェントにロードされたキーは、通常、現在のターミナルセッションまたはデスクトップログインセッションでのみ利用可能です。ログアウトして再ログインした後は、
ssh-addを再実行する必要があります。 - キーの有効期間:
-tフラグを使用して、エージェントに保持されるキーの最大有効期間を設定できます(例:ssh-add -t 1h ~/.ssh/id_ed25519はキーを1時間ロードしたままにします)。
高度なセキュリティ: パスワード認証の無効化
必要なすべてのサーバーでキーベースの認証が問題なく機能することを確認したら、最も強力なセキュリティ対策はパスワードベースのログインを完全に無効にすることです。これにより、パスワードに対するブルートフォース攻撃を防ぎます。
キーを使用してSSH経由でサーバーに接続します。
SSHデーモン設定ファイル(通常は
/etc/ssh/sshd_configにあります)を編集します。sudo nano /etc/ssh/sshd_config次のディレクティブを見つけて設定します。
# これがyesに設定されていることを確認(通常はデフォルト) PubkeyAuthentication yes # パスワードログインを無効化 PasswordAuthentication no再起動する前に設定を確認します。
sudo sshd -tSSHサービスを再起動して変更を適用します。サービス名は、RHEL系システムでは一般的に
sshd、Debian/Ubuntuではsshです。sudo systemctl restart sshd # または sudo systemctl restart ssh
警告: パスワード認証を無効にする前に、1つのSSHセッションを開いたままにして、新しいキーで2回目のログインが機能することを確認してください。再起動が失敗したり、キーが間違っていたりすると、コンソールまたは帯域外アクセスが必要になります。
次のステップ
最初のキーベースのログインが成功したら、SSHキーを本番環境の認証情報として扱います。
- アクセスする主要なシステムまたはサービスごとに一意のキーペアを生成します。
- 重要なサーバー上の
authorized_keysファイルを定期的に監査します。 - 担当者が変わったり、マシンが廃止されたりしたら、古いキーを削除します。
- 共有ワークステーションでは、短命のエージェントセッションに
ssh-add -tを使用します。