⚙️

Raspberry Pi 4にSquidでbasic認証付きプロキシサーバを立てる

2020/11/11に公開

背景・やること

クライアントアプリ開発中、プロキシ認証が必要な環境での通信をテストするためにLAN内にbasic認証付きのプロキシサーバをが欲しかった。Raspberry Pi 4が転がっていたのでこれを有効活用することにした。

前提・環境

Raspberry Pi 4 ModelB
Raspbian OS 10 buster
Kernel 4.19
Squid 4.6

※ネットワーク・インフラ方面はあまり得意ではないので間違っているところなどあればご教示ください。

全体の流れ

  1. Squidのインストール
  2. htpasswdを使うためのapache2-utilsのインストール
  3. パスワードファイルの作成
  4. Squidの設定
  5. Squid再起動
  6. 動作確認

手順

Squidのインストール

ともかくSquid本体をインストールする。バージョンは4.6。

$ sudo apt-get install squid

apache2-utilsのインストール

今回はプロキシを使ったアクセス時にbasic認証を要求することが要件なので、basic認証に設定するパスワードファイルを作る。パスワードファイル作成に使うhtpasswdコマンドはRaspbian OSインストール時にはついてこなかったようなので、インストールを行う。apache2-utilsをインストールすることでhtpasswdコマンドが使えるようになった。

$ sudo apt-get install apache2-utils

パスワードファイルの作成

インストールしたapache2-uitlsに含まれるhtpasswdコマンドで、任意のディレクトリにパスワードファイルを作成する。
今回は /etc/squid/htpasswd というファイルを作り、ユーザ名はuserとした。
password:とかRe-type new password:とか聞かれるので、設定したいパスワードを入力する。

$ sudo htpasswd -c /etc/squid/htpasswd user

Squidの設定

Squidがリクエストを受けた場合に作成したパスワードファイルに登録されたユーザの認証を要求するように設定を行う。今回は、basic認証周り以外はデフォルト設定で希望の動作が得られた。

/etc/squid/squid.confにある設定ファイルを見ると、ルールを設定するには/etc/squid/conf.d/以下に設定ファイルを挿入しろと書いてあるので、basic認証用の設定ファイルを/etc/squid/conf.d/basic_auth.confに作成した。

$ sudo touch /etc/squid/conf.d/basic_auth.conf
$ sudo vi /etc/squid/conf.d/basic_auth.conf

Squidの設定ファイルでは上から順に許可する・拒否するアクセスのルールを書いていって、最後にdeny allと未定義の他のアクセスをすべて不許可、と言うように書く模様。/etc/squid/squid.confでは、deny allの前に/etc/squid/conf.d/以下のすべての設定ファイルをインクルードするようになっていた。

作成した設定ファイルは以下の通り。

# basic認証を設定。認証プログラムとパスワードファイルのパスを指定
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/.htpasswd

# 認証を行うプロセスの数。
# 複数クライアントから同時に要求が来て認証情報の入力待ちを何件平行に行えるかの設定(たぶん)
auth_param basic children 5

# ブラウザのダイアログとかに表示する、何に対しての認証要求なのかを表現する文言の設定。
# "Squid Basic Authentication"のところを、サーバ名とか誰が認証を求めてるのかわかる親切な内容にするとよさげ。
auth_param basic realm Squid Basic Authentication

# 入力された認証情報の有効期限。この場合1時間後に再度尋ねる
auth_param basic credentialsttl 1 hours

# ACLとはAcess Control Listのこと。
# たぶんパスワード形式でのプロキシ認証必須にするという意味
acl password proxy_auth REQUIRED

# たぶんパスワード認証のアクセスを許可するという意味
#(呼び出し元のsquid.confでdeny allするのでhttp_access password以外はdenyすることになる?)
http_access allow password

Squidの再起動

$ sudo service squid restart 

これで正常に再起動すれば、basic認証を要求するようになっている。
自分の場合は、設定ファイルのbasicをabsicとtypoしていたせいで起動に失敗していた……
設定変更した結果再起動できなくなった場合

$ sudo squid -k parse

コマンドで設定ファイルの構文をチェックできる。

動作確認

以下のコマンドで、アクセスが拒否されることを確認。

$ curl example.com -x localhost:3128

以下のコマンドで、Connection Refusedとかが返ってこずにHTML形式のレスポンスが表示されることを確認。(passwordの部分はパスワードファイル作成時に設定したパスワードを入力する)

$ curl example.com -x user:password@localhost:3128

ログファイル

デフォルトでは以下にログファイルが作られる模様。

/var/log/squid/access.log
/var/log/squid/cache.log

Discussion