
課題とアプローチ
本番環境で作業を行う場合、本番環境で稼働するサーバにGUIアクセスして作業したいケースがあると思います。
例えば、管理用画面がGUIで提供されている場合です。
そのようなGUIアクセスを統制する方法として、以前紹介した手法を組み合わせることで実現可能になります。
まず、「Change Managerによる変更管理と本番アクセス統制」で本番環境へスイッチロールしたあと、「Session Managerのポートフォワーディング機能によるRDP接続」のようにSession Managerのフリートマネージャーでアクセスします。
しかしながら、フリートマネージャーを使ったGUIアクセスの場合、わざわざスイッチロールしないとならないうえ、以下のように画面が小さく操作しずらいという欠点があります。


そこで、踏み台サーバを用意し、Change Managerと「Session Managerのポートフォワーディング機能によるRDP接続」を組み合わせてアクセスを制御します。
さらに、本番環境へのGUIアクセスは、プライベートリンクを活用します。
本番環境のサーバは暗号化して接続するため、ACMの証明書をALBに紐づけてHTTPSで接続を可能にしています。
全体のアーキテクチャは以下になります。

本番環境への経路を実装する
まずは、Jumpアカウントに踏み台Windowsインスタンスを用意します。

そして、Jumpアカウントにプライベートリンク用のエンドポイントを作成します。
DNS名を控えておきます。

Route 53にてプライベートホストゾーンを作成し、本番サーバのドメインから先ほど控えたプライベートリンク用のエンドポイントへルーティングするレコードを追加します。

続いて、本番アカウントにエンドポイントサービスを作成し、NLBを関連付けて、Jumpアカウントのエンドポイントと接続します。


NLBでリスナーを作成します。
ここでは、TCP:10443 で待ち受けています。

宛先としてALBを登録しています。

ここまでの設定で以下のようになります。

続いて、ALBでリスナーを作成します。
ここでも、TCP:10443 で待ち受けています。

セキュアに接続するため、ACMの証明書を紐づけています。


そして、ALBのターゲットとして、本番環境で稼働するEC2インスタンスを登録しています。


ここまでの設定で以下のようになります。

本番アクセス用のIAMグループに権限を追加する
前回は、Change Managerで一時的に追加される本番アクセス用のIAMグループに、スイッチロール用の権限を付与していれば、本番環境にアクセスでききました。
今回は、このIAMグループにSession Managerの実行権限を追加します。

具体的には以下の「SessionManagerPortForwardPolicy」ポリシーになります。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ssm:ResumeSession", "ssm:DescribeSessions", "ssm:TerminateSession", "ssm:StartSession" ], "Resource": "*", "Effect": "Allow" } ] }
挙動確認
まずは、Change Managerにより承認をしてもらっておらず、本番アクセス用のIAMグループに所属していない場合です。
Change Manager承認前
>aws sts get-session-token --serial-number arn:aws:iam::<AccountID>:mfa/<IAMUser> --token-code <TokenCode> --no-verify-ssl
urllib3\connectionpool.py:1045: InsecureRequestWarning: Unverified HTTPS request is being made to host 'sts.ap-northeast-1.amazonaws.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
{
"Credentials": {
"AccessKeyId": "********************",
"SecretAccessKey": "********************",
"SessionToken": "********************",
"Expiration": "2025-01-14T22:16:28+00:00"
}
}
>set AWS_ACCESS_KEY_ID=********************
>set AWS_SECRET_ACCESS_KEY=********************
>set AWS_SESSION_TOKEN=********************
>aws ssm start-session --target <InstanceID> --document-name AWS-StartPortForwardingSession --parameters portNumber=3389,localPortNumber=11111 --no-verify-ssl
urllib3\connectionpool.py:1045: InsecureRequestWarning: Unverified HTTPS request is being made to host 'ssm.ap-northeast-1.amazonaws.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam::<AccountID>:user/<IAMUser> is not authorized to perform: ssm:StartSession on resource: arn:aws:ec2:ap-northeast-1:<AccountID>:instance/<InstanceID> because no identity-based policy allows the ssm:StartSession action
本番アクセス用のIAMグループに所属しておらず、Session Managerの実行権限がないのでセッションを確立できません。
続いて、Change Managerにより承認をしてもらい、本番アクセス用のIAMグループに所属したあとの場合です。
Change Manager承認後
>aws sts get-session-token --serial-number arn:aws:iam::<AccountID>:mfa/<IAMUser> --token-code <TokenCode> --no-verify-ssl
urllib3\connectionpool.py:1045: InsecureRequestWarning: Unverified HTTPS request is being made to host 'sts.ap-northeast-1.amazonaws.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
{
"Credentials": {
"AccessKeyId": "********************",
"SecretAccessKey": "********************",
"SessionToken": "********************",
"Expiration": "2025-01-14T22:25:36+00:00"
}
}
>set AWS_ACCESS_KEY_ID=********************
>set AWS_SECRET_ACCESS_KEY=********************
>set AWS_SESSION_TOKEN=********************
>aws ssm start-session --target <InstanceID> --document-name AWS-StartPortForwardingSession --parameters portNumber=3389,localPortNumber=11111 --no-verify-ssl
urllib3\connectionpool.py:1045: InsecureRequestWarning: Unverified HTTPS request is being made to host 'ssm.ap-northeast-1.amazonaws.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
Starting session with SessionId: <IAMUser>-**********
Port 11111 opened for sessionId <IAMUser>-**********.
Waiting for connections...
今度は、本番アクセス用のIAMグループに所属しており、Session Managerの実行権限があるのでセッションを確立できます。
リモートデスクトップを起動して踏み台Windowsに接続してみます。

リモートデスクトップで接続できました。

本番環境のサーバへGUIアクセスもできました。

まとめ
本番アカウントへスイッチロールし、フリートマネージャーで小さな画面で作業しなければならない課題がありました。
そこで、Change Manger、Session Manager、ポートフォワード、プライベートリンクといった技術を組み合わせることで、課題を解決することができました。
さらに応用すると、権限をアクセス統制を維持しながら様々な権限をコントロールすることができるので、非常に便利だと思います。
Change Managerは様々な可能性を秘めているので、ぜひ試してみてください。