【AWS】踏み台サーバー経由でプライベートサブネットのEC2にSSH接続する2つの方法まとめ

:::note info
本記事は[リンクアンドモチベーションAdventCalendar2024](https://qiita.com/advent-calendar/2024/lmi)の13日目の記事です。
:::

## はじめに
こんにちは！リンクアンドモチベーションでSREをしている井川と申します。
本記事は、AWSのプライベートサブネットのEC2にSSH接続を試した際の学びをまとめたものです。

今回は「プライベートサブネットのEC2にSSH接続する」という具体的なGoalを設定しながら、それに必要な設定や手順を整理していきます。
また、複数の方法を試し、それぞれのメリット・デメリットについても触れるので、ぜひ最後までご覧ください。



## プライベートサブネットのEC2へのSSH接続イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/16c97b22-5981-6d0a-a43e-e30d58f507cd.png)
プライベートサブネットは、インターネットから直接アクセスできないため、一度踏み台サーバーを経由する必要があります。
踏み台サーバーとは、パブリックサブネットに置く中継用のサーバーで、この踏み台サーバーにSSH接続をしてそこから改めて目的のサーバーにSSH接続をします。

ちなみに、NATゲートウェイは使わないのかという疑問を持たれるかもしれませんが、NATゲートウェイでは外部から接続できません。
というのも、NATゲートウェイはパブリックサブネットのリソース**から**インターネットにアクセスするためのもので、外部からのアクセスを許可していないためです。

## プライベートサブネットのEC2へのSSH接続手順
手順は以下の通りです。
1. インターネットからSSH接続できるEC2をパブリックサブネットに作成する

1. 踏み台サーバーからのSSH接続を許可するセキュリティグループを作成する
![image (78).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/8d386800-7ee0-303d-dfc2-b2b9e7d58edc.png)
（パブリックサブネットに作成したEC2のプライベートipを指定する）

1. 上記セキュリティグループを紐付けたEC2をプライベートサブネットに作成する

しかし、上記設定では、踏み台サーバーから目的サーバーにSSH接続する際に、キーペアが見つからず接続できません。
![image (86).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/b488be89-dd42-e537-fdfd-516a6359e2fe.png)

その問題を解決する方法が2種類あります。
**キーペアを踏み台サーバーに保存する方法**と**SSH Agent Forwardingを利用する方法**です。
それぞれ方法を解説していきます。


## キーペアを踏み台サーバーに保存する方法
この考え方はシンプルです。
ローカルに保存したキーペアを参照できない場合、踏み台サーバーにそのキーペアをコピーすれば良いというものです。

scpというコマンドを用いて、ローカルに保存したキーペアを踏み台サーバーにコピーします。
```
scp -i 踏み台サーバー用のキーペア 送信したいファイル（目的サーバー用のキーペア） ec2-user@踏み台サーバーのIPアドレス:~/.ssh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/15e4c224-fc04-a1ca-a333-862ebf1881d6.png)


これにより、下記の通りプライベートサブネットのEC2にSSH接続できます。
まず、ローカルにあるキーペアを使って踏み台サーバーにSSH接続します。
```
ssh -i キーペア ec2-user@踏み台サーバーのIPアドレス
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/d176eca7-bbd5-9745-bff0-7c17da038bf8.png)


そして、踏み台サーバーにあるキーペアを使って目的サーバーへSSH接続します。
```
ssh -i ~/.ssh/キーペア ec2-user@目的サーバーのIPアドレス
```
![image (81).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/6180e625-f14d-59c3-eab0-237a98995fe1.png)

ただし、この接続方法だと、パブリックサブネットのEC2にキーペアを保存することになるため、設定ミスや攻撃により漏洩するリスクがあります。
そのため、パブリックサブネットのEC2にキーペアを保存せずプライベートサブネットのEC2にSSH接続をする方法でも試してみます。

## SSH Agent Forwardingを利用する方法
ssh-agentという秘密鍵の管理を効率化するプログラムを利用します。

まずは、今回使っているキーペアを登録します。
```
ssh-add xxxx.pem
```
![image (84).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/bfd2e0a4-916e-bc2a-a77c-65e9eaf52934.png)


そして、踏み台サーバーにSSH接続する際に`-A`オプションをつけることで踏み台サーバーでssh-agentに登録されたキーペアを利用できます。
```
ssh -A ec2-user@踏み台サーバーのIPアドレス
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/63be4708-2c51-ac4c-7d86-9c5de1dfcf97.png)


その上で、踏み台サーバーから目的サーバーへSSH接続します。
オプションをつける必要はありません。
```
ssh ec2-user@目的サーバーのIPアドレス
```
![image (83).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622457/d43cde78-863a-ed66-29cd-f9a72b0be026.png)

## まとめ
今回、踏み台サーバーを用いてプライベートサブネットのEC2にSSH接続する中で、認証のための方法が2種類あることをまとめました。
2つを比較すると、キーペアを踏み台サーバーに保存する方法が簡単ですが、セキュリティのリスクがあるため、SSH Agent Forwardingを利用する方法の方が安全に思えます。

しかし、現在は[Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html)を使った、踏み台サーバーを用いない接続方法もあるため、そちらも学んで今後の実業務に活かしていきたいと思います。