1. 背景
パブリックサブネットにある踏み台サーバー(Bastion Server
)経由で他のサーバーにアクセスする際、プライベートキー(private key
)はどう管理していますか?
たまにプライベートキーをBastion Server
に置いてしまうケースを聞いたことがあります。
しかし、これは非常に危険な方法です。
プライベートキーをBastion Server
に置くと、そのサーバーが侵害された場合、プライベートサブネット内の他のEC2インスタンスも危険にさらされる可能性があります。このリスクを回避するため、より安全な方法を検討する必要があります。
そこで、Bastion Server
やプライベートEC2インスタンスに直接プライベートキーをコピーせず、ローカルマシンにのみプライベートキーを保存するSSH Agent Forwarding
方式について説明します。この方法を使用することで、セキュリティを向上させつつ、効率的にサーバーアクセスを行うことができます。
2. SSH Agent Forwardingの動作仕組み
2.1 操作プロセス
- 接続の確立
ローカルマシンからBastion Serverに接続する際、SSH AgentのUNIXドメインソケットが転送 - 認証要求の転送:
Bastion ServerからPrivate EC2インスタンスに接続する際、認証要求がSSHプロトコルを通じてローカルマシンのSSH Agentに転送されます - ローカルでの署名:
ローカルマシンのSSH Agentが秘密鍵を使用して認証要求に署名し、結果を転送 - 認証の完了:
署名された認証要求がBastion Serverを経由してPrivate EC2インスタンスに送られ、認証が完了
2.2 特徴
- 秘密鍵はローカルマシンから移動しません
- 中間サーバー(Bastion Server)に秘密鍵をコピーする必要がありません
- 複数のホップを経由する場合でも、1つの秘密鍵で認証が可能
3. 利用ための準備
-
SSHクライアント側(Bastion Serverにログインするローカルマシン)
Agent Forwarding
の有効化-
ssh -A
コマンドで都度指定する方法ssh -A ec2-user@bastion-server-ip
- ユーザーの
~/.ssh/config
で設定を追加する方法Host * ForwardAgent yes
-
-
Bastion Server側
Agent Forwading
の有効化:- Bastion ServerのSSHDの設定ファイル(
/etc/ssh/sshd_config
)で、以下の設定が有効になっていることを確認AllowAgentForwarding yes
-
多くのLinuxのデフォルト設定では、
/etc/ssh/sshd_config
のAllowAgentForwarding
がコメントアウトされたとしても、デフォルトでyes
として扱われます。つまり、明示的にnoと設定されていない限り、Agent Forwardingは許可されています。
つまり、Bastion Server側で明示的にAgent Forwardingを有効にする設定を行わなくても、クライアント側の設定が正しければAgent Forwardingは機能します。 -
現在の設定を確認する方法:
sudo sshd -T | grep -i 'AllowAgentForwarding'
- Bastion ServerのSSHDの設定ファイル(
4. ssh -A
コマンドで都度指定する方法
事前準備:ローカルPCの.ssh/configに以下を設定しておく
Host bastion
Hostname <bastion-server-ip>
Port 22
User ec2-user
IdentityFile ~/.ssh/id_rsa
- ローカルPCから以下のコマンドで先にbastionサーバーにアクセス
$ ssh -A bastion
- さらにbastionサーバーからprivate subenetにあるEC2にログイン
$ ssh ec2-user@<private-instance-ip>
5. ユーザーの~/.ssh/config
で設定を追加する方法
事前準備:/.ssh/config
ファイルに以下の内容を設定しておく
Host bastion
Hostname <bastion-server-ip>
Port 22
User ec2-user
IdentityFile ~/.ssh/id_rsa
ForwardAgent yes
Host private
Hostname <private-instance-ip>
Port 22
User ec2-user
ProxyCommand ssh -W %h:%p bastion
- ローカルPCから以下のコマンドで先にbastionサーバーにアクセス
$ ssh bastion
- ローカルPCからprivate subenetのEC2にログイン
$ ssh private