LoginSignup
13
7

DebianにフォワードプロキシSquidを入れてWebフィルタリングをしよう

Last updated at Posted at 2021-03-23

あらすじ

Debian 10 に Squid 4.6 を HTTPS対応でインストールしようじゃなイカ。
image.png

モチベーション

先日、CentOSが終了するとの話がありました。これはイカがいたしましょう。今まで CentOS でフォワードプロキシを運用していましたが、この機会にDebianに引っ越しすることにします。Debianは、UbuntuKaliRaspbianのベースになっています。

※フォワードプロキシはウェブ利用のクライアント側に位置し、ウェブサービスユーザーの身代わりになるものです。Webフィルタリングのサーバーとして機能させることが出来ます。ちなみに逆はリバースプロキシで、ウェブサービスのサーバーの身代わりになるものです。HTTPにSSLを付けるだけだったり、いろいろします。どちらもイカしてますね!

今までCentoOSだった人が、DebianでProxyを使い始める話をするだけです。

引っ越しと書きましたが、設定引継のガイドではありません。

いろいろ調べると、CentOS の移行先は CentOS Stream のほうが良さそうです。イカようにも出来そうですね。

そもそもフォワードプロキシのメリット

企業では、NAT 機能で、社内ネットワーク内からインターネットにアクセスする設定が多いです。NAT では、悪質なサイトなどへのアクセスを IP アドレスでしかブロックできないことがあります。

「別にいいんじゃなイカ?」という声もありそうですが、これでは上手くイカない事例があるわけです。

IP アドレスでブロックすると、AWS や Akamai といった CDN まで対象に含めてしまうことになります。これにより、まったく関係のないサイトで利用されている CSS、JavaScript ファイルまでブロックしてしまい、様々なページでの閲覧に支障が出てくることがあります。これはイカんですね。

そこで Squid の出番です。 Webプロキシなので、アプリケーション層で動作し、IP アドレスではなく FQDN でブロックが可能なのです。昨今の CDN を多用する Web サービスを安全に利用できます。 また、FQDN で接続ログが残るのもCSIRT的に好都合です。

また、Webにはインターネット閲覧はさせたくないが、ソフトウェア更新はしたいといった内容にも応えてくれます。
このように、フォワードプロキシはイカしたシステムなのです。

HTTPS・SSL

Googleの透明性レポート「ウェブ上での HTTPS 暗号化」をみても分かるように、Google主導の取り組みによって HTTPS 化が進んでいます。squid で SSL が扱えるようにすることは必須と言えます。

ところが2021年、現在のStableバージョンsquid4.6ではSSLは無効化されております。そのため、少々お手数がかかります。そのあたりのお話もしていきましょう。

待って!インストールしないで!

いきなりapt installしようとしましたか?ちょっと待ってください。それはイカんです。
その方法でインストールしたsquidにはSSLの機能がありません。

「そんなわけないじゃなイカ!?」って人は一度インストールしてみて、
次のコマンドを実行してみてください。

squid -v

configure options パラメータの値に --enable-ssl-crtd および --with-openssl が含まれていればそのまま使えます。
無ければ、使えないのです。SSL機能が。

なんと、ソースコードからビルドする前にオプション設定が必要です。そのため、自分でビルドする必要があります。ビルドしてからインストールしましょう。イカにしてビルドするのでしょうか?

ビルドしよう

まずはアーカイバをインストールします。

 sudo apt install dpkg-dev

これで、ソースコードの圧縮ファイルをダウンロード後に解凍してくれます。
次に、ソースコードをダウンロードします。

cd ~
sudo apt source squid

そうすると、~/squid-4.6というフォルダが出来上がります。
これがプロジェクトフォルダです。
この中にあるビルド設定ファイルrulesを書き換えます。

sudo nano -l ~/squid-4.6/debian/rules

私はnanoエディターが好きなのでnanoで編集します。

nano エディター起動オプションに-lを付与して行番号を表示しています。rulesファイルは大きいため行番号が分かると便利です。

DEB_CONFIGURE_EXTRA_FLAGS := という部分があるので、そこに、下記を追加します。

--with-openssl \
--enable-ssl \
--enable-ssl-crtd \

書き換えが終わったら、今の設定を反映します。

~/squid-4.6/configure

依存関係を一気に入れます。

sudo apt install devscripts build-essential fakeroot libssl-dev libldap2-dev libpam0g-dev libdb-dev cdbs libsasl2-dev debhelper libcppunit-dev libkrb5-dev comerr-dev libcap2-dev libecap3-dev libexpat1-dev libxml2-dev pkg-config libnetfilter-conntrack-dev nettle-dev libgnutls28-dev dh-apparmor ed

依存関係がインストールできたら、
ビルドを行います。

cd ~/squid-4.6
sudo debuild -us -uc -b

ビルドが終わると、~ディレクトリに*.debのファイルが増えているはずです。
これをインストールしてあげます。

sudo dpkg -i ~/squid*.deb

インストールエラーになります。依存関係を修復します。

sudo apt --fix-broken install

もう一度インストールします。

sudo dpkg -i ~/squid*.deb

サービスにする

Squid サービスを自動起動設定に追加します。

sudo systemctl enable squid

Squid サービスを開始します。

sudo service squid start

Squid サービスのステータスを確認します。この操作には、次のコマンドを実行します:

sudo service squid status

Active パラメータの値に active (running) が含まれていればOKです。

