プロキシ環境における SSM を使った Windows への RDP 接続

記事タイトルとURLをコピーする

こんにちは。エンタープライズクラウド部技術3課の脇江です。

EC2 の Windows Server インスタンスで SSM Agent を使用するときのプロキシ設定について調べる機会がありましたので、備忘のために記しておきます。

今回は以下を前提条件として動作の確認を実施しました。

  • SSM Session Manager のポートフォワーディングを使用して Windows Server にRDP接続
  • VPCエンドポイントを使用せず、インターネット経由で SSM を利用
  • インターネットにアクセスする際は必ずプロキシを経由する

SSM Session Manager のポートフォワーディングによるリモートホストへの接続については以下をご参照ください。

aws.amazon.com

構成

プロキシを経由しないとインターネットにアクセスできない環境として以下の構成としました。

  • Private subnet のルートテーブルで local へのルートのみを設定
  • SSM 利用対象 EC2 として Windows Server を使用
  • Windows Server のプロキシ設定変更のために踏み台を経由してポートフォワーディングでローカルPCからRDP接続する

SSM Agent のプロキシ設定を実施することで以下のようにすることを目指します。

SSM Agent のプロキシ設定パターン

AWS公式ドキュメントによると、SSM Agent のプロキシ設定は次の5パターンとなります。

SSM Agent プロキシ設定は、次の順序で評価されます。
1. AmazonSSMAgent レジストリ設定 (HKLM:\SYSTEM\CurrentControlSet\Services\AmazonSSMAgent)
2. システム環境変数 (http_proxy、https_proxy、no_proxy)
3. LocalSystem ユーザーアカウントの環境変数 (http_proxy、https_proxy、no_proxy)
4. Internet Explorer の設定 (HTTP、secure、exceptions)
5. WinHTTP プロキシの設定 (http=、https=、bypass-list=)

docs.aws.amazon.com

それぞれの設定について実際に試してみました。

1. AmazonSSMAgent レジストリ設定

レジストリとは Windows で使用される設定情報のデータベースです。
GUIで操作して変更した設定などもレジストリに情報が反映されます。

ここではAWS公式ドキュメントに記載の PowerShell コマンドにて SSM Agent で使用するプロキシ設定をレジストリに反映します。
※変数 $proxyVariableshostname:port を実際に使用するプロキシのホスト名(IPアドレス)、ポートに置き換えます。

$serviceKey = "HKLM:\SYSTEM\CurrentControlSet\Services\AmazonSSMAgent"
$keyInfo = (Get-Item -Path $serviceKey).GetValue("Environment")
$proxyVariables = @("http_proxy=hostname:port", "https_proxy=hostname:port", "no_proxy=169.254.169.254")

if ($keyInfo -eq $null) {
    New-ItemProperty -Path $serviceKey -Name Environment -Value $proxyVariables -PropertyType MultiString -Force
} 
else {
    Set-ItemProperty -Path $serviceKey -Name Environment -Value $proxyVariables
}

Restart-Service AmazonSSMAgent

コマンドの最後で SSM Agent サービスの再起動を実施しているため、コマンド実行が完了すると踏み台を経由せずにポートフォワーディングでRDP接続が開始できるようになります。

GUIでの設定確認

Windows 標準で使用できる「レジストリエディター」でレジストリの設定内容をGUIで確認・編集することも可能です。
レジストリエディターで今回設定したレジストリのパスを辿ると、設定した内容が反映されていることが確認できます。
※HKLM = HKEY_LOCAL_MACHINE

2. システム環境変数

環境変数にはユーザーに関わらず使用できる「システム環境変数」とユーザーごとに使用できる「ユーザー環境変数」の2種類があります。
ここではシステム環境変数に http_proxy, https_proxy, no_proxy を設定するため、以下のコマンドを PowerShell で実行します。
※変数 $http_proxy $https_proxyhostname:port を実際に使用するプロキシのホスト名(IPアドレス)、ポートに置き換えます。
SetEnvironmentVariableの第3引数として Machine を指定することでシステム環境変数に設定することができます。

$http_proxy = "hostname:port"
$https_proxy = "hostname:port"
$no_proxy = "169.254.169.254"

[Environment]::SetEnvironmentVariable('http_proxy', $http_proxy, 'Machine')
[Environment]::SetEnvironmentVariable('https_proxy', $https_proxy, 'Machine')
[Environment]::SetEnvironmentVariable('no_proxy', $no_proxy, 'Machine')

Restart-Service AmazonSSMAgent

GUIでの設定確認

Winキーを押下し、続けて「env」と入力することで表示される Edit the system environment variables をクリックします。

Environment Variables をクリックします。

System variables に http_proxy https_proxy no_proxy が設定されていることが確認できます。

3. LocalSystem ユーザーアカウントの環境変数

「LocalSystem ユーザー」は正確には NT AUTHORITY\SYSTEM というユーザーを指します。
NT AUTHORITY\SYSTEM は SSM Agent サービスを起動するために使用されるユーザーとなるため、このユーザーの環境変数を設定することでもプロキシ経由のRDP接続が可能となります。

通常、NT AUTHORITY\SYSTEM のユーザー環境変数を編集することはできないため、Microsoft が提供している「PsExec」というツールを使用します。
まずはじめに下記 URL から PsExec をダウンロードし、設定対象の Windows の任意のフォルダに配置します。 ※ダウンロードした PsExec の zip ファイルを解凍すると PSTools というフォルダ名となります。

learn.microsoft.com

PowerShell(コマンドプロンプトでも可)から以下を実行します。
※PSTools フォルダを Administrator のデスクトップフォルダに配置した場合で記載しています。

