プライベートサブネットの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 インスタンスの管理 | AWS re:Post
現在、インターネットにアクセスできないAmazonElasticComputeCloud(AmazonEC2)インスタンスを使用しています。AWSSystemsManagerを使用してインスタンスを管理する方法を教えてください。
利用者のIAMユーザへの権限付与

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

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

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

AWS CLI導入

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

What is the AWS Command Line Interface? - AWS Command Line Interface
UsetheAWSCommandLineInterface(AWSCLI)tocontrolAWSservicesfromthecommandlineandautomatethemusingscripts.
Session Manager plugin 導入
(オプション) AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager
システムにSessionManagerプラグインをインストールし、AWSCLIでマネージドノードに接続するセッションを開始と終了します。

接続方法

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 re:Post
MFAトークンを使用して、AWSコマンドラインインターフェイス(AWSCLI)でAWSリソースへのアクセスを認証したいと考えています。

今度こそ、接続!

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をコピーしました