AWSで作成したLinux系EC2インスタンスへの接続方法として、AWS Systems Manager Session Manager(以下、SSM Session manager)などがありますが、昨年6月に新機能であるEC2 Instance Connect Endpoint(以下、EIC Endpoint)が公開されました。
今回は、EC2インスタンスに安全なリモートアクセスを提供するための機能として似ているSSM Session managerとEIC Endpointの両サービスの内容を比較し、実際に使用をしてみようと思います。
まずは両サービスの概要を説明していきます。
EIC EndpointはインスタンスにパブリックIPv4アドレスがなくても、SSH または RDP 経由でインスタンスに接続できる機能です。サブネット内にEIC Endpointを作成し、セキュリティグループで通信を許可するようにしておくことで、エンドポイント経由でVPC内のインスタンスに接続できるようになります。
EC2 Instance Connect Endpoint を使用した、パブリック IPv4 アドレスを必要としないインスタンスへの接続より参照
上記は、EIC Endpointの接続イメージです。
ユーザーはEIC Endpointを経由しインスタンスにアクセスします。上記の図にもあるように同一VPCであればEIC Endpointを設定していないサブネットに対してもアクセスが可能です。
EIC Endpointの作成と接続制御の権限は、IAMによって制御されます。また、インスタンスのセキュリティグループ設定でEIC EndpointのセキュリティグループからSSHインバウンド接続のみを許可することで、IAMベース及びネットワークベース両方でのアクセス制限を行うことが可能です。
既存サービスであるEC2 Instance Connectとの違いはパブリックIPv4で接続するところとネットワークベースでの制御も可能なところがあります。
インスタンスへの接続は、成功失敗含め、すべてCloudTrailにログが作成されます。
また、EIC EndpointはVPCにつき1つまでしか作成できないため、EIC Endpointが単一障害点となる可能性があることは注意が必要です。
SSM Session managerは、EC2インスタンスにエンドポイント経由でhttpsのシェルアクセスを提供するサービスです。そのため、セキュリティグループでSSHのポートを解放する必要がありません。
EIC Endpointと同様にIAMによるアクセス制御やプライベートサブネットのインスタンスに接続が可能であり、ログやイベントの取得が可能です。
SSM Session managerを使用する際の注意点として、SSM Agentを事前にインストールする必要があります。Amazon Linux系などのAMIにはインスタンス作成時からデフォルトでインストールされていますが、インストールされていないAMIについては別途インストールする必要があります。
SSM Agentを手動でインストールする場合は以下を参考にしてください。
SSM Agent の使用
また、SSM Agentを使用するためにOS上でssm-userユーザーアカウントが作成されます。Windows Server のドメインコントローラーを除き、初めてセッションが開始されるときに ssm-user が自動的に作成されます。
セッションはCloudWatch Logsによって自動的に記録され、セキュリティと監査に役立ちます。
それでは、AWSマネジメントコンソールからEIC Endpointを使用していきたいと思います。
東京リージョンに作成しています。
今回は以下のような構成を作成していきたいと思います。
プライベートサブネット内にEC2インスタンスとしてAmazon Linux 2023を作成します。
EC2インスタンスのセキュリティグループとしてEIC EndpointからのみのSSHアクセスを許可したセキュリティグループを作成します。
EIC Endpointの作成及び削除には以下の権限が必要です。
今回のデモではIAMの設定を省略しますが、リソースタグに応じたアクセス許可や送信元IPアドレス制限を使用したアクセス許可の設定が可能となっております。IAMポリシーの設定については以下を参考にしてください。
EC2 Instance Connect Endpoint を使用するための IAM アクセス許可の付与
まずはVPCを作成していきます。
手順の詳細は省きますが、VPCの作成後、プライベートサブネットを作成します。
今回は以下の設定で作成しました。
VPC
パラメータ | 設定 |
---|---|
Name | demo-vpc |
CIDR | 10.0.0.0/16 |
プライベートサブネット
パラメータ | 設定 |
---|---|
Name | demo-privatesubnet |
AZ | ap-northeast-1a |
CIDR | 10.0.0.0/24 |
続いて、EIC Endpointの作成の前段作業としてセキュリティグループを作成していきます。
構成図にもあるようにセキュリティグループはEIC EndpointとEC2インスタンス用の2つ作成します。
EIC Endpoint用セキュリティグループ
パラメータ | 設定 |
---|---|
Name | EIC Endpoint Security Group |
VPC | demo-vpc |
インバウンドルール | 設定無し |
アウトバウンドルール | 10.0.0.0/16 |
EIC Endpoint用セキュリティグループのアウトバウンドルールはVPCやサブネットの範囲内、セキュリティグループを指定するなど任意に接続先を制限することが可能です。今回はVPCのIPアドレス範囲で制限をしています。
EC2インスタンス用セキュリティグループ
パラメータ | 設定 |
---|---|
Name | EC2 Instance Security Group |
VPC | demo-vpc |
インバウンドルール | EIC Endpoint用セキュリティグループからのSSHを許可 |
アウトバウンドルール | 任意の設定 |
続いてEIC Endpointを作成していきます。
AWSマネジメントコンソールからVPC→エンドポイント→エンドポイントを作成と進みます。
エンドポイントの作成画面のサービスカテゴリの項目で「EC2 Instance Connect Endpoint」を選択するとEIC Endpointの設定画面になります。
EIC Endpointを以下のように設定していきます。
パラメータ | 設定 |
---|---|
Name | demo-eic-endpoint |
VPC | demo-vpc |
追加設定 | なし |
セキュリティグループ | EIC Endpoint用セキュリティグループ |
サブネット | demo-privatesubnet |
最後にEC2インスタンスの作成と接続を行います。
EC2インスタンスは以下のように作成しています。 EC2 インスタンス
パラメータ | 設定 |
---|---|
Name | demo-ec2 |
AMI | Amazon Linux 2023 AMI |
インスタンスタイプ | t2.micro |
VPC | demo-vpc |
サブネット | demo-privatesubnet |
パブリックIPの自動割り当て | 無効化 |
セキュリティグループ | EC2インスタンス用セキュリティグループ |
ストレージや詳細設定はお好みでお願いします。
注意点としてパブリックIPの自動割り当ては無効化で行っています。
無効化することで作成したインスタンスはパブリックIPアドレスが割り当てられていないインスタンスとして作成されます。
作成が完了したらインスタンスに接続していきます。
インスタンスに接続しようとするとパブリックIPv4アドレスがない警告が表示されますが、「EC2 Instance Connect エンドポイントを使用して接続する」を選択します。
無事に接続できました。
以上、接続のデモでした。
Windows ServerのインスタンスについてもパブリックIPアドレスを使用せずに接続が可能です。
その場合、3389番ポート以外でVPCとのプライベートトンネルを作成して接続します。
詳細についてはこちらをご覧ください。
EIC Endpointの削除については通常のVPCエンドポイントの削除と同様の手順で削除できます。
今回の構成はCloudFormationでも再現が可能なため、テンプレートファイルを以下に記載します。
構成はハンズオンと同じ構成です。
AWSTemplateFormatVersion: 2010-09-09
Resources:
mainVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
PrivateSubnet:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.0.0/24
AvailabilityZoneId: 'use1-az2'
MapPublicIpOnLaunch: 'false'
VpcId: !Ref mainVPC
EICSecGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: handson-EICsg
GroupDescription: SecGroupEIC
VpcId: !Ref mainVPC
EC2SecGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: handson-EC2sg
GroupDescription: SecGroupEC2
VpcId: !Ref mainVPC
EICEgress:
Type: AWS::EC2::SecurityGroupEgress
Properties:
Description: EIC Security Group
DestinationSecurityGroupId: !GetAtt EC2SecGroup.GroupId
GroupId: !Ref EICSecGroup
IpProtocol: -1
EC2Ingress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
Description: EC2 Security Group
FromPort: 22
ToPort: 22
IpProtocol: tcp
SourceSecurityGroupId: !Ref EICSecGroup
GroupId: !Ref EC2SecGroup
EICEndpoint:
Type: AWS::EC2::InstanceConnectEndpoint
Properties:
PreserveClientIp: false
SecurityGroupIds:
- !Ref EICSecGroup
SubnetId: !Ref PrivateSubnet
demoEC2:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-08a52ddb321b32a8c
InstanceType: t2.micro
NetworkInterfaces:
- AssociatePublicIpAddress: "false"
DeviceIndex: "0"
SubnetId: !Ref PrivateSubnet
GroupSet:
- !Ref EC2SecGroup
スタック作成後、同じ手順でインスタンスに接続することが可能です。
以上、EIC Endpointのデモの内容でした。
EC2インスタンスへの接続方法としてSSM Session Managerがありましたが、こちらは無料ではありますが、接続経路としてVPC Endpointを使用するため、VPC Endpointの料金は発生します。
EIC EndpointはVPC Endpointを使用しないため無料で利用することができます。
2024年2月よりパブリックIPv4に対しても課金が行われることとなります。EC2インスタンスへの接続方法見直しのきっかけとしてご参考になれば幸いです。