SSHキー初心者ガイド:安全な生成、利用、管理
SSHキーの生成、公開鍵のサーバーへのコピー、ssh-agentの使用、ホストごとのSSH設定を安全に管理する方法。
SSHキー入門ガイド:安全に生成、使用、管理する方法
SSHキーを使用すると、ネットワーク上で再利用可能なパスワードを送信せずにサーバーにログインできます。Linuxサーバー、クラウドインスタンス、Gitリモートを管理する場合、適切に保護されたSSHキーは通常、パスワードベースのログインよりも安全で簡単です。
この初心者向けガイドでは、SSHキーペアの生成方法、公開鍵をサーバーにコピーする方法、適切な秘密鍵で接続する方法、そしてサーバーリストが増えるにつれてキーを管理しやすく保つ方法を説明します。
SSHキーペアについて
SSHキー認証は、秘密鍵と公開鍵という暗号鍵のペアに依存しています。これらの鍵は数学的に関連付けられていますが、公開鍵から秘密鍵を導き出すことは計算上不可能です。
- 秘密鍵: この鍵は秘密に保ち、決して共有してはいけません。ローカルマシンに保存され、あなたの身分証明として機能します。SSH接続を開始すると、クライアントは秘密鍵を使用してあなたの身元を証明します。
- 公開鍵: この鍵は自由に共有できます。アクセスしたいリモートサーバーに公開鍵を配置します。接続しようとすると、サーバーは公開鍵を使用して、対応する秘密鍵をあなたが持っていることを確認します。
サーバーに接続しようとすると、次のプロセスが発生します。
- SSHクライアントが公開鍵をサーバーに提示します。
- サーバーは、この公開鍵が認証されているか(つまり、
authorized_keysファイルに存在するか)を確認します。 - 認証されている場合、サーバーはクライアントにチャレンジを送信します。
- クライアントは秘密鍵でチャレンジに署名し、署名をサーバーに送り返します。
- サーバーは公開鍵で署名を検証します。署名が有効な場合、パスワードなしで認証が許可されます。
SSHキーペアの生成
SSHキーペアを生成するための最も一般的なツールはssh-keygenです。このコマンドは、ほとんどのLinux、macOS、Windows(WSLまたはGit Bash経由)システムで使用できます。
ssh-keygenの使用
新しいSSHキーペアを生成するには、ターミナルまたはコマンドプロンプトを開き、次のコマンドを実行します。
ssh-keygen -t ed25519
このコマンドの内訳は次のとおりです。
ssh-keygen:SSHキーを生成するコマンド。-t ed25519:作成するキーのタイプを指定します。ed25519は、最新で非常に安全、かつ高速な楕円曲線暗号アルゴリズムです。その他の一般的なオプションには、rsa(例:4096ビットRSAキーの場合はssh-keygen -t rsa -b 4096)などがあります。
コマンドを実行すると、いくつかの質問が表示されます。
- キーを保存するファイルを入力してください(例:
/home/your_user/.ssh/id_ed25519): Enterキーを押してデフォルトの場所を受け入れます。これにより、.sshディレクトリにid_ed25519(秘密鍵)とid_ed25519.pub(公開鍵)の2つのファイルが作成されます。 - パスフレーズを入力してください(パスフレーズなしの場合は空のまま): これは重要なセキュリティ手順です。パスフレーズを入力すると、秘密鍵がディスク上で暗号化されます。秘密鍵ファイルが侵害された場合でも、攻撃者はそれを使用するためにパスフレーズを必要とします。強力なパスフレーズを使用することを強くお勧めします。
- 同じパスフレーズを再度入力してください: パスフレーズを確認します。
出力ファイルについて
生成後、~/.ssh/ディレクトリ(または指定したパス)に2つのファイルが作成されます。
id_ed25519(またはid_rsa):あなたの秘密鍵です。このファイルは絶対に共有しないでください。 あなたのユーザーのみが読み取り専用になるように権限を制限してください。id_ed25519.pub(またはid_rsa.pub):あなたの公開鍵です。これはサーバーに配布する鍵です。
秘密鍵の保護
秘密鍵に正しいファイル権限が設定されていることを確認することが不可欠です。Linux/macOSでは、次を実行します。
chmod 600 ~/.ssh/id_ed25519
このコマンドは、ファイルの所有者のみに読み取りおよび書き込み権限を制限し、システム上の他のユーザーが秘密鍵にアクセスできないようにします。
サーバーへの公開鍵のデプロイ
SSHキーペアを生成したら、アクセスしたいリモートサーバーに公開鍵を配置する必要があります。
ssh-copy-idの使用(推奨)
ssh-copy-idは、公開鍵をリモートサーバーにコピーするプロセスを簡素化するユーティリティスクリプトです。公開鍵をサーバーの~/.ssh/authorized_keysファイルに自動的に追加し、正しい権限を設定します。
ssh-copy-idを使用するには、ローカルマシンから次のコマンドを実行します。
ssh-copy-id user@remote_host
userをリモートサーバーのユーザー名に、remote_hostをサーバーのIPアドレスまたはホスト名に置き換えます。キー転送を承認するために、リモートホストのuserのパスワードを最後に1回求められます。
標準以外のSSHポート(例:2222)を使用している場合は、-pオプションで指定できます。
ssh-copy-id -p 2222 user@remote_host
手動デプロイ(ssh-copy-idが利用できない場合)
ssh-copy-idが利用できない場合は、公開鍵を手動でコピーできます。まず、ローカルマシンで公開鍵の内容を表示します。
cat ~/.ssh/id_ed25519.pub
出力全体をコピーします。次に、パスワードを使用してリモートサーバーにSSH接続します。
ssh user@remote_host
ログインしたら、.sshディレクトリが存在しない場合は作成し、authorized_keysファイルを作成または追加します。
mkdir -p ~/.ssh
chmod 700 ~/.ssh
次に、公開鍵の内容をauthorized_keysファイルに貼り付けます。これは、nanoやvimなどのテキストエディタを使用して行うことができます。
nano ~/.ssh/authorized_keys
コピーした公開鍵を新しい行に貼り付けます。エディタを保存して終了します。
最後に、authorized_keysファイルの権限が正しいことを確認します。
chmod 600 ~/.ssh/authorized_keys
これらの手順を完了すると、パスワードなしでサーバーにSSH接続できるようになります。
SSHキーを使用した接続
公開鍵がサーバーに配置されたら、秘密鍵を使用して接続できます。SSHクライアントは、~/.ssh/にあるキーを自動的に使用しようとします。
ssh user@remote_host
キー生成時にパスフレーズを使用した場合は、ここでパスフレーズの入力を求められます。パスフレーズを使用しなかった場合は、直接ログインします。
異なるキーの指定
複数のSSHキーペアがある場合、またはキーがデフォルトの場所にない場合は、-iオプションで使用する秘密鍵を指定できます。
ssh -i /path/to/your/private_key user@remote_host
SSHキーの管理
アクセスするサーバーが増えるにつれて、SSHキーも増えていきます。セキュリティと利便性を維持するには、効果的な管理が重要です。
SSHエージェント
SSHエージェントは、パスフレーズで復号化された秘密鍵をメモリに保持するバックグラウンドプログラムです。これにより、パスフレーズを再入力することなく、複数のSSH接続にキーを使用できます。
- SSHエージェントの起動: エージェントは、デスクトップ環境にログインすると自動的に起動することがよくあります。そうでない場合は、手動で起動できます。
eval "$(ssh-agent -s)" - エージェントへのキーの追加: エージェントが実行されたら、秘密鍵を追加します。
パスフレーズの入力を求められます。その後、エージェントがキーを管理し、以降のSSH接続で自動的に使用されます。ssh-add ~/.ssh/id_ed25519
SSH設定ファイル(~/.ssh/config)
SSHクライアント設定ファイル(~/.ssh/config)を使用すると、ホストのエイリアスを定義し、特定のホストに使用するキーを含む接続パラメータを指定できます。これは、複数のサーバーを管理する場合に非常に便利です。
ローカルマシンで~/.ssh/configファイルを作成または編集し、次のようなエントリを追加します。
# デフォルト設定
Host *
ServerAliveInterval 60
# サーバー1:Webサーバー
Host webserver
HostName 192.168.1.100
User webadmin
Port 2222
IdentityFile ~/.ssh/webserver_key
# サーバー2:データベースサーバー
Host dbserver
HostName db.example.com
User dbuser
IdentityFile ~/.ssh/db_key
この設定により、次のコマンドでWebサーバーに接続できます。
ssh webserver
また、次のコマンドでデータベースサーバーに接続できます。
ssh dbserver
SSHクライアントは、~/.ssh/configファイルで定義された正しいユーザー名、ポート、秘密鍵ファイルを自動的に使用します。ForwardAgent yesをグローバルに有効にしないでください。エージェント転送は一部のジャンプホストワークフローに役立ちますが、セッションがアクティブな間、リモートホストにエージェントソケットを公開します。
キーのローテーションと失効
- ローテーション: 特に機密性の高いシステムでは、SSHキーを定期的にローテーションすることを検討してください。これには、新しいキーを生成し、サーバー上の古い公開鍵を置き換えることが含まれます。
- 失効: 秘密鍵が侵害された場合、またはアクセスが不要になった場合は、デプロイされたすべてのサーバーの
authorized_keysファイルから対応する公開鍵を削除する必要があります。これはセキュリティを維持するために重要です。
ベストプラクティスとセキュリティのヒント
- パスフレーズを使用する: 常に強力なパスフレーズで秘密鍵を保護してください。これは、秘密鍵ファイルが盗まれた場合の不正使用に対する主要な防御策です。
- 秘密鍵の権限を保護する: 秘密鍵ファイルの権限が
600(-rw-------)であることを確認してください。 ssh-agentを使用する: SSHエージェントを活用して、パスフレーズを繰り返し入力する手間を省きます。- パスワード認証を無効にする: SSHキー認証が機能するようになったら、サーバーでのパスワードベースの認証を無効にして、セキュリティレイヤーを追加することを検討してください。
- キーを最新の状態に保つ: Ed25519などの最新の強力なアルゴリズムを使用してください。十分なビット長(少なくとも4096)のない古いRSAキーは避けてください。
authorized_keysに注意する: 信頼できるソースからの公開鍵のみをauthorized_keysファイルに追加してください。- 定期的な監査: サーバー上の
authorized_keysファイルを定期的に確認し、許可されたキーのみが存在することを確認してください。
まとめ
SSHキーは、緊急時にサーバーにアクセスする必要が生じる前に設定しておく価値があります。最新のキーを生成し、パスフレーズで秘密鍵を保護し、公開鍵のみをサーバーにコピーし、アクセスが変更されたらauthorized_keysから古いキーを削除してください。