こんにちは。エンタープライズクラウド部技術3課の脇江です。
EC2 の Windows Server インスタンスで SSM Agent を使用するときのプロキシ設定について調べる機会がありましたので、備忘のために記しておきます。
今回は以下を前提条件として動作の確認を実施しました。
- SSM Session Manager のポートフォワーディングを使用して Windows Server にRDP接続
- VPCエンドポイントを使用せず、インターネット経由で SSM を利用
- インターネットにアクセスする際は必ずプロキシを経由する
SSM Session Manager のポートフォワーディングによるリモートホストへの接続については以下をご参照ください。
構成
プロキシを経由しないとインターネットにアクセスできない環境として以下の構成としました。
- 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=)
それぞれの設定について実際に試してみました。
1. AmazonSSMAgent レジストリ設定
レジストリとは Windows で使用される設定情報のデータベースです。
GUIで操作して変更した設定などもレジストリに情報が反映されます。
ここではAWS公式ドキュメントに記載の PowerShell コマンドにて SSM Agent で使用するプロキシ設定をレジストリに反映します。
※変数 $proxyVariables
の hostname: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_proxy
の hostname: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
というフォルダ名となります。
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 の設定」というのは「インターネットオプション」で設定するプロキシ設定のことを指します。
インターネットオプションでのプロキシ設定はユーザーごとに設定が保持されます。
つまり、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_proxy
の hostname: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 レジストリ設定」を実施するのが無難ではないかという印象です。
本記事がどなたかのお役に立ちましたら幸いです。