プライベートサブネットのWindows EC2インスタンスへSSMポートフォワード経由でRDP接続する方法 (MFAあり)

こんにちは、SCSK浦野です。

今更感のある内容ではあるのですが、SSMのポートフォワード経由でのPrivate環境へのRDPの手順をまとめてみました。
本番環境であれば、MFAを強制されていることが多いかと思いますが、多くの記事ではAWS CLIでのMFA認証に触れられていなかったので、一緒に記載しておくことで誰かの役に立ったら幸いです。

やりたいこと

SSMのポートフォワードを利用しない場合、①の経路のようなアクセスをしないとPrivate環境へRDPを行うことができませんが、②のSSMのポートフォワード経由でのアクセスを可能にすることにより、「踏み台サーバ」のコストや管理から解放されます。アカウントの管理についてはIAMで一括で管理することになります。利用者にはMFAの利用が強制されている状況とします。

利用者が接続を始める前の環境準備

利用者がRDPで接続を開始する前に、以下の環境がAWS上で整っている必要があります。

エンドポイントの作成及びEC2へのIAMロール付与

エンドポイントの作成、エンドポイントへのSG付与、EC2へのIAMロール付与を行います。

Systems Manager を使用したインターネットアクセスなしでのプライベート EC2 インスタンスの管理
利用者のIAMユーザへの権限付与

必要なユーザへ必要な範囲のノードに対しての許可を付与します。

Session Manager の追加サンプル IAM ポリシー - AWS Systems Manager
サポートする Session Manager ユーザーアクセスシナリオのカスタム IAM ポリシーを作成します。

利用者(作業端末)の準備

AWS CLI導入

以下の手順に従いダウンロードしインストールします。

What is the AWS Command Line Interface? - AWS Command Line Interface
Use the AWS Command Line Interface (AWS CLI) to control AWS services from the command line and automate them using scripts.
Session Manager plugin 導入
(オプション) AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager
システムに Session Manager プラグインをインストールし、AWS CLI でマネージドノードに接続するセッションを開始と終了します。

接続方法

MFAを利用せずに接続する方法

作業端末にて「Windows PowerShell」を立ち上げて、以下コマンド実行します。

aws configure
AWS Access Key ID [****************HOGE]: XXXXXXXXXXXXXXXXXX
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を利用してトークンを取得、登録する方法

以下のコマンドを実行して、一時的な認証情報を取得します。

aws sts get-session-token –serial-number arn:aws:iam::xxxxxxxxxxxx:mfa/hoge –token-code xxxxxx

実行すると、以下のような応答があります。

{
“Credentials”: {
“AccessKeyId”: “access-key-id”,
“SecretAccessKey”: “secret-access-key”,
“SessionToken”: “temporary-session-token”,
“Expiration”: “expiration-date-time”
}
}

実際の “temporary-session-token” はめちゃくちゃ長いです。
各値を環境変数に設定します。

$env:AWS_ACCESS_KEY_ID = “access-key-id”
$env:AWS_SECRET_ACCESS_KEY =”secret-access-key”
$env:AWS_SESSION_TOKEN =”temporary-session-token”
AWS CLI 経由で MFA を使用してアクセスを認証する

今度こそ、接続!

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で指定したノードへ接続ができるようになります。

以上となります。

タイトルとURLをコピーしました