apacheでホワイトリスト型のプロキシサーバを作成する

AWS

セキュリティ的な制限でインターネットに直接接続できないローカルな環境からインターネットに接続したい場合には、プロキシサーバを経由して接続することでアクセス元のコンピューターの身元を隠すことができるため、機密情報や個人情報の漏えいの抑制に繋がります。
また、接続可能な外部サイトをホワイトリストとして設定することで特定のサイトして接続できなくすることでセキュリティを高めることができます。
今回はパブリックサブネット上にプロキシサーバを作成し、プライベートサブネット上のサーバからプロキシサーバを経由してインターネットの接続許可された特定のWEBサイトに接続してみます。

構成イメージ

『リポジトリサーバ構築』の時とほぼ同様の構成となります。
プライベートサブネットのサーバAからパブリックサブネットのプロキシサーバを経由してgoogleに接続してみます。

事前準備

事前に以下のものを用意しておきます。
【プロキシサーバサーバ】
・インターネットに接続可能なEC2インスタンス(RHEL8.6)
  ⇒SELINUXは無効化にしておきます。
【サーバA】
・インターネットに接続できないEC2インスタンス(RHEL8.6)

手順の流れ

以下の流れで実装します。

1.【プロキシサーバ】httpd導入&httpd.conf変更
2.【サーバA】プロキシ設定
3.【サーバA】インターネットに接続確認

1. 【プロキシサーバ】httpd導入&httpd.conf変更

プロキシサーバにapacheを導入していきます。

# dnf install httpd

導入後、proxyモジュールが読み込まれていることを確認します。

 # httpd -M | grep proxy
 proxy_module (shared)
 proxy_ajp_module (shared)
 proxy_balancer_module (shared)
 proxy_connect_module (shared)
 proxy_express_module (shared)
 proxy_fcgi_module (shared)
 proxy_fdpass_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_hcheck_module (shared)
 proxy_scgi_module (shared)
 proxy_uwsgi_module (shared)
 proxy_wstunnel_module (shared)
 proxy_http2_module (shared)

/etc/httpd/conf.d/配下にproxy.confを作成していきます。

Listenポートは「8000」番にしてみました。

その次にホワイトリストの設定ですが、まずは全てのサイトをdeniedで拒否しております。
接続許可する外部サイトとして今回はgoogleのホームページを指定しております。
2つ指定しているのはhttpとhttpsの両方で接続を試すためです。

httpのほうは「http://~」で指定する必要あり。
httpsのほうは「ドメイン名」で指定する必要があります。

 # vi /etc/httpd/conf.d/proxy.conf
【以下を記述】
Listen 8000
<IfModule proxy_module>
  ProxyRequests On
  ProxyVia      On
  ProxyTimeout  300
  AllowCONNECT 443
  CustomLog logs/proxy_log combined

  <Proxy *>
    Require all denied
  </Proxy>
  <Proxy google.com>
    Require all granted
  </Proxy>
  </Proxy http://google.com>
    Require all granted
  </Proxy>

</IfModule>

proxy.conf作成後、httpdを再起動します。

# systemctl restart httpd

また、プロキシサーバのセキュリティグループのインバウンド設定としてサーバAからの8000番ポートを許可するようにしておきます。

2.【サーバA】プロキシ設定

サーバAでhttp/https接続する際にプロキシサーバを経由させるための設定をします。

環境変数として設定するために/etc/profile.d/配下にproxy.shを作成します。

# vi /etc/profile.d/proxy.sh

「HOST」にはプロキシサーバのIPアドレスまたはホスト名を指定します。
「PORT」にはプロキシサーバでListenしている8000番を指定します。
また、no_proxyには「169.253.169.254」も指定します。
これはインスタンスメタデータサービスの IP アドレスであり、EC2インスタンスがインスタンスメタデータにアクセスし、インスタンスの設定または管理するために使用されるものになります。
IAMロールを付与して、AWS CLIによりコマンドを実行する際にも使用されます。
その為、このIPについてはプロキシサーバ経由から除外させます。

HOST="[プロキシサーバのIP or ホスト名]" 
PORT="[プロキシサーバのポート番号]" ※今回は8000を指定
PROXY="$HOST:$PORT"
export http_proxy="http://$PROXY"
export https_proxy="https://$PROXY"
export HTTP_PROXY="http://$PROXY"
export HTTPS_PROXY="https://$PROXY"
export no_proxy="127.0.0.1,localhost,169.253.169.254"
export NO_PROXY="$no_proxy"

上記内容で保存します。

また、プロキシサーバのへの接続としてセキュリティグループのアウトバウンド設定として8000番ポートを許可しておきます。

3. 【サーバA】インターネットに接続確認

この状態でサーバAからインターネットに接続してみます。

プロキシサーバのホワイトリストで許可している「google.com」にhttpでアクセスしてみます。

# curl -I http://google.com
HTTP/1.1 301 Moved Permanently
Date: Sun, 08 Jan 2023 11:49:35 GMT
Server: gws
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Cross-Origin-Opener-Policy-Report-Only: same-origin-allow-popups; report-to="gws"
Report-To: {"group":"gws","max_age":2592000,"endpoints":[{"url":"https://csp.withgoogle.com/csp/report-to/gws/other"}]}
Expires: Tue, 07 Feb 2023 11:49:35 GMT
Cache-Control: public, max-age=2592000
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Via: 1.1 ip-10-0-2-241.ap-northeast-1.compute.internal

ステータスコード301で応答がありアクセスできていることが確認できました。

次にgoogleでhttpsで接続してみます。

# curl -I https://google.com
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

エラーとなり接続できませんでした。

どうやらプロキシ環境下でcurlによるSSL(https)接続を行うには「.curlrc」に設定が必要らしいです。

# vi .curlrc

以下を設定

proxy=http://[プロキシサーバのIPアドレス or ホスト名]:[プロキシサーバのポート番号]

再度接続確認してみます。

# curl -I https://google.com
HTTP/1.0 200 Connection Established
Proxy-agent: Apache/2.4.37 (Red Hat Enterprise Linux)

HTTP/2 301
location: https://www.google.com/
content-type: text/html; charset=UTF-8
cross-origin-opener-policy-report-only: same-origin-allow-popups; report-to="gws"
report-to: {"group":"gws","max_age":2592000,"endpoints":[{"url":"https://csp.withgoogle.com/csp/report-to/gws/other"}]}
date: Sun, 08 Jan 2023 12:09:56 GMT
expires: Tue, 07 Feb 2023 12:09:56 GMT
cache-control: public, max-age=2592000
server: gws
content-length: 220
x-xss-protection: 0
x-frame-options: SAMEORIGIN
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"

httpsで接続することができました。

以上で完了です。

コメント

タイトルとURLをコピーしました