SquidのDigest認証でパスワードファイルをハッシュ化する



SquidでDigest認証(ダイジェストにんしょう)を設定した話。

「squid digest認証」などで検索すると、パスワードファイルにパスワードを平文として記載する例が多くヒットする(日本語のページの話)。

それだとBasic認証とたいして変わらない気がするので、パスワードファイルをハッシュ化(暗号化)しても、Digest認証できるようにした。

結論としては、squid.confのauth_param digest programで指定する認証用のコマンドで、-cオプションを付ければよかった。

auth_param digest program /usr/lib64/squid/digest_file_auth -c path_to_password_file

前提条件

プロキシサーバーは、Virtualbox バージョン 5.2.12 r122591上のCentOS-7 (1804)にインストールした、Squid Cache: Version 3.5.20。
プロキシのクライアントは、macOS High Sierra バージョン 10.13.5。

CentOSのネットワークは設定済
CentOSとmacOSは、同一ネットワーク192.168.11.0/24に所属し、CentOSのIPアドレスは192.168.11.77。

以下、プロンプトが#の場合は、CentOSのrootユーザー、$の場合は、macOSの一般ユーザー。

Squidのインストール〜疎通確認まで

CentOS 7にsquidをyumでインストールした。

# yum -y install squid

インストール後、squidの設定ファイル(デフォルトで/etc/squid/squid.conf)を編集。

# vi /etc/squid/squid.conf

筆者の自宅のネットワークは、ネットワークアドレスが192.168.11.0/24のため、下記の部分を、

acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

下記のように編集した。

#acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.11.0/24        # RFC1918 possible internal network
#acl localnet src fc00::/7       # RFC 4193 local private network range
#acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

次に、ファイアウォールを開けた。

squidのポート番号は、設定ファイルのhttp_portで指定されている。

# cat /etc/squid/squid.conf | grep http_port
http_port 3128

ポート3128を開放し、リロードして設定を反映させた。

# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.11.0/24" port protocol="tcp" port="3128" accept"
success
# firewall-cmd --reload
success

systemctlで、Squidを起動させた。

# systemctl start squid

ステータスを確認すると、起動していることが確認できた。

# systemctl status squid
● squid.service - Squid caching proxy
   Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled)
   Active: active (running) since 土 2018-08-11 20:51:03 JST; 14s ago
以下省略

ssで、ポート3128でLISTENしていることも確認できた。

# ss -natupl | grep LISTEN
tcp    LISTEN     0      128       *:22                    *:*                   users:(("sshd",pid=952,fd=3))
tcp    LISTEN     0      100    127.0.0.1:25                    *:*                   users:(("master",pid=1193,fd=13))
tcp    LISTEN     0      128      :::22                   :::*                   users:(("sshd",pid=952,fd=4))
tcp    LISTEN     0      128      :::3128                 :::*                   users:(("squid",pid=1460,fd=11))
tcp    LISTEN     0      100     ::1:25                   :::*                   users:(("master",pid=1193,fd=14))

curlで疎通確認を行った。下記、Mac側で実行したコマンド。

$ curl -o - https://taeisheauton4programming.blogspot.com -x 192.168.11.77:3128

-xで、プロキシサーバーを指定する。192.168.11.77は、筆者の環境のCentOSのIPアドレス。

上記コマンドを実行した結果、本ブログのTOPページのHTMLが標準出力に出力されたため、squid経由でHTTP(S)アクセスできていることが確認できた。

なお、設定やコマンドが間違っていると、下記のようなエラーが表示される。

curl: (7) Failed to connect to 192.168.11.77 port 3128: Connection refused

Digest認証の設定

パスワードファイルの作成にhtdigestコマンドを使うため、インストールした。
htdigest は、httpd-toolsに含まれるようなので、yumでhttpd-toolsをインストールした。

# yum -y install httpd-tools

