3月よりIE課(インターナルエデュケーション課) に異動しました山﨑です。
6月13日のAWSアップデートでPublic IPを利用することなく、EC2 Instance Connect を用いてSSH/RDP接続ができるようになったというアップデートがありました。
そこで今回はEC2インスタンス(Linux)へのログイン方法について整理してみたいと思います。
サマリー
ログイン方法の比較表
主観も多少混じっていますが、各ログイン方法について比較表を作ってみましたのでご参考までにご覧ください。
ログイン対象のEC2インスタンスがインターネットと通信可能な環境に配置されている場合
EC2インスタンスがインターネットと通信可能な環境に配置されている場合は、「SSM経由」のアクセス方法がコスト面やメンテナンスを考慮すると良さそうです。
項目 | 踏み台サーバー経由 | SSM経由 | EC2 Instance Connect経由(using Public IP) |
---|---|---|---|
構築負荷 | EC2インスタンスの構築 | ・SSMエージェントのインストール ※Pre-installされているAMIあり ・Instance Profile の作成とアタッチ ・IAMユーザーへ権限を付与 |
・EC2 Instance Connect エージェントのインストール ※Pre-installされているAMIあり ※サポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降 ・IAMユーザーへ権限を付与 ・EC2インスタンスにPublic IPを付与 |
メンテナンス | ・パッチ適用 ・サーバーのセキュリティ対策等の運用が必要 |
・SSMエージェントのアップデート ・SSMエージェントの死活監視等の運用が必要 |
・EC2 Instance Connect エージェントのアップデート ・EC2 Instance Connect エージェントの死活監視等の運用が必要 |
ログ記録 | ・EC2インスタンス内でログを記録 ・CloudWatch Logs にログを記録 |
・CloudTrail によるログ記録 ・セッションアクティビティのログ記録 |
・CloudTrail によるログ記録 ・EC2インスタンス内でログを記録 ・CloudWatch Logs にログを記録 |
コスト | t3.micro: $0.0136/hr t3.small: $0.0272/hr t4g.micro: $0.0108/hr t4g.small: $0.0216/hr |
不要 | 不要 |
アクセス制御 | ・Security Group ・キーペア |
IAM | ・Security Group ・IAM |
ログイン対象のEC2インスタンスがプライベート環境に配置されている場合
EC2インスタンスがプライベート環境に配置されている且つOSがAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降であれば、「EC2 Instance Connect経由(without Public IP)」のアクセス方法がコスト面を考慮すると良さそうです。
項目 | 踏み台サーバー経由 | SSM経由 | EC2 Instance Connect経由(without Public IP) |
---|---|---|---|
構築負荷 | EC2インスタンスの構築 | ・SSMエージェントのインストール ※Pre-installされているAMIあり ・Instance Profile の作成とアタッチ ・VPC Endpoint の構築(×3) com.amazonaws.region.ssm com.amazonaws.region.ec2messages com.amazonaws.region.ssmmessages |
・EC2 Instance Connect エージェントのインストール ※Pre-installされているAMIあり ※サポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降 ・IAMユーザーへ権限を付与 ・VPC Endpoint の構築 EC2 Instance Connect Endpoint |
メンテナンス | ・パッチ適用 ・サーバーのセキュリティ対策等の運用が必要 |
・SSMエージェントのアップデート ・SSMエージェントの死活監視等の運用が必要 |
特に不要 |
ログ記録 | ・EC2インスタンス内でログを記録 ・CloudWatch Logs にログを記録 |
・CloudTrail によるログ記録 ・セッションアクティビティのログ記録 |
・CloudTrail によるログ記録 ・EC2インスタンス内でログを記録 ・CloudWatch Logs にログを記録 ※VPC Endpointが必要 |
コスト | t3.micro: $0.0136/hr t3.small: $0.0272/hr t4g.micro: $0.0108/hr t4g.small: $0.0216/hr |
($0.014/hr + $0.01/GB) × 3 | $0.014/hr + $0.01/GB |
アクセス制御 | ・Security Group ・キーペア |
IAM | ・Security Group ・IAM |
EC2インスタンスへのログイン方法
①踏み台サーバーを利用する方法
項目 | 踏み台サーバー経由(in Public) | 踏み台サーバー経由(in Private) |
---|---|---|
構築負荷 | EC2インスタンスの構築 | EC2インスタンスの構築 |
メンテナンス | ・パッチ適用 ・サーバーのセキュリティ対策等の運用が必要 |
・パッチ適用 ・サーバーのセキュリティ対策等の運用が必要 |
ログ記録 | ・EC2インスタンス内でログを記録 ・CloudWatch Logs にログを記録 |
・EC2インスタンス内でログを記録 ・CloudWatch Logs にログを記録 |
コスト | t3.micro: $0.0136/hr t3.small: $0.0272/hr t4g.micro: $0.0108/hr t4g.small: $0.0216/hr |
t3.micro: $0.0136/hr t3.small: $0.0272/hr t4g.micro: $0.0108/hr t4g.small: $0.0216/hr |
アクセス制御 | ・Security Group ・キーペア |
・Security Group ・キーペア |
踏み台サーバーを利用する場合、ログイン対象のEC2インスタンスがインターネットと通信可能な環境に配置されていても、そうでなくても構成は特に変わりませんが、踏み台サーバーを利用する方法は、コストとメンテナンスの観点からあまりお勧めできないかなと思います。この方法を採用する場合は未使用時にインスタンスを停止して、余計なコストがかからないように自動化しておくことをお勧めします。
②SSM Session Manager を利用する方法
ログイン対象のEC2インスタンスがインターネットと通信可能な環境に配置されている場合
ログイン対象のEC2インスタンスがプライベート環境に配置されている場合
構成比較
項目 | SSM経由(in Public) | SSM経由(in Private) |
---|---|---|
構築負荷 | ・SSMエージェントのインストール ※Pre-installされているAMIあり ・Instance Profile の作成とアタッチ ・IAMユーザーへ権限を付与 |
・SSMエージェントのインストール ※Pre-installされているAMIあり ・Instance Profile の作成とアタッチ ・IAMユーザーへ権限を付与 ・VPC Endpoint の構築(×3) com.amazonaws.region.ssm com.amazonaws.region.ec2messages com.amazonaws.region.ssmmessages |
メンテナンス | ・SSMエージェントのアップデート ・SSMエージェントの死活監視等の運用が必要 |
・SSMエージェントのアップデート ・SSMエージェントの死活監視等の運用が必要 |
ログ記録 | ・CloudTrail によるログ記録 ・セッションアクティビティのログ記録 |
・CloudTrail によるログ記録 ・セッションアクティビティのログ記録 |
コスト | 不要 | ($0.014/hr + $0.01/GB) × 3 |
アクセス制御 | IAM | IAM |
SSM経由(in Public)はコストメリットが大きいです。ただし、セッションアクティビティのログ記録を有効化する場合は別途、S3バケットを作成したりする手間とコストがかかる点は留意しておきましょう。
SSM経由(in Private)はVPC Endpoint を3つ作成しないいけないためコストが余計にかかってしまいます。セッションアクティビティのログ記録を有効化すると追加コストもかかります。
IAM を用いたアクセス制御
SSM Session Manager を利用する場合はIAMアイデンティ(IAMユーザー/IAMグループ/IAMロール)に対して以下のようなIAMポリシーをアタッチすることで、アクセス制御をすることができます。
参考ドキュメント:Quickstart default IAM policies for Session Manager - AWS Systems Manager
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:ResumeSession", "ssm:DescribeSessions", "ssm:TerminateSession", "ssm:StartSession", "ssm-guiconnect:CancelConnection", "ssm-guiconnect:GetConnection", "ssm-guiconnect:StartConnection" ], "Resource": [ "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "StringLike": { "ssm:resourceTag/DivisionCode": [ "IT-System" ] } } } ] }
- DivisionCode: IT-System タグが付与されたEC2インスタンス対してセッションの開始/中断/切断を許可する
③EC2 Instance Connect を利用する方法
ログイン対象のEC2インスタンスがインターネットと通信可能な環境に配置されている場合
ログイン対象のEC2インスタンスがプライベート環境に配置されている場合
構成比較
項目 | EC2 Instance Connect経由 (in Public) |
EC2 Instance Connect経由 (in Private) |
---|---|---|
構築負荷 | ・EC2 Instance Connect エージェントのインストール ※Pre-installされているAMIあり ※サポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降 ・IAMユーザーへ権限を付与 ・EC2インスタンスにPublic IPを付与 |
・EC2 Instance Connect エージェントのインストール ※Pre-installされているAMIあり ※サポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降 ・IAMユーザーへ権限を付与 ・VPC Endpoint の構築 EC2 Instance Connect Endpoint |
メンテナンス | ・EC2 Instance Connect エージェントのアップデート ・EC2 Instance Connect エージェントの死活監視等の運用が必要 |
・EC2 Instance Connect エージェントのアップデート ・EC2 Instance Connect エージェントの死活監視等の運用が必要 |
ログ記録 | ・CloudTrail によるログ記録 ・EC2インスタンス内でログを記録 ・CloudWatch Logs にログを記録 |
・CloudTrail によるログ記録 ・EC2インスタンス内でログを記録 ・CloudWatch Logs にログを記録 ※VPC Endpointが必要 |
コスト | 不要 | $0.014/hr + $0.01/GB |
アクセス制御 | ・Security Group ・IAM |
・Security Group ・IAM |
EC2 Instance Connect経由(in Public)だとPublic IPをEC2インスタンスに付与する必要があるので、それであればキーペアを使って通常通りSSHアクセスすれば良いのではないかと思いました。
EC2 Instance Connect経由(in Private)はSSM Session Manager とは異なり、VPC Endpoint を1つ作成すればVPC Endpoint経由でプライベートアクセスが可能なのでコストメリットが大きいです。しかし、注意点としてはLinux OS の場合はEC2 Instance Connect エージェントのサポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降ということです。
参考ドキュメント:Install EC2 Instance Connect on your EC2 instances - Amazon Elastic Compute Cloud
実際にRHELでエージェントをインストールしようとするとレポジトリにマッチするソフトウェアがないためエラーが出ました。
[ec2-user@ip-xx-xx-xx ~]$ sudo yum install ec2-instance-connect Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs) 49 MB/s | 22 MB 00:00 Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs) 50 MB/s | 12 MB 00:00 Red Hat Enterprise Linux 9 Client Configuration 36 kB/s | 3.0 kB 00:00 No match for argument: ec2-instance-connect Error: Unable to find a match: ec2-instance-connect
Security Group を用いたアクセス制御
EC2 Instance Connect(in Private)では、VPC Endpointで「Preserve Client IP」というクライアント端末のIPを保持する機能を有効化し、VPC Endpointに対してSecurity GroupのInboundルールを設定することで、アクセス元のIPアドレス制限を設けることができます。
また、Security GroupのOutboundルールを設定することで、アクセス先のEC2インスタンスを制御することができます。
Security groups for EC2 Instance Connect Endpoint - Amazon Elastic Compute Cloud
IAM を用いたアクセス制御
EC2 Instance Connect(in Private)では、VPC Endpointで「Preserve Client IP」というクライアント端末のIPを保持する機能を有効化し、IAMポリシーのCondition句を用いれば、IPアドレス単位でアクセス制御が可能です。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeInstanceConnectEndpoints" ], "Resource": "*" }, { "Effect": "Allow", "Action": "ec2-instance-connect:OpenTunnel", "Resource": "arn:aws:ec2:region:account-id:instance-connect-endpoint/eice-123456789abcdef", "Condition": { "IpAddress": { "aws:SourceIp": "192.0.2.0/24" }, "NumericEquals": { "ec2-instance-connect:remotePort": "22" } } } ] }
まとめ
ざっと整理してみましたが、結論としては
- EC2インスタンスがインターネットと通信可能な環境に配置されている場合は、「SSM経由」のアクセス方法がコスト面やメンテナンスを考慮すると良さそう
- EC2インスタンスがプライベート環境に配置されている且つOSがAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降であれば、「EC2 Instance Connect経由(without Public IP)」のアクセス方法がコスト面を考慮すると良さそうです。
山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ
2019/12〜2023/2までクラウドインテグレーション部でお客様のAWS導入支援を行っていました。現在はIE(インターナルエデュケーション)課にて採用周りのお手伝いや新卒/中途オンボーディングの業務をしています。2023 Japan AWS Top Engineers/2023 Japan AWS Ambassadors