WindowsサーバでSSM Agentだけプロキシさせない設定をやってみた

2022.10.25

以前以下のブログでSSM Agentのプロキシ設定を検証してみましたが、逆にSSM Agentだけプロキシさせない設定ができるのか検証をしてみました。

検証環境構成

構成はNATゲートウェイが追加されただけで前回とほとんど同じになります。

プロキシサーバの作成方法は前回のものと同じなので以下のブログを参照してください。

検証

SSM Agent以外の通信はプロキシサーバ経由で外部に出るためシステム環境変数 (http_proxy、https_proxy、no_proxy) を設定します。
Windowsサーバにアクセスしてコントロールパネル->システムとセキュリティ->システム->システムの詳細設定->環境変数->システム環境変数の新規を開いて環境変数を設定します。
http_proxy、https_proxyにはプロキシサーバのIPアドレスとポートを設定します。
no_proxyには169.254.169.254を設定します。
設定ができると以下の画像の状態になります。

この状態になったらOKをクリックしてからPowerShellで以下のコマンドを実行します。

Restart-Service AmazonSSMAgent

ここまでの設定でSSM Agentも含めてプロキシされる設定になります。

どうやったらSSM Agentだけプロキシさせないようにできるのか

no_proxyにプロキシさせたくないものを設定すればよいのでSSM Agentがどこに通信をしているのか確認しました。
プロキシサーバのログを見ると以下のログが流れてきます。

1666689598.457   9047 X.X.X.X TCP_TUNNEL/200 5970 CONNECT ssm.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/52.119.223.48 -
1666689601.639  19995 X.X.X.X TCP_TUNNEL/200 5576 CONNECT ec2messages.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/52.119.223.180 -

上記のログはSystems Manager エンドポイントへの通信のログになります。
公式ドキュメントから「ssm.」、「ec2messages.」、「ssmmessages.*」に通信することがわかったのでこれをno_proxyに設定します。
no_proxyには「169.254.169.254,ssm.ap-northeast-1.amazonaws.com:443,ec2messages.ap-northeast-1.amazonaws.com:443,ssmmessages.ap-northeast-1.amazonaws.com:443」を設定しました。

設定後、PowerShellで以下のコマンドを実行します。

Restart-Service AmazonSSMAgent

SSM Agentを再起動した後に以下のコマンドでプロキシサーバのログを確認するとSystems Managerへの通信が出てこなくなりました。

tail -f /var/log/squid/access.log

この状態のWindowsサーバでcurlコマンドを使用して https://dev.classmethod.jp/ にアクセスしてみました。
PowerShellで以下のコマンドを実行します。

curl.exe https://dev.classmethod.jp/ -s -o nul -w "%{http_code}"

実行するとステータスコード200でレスポンスがあります。
また、プロキシサーバのログを確認すると以下のようにアクセスしているログが確認できます。

1666692806.720     51 X.X.X.X TCP_TUNNEL/200 174259 CONNECT dev.classmethod.jp:443 - HIER_DIRECT/54.65.152.135 -

この状態でNATゲートウェイへのルートを削除するとWindowsサーバにアクセスできなくなることが確認できます。
アクセスすると以下のようにタイムアウトエラーになります。

もう少しだけ簡単な方法

Windowsの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、セキュア、例外)
  5. WinHTTP プロキシ設定 (http=、https=、bypass-list=)

「AmazonSSMAGent レジストリ設定」が一番優先される設定になるため、レジストリに「no_proxy=*」で設定することでSSM Agentだけがプロキシされないようになります。
PowerShellで以下のコマンドを実行します。

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

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

こちらの設定の場合、「169.254.169.254,ssm.ap-northeast-1~」のように長く書く必要が無いため少しだけシンプルにすることができます。
同じようにcurlコマンドでWebサイトにアクセスするとプロキシサーバにログが出力されることと、NATゲートウェイへのルートを削除するとWindowsサーバにアクセスできなくなることが確認できます。

さいごに

SSM Agentだけプロキシさせない設定をやってみました。
個人的には長々と設定を書いたりするのが好きではないので、少しでも設定する内容が短くなるレジストリ設定の方を選択したいです。