📑

SquidにBasic認証を設定

2024/08/08に公開

はじめに

このガイドでは、Windows PCがパブリックサブネットに配置したSquidプロキシにアクセスする際のBasic認証の設定方法を説明します。認証画面を表示させ、認証が正常に機能することを確認できるようになります。

前提条件

EC2にSquidをインストールしてプロキシサーバーを構築が完了していること

参考:https://zenn.dev/shz/articles/b56031151c11bf

事前準備

まず、Basic認証で使用する試験用ユーザを作成します。htpasswdコマンドを使用して、ユーザ名とパスワードを設定します。

sudo htpasswd -c /etc/squid/.users test-user

ここで、-cオプションは新しいパスワードファイルを作成し、test-userはユーザ名です。コマンド実行後にパスワードの入力を求められます。

次に、Basic認証で使用する認証プログラムがローカルに存在することを確認します。

ls /usr/lib64/squid/ |grep basic_ncsa_auth

以下のファイルがリストに含まれていることを確認してください:

  • basic_ncsa_auth

basic_ncsa_authが必要な理由

basic_ncsa_authは、SquidがBasic認証を行うための認証ヘルパープログラムです。このプログラムは、ユーザ名とパスワードの組み合わせが正しいかどうかをチェックし、認証を行います。具体的には、htpasswdコマンドで生成されたパスワードファイルを使用して、ユーザの認証情報を検証します。

Squid設定ファイルの編集

次に、Squidの設定ファイル(/etc/squid/squid.conf)を編集します。以下は設定ファイルの対象となる部分だけ抜粋したものです。

1. HTTP通信設定

まず、HTTP通信の設定を行います。既存の設定に加え、クライアントPCのIPアドレスからのアクセスを許可するACLを追加します。

# 既存のACL定義
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 SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

# クライアントPCのIPアドレスを許可するACLを追加
acl myip src 203.0.113.24/32  # クライアントPCの例示用IPアドレス

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager

# 既存のアクセス許可ルール
http_access allow localnet
http_access allow localhost

# クライアントPCのIPアドレスからのアクセスを許可するルールを追加
http_access allow myip

http_access deny all

http_port 3128

coredump_dir /var/spool/squid

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

2. Basic認証の設定

次に、Basic認証の設定を行います。以下の設定を追加してください。

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
  • auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/.users:

Basic認証のために使用するプログラムとユーザ情報ファイルを指定します。basic_ncsa_authプログラムが/etc/squid/.usersファイルを使用して認証を行います。

  • auth_param basic children 5:

認証ヘルパープログラムの子プロセスを最大5つまで並行して動作させることを指定します。これにより、複数の認証要求を同時に処理できます。

  • auth_param basic realm Squid Basic Authentication!:

認証プロンプトに表示される認証領域(realm)を指定します。ユーザがブラウザでプロキシにアクセスするときに表示されるメッセージになります。

  • auth_param basic credentialsttl 5 hours:

認証情報の有効期間を設定します。この場合、認証情報は5時間有効です。5時間後には再度認証が必要になります。

  • auth_param basic casesensitive off:

ユーザ名の大文字小文字を区別しないようにします。ユーザ名の大文字小文字を区別する場合はonに設定します。

  • acl auth proxy_auth REQUIRED:

認証が必要なアクセス制御リスト(ACL)を定義します。proxy_auth REQUIREDは、認証が必須であることを意味します。

  • http_access allow auth:

認証が成功したユーザに対してアクセスを許可します。このルールが適用されると、認証に成功したユーザはプロキシを通してインターネットにアクセスできます。

設定の調整

設定ファイルのルールは上から順に適用されるため、クライアントに「Basic認証でユーザを認証してからプロキシを使わせる」設定が必要です。以下のように設定を変更します。

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 SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

# クライアントPCのIPアドレスを許可するACLを追加
acl myip src 203.0.113.24/32  # クライアントPCの例示用IPアドレス

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager

# 既存のアクセス許可ルール
http_access allow localnet
http_access allow localhost

# クライアントPCのIPアドレスからのアクセスを許可するルールを追加
http_access allow myip

http_access deny all

http_port 3128

coredump_dir /var/spool/squid

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

この設定により、myip(クライアントPCのIPアドレス)はBasic認証を通過しない限りアクセスできなくなります。

設定の適用と確認

設定を保存した後、Squidを再起動して設定を適用します。

sudo systemctl restart squid

プロキシを設定したブラウザからインターネットにアクセスすると、認証プロンプトが表示されます。

ユーザ名とパスワードを入力し、認証が成功することを確認してください。

トラブルシューティング

もし、認証プロンプトが表示されない場合は、以下を確認してください:

  1. squid.confの設定が正しく記述されているか。
  2. htpasswdコマンドで正しいファイルにユーザを追加したか。
  3. Squidのログファイル(/var/log/squid/access.log/var/log/squid/cache.log)を確認し、エラーメッセージがないか確認する。

具体的なログ例と対策

  • エラーメッセージ: WARNING: basicauthenticator #0 (FD 5) exited

    • 対策: 認証プログラムが正しく設定されていない可能性があります。/usr/lib64/squid/basic_ncsa_authのパスを確認し、存在することを確認してください。
  • エラーメッセージ: TCP_DENIED/407

    • 対策: 認証が必要ですが、提供された認証情報が不足しています。ブラウザの設定を確認し、正しいユーザ名とパスワードを入力してください。

まとめ

このガイドでは、パブリックサブネットに配置されたSquidプロキシサーバにBasic認証を設定する手順を詳しく説明しました。初めての方でも以下のステップを踏むことで、認証機能を有効にしてプロキシを利用できるようになります。

  • ユーザの作成:htpasswdコマンドを使用して、認証に必要なユーザ情報を準備しました。
  • 認証プログラムの確認:basic_ncsa_authプログラムが正しく存在することを確認しました。
  • Squid設定ファイルの編集:必要なACLとBasic認証の設定を追加し、適用しました。
  • 認証の適用と確認:設定を保存してSquidを再起動し、ブラウザからアクセスすることで認証プロンプトが表示されることを確認しました。
  • トラブルシューティング:認証に関する一般的なエラーとその対策を紹介しました。

この設定により、セキュアな環境でプロキシを運用することができます。Basic認証を用いることで、不正アクセスを防ぎ、特定のユーザだけがプロキシを利用できるようになります。

Discussion