背景
背景
社内のプロジェクトで以下の話が上がってきて対応した記録です。
・ 普段、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 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を使って、エージェント転送設定しています。
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 |