SSL Bump の設定

HTTPSのWebページが見れるように設定を加えていきます。

自己署名 SSL 証明書の作成

まずは、いわゆる「オレオレ証明書」を作成します。Lets'Encryptなどを使って生成しても良いのではなイカと思います。

Squid サービスのディレクトリに移動します。

cd /etc/squid

自己署名 SSL 証明書を作成します。

sudo openssl req -new -newkey rsa:2048 -days <証明書の有効期間の日数> -nodes -x509 -keyout bump.key -out bump.crt

これにより、自己署名 SSL 証明書の各項目を対話形式で入力します。
その結果、証明書ファイル bump.crt と秘密鍵ファイル bump.key が作成されます。

不正アクセスを防ぐため、秘密鍵ファイルは安全な場所に保存しましょう。

証明書ファイルを DER 形式に変換して、信頼する証明書としてブラウザーにインポートできるようにします。

sudo openssl x509 -in bump.crt -outform DER -out bump.der

その後、クライアント側のコンピューターで、信頼されたルート証明機関のリストに bump.der ファイルをインポートします。
特定のブラウザー(Mozilla Firefox など)を使用する場合は、ブラウザーの保管領域にも証明書を追加する必要があります。

bump設定

Squid サービスで SSL Bump を設定していきます。

そもそも Squid サービスが必要なオプションをサポートしていることを確認します。

sudo squid -v

configure options パラメータの値に --enable-ssl-crtd および --with-openssl が含まれていればOKです。

別途用意した場合は、ここでPEM 形式の SSL 証明書を /etc/squid/bump.crt に配置します。
また、PEM 形式の秘密鍵を /etc/squid/bump.key に配置します。
Diffie-Hellman アルゴリズムの設定ファイルを生成します。

sudo openssl dhparam -outform PEM -out /etc/squid/bump_dhparam.pem 2048

SSL 証明書ファイルを使用するための権限を設定します。

sudo chown proxy:proxy /etc/squid/bump*
sudo chmod 400 /etc/squid/bump*

squid サービスが実行中の場合は停止します。

sudo service squid stop

証明書データベース用のディレクトリを作成して、データベースを初期化します。

sudo mkdir -p /var/lib/squid
sudo rm -rf /var/lib/squid/ssl_db
sudo /usr/lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 20MB
sudo chown -R proxy:proxy /var/lib/squid

/etc/squid/squid.conf 設定情報ファイルを次のように変更します。
ファイルの先頭または 1 つ目の http_access の前に次を追加します。

acl intermediate_fetching transaction_initiator certificate-fetching
http_access allow intermediate_fetching

ファイルの末尾に以下を追加します。

sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 20MB
sslproxy_cert_error allow all
ssl_bump stare all

http_port で始まる行を以下で置き換えます。

http_port 3128 tcpkeepalive=60,30,3 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB tls-cert=/etc/squid/bump.crt tls-key=/etc/squid/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3,SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=prime256v1:/etc/squid/bump_dhparam.pem

3128は Well known port です。安全性を高める場合はこの時点で3128以外の数字に書き換えます。

squid サービスを再起動します。

sudo service squid restart

自動アップデートから除外

自動アップデートされてしまうと、SslBump設定が消えます。それは困るので例外設定を入れておきます。

echo squid* hold | sudo dpkg --set-selections

squidの更新が無いか、定期的にGithubを確認しなければいけませんね。気が向いたらIFTTTで設定しましょうかね。

アクセス制御設定

そのままだと利用環境にあった設定になっていません。特に、ACL(Access Control List)の設定が不十分です。

sudo nano /etc/squid/squid.conf

nanoなどのエディターを使って、squid.confの中のaclで始まる部分を環境に合わせて書き換えます。

書き終えたら、squidを再起動します。

sudo service squid restart

もしここでsquid.confの文法エラーなどがあると、squidの起動に失敗します。
その時は、慌てずsquid.confの中身を変更前の状態に戻してみます。
そうするとsquidは起動するので、リラックスして思考できます。

お好みのsquid.confになるまで何度再起動しても構いません。

squid -k checksquid -k debugというコマンドを使うと、squid を再起動しなくても設定ファイルの静的解析ができるので便利です。

squid.conf

私の場合、環境に合わせて2か所変更しました。

まず、from where browsing should be allowedというコメントの下に、
http_access allow localnetがコメントアウトされているので、先頭の#を消して機能させます。

# from where browsing should be allowed

http_access allow localnet
http_access allow localhost

次にacl localnet srcで始まる行が複数記述されている部分を見つけます。
これらすべての先頭にに#を付けてコメントアウトします。

その下に行を追加し、下記のように必要なネットワークを追加しました。

acl localnet src 192.168.0.0/24 # Aビル3F

acl localnet src 192.168.1.0/24 # Aビル3F

acl localnet src 192.168.2.0/24 # Aビル3F

とりあえずこれで、LAN内からアクセスできることは確認できました。イカがでしたか?

ネットワーク構成

イメージです。なんとなく伝わるんじゃなイカと思います。いずれ、もう少し詳しい図に変更します。

image.png

参考

こちらのイカしたサイトもぜひご覧ください!

まとめ

これからはHTTPSが標準の時代です。
もう少ししたらsquidもデフォルトでSSL対応してくれるかもしれませんね。
それでは、「ぬりたく~る…テンタクル!!」

Excelsior!

13
7
0

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
13
7