SquidのDigest認証でパスワードファイルをハッシュ化する
Follow @venividivici830
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
プロキシのクライアントは、macOS High Sierra バージョン 10.13.5。
CentOSのネットワークは設定済。
CentOSとmacOSは、同一ネットワーク192.168.11.0/24に所属し、CentOSのIPアドレスは192.168.11.77。
以下、プロンプトが#の場合は、CentOSのrootユーザー、$の場合は、macOSの一般ユーザー。
# 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を開放し、リロードして設定を反映させた。
ssで、ポート3128でLISTENしていることも確認できた。
-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
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 -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
Macのプロキシは、システム環境設定→ネットワーク→詳細→プロキシ から設定できる。
「Webプロキシ(HTTP)」と「保護されたWebプロキシ(HTTPS)」を設定すればOK。
Chromeで認証画面を表示させたいので、下図の例では、あえてユーザ名、パスワードは設定していない。


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

squidに設定したユーザー、パスワードを入力したところ、無事、インターネットに接続できた。
# systemctl enable squid
Created symlink from /etc/systemd/system/multi-user.target.wants/squid.service to /usr/lib/systemd/system/squid.service.
ArchWiki Squid
Squid and Digest Authentication
設定の意味
OPTIONS FOR EXTERNAL SUPPORT PROGRAMS
ACCESS CONTROLS
ファイアウォールの設定
Centos7でsquidを立てる
htdigestコマンドのインストール
サーバにhtpasswdだけインストールしたい
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:
パスワードファイルの格納場所とファイル名も任意だが、参考にしたページと同様、/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だけインストールしたい
コメント
コメントを投稿