3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Code Engineへのアクセスを制御するため、Squidによるリバースプロキシ(Reverse Proxy)を立てる

Last updated at Posted at 2024-11-12

IBM CloudのCode Engineを使用してWeb Applicationを構築する際、安全性を考慮してアクセスを制限したいと希望するお客様が多くいらっしゃいます。

一般的な解決策としては、Code Engine上のWeb Applicationをプライベートエンドポイントのみで公開し、ユーザーがプロキシサーバーやVPNを介して接続する方法や、パブリックエンドポイントを使用しながらファイアウォールで保護する方法などがあります。

本記事の説明は、プロキシサーバーを使用する方法に関するものです。特に、フォワードプロキシ(ForwardProxy)ではなく、リバースプロキシ(ReverseProxy)の設定方法について取り上げています。

実現したいこと

構成はこうなります。
image.png

  • Web App on Code Engine:Httpsのみ、Private Endpointで公開する
  • Proxy on Virtual Server:Proxy softwareがSquidです。まだ、Security Groupによる、送信元IP Addressや、Protocol、PortNoを制御する

最初はForward Proxyで試しました。次の記事は大変参考になりました。
By @egawaaa: SquidによるフォワードプロキシでCode Engineへのアクセスを制御する。
https://qiita.com/egawaaa/items/79176404ba91270981a9

その後、Reverse Proxyの要件が出てきて、変更があったのはSquidの設定部分のみです。そのため、Squidの設定方法について重点的に説明します。

Forward ProxyとReverse Proxyについて

Forward Proxyであれば

@egawaaaさんの記事に説明して頂いたように、Forward Proxyを使用する場合、Webアプリケーションを訪問するユーザーはプロキシサーバーを設定する必要があります。具体的には、

  • curl コマンドを使用する場合は、--proxy を指定し、宛先アドレスとしてWeb AppのURLを指定する必要があります。
curl --proxy http://<proxy server IP>:8080 https://<application-specific-url>.xxxxxx.private.jp-tok.codeengine.appdomain.cloud
  • ブラウザを使用する場合は、ブラウザのプロキシ設定を行う必要があり、Web Appを訪問する際にWeb AppのURLままに入力します。
    下記の二つのスクリーンショットは@egawaaaさんの記事からのものです。
    image.png
    image.png

Reverse Proxyであれば

Reverse Proxyを使用すると、curlまたはブラウザーは、実はProxy Serverのアドレスを宛先として接続します。つまり、Proxy Serverの存在を意識せずにWeb Appにアクセスできます。詳細の接続方法については、この記事の後半の手順の部分で説明します。

どのようなメリットがあるかといいますと:

  • Web Appの一般的なユーザーにとって、常にブラウザのプロキシ設定が必要となるのは不便です。また、会社のPCを使用しているユーザーの中には、ブラウザのプロキシ設定を自由に変更できない場合もあります。
  • Code EngineのWeb App URLは固定の形式になっており、たとえば、codeengine.appdomain.cloudというDomainが使用されます。もし、Web Appに独自のDomainを使用したい場合は、リバースプロキシを通じて実現可能です。

手順

全体の流れ:

  1. Code EngineでAppを作成する
  2. VSI for VPCを作成する
  3. Squidの導入と設定、接続効果を確認する

Step 1. Code EngineでAppを作成する

詳細手順を割愛しますが、「Domain Mappings」で「Private」をご選択ください。

image.png

Appの構築が出来たら、Domain mappingsタブでURLを確認できます。
私の環境ではWeb AppのURLがこうなります:https://application-xxx.1xxxe.private.jp-tok.codeengine.appdomain.cloud

image.png

Step 2. VSI for VPCを作成する

VSIのプロビジョニングやSecurity Groupの設定に関する手順を割愛します。
OSがCentOSにしました。

Step 3. Squidの導入と設定、接続確認

Squidのインストール

dnf -y install squid

Squidのバージョンを確認します。

[root@xxx-centos9 ~]# squid --version
Squid Cache: Version 5.5
Service Name: squid

squid.confを編集します。

vi /etc/squid/squid.conf
Client PCとProxy Serverの間でHttpで接続する場合、

構成ファイルの最後に下記の内容を追加します:

http_port 3128 accel defaultsite=application-xxx.1xxxe.private.jp-tok.codeengine.appdomain.cloud no-vhost
cache_peer  application-xxx.1xxxe.private.jp-tok.codeengine.appdomain.cloud parent 443 0 no-query originserver ssl name=myAccel
cache_peer_access myAccel allow all
http_access allow all

一部のパラメータを説明します:

  • http_portの行:
    • 3128:HTTPで接続する場合、Port 3128を使います。
    • accel:Squidは、HTTPリクエストのHostヘッダーに関係なく、すべての受信リクエストを指定された defaultsite宛てのものとして扱います。
    • defaultsite:Code EngineでのWeb AppのURLを'https://'なしで設定します。
    • no-vhost:Squid 3.2以降では、HTTP/1.1のドメインベースのVirtual Hosting Supportが無効になっています。古いバージョンのSquidを使用する場合は、このオプションを省略してください。今回はSquid 5.5なので、このオプションが必要です。

- cache_peerの行:
- Code EngineのWeb AppのURLを'https://'なしで設定します。
- 443:Code EngineのWeb AppのPort No
- ssl:Proxy ServerとWeb Appの間にHttpsを使います。

この設定を保存してから、Squidを起動します。

systemctl restart squid

Web Appを接続できるか、Curlやブラウザで確認します。

curl http://<Proxy Server IP>:3128

image.png
image.png

Client PCとProxy Serverの間でHttpsで接続する場合、

構成ファイルの最後に下記の内容を追加します:

https_port 443 accel defaultsite=application-xxx.1xxxee.private.jp-tok.codeengine.appdomain.cloud cert=/etc/squid/ssl_certificates/proxy.test.com.crt key=/etc/squid/ssl_certificates/proxy.test.com.key no-vhost
cache_peer application-xxx.1xxxe.private.jp-tok.codeengine.appdomain.cloud parent 443 0 no-query originserver ssl name=myAccel
cache_peer_access myAccel allow all
http_access allow all

お気づきのように、今回は:

  • Httpsで443を使います
  • Proxy Server用のSSL Certificateの準備が必要になります。
    私の検証環境でEasyRSAを使って自己証明書を作成しました。手順はこちら:
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full proxy.test.com nopass

作成した ./pki/issued/proxy.test.com.crt./pki/private/proxy.test.com.keyを **/etc/squid/ssl_certificates/**に移動してから、Squidをスタートします。

systemctl restart squid

HttpsでWeb Appを接続できるか、Curlやブラウザで確認します。自己証明書なので、Curl -kが必要、ブラウザで証明書に関するWarningを無視します。

curl https://<Proxy Server IP>:443 -k

image.png

image.png

更に、Local PCのHost Fileを編集すれば、FQDNでも訪問でき、独自のDomainを使うことが可能です。
image.png

最後に

手順が以上です。
今回の検証は @egawaaaさんの記事は大変参考になりまして、感謝致します。

3
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?