背景
セキュリティレベルの高い環境ではセキュリティの出口対策として外向けの通信を絞っている環境があることがあります。
しかし、近年のシステムはフロントエンド(Webやコマンドライン)側で様々なAPIと通信をするような実装がされていることが多いです。
目的
この記事ではコマンドラインを操作する際、どのエンドポイントと通信をしているのか調査し、そのエンドポイント(URL)のみ許可をして想定してる操作が可能か確認する通信テストの二つについてご紹介します。
(別途Webブラウザを操作する際の記事も書きたいと思います。)
テスト環境の構築
今回はコマンドラインの通信を想定してテスト環境を構築します。
以下のような環境で、TestenvからはProxyを介してしかインターネットに出られない環境を構築します。
※ サンプルリポジトリ
この構成は、以下のようなdocker-composeで実現することができます。
プロキシ設定をProxyに向けることで実現しています。
version: "3.8"
services:
testenv:
image: "amazonlinux:2023"
environment:
- "HTTP_PROXY=http://proxy:3128"
- "HTTPS_PROXY=http://proxy:3128"
networks:
- "isolate"
proxy:
image: "ubuntu/squid"
restart: "always"
volumes:
- "./squid.conf:/etc/squid/squid.conf"
- "./whitelist:/etc/squid/whitelist"
ports:
- 3128
networks:
- "isolate"
- "proxy"
networks:
isolate:
internal: true
proxy:
通信調査方法
上記のテスト環境のTestenvのサーバーから確認したいコマンドを実行し、Proxyのアクセスログを確認することで、どういった通信が発生しているのか確認することができます。
サンプルリポジトリではホワイトリストにあるURL以外の通信以外は全て拒否するように設定しています。
サンプルリポジトリにあるsquid.confの以下の設定項目をコメントアウトすることで、全ての通信を許可するような設定になるので確認していくと良いと思います。
# ここまで一致しなかった場合は拒否
http_access deny all
通信テスト方法
通信に必要なエンドポイントがわかったら、whitelistファイルにURLを記述していきます。
その後、コメントアウトした設定をコメントインすることで、whitelistファイルにあるURL以外にはアクセスすることができなくなります。
その状態で、想定しているコマンドラインやプログラムなどを実行し、きちんと正常に動作するか確認することができます。