0
1

EIC endpointで踏み台serverを無くす

Last updated at Posted at 2024-06-01

目的

EC2 Instance Connect Endpointを使用してPrivate subnetにあるEC2へ接続する方法をご紹介します。
またIAMポリシーを用いたサーバ内OSユーザのアクセスコントロールも合わせてまとめます。

導入背景

AWS re:inforce 2023の中でEC2 Instance Connect Endpointが紹介され、これなら踏み台サーバを経由せずともPrivate subnet EC2に接続できる!と思い今回実装しました。

弊社環境ではPublic subnetの踏み台サーバの運用には鍵の管理や踏み台サーバの運用コスト(脆弱性対応・ランニングコスト)の課題があり、これらを解決すべくまずはテスト環境で導入してみました。

EIC endpointについて

従来インスタンスへのSSH/RDPでの接続にはPublic IPや踏み台インスタンスを用意する必要がありましたが、Public IP を持たないインスタンスに対しSSH/RDP接続が可能になるサービスです。

Service Quotas

サービスクウォータが小さいので、まずは実装前にご自分の環境に導入できるか検討する必要があります。
Quotas for EC2 Instance Connect Endpoint

Session manegerとの違い

Private subnet EC2に接続する手段としてEC2 Instance Connect Endpointの他にSession Managerが挙げられます。
違いについては以下でまとめられています。
EC2 Instance Connect Endpoint と Session Managerの違いをまとめてみた

可用性の観点ではSession manegerを選んだ方が良いですが、NAT gatewayやSSMVPCeを経由しないので接続に関わるコストが発生しないのが魅力的ですね。

実装

Security groupの作成

まずEIC endpoint用のSecurity groupを作成します。
ステートフルなのでOUTboundだけ作れば大丈夫です。

EIC endpoint用のSecurity group

Type Procotol Port Source
Egress/Outbound TCP 22 0.0.0.0/0

ログイン先のEC2のSecurity groupに以下のルールを追加します。

Type Procotol Port Source
Ingress/Inbound TCP 22 上記のEIC用SG

EIC endpointの作成

EIC endpointの作成方法についてはこちらの方が書いた記事がわかりやすいです。
各自の使用するSubnetに作成してください。
EC2 Instance Connect Endpointを使ってEC2に接続してみた

EIC endpoint経由でのログイン

今回ログインしたEC2はAmazon linuxを使用しており、特に設定していない限りデフォルトでec2-userが作成されているのでこのユーザでログインします。

スクリーンショット 2024-06-02 8.38.58.png

EIC endpointでこのログインできました。
スクリーンショット 2024-06-01 14.32.05.png

エラーが出る際はIAMユーザに適切な権限がついているか、これまでの設定にミスがないか確認してください。
個人開発ならここまでで十分でしょう。

アクセスコントロール

業務の制約

弊社には踏み台サーバ経由でPrivate EC2サーバにアクセスするユーザは複数人程度存在し、ログの管理やアクセスコントロールの実施が必要になります。特にサーバ内のOSアカウントでユーザの管理やユーザに応じたroot権限への昇降性の有無を細かく制御する必要があります。

InstanceConnectを用いたアクセスコントロール

EC2 Instance Connectではカスタムユーザが提供されています。これはサーバにログインするOSユーザをIAMポリシーによってアクセス制限することが可能になります。

実装

Private subnet内のEC2でOSアカウントを作成

今回使用するEC2はAmazon LinuxなのでLinuxOSアカウントを作成します。この際に必要に応じてroot権限への昇降をコントロールする必要があります。

適宜業務に合わせた形でアカウントを作成してください。

IAMポリシーでの制御

Instance connectd経由でEC2にログインする場合は下記のポリシーを例に使用してリソースへのアクセス制御や使用するOSアカウント名を指定してください。
IAM への EC2 Instance Connect のアクセス許可の付与

	"Version": "2012-10-17",
	"Statement": [{
			"Effect": "Allow",
			"Action": "ec2-instance-connect:SendSSHPublicKey",
			"Resource": [
				"arn:aws:ec2:region:account-id:instance/i-1234567890abcdef0",
				"arn:aws:ec2:region:account-id:instance/i-0598c7d356eba48d7"
			],
			"Condition": {
				"StringEquals": {
					"ec2:osuser": "test-username"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "ec2:DescribeInstances",
			"Resource": "*"
		}
	]
}

EIC endpointでのログイン

ユーザ名はサーバ内でで作成したosアカウント名を同一のものを指定します。

スクリーンショット 2024-06-02 8.39.56.png

問題なくログインすることができました。
スクリーンショット 2024-06-01 14.42.46のコピー.png

試しにIAMポリシーで許可されていない適当なユーザ名でログインを試みると拒否されました。

auth-error.png

もちろん、Linux側でrootへの昇降を許可していないユーザでsudo操作を試みても問題ありません。
(Linuxでの設定によりここら辺は各々で異なります)
スクリーンショット 2024-06-01 14.54.19.png

まとめ

今回はEC2 Instance Connect Endpointを使用することで踏み台サーバ経由でのSSHログインを廃止する試みをしてみました。EIC endpointはデフォルトのサービスクウォータが低いことやAZに依存することはありますが、コストを削減できるのは大きなメリットだと思います。

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