こんにちは、SCSK浦野です。
今更感のある内容ではあるのですが、SSMのポートフォワード経由でのPrivate環境へのRDPの手順をまとめてみました。
本番環境であれば、MFAを強制されていることが多いかと思いますが、多くの記事ではAWS CLIでのMFA認証に触れられていなかったので、一緒に記載しておくことで誰かの役に立ったら幸いです。
やりたいこと
SSMのポートフォワードを利用しない場合、①の経路のようなアクセスをしないとPrivate環境へRDPを行うことができませんが、②のSSMのポートフォワード経由でのアクセスを可能にすることにより、「踏み台サーバ」のコストや管理から解放されます。アカウントの管理についてはIAMで一括で管理することになります。利用者にはMFAの利用が強制されている状況とします。
利用者が接続を始める前の環境準備
利用者がRDPで接続を開始する前に、以下の環境がAWS上で整っている必要があります。
エンドポイントの作成及びEC2へのIAMロール付与
エンドポイントの作成、エンドポイントへのSG付与、EC2へのIAMロール付与を行います。
利用者のIAMユーザへの権限付与
必要なユーザへ必要な範囲のノードに対しての許可を付与します。
利用者(作業端末)の準備
AWS CLI導入
以下の手順に従いダウンロードしインストールします。
Session Manager plugin 導入
接続方法
MFAを利用せずに接続する方法
作業端末にて「Windows PowerShell」を立ち上げて、以下コマンド実行します。
AWS Secret Access Key [****************PIYO]: YYYYYYYYYYYYYYYYYYYYYYYYYYYY
Default region name [None]: ap-northeast-1
Default output format [None]:json
ここで、MFAが強制されていなければ、すぐにstart-sessionしてRDPできるのですが・・・
強制されている状態で、コマンド打っても、以下のようにダメです。
aws ssm start-session –target i-<インスタンスID> –document-name AWS-StartPortForwardingSession –parameters “portNumber=3389, localPortNumber=17320”
An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam::xxxxxxxxxxxx:user/hoge is not authorized to perform: ssm:StartSession on resource: arn:aws:ec2:ap-northeast-1:xxxxxxxxx:instance/i-<インスタンスID> with an explicit deny
MFAを利用してトークンを取得、登録する方法
以下のコマンドを実行して、一時的な認証情報を取得します。
実行すると、以下のような応答があります。
“Credentials”: {
“AccessKeyId”: “access-key-id”,
“SecretAccessKey”: “secret-access-key”,
“SessionToken”: “temporary-session-token”,
“Expiration”: “expiration-date-time”
}
}
実際の “temporary-session-token” はめちゃくちゃ長いです。
各値を環境変数に設定します。
$env:AWS_SECRET_ACCESS_KEY =”secret-access-key”
$env:AWS_SESSION_TOKEN =”temporary-session-token”
今度こそ、接続!
aws ssm start-session –target i-<インスタンスID> –document-name AWS-StartPortForwardingSession –parameters “portNumber=3389, localPortNumber=17320”
Starting session with SessionId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Port 17320 opened for sessionId xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Waiting for connections…
無事に通りました。
あとは、リモートデスクトップ接続を立ち上げて、「localhost:17320」へ接続すれば、インスタンスIDで指定したノードへ接続ができるようになります。
以上となります。