1
3

ローカル端末のみに秘密鍵を保持:SSH Agent Forwardingによる安全な多段SSH接続

Last updated at Posted at 2024-08-28

1. 背景

パブリックサブネットにある踏み台サーバー(Bastion Server)経由で他のサーバーにアクセスする際、プライベートキー(private key)はどう管理していますか?
たまにプライベートキーをBastion Serverに置いてしまうケースを聞いたことがあります。
しかし、これは非常に危険な方法です。
プライベートキーをBastion Serverに置くと、そのサーバーが侵害された場合、プライベートサブネット内の他のEC2インスタンスも危険にさらされる可能性があります。このリスクを回避するため、より安全な方法を検討する必要があります。
image.png

そこで、Bastion ServerやプライベートEC2インスタンスに直接プライベートキーをコピーせず、ローカルマシンにのみプライベートキーを保存するSSH Agent Forwarding方式について説明します。この方法を使用することで、セキュリティを向上させつつ、効率的にサーバーアクセスを行うことができます。
image.png

2. SSH Agent Forwardingの動作仕組み

2.1 操作プロセス

  1. 接続の確立
    ローカルマシンからBastion Serverに接続する際、SSH AgentのUNIXドメインソケットが転送
  2. 認証要求の転送:
    Bastion ServerからPrivate EC2インスタンスに接続する際、認証要求がSSHプロトコルを通じてローカルマシンのSSH Agentに転送されます
  3. ローカルでの署名:
    ローカルマシンのSSH Agentが秘密鍵を使用して認証要求に署名し、結果を転送
  4. 認証の完了:
    署名された認証要求がBastion Serverを経由してPrivate EC2インスタンスに送られ、認証が完了

2.2 特徴

  • 秘密鍵はローカルマシンから移動しません
  • 中間サーバー(Bastion Server)に秘密鍵をコピーする必要がありません
  • 複数のホップを経由する場合でも、1つの秘密鍵で認証が可能

3. 利用ための準備

  1. SSHクライアント側(Bastion Serverにログインするローカルマシン)Agent Forwardingの有効化

    1. ssh -Aコマンドで都度指定する方法
      ssh -A ec2-user@bastion-server-ip
      
    2. ユーザーの~/.ssh/configで設定を追加する方法
      Host *
        ForwardAgent yes
      
  2. Bastion Server側Agent Forwadingの有効化:

    • Bastion ServerのSSHDの設定ファイル(/etc/ssh/sshd_config)で、以下の設定が有効になっていることを確認
      AllowAgentForwarding yes
      
    1. 多くのLinuxのデフォルト設定では、/etc/ssh/sshd_configAllowAgentForwardingがコメントアウトされたとしても、デフォルトでyesとして扱われます。つまり、明示的にnoと設定されていない限り、Agent Forwardingは許可されています。
      つまり、Bastion Server側で明示的にAgent Forwardingを有効にする設定を行わなくても、クライアント側の設定が正しければAgent Forwardingは機能します。

    2. 現在の設定を確認する方法:

    sudo sshd -T | grep -i 'AllowAgentForwarding'
    

    現在bastion server側の設定値を確認:デフォルトでyesになっている
    image.png

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
    
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3