下記コマンドで、パスワードファイルを作成。ユーザーは「user」、パスワードは「passwd」を設定した。

# htdigest -c /etc/squid/users MyRealm user
Adding password for user in realm MyRealm.
New password:
Re-type new password:

なお、Realmは適当。参考にしたページと同様にMyRealmを設定した。
パスワードファイルの格納場所とファイル名も任意だが、参考にしたページと同様、/etc/squid/usersとした。

作成されたパスワードファイルの中身を確認すると、パスワードが暗号化されていることが確認できた。

# cat /etc/squid/users
user:MyRealm:9dc1876187d1cf3bbd93f12d17348cf8

squidの設定ファイルを編集。

# vi /etc/squid/squid.conf

具体的には、INSERT YOUR OWN RULE(S)のあたりに、下記のような設定を追加。

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
auth_param digest program /usr/lib64/squid/digest_file_auth -c /etc/squid/users
auth_param digest children 5
auth_param digest realm MyRealm
acl users proxy_auth REQUIRED
http_access allow users

ポイントは、/usr/lib64/squid/digest_file_authのオプションに-cを付けていること。
これにより、平文でない(暗号化された)パスワードファイルでもDigest認証できる。

なお、認証用のプログラム(上の例では、/usr/lib64/squid/digest_file_auth)は、環境によってdigest_pw_authであったりするようだ。
筆者の環境では、下記のようにgrepで検索した結果、digest_file_authが該当しそうだったので、digest_file_authを指定した次第だ。

# find /usr/ | grep squid | grep digest
/usr/lib64/squid/digest_edirectory_auth
/usr/lib64/squid/digest_file_auth
/usr/lib64/squid/digest_ldap_auth

squidを再起動することで、設定を反映させた。

# systemctl restart squid

確認(curl)

Mac側で、curlにより確認。-Uで、プロキシのユーザー、パスワードを指定できる。

$ curl -o - https://taeisheauton4programming.blogspot.com -U user:passwd -x 192.168.11.77:3128
curl: (56) Received HTTP code 407 from proxy after CONNECT

エラーが出てしまった。

manコマンドでcurlのマニュアルを見たところ、curlでDigest認証をする場合は、--proxy-digestを付ける必要があるようだ。

下記のコマンドを実行したところ、無事、Digest認証で、本ブログのTOPページのHTMLが標準出力に出力された。

$ curl -o - https://taeisheauton4programming.blogspot.com -U user:passwd -x 192.168.11.77:3128 --proxy-digest --digest

確認(GUI)

GUI(Chrome)でも確認した。

Macのプロキシは、システム環境設定→ネットワーク→詳細→プロキシ から設定できる。

「Webプロキシ(HTTP)」と「保護されたWebプロキシ(HTTPS)」を設定すればOK。
Chromeで認証画面を表示させたいので、下図の例では、あえてユーザ名、パスワードは設定していない。




設定後、Chromeで検索しようとすると、認証画面が表示された。

 

squidに設定したユーザー、パスワードを入力したところ、無事、インターネットに接続できた。

Squidが自動で起動されるようにした

本投稿の主旨とは話がずれるが、マシン起動時にsquidが自動的に起動されるようにしておいた。

# systemctl enable squid
Created symlink from /etc/systemd/system/multi-user.target.wants/squid.service to /usr/lib/systemd/system/squid.service.

参考

Digest認証の設定手順
ArchWiki Squid
Squid and Digest Authentication

設定の意味
OPTIONS FOR EXTERNAL SUPPORT PROGRAMS
ACCESS CONTROLS

ファイアウォールの設定
Centos7でsquidを立てる

htdigestコマンドのインストール
サーバにhtpasswdだけインストールしたい


コメント

このブログの人気の投稿

PowerShell 6で、Shift_JISのCSVをImport-Csvで読み込んだら文字化けした

Windowsで、特定のユーザーに特定のサービスの再起動を許可する

PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchする