こんにちは、やまぐちです。
概要
Proxy (Squid) 経由で SSM を使用できるようするまでを書きます。
構成図は以下のような形です。
パブリックサブネットに NAT Gateway を配置する代わりに EC2 (Squid) を設置する形です。
今回は、検証用ですので Squid の認証設定などは行いません。
Proxy 経由で EC2 のログを CloudWatch Logs へログを出力させる記事は以下になりますので、ご参考までに(前半はほぼ同じ内容です)
blog.serverworks.co.jp
流れ
EC2 インスタンスの作成
パブリックサブネットの EC2 インスタンスに Squid をインストール・設定
プライベートサブネットの EC2 インスタンス内の SSM の設定ファイルを編集
フリートマネージャーで確認
やってみる
1. EC2 インスタンスの作成
プライベートサブネットとパブリックサブネットにそれぞれ EC2 を作成します。
以下キャプチャの赤枠で囲っている部分です。
今回は検証用ですので、インスタンスタイプは t3.micro
としました。
ちなみに OS は Amazon Linux 2023
にしました。
その他の設定値について
アタッチする IAMロール
Squid インスタンス:付与してもしなくてもよい
対象インスタンス:
AmazonSSMManagedInstanceCore
がアタッチされた IAMロール
アタッチするセキュリティグループ
- Squid インスタンス:以下のインバウンドルールを含めたセキュリティグループ
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
SSH | TCP | 22 | ログイン元のIPアドレス |
カスタム TCP | TCP | 3128 | 対象インスタンスのIPアドレス or 対象インスタンスにアタッチされているセキュリティグループ |
- 対象インスタンス:以下のインバウンドルールを含めたセキュリティグループ
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
SSH | TCP | 22 | Squid インスタンスのIPアドレス or Squid インスタンスにアタッチされているセキュリティグループ (Squidインスタンスからポートフォワードする場合) |
2. パブリックサブネットの EC2 インスタンスに Squid をインストール・設定
パブリックサブネットに作成した Squid 用インスタンスにログインし、Squid をインストールします。(dnf ではなく yum でも OK)
$ sudo dnf install squid -y
インストールが完了したら Squid の設定ファイルの/etc/squid/squid.conf
を編集します。
$ sudo vim /etc/squid/squid.conf
http_access allow localhost
が記載されている箇所の上に、http_access allow localnet
を追記します。
http_access allow localnet http_access allow localhost
アクセスを追記したlocalnet
は/etc/squid/squid.conf
内の最初の方に書かれているプライベートIPアドレスのことを指します。
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN) acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN) acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN) acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN) acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN) acl localnet src fc00::/7 # RFC 4193 local private network range acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
設定を読み込ませます。
$ sudo systemctl restart squid
ここまで完了したら、Squid の設定は完了です。
本来であれば/etc/squid/squid.conf
内をいじってアクセス元やアクセス先の制限を行ったりしますが、今回は検証用なのでそこまでは行いません。
3. プライベートサブネットの EC2 インスタンス内の SSM の設定ファイルを編集
では次は、プライベートサブネットに作成した SSM の利用対象のインスタンスにログインします。
ログイン方法については詳しく言及しませんが、今回はパブリックサブネットの Squid サーバからポートフォワードでログインしました。
また、設定手順は以下のドキュメントを参考にしてます。
Upstart のケースも書かれています
ログインが完了したら、SSM Agent がインストールされているかを確認します。
$ sudo systemctl status amazon-ssm-agent
冒頭でお伝えしました通り、今回は Amazon Linux 2023 で作成しましたのでデフォルトで SSM Agent はインストールされている状態です。
一部 OS では SSM Agent 自体がデフォルトでインストールされていない場合があるのでその場合はインストールを行います(インストール方法については割愛します)
Proxy を使用するように SSM Agent を設定する
Proxy を使用するように設定を記載します。
$ sudo systemctl edit amazon-ssm-agent
記載する内容は以下です。(vim か nano で記載します)
[Service] Environment="http_proxy=http://Squid用インスタンスのプライベート IP DNS 名:3128" Environment="https_proxy=http://Squid用インスタンスのプライベート IP DNS 名:3128" Environment="no_proxy=169.254.169.254"
記載が完了したら設定を読み込ませて、再起動させます。
$ sudo systemctl daemon-reload && sudo systemctl restart amazon-ssm-agent
ステータスを確認し、起動していることを確認します。
$ sudo systemctl status amazon-ssm-agent
Proxy が正しく指定されていることを確認する
$ sudo cat /etc/systemd/system/amazon-ssm-agent.service.d/override.conf
4. フリートマネージャーから確認
対象インスタンスがフリートマネージャーに表れ、Ping ステータス が「オンライン」になっていれば設定完了です。
繋がらない時は
もし、うまくつながらない時は以下のログを確認して手がかりを探しましょう。
Squidインスタンス:/var/log/squid/access.log
対象インスタンス:/var/log/amazon/ssm/amazon-ssm-agent.log, /var/log/amazon/ssm/errors.log
最後に
インターネット経由で SSM へ接続したくないという場合は、以下の3つのエンドポイント経由でアクセスさせることもできますのでご参考までに
むしろ、Proxy 経由よりもエンドポイント経由で接続させるパターンの方が多いのかなとは感じてます。
ssm.region.amazonaws.com
ssmmessages.region.amazonaws.com
ec2messages.region.amazonaws.com