自由気ままに書いちゃおう

好きなことをつらつらと・・・

AWS SessionManager(セッションマネージャ)でポートフォワーディング2

前回からの続きです。

www.guri2o1667.work


では早速、実際に設定してみます。

 

 

■Clientで必要となるツールのインストール1(awscli)

以下記事を参考にしてください。

WindowsにAWS CLI v2をインストール - 自由気ままに書いちゃおう

WindowsにインストールしたAWS CLI v2の初期設定 - 自由気ままに書いちゃおう

■Clientで必要となるツールのインストール2(session-manager-plugin)


1.以下サイトにアクセスし、インストーラーをダウンロードします。

(オプション) AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager


上記にアクセス後、使用しているクライアントPCのOSに併せて、session-manager-pluginのインストーラーをダウンロードします。


2.インストーラーをダブルクリックします。※「セキュリティの警告」が表示された場合は、「実行」をクリックします。

3.「I agree to the license terms and conditions」にチェックを入れ、「Install」をクリックします。


※デフォルトで「C:\Program Files\Amazon\SessionManagerPlugin」にインストールされるようです。インストーラーからはインストール先の指定はできません。
f:id:guri2o1667:20200501151657p:plain


4.以下画面が表示されたことを確認し、「Close」をクリックします。

f:id:guri2o1667:20200501151734p:plain


5.セッションマネージャのパスを環境変数に登録します
パス: C:\Program Files\Amazon\SessionManagerPlugin\bin


※画面はイメージです。

f:id:guri2o1667:20200501152240p:plain



6.インストールがうまくいっているかどうか動確を行います。PowerShellを起動し、以下コマンドを実行します。

session-manager-plugin

以下メッセージが返ってくれば、インストール成功です。
「The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.」

7.session-manager-pluginのバージョンを確認しておきます。

session-manager-plugin --version


私の環境では、以下バージョンでした。
「1.1.54.0」

■EC2(WindowsServer2019)を作成


ここでは、セッションマネージャで接続したいサーバにWindowsServer2019を使用します。
そのため、EC2をプライベートサブネットに作成してください。
※EC2の作成手順は割愛します。
※EC2作成時にアタッチするセキュリティグループはひとまず任意のもので大丈夫です。(後でSeesionManager接続用のSGをアタッチしますので、今時点では適当なもので大丈夫です。)

使用したami-idは「ami-008755994dfc325f7」です。
※「Microsoft Windows 2019 Datacenter edition. [English]」

■セキュリティグループの作成


【VPC Endpointsにアタッチするセキュリティグループについて】
名前: ここでは、「systemsmanager-sg-vpcendpoints」としています。
Inbound: EC2(443/HTTPS) ※WindowsServer2019からの通信のみ許可するようにします。
Outbound: 設定不要 ※デフォルトのoutboundルールは削除してください。

以下は設定例です。(ソースはWindowsServer2019のプライベートサブネットを指定しています。10.0.4.0/24)

f:id:guri2o1667:20210312135335p:plain


VPCエンドポイントはEC2(プライベートサブネット)からの通信(443)を受け付けるようにします。


【EC2にアタッチするセキュリティグループについて】

名前: ここでは、「systemsmanger-sg」としています。
Inbound: 設定不要
Outbound: VPC Endpoints(443/HTTPS)

以下は設定例です。(送信先は、前述に作成したsystemsmanager-sg-vpcendpointsです。)
※test2-と入っていますが、無視してください。

f:id:guri2o1667:20210312135721p:plain

EC2はVPCエンドポイントへのアウトバウンド通信(443)のみを許可します。

■EC2(WindowsServer2019)にセキュリティグループを適用

先ほど作成した「systemsmanger-sg」を、WindowsServer2019にアタッチします。

■VPC Endpointsの設定


VPC Endpointsは、外部との通信手段を持たないAWSリソース(EC2等)が、
グローバルなAWSサービス(S3やSystemsManger等)と通信するために使用するセキュアなプライベート接続のことです。

つまり、VPC Endpointsは、
VPC内部からグローバルのAWSサービスに直接アクセスするための出口」です。
ここでは、その出口(=エンドポイント)を4つ3つ作成します。
※私の勘違いでした。①のエンドポイントの作成は不要です。

①com.amazonaws.ap-northeast-1.ec2
②com.amazonaws.ap-northeast-1.ec2messages
③com.amazonaws.ap-northeast-1.ssm
④com.amazonaws.ap-northeast-1.ssmmessages



※上記①~④の意味は以下URLを参照してください。

ステップ 6: (オプション) Virtual Private Cloud エンドポイントの作成 - AWS Systems Manager


※エンドポイントは一つずつしか作成できないため、ここでは、「①com.amazonaws.ap-northeast-1.ec2」を作成する手順を例として記載しています。
②~④の作成も同様の手順で実施できます。
※①は作成不要です。ただ、手順紹介のため下記は残しております。①ではなく②~④のいづれかと思って見ていただければと思います。


※VPCの設定「DNSホスト名」「DNS解決」を有効化しておいてください。有効化していない場合、エラーとなります。

f:id:guri2o1667:20220218141411p:plain



f:id:guri2o1667:20220218141359p:plain




1.AWSコンソールから「VPC」>「エンドポイント」をクリックし、「エンドポイントの作成」をクリックします。

f:id:guri2o1667:20200501171102p:plain


2.検索に「com.amazonaws.ap-northeast-1.ec2」を入力し、ラジオボタンにチェックを入れ、対象のVPC、プライベートサブネット、Endpointsにアタッチするセキュリティグループを選択します。

※EndpointsにアタッチするSGは「systemsmanager-sg-vpcendpoints」を選択します。

3.作成直後は、「ステータス」列が「保留中」となるため、「使用可能」になるまで待ちます。この間に残りの②~④のエンドポイントを作成しておいてください。

4.「ステータス」列が「使用可能」になった場合、以下のようになります。

f:id:guri2o1667:20200501181342p:plain

 

f:id:guri2o1667:20200501181417p:plain

f:id:guri2o1667:20200501181444p:plain


ここまで実施できると下記構成まで作成できていることになります。

f:id:guri2o1667:20200501183427p:plain

■EC2にIAMロールを付与


WindowsServer2019のEC2に「AmazonEC2RoleforSSM 」ポリシーを付与するため、
事前に新規でIAMロールを作成しておく必要があります。
※設定手順は割愛しますが、「AWSサービス」で「EC2」を選択し、対象ポリシーを選択するだけです。

ここでは、以下設定としました。
IAMロール名: win2019-ssm
ポリシー名:  AmazonEC2RoleforSSMAmazonSSMManagedInstanceCore

その後、WindowsServer2019のEC2に当該IAMロールをアタッチします。

1.対象のEC2を右クリックし、「インスタンスの設定」>「IAMロールの割り当て/置換」をクリックします。

f:id:guri2o1667:20200501183914p:plain

2.「win2019-ssm」を選択して、「適用」をクリックします。
3.EC2に当該IAMロールが適用されていることを確認します。

f:id:guri2o1667:20200501184642p:plain

最終的な構成はこんな感じです。

f:id:guri2o1667:20200501192511p:plain

■動確


1.以下コマンドを実行します。※aws ssm start-sessionコマンドを実行し、SSMを利用してEC2にポートフォワーディングをセットします。
※「i-XXXXXX」はリモート接続を行いたいインスタンスIDを指定してください。

aws ssm start-session --target i-XXXXXXX --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389,localPortNumber=63389"


※start-session の引数は以下リファレンス参照

start-session — AWS CLI 1.18.50 Command Reference

【失敗時のメッセージ】
 An error occurred (TargetNotConnected) when calling the StartSession operation: i-XXXXXXX is not connected.


【成功時のメッセージ】
※ここでは、localhost:63389で接続できるようにaws ssm start-sessionコマンドを実行したため、ログには「Port 63389」と表示されております。

Starting session with SessionId: awscliuser-XXXXXXXXXXXXXXXX
Port 63389 opened for sessionId awscliuser-XXXXXXXXXXXXXXXX.


2.上記【成功時のメッセージ】が出力されていることを確認し、ClientからRDP接続をして対象インスタンスに接続できるかどうかを試してみます。

f:id:guri2o1667:20200501191829p:plain


無事にRDP接続できていれば、ポートフォワーディングによるプライベートサブネットに配置したEC2への接続に成功したことになります。


3.RDP接続後、サインアウトしただけでは、start-sessionで張ったセッションは接続されたままとなります。セッションを切断したい場合には、インスタンスの停止かPowerShellでCtrl+Cを押下します。


【セッション切断後のログ】

Starting session with SessionId: awscliuser-XXXXXXXXXXXXXXXX
Port 63389 opened for sessionId awscliuser-XXXXXXXXXXXXXXXX.
Connection accepted for session awscliuser-XXXXXXXXXXXXXXXX. ※RDP接続時に出力されたログ
Terminate signal received, exiting. ※Ctrl+C押下後に出力されたログ



以上です。
次回は、今回やった内容を踏まえ、セッションマネージャを使用したポートフォワーディングのメリット/デメリットや注意点等、総括を行いたいと思います。

 

www.guri2o1667.work

 

 

www.guri2o1667.work