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


背景


背景

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

・ 普段、Amazon WorkspacesでプライベートなEC2にアクセスしている
・ 今回、一時的に作業効率を上げたく直接アクセスしたい


簡単な構成


簡単な構成

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


想像したこと1

リスク

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

コスト

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


想像したこと2

ルートテーブル

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

セキュリティグループ

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


検討したこと

・ パブリックサブネットにインターネットからinboudを受けるSSHエージェント転送サーバを作る
  → パブリックサブネット側のルートテーブルが複雑で、新たに切り出したあとの制御などのタイムコストで断念
E.IPを付与する
  → 既存のプライベートサブネットにあるルートテーブルが複雑なので、対象インスタンス用に新たに切り出すための調査などのタイムコストで断念
AWS Client VPN環境を作る
  → VPNエンドポイントを作っただけでは他のインスタンスにもアクセスできてしまうので、制御が難しいと断念
ELB - CLBを作る → CLBのターゲットインスタンスを対象のEC2インスタンスのみに絞ればよくて、CLBのセキュリティグループを新設すれば、アクセス元も制御できる

参考にしたこと

プライベートなEC2に一時的にSSHする3つの方法
[AWS]踏み台をワンチャンなくせる!?VPC接続にClient VPNを使ってみよう


実際作ってみた


ベース

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)の定義


Private EC2の定義

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


Public EC2の定義

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


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 [email protected]
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を使って、エージェント転送設定しています。


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

Tera Termを使ってELB(CLB)経由でアクセスします。

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) の料金
※ 2020年3月7日現在

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