プライベートなEC2へSSH接続

# 背景

----

# 背景

社内のプロジェクトで以下の話が上がってきて対応した記録です。

・　普段、[Amazon Workspaces](https://aws.amazon.com/jp/workspaces/)でプライベートなEC2にアクセスしている
・　今回、一時的に作業効率を上げたく直接アクセスしたい

-----

# 簡単な構成

-----

## 簡単な構成

・ Amazon WorkspacesからEC2へアクセスする
・ EC2はNAT Gatewayでインターネットから必要なパッケージをDLする

![image_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/1af1c7fb-5c19-c2e8-55c4-b6b49a7000bf.png)

-----

# 想像したこと１

## リスク

・ インターネットからアクセスしてはいけないポリシーがある（はず）
・ 同一サブネットにある他のリソースにアクセスできないようにする

## コスト

・インターネットからアクセスできる経路を確保するには追加コストが拠点側・AWS側のどこかで発生する

---

# 想像したこと２

## ルートテーブル

・ プライベートサブネットなので、インターネットに出るためにNAT Gatewayを向いている（はず）か

## セキュリティグループ

・ 既設でインターネットからinboundで許可するグループ、あるいは一時的に新設が可能か

---

#  検討したこと

・ パブリックサブネットにインターネットからinboudを受けるSSHエージェント転送サーバを作る
　　→　パブリックサブネット側のルートテーブルが複雑で、新たに切り出したあとの制御などのタイムコストで断念
・ [E.IP](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)を付与する
　　→　既存のプライベートサブネットにあるルートテーブルが複雑なので、対象インスタンス用に新たに切り出すための調査などのタイムコストで断念
・ [AWS Client VPN](https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/what-is.html)環境を作る
　　→　VPNエンドポイントを作っただけでは他のインスタンスにもアクセスできてしまうので、制御が難しいと断念
・ [ELB - CLB](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/introduction.html)を作る　→ CLBのターゲットインスタンスを対象のEC2インスタンスのみに絞ればよくて、CLBのセキュリティグループを新設すれば、アクセス元も制御できる

### 参考にしたこと

[プライベートなEC2に一時的にSSHする3つの方法](https://dev.classmethod.jp/etc/bastion-3way-rk/)
[[AWS]踏み台をワンチャンなくせる！？VPC接続にClient VPNを使ってみよう](https://dev.classmethod.jp/cloud/aws/vpc-client-vpn/)

----

# 実際作ってみた

![image_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/5deb6ab8-7967-afde-c76c-6a1e1793d4df.png)

----

# ベース

Public SubnetとPrivate Subnetに分ける普通の構成です。

## VPC

|  IPv4 CIDR | IPv6 CIDR |    
|:----------:|:----:|
| 10.1.0.0/16 | - |

## Subnet

|  IPv4 CIDR | Route Table | NOTES |    
|:----------:|:----------:|:---------:|
| 10.1.1.0/16 | Route Table A | Public Subnet(DMZ) |
| 10.1.2.0/16 | Route Table B | Private Subnet |

## Route Table

#### Route Table A

|  Destination | Target | Status |  Propagated |     
|:----------:|:----------:|:---------:|:---------:|:---------:|
| 10.1.0.0/16 | Local | Active | No |
| 0.0.0.0/0 | Internet Gateway | Active | No |

#### Route Table B

|  Destination | Target | Status |  Propagated |     
|:----------:|:----------:|:---------:|:---------:|:---------:|
| 10.1.0.0/16 | Local | Active | No |
| 0.0.0.0/0 | NAT Gateway | Active | No |

------

# 検証構成

## Security Group

### Group A for ELB(CLB)

|   Type  |    Protocol    |    Port Range    | Source | NOTES |
|:-------------:|:------------:|:------------:|:----------:|:------------:|
| Custom TCP | TCP | 10022 | ${My Global IPAddress}/32| - |

### Group B for Public EC2

| Type | Protocol | Port Range | Source | NOTES | 
|:----:|:----:|:----:|:----:|:-----:|
| SSH | TCP | 22 | ${My Global IPAddress}/32 | 動作検証用 |

### Group C for Private EC2

| Type | Protocol | Port Range | Source | NOTES | 
|:----:|:----:|:----:|:----:|:-----:|
| SSH | TCP | 22 | sg-${Group A for ELB(CLB)} | Group in Group で定義 |
| SSH | TCP | 22 | sg-${Group B for Public EC2} | Group in Group で定義 |

----------

# ELB（CLB）の定義

![ELB_CLB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/6cc307ab-6582-15b4-b8ef-bd617d347e02.png)

![ELB_CLB_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/84c97e50-2a32-84b1-d8e5-d247e4af78bd.png)

-----------

# Private EC2の定義

`IPv4パブリック IP`は割り当たっていません。

![EC2_private.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/023c0dc0-ec70-c712-91c1-f0e45707f3c7.png)

-----------

# Public EC2の定義

Private EC2にアクセスができるよう
 `IPv4パブリック IP`は割り当てています。

![EC2_public.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/b06dc217-261b-7e22-f865-07d1db278c8c.png)

-----------

# Public EC2 から Private EC2へアクセス確認

Public EC2(10.1.1.117) から Private EC2(10.1.2.94)へアクセスします。

```
Last login: Sat Mar  7 13:08:41 2020 from XXX.XXX.XXX

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 26 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-1-1-117 ~]$ 
[ec2-user@ip-10-1-1-117 ~]$ ssh ec2-user@10.1.2.94
Last login: Sat Mar  7 13:08:45 2020 from 10.1.1.117

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-1-2-94 ~]$ 
[ec2-user@ip-10-1-2-94 ~]$ 
```

[Rlogin](http://nanno.dip.jp/softlib/man/rlogin/)を使って、エージェント転送設定しています。
![ssh_agent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/e0a0e2be-7672-818a-dfec-6e5446224913.png)

-----------

# Public EC2 から Private EC2へアクセス確認

[Tera Term](https://ja.osdn.net/projects/ttssh2/)を使ってELB（CLB）経由でアクセスします。

![ssh_elb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/7ddf18e2-5256-2ccd-b9eb-2a46c0427137.png)

![ssh_elb_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182636/000cd421-0134-611d-6fd0-ed9ba1bf05ba.png)

```
Last login: Sat Mar  7 13:27:07 2020 from 10.1.1.117

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-1-2-94 ~]$
```

------------

# まとめ

- ELB（CLB）で、TCPのポートフォワーディングが簡単でセキュアに実装できる
     - ELB（CLB）の作成
     - ELB（CLB）の対象にPrivateなEC2を指定
     - Security Group（ELB , EC2）の作成
     - CLBはSingle-AZで構成可能なので、 ELB:EC2 = 1:1 で作れば他のPrivateなEC2に影響がない

# 注意事項

- ELBはCLBのみSingle-AZで起動可能
    - ALBの場合は、Multi-AZ前提となるため、対象のインスタンス1台のみといった指定はできない
- プロキシの役割をするAmazon EC2や直接EC2にE.IPをアタッチするより料金は高い

[Elastic Load Balancing（Classic Load Balancer）](https://aws.amazon.com/jp/elasticloadbalancing/pricing/) の料金
※ 2020年3月7日現在

|時間 (または 1 時間未満)  | 処理されるデータの GB | 
|:-----:|:-------|
| 0.027USD | 0.008USD | 

-----------------