事象
- Squidを触る機会があり、Basic認証を有効化しようとした際に認証プロンプトが中々出なかった。
- ちょっとググったが、同じようなところで躓いている人(記事)が見つからず1時間浪費してしまった。
原因
- squid.conf において認証の設定は http_access より先に記述する必要がある。
- 恐らく、設定ファイルにおいて上からルールが適用されるため、認証設定より先にアクセス許可ルールが存在すると、そこでクライアントからの通信が許可されてしまうためと思われる。(今回使用したバージョン以外では、どうなるか不明。)
環境
- OS : CentOS Linux release 7.6.1810 (Core)
- squid : squid-3.5.20-17.el7_9.8.x86_64
解説
事前準備
Basic認証で使用する試験用ユーザを作成する。
# htpasswd -c /etc/squid/.users test-user
Basic認証で使用する認証プログラムがローカルに存在することを確認する。
# ls /usr/lib64/squid/
basic_db_auth ext_file_userip_acl
basic_getpwnam_auth ext_kerberos_ldap_group_acl
basic_ldap_auth ext_ldap_group_acl
basic_msnt_multi_domain_auth ext_session_acl
basic_ncsa_auth ext_time_quota_acl
basic_nis_auth ext_unix_group_acl
basic_pam_auth ext_wbinfo_group_acl
basic_pop3_auth helper-mux.pl
basic_radius_auth log_db_daemon
basic_sasl_auth log_file_daemon
basic_smb_auth negotiate_kerberos_auth
basic_smb_auth.sh negotiate_kerberos_auth_test
basic_smb_lm_auth ntlm_fake_auth
cachemgr.cgi ntlm_smb_lm_auth
cert_tool ssl_crtd
digest_edirectory_auth storeid_file_rewrite
digest_file_auth unlinkd
digest_ldap_auth url_fake_rewrite
diskd url_fake_rewrite.sh
Basic認証用の設定
/etc/squid/squid.conf(今回の対象となる部分だけ抜粋)
1 : HTTP通信設定周り
/etc/squid/squid.conf
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 SSL_ports port 443
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access allow localnet
http_access deny all
http_port 3128
2 : Basic認証周り
/etc/squid/squid.conf
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/.users
auth_param basic children 5
auth_param basic realm Squid Basic Authentication!
auth_param basic credentialsttl 5 hours
auth_param basic casesensitive off
acl auth proxy_auth REQUIRED
http_access allow auth
設定した最初の段階では1→2の順でConfigを記述し、「これでいけるやろ」と思いながら意気揚々とSquidを再起動させ、プロキシを設定したブラウザから適当にインターネットアクセスを試みたところ、普通に繋がってしまいました。
上述の通り、設定ファイルのルールは上から適用されていくので、この書き方だと http_access allow localnet の行でアクセスが許可されてしまうんですね。
そのため、クライアントに「Basic認証でユーザを認証してからプロキシを使わせる」といった設定が必要な場合は、下のような書き方が必要になります。
/etc/squid/squid.conf
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 SSL_ports port 443
acl CONNECT method CONNECT
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/.users
auth_param basic children 5
auth_param basic realm Squid Basic Authentication!
auth_param basic credentialsttl 5 hours
auth_param basic casesensitive off
acl auth proxy_auth REQUIRED
http_access deny !Safe_ports
http_access allow localnet auth
http_access deny all
http_port 3128
これで無事に認証プロンプトがでるようになりました。めでたし。
補足
今回はBasic認証として紹介しましたが、設定ファイルの構成の話なので認証方式はすべて該当するかと思います。(未検証)