cd C:\Users\Administrator\PSTools

.\PsExec.exe -i -s powershell.exe

別ウィンドウで PowerShell コンソールが開きます。
どのユーザーが使用されているかを確認してみましょう。

PS C:\Windows\system32> whoami
nt authority\system

ユーザーが NT AUTHORITY\SYSTEM になっていることが確認できましたので、ユーザー環境変数を設定します。
設定するコマンドはシステム環境変数の設定時と基本的には同じですが、Machine の部分を User に置き換えます。
そうすることで現在のユーザー(NT AUTHORITY\SYSTEM)のユーザー環境変数に設定することができます。

$http_proxy = "hostname:port"
$https_proxy = "hostname:port"
$no_proxy = "169.254.169.254"

[Environment]::SetEnvironmentVariable('http_proxy', $http_proxy, 'User')
[Environment]::SetEnvironmentVariable('https_proxy', $https_proxy, 'User')
[Environment]::SetEnvironmentVariable('no_proxy', $no_proxy, 'User')

Restart-Service AmazonSSMAgent

CLIでの設定確認

PowerShell(コマンドプロンプトでは不可)から以下を実行することでユーザー環境変数に設定した内容を確認できます。
※ユーザーを NT AUTHORITY\SYSTEM に切り替えた状態で実行します。

[Environment]::GetEnvironmentVariable('http_proxy', 'User')
[Environment]::GetEnvironmentVariable('https_proxy', 'User')
[Environment]::GetEnvironmentVariable('no_proxy', 'User')

4. Internet Explorer の設定

「Internet Explorer の設定」というのは「インターネットオプション」で設定するプロキシ設定のことを指します。
インターネットオプションでのプロキシ設定はユーザーごとに設定が保持されます。

jpdsi.github.io

つまり、SSM Agent の実行ユーザーは NT AUTHORITY\SYSTEM であるため、NT AUTHORITY\SYSTEM でインターネットオプションのプロキシ設定をしてあげる必要があります。

環境変数を設定する際と同様に PsExec を使用して、ユーザーが NT AUTHORITY\SYSTEM になっている PowerShell コンソールを開きます。 そのうえで以下コマンドを実行し、インターネットオプションの設定画面を開きます。

PS C:\Windows\system32> whoami
nt authority\system
PS C:\Windows\system32> inetcpl.cpl

Connections タブを選択し、LAN settingsをクリックすることでプロキシの設定画面が表示されます。

Use a proxy server for your LAN にチェックを入れ、プロキシの情報を Address Port に入力します。

Advancedをクリックして詳細設定画面を開きます。
Use the same proxy server for all protocolsのチェックを外し、Exceptionsに「169.254.169.254」と入力します。

設定完了後、SSM Agent サービスの再起動を実施すると踏み台を経由しないポートフォワーディングでのRDP接続が開始できるようになります。

注意点

AWS公式ドキュメントによると、HTTPSのプロキシ設定は必須で設定する必要があります。

SSM Agent は、HTTPS プロトコルを使用して通信します。
このため、次の設定オプションのいずれかを使用して HTTPS proxy パラメータを設定する必要があります。

プロキシの詳細設定画面で Use the same proxy server for all protocols をチェックしている状態でも HTTPS のプロキシが設定されているように見えますが、この状態で SSM Agent サービス起動時のログを見てみると、https_proxy の設定が空欄になってしまいます。
※ログファイルのパス: C:\ProgramData\Amazon\SSM\Logs\amazon-ssm-agent.log

2023-05-12 02:10:35 INFO Proxy environment variables:
2023-05-12 02:10:35 INFO https_proxy: 
2023-05-12 02:10:35 INFO http_proxy: http://hostname:port
2023-05-12 02:10:35 INFO no_proxy: 169.254.169.254

この状態では踏み台を経由しないポートフォワーディングによる RDP 接続を開始することができませんでした。 Use the same proxy server for all protocols のチェックを外し、HTTPS のプロキシ設定を明示的に行う必要があります。

5. WinHTTP プロキシの設定

「WinHTTP」とは Windows Update やライセンス認証などで使用されるコンポーネントです。
WinHTTP を使用した通信をする場合のプロキシ設定がインターネットオプションでのプロキシ設定とは別に存在します。

WinHTTP のプロキシ設定はコンピューター全体に適用されるため、どのユーザーでログインした場合でも使用される設定となります。
以下のコマンドを PowerShell で実行し、WinHTTP のプロキシ設定を行います。
※変数 $http_proxy $https_proxyhostname:port を実際に使用するプロキシのホスト名(IPアドレス)、ポートに置き換えます。

$http_proxy = "hostname:port"
$https_proxy = "hostname:port"
$no_proxy = "169.254.169.254"

netsh winhttp set proxy proxy-server="http=$http_proxy,https=$https_proxy" bypass-list=$no_proxy

Restart-Service AmazonSSMAgent

CLIでの設定確認

PowerShell(コマンドプロンプトでも可)から以下を実行することで WinHTTP プロキシ設定を確認できます。

PS C:\Users\Administrator> netsh winhttp show proxy

Current WinHTTP proxy settings:

    Proxy Server(s) :  http=hostname:port;https=hostname:port
    Bypass List     :  169.254.169.254

終わりに

SSM Agent について、AWS公式ドキュメントに記載の5つの設定方法について試してみました。
SSM Agent でのみ使用されるプロキシ設定という点で「1. AmazonSSMAgent レジストリ設定」を実施するのが無難ではないかという印象です。

本記事がどなたかのお役に立ちましたら幸いです。

脇江 凜 (記事一覧)

エンタープライズクラウド部クラウドリライアビリティ課

猫が好きです。