SquidにBasic認証を設定した時、ちょっと躓いた件

## 事象
- 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
```

これで無事に認証プロンプトがでるようになりました。めでたし。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/ba5e10bb-87ac-711c-b90f-da503d98574e.png)


## 補足
今回はBasic認証として紹介しましたが、設定ファイルの構成の話なので認証方式はすべて該当するかと思います。(未検証)

## 参考にさせていただいたサイト
[CentOS7のSquidでBasic認証付きプロキシーサーバーを構築する方法](https://4thsight.xyz/5627)