最終更新日: 2014年1月13日
Squid Home / FAQトップ

23. 認証

Squidの各種の認証方法についてのサンプルはこちらにありますのでご覧下さい。

23.1 Squidではどのようなプロキシ認証が機能しますか?

Squidの各種の認証方法についてのサンプルはこちらにありますのでご覧下さい。
注意:この情報は、 バージョン2.5x に対応します。

Squidでは、proxy_auth ACLが使われることでユーザ認証が行われるようになります。
ブラウザーは、ユーザー認証の認可のリクエストをリクエスト・ヘッダー中に入れて送ります。

Squidはリクエストを得ると、proxy_auth ACLによる http_access ルールが存在する場合には認証ヘッダーをリクエストから探し、そのヘッダーのユーザIDとパスワードを抽出します。
ヘッダーが見当たらない場合、Squidはステータス407(Proxy Authentication Required)をHTTPの応答として返します。ユーザエージェント(ブラウザー)は407の返答を受けると、名前およびパスワードを入力するようにユーザに促します。名前およびパスワードはコード化され、プロキシに認可ヘッダーのリクエストを送ります。

注意: 名前およびパスワードは"base64"を使用して、エンコード(コード化)されます(RFC 2616のセクション11.1を参照)。
しかしながら、base64はテキストを2進法の符号づけするだけで暗号化される訳ではありません。 これは、ユーザー名およびパスワードがブラウザーとプロキシの間で本質的には"クリアテキスト"であることを意味します。
したがって、アカウント・ログインするためのユーザ名およびパスワードと同じものを使わない方が良いでしょう。

注意2: Internet Explorer(IE)のバグによってSquid2.5との組み合わせにおいて、認証時に参照するページがHTTPSによるページあった場合に、IE起動直後の場合に画面の表示に失敗します。
これの対処方法をFAQに載せておきます。

認証は、Squidのプロセスとは別の外部プロセスによって現実されます。Squidがスタートすると、それは多くの認証サブプロセスを大量に起動します。
これらのプロセスは、標準入力(stdin)でユーザー名およびパスワードを読み、「OK」あるいは「ERR」を返答します。
現在、多くの異なる認証スキームの中から一度に1つのスキームを使用することができます。

Squidソース・コードは、基本的な認証のためにいくつかの認証プロセスを持っています。:

さらに、Squidはパスワードがプレーンテキストとして交換されないより安全な認証方法を供給する、NTLMおよびダイジェスト認証スキームをサポートします。それぞれのスキームは、ヘルパーおよびauth_paramセッティングのが独自ですので異なる認証スキーム間のヘルパーを混合することができません。NTLM認証をセット・アップする方法についての情報のために、winbindを見てください。

ユーザを認証するために、コンパイル・インストールディレクトリに供給されている認証モジュールかあなたが作成したヘルパー/basic_auth/が必要です。

squid.confの中でauth_paramオプションと共にどの認証プログラムを使用するべきであるかSquidに伝えます。 必要ならば任意のコマンドライン・オプションを加えて、プログラムの名前を指定します。例えば:

auth_param basic program /usr/local/squid/bin/ncsa_auth /usr/local/squid/etc/passwd

23.2 どのようにアクセスコントロールの中で認証を使いますか?

デフォルトでは、SquidはSSLリクエストの場合にはオリジナルサーバへ直接接続します。 しかし、もしあなたがSSLリクエストを親サーバを経由して接続したいなら、SSLリクエストを直接接続しないように最初に指定してください:

acl SSL method CONNECT
never_direct allow SSL

これと同時に、SSLリクエストを使う場合の親を1つだけ指定すべきです。 もし特別な親を指定するなら"cache_peer_access "で設定します。

cache_peer parent1 parent 3128 3130
cache_peer parent2 parent 3128 3130
cache_peer_access parent2 allow !SSL

こうすることで、SquidはSSLにparent2を使わずに、常にparent1を使うようになります。

Squidは、あなたが個々のユーザー名の指定することでよりきめの細かいコントロールを提供することを可能にします。
例えば:

acl foo proxy_auth REQUIRED
acl bar proxy_auth lisa sarah frank joe
acl daytime time 08:00-17:00
acl all src 0/0
http_access allow bar
http_access allow foo daytime
http_access deny all

この例では、lisaとsarahとjoeというユーザはいつでもプロキシを使うことができ、それ以外のユーザは8:00-17:00の間だけプロキシを利用できるようになります。

23.3 Squidは認証結果をキャッシュして再利用にしますか?

はい、その通りです。 成功した認証検査はデフォルトによって1時間貯えられます。 その意味することは(最悪の場合には)あなたがキャッシュから出た後に認証データベースが削除されるまでの1時間の間に誰かがこれ使うかもしれないという事です。

auth_paramオプションを使う事で有効期限をコントロールすることができます。

注:これは、ユーザによる再度のユーザ認証を必要とするかのパラメータではありません。セッションを維持するのは、ブラウザーです。 ブラウザーは、Squidに送られたすべてのリクエストをユーザーの代わりに立証します。
このパラメーターが管理するものは、単にどのくらいしばしばSquidが定義されたヘルパーに、パスワードがまだ妥当かたずねる間隔です。

23.4 パスワードはクリアテキストで格納されますか。それとも、暗号化されますか?

Squidはメモリ上ではクリアエキストでパスワードを格納します。 

外部認証プロセスに話しかける場合、Squidはクリアテキストでユーザー名およびパスワードを送ります。
しかしながら、外部認証はローカルコンピュータ上でパイプを使って行われており、これをのぞき見することが出来るのはrootの権限のある場合に限られるのでそう心配する事は内でしょう。

23.5 どのようにwinbind認証を使いますか

Jerry Murdock によって:

Winbindは最近Sambaに追加された機能で、NTベースのユーザアカウントの機能を提供します。Squidはwinbindによって強固で堅固で効率的なNTドメインコントローラーに対する基礎的なNTLM認証のエンジンを提供します。

winbind認証は、Linux、FreeBSDおよびSolaris下で利用出来るようになっています。

■ Sambaサポートのリリース

Samba-3.xからは機能の一部として標準でntlm_authがサポートされています。 このため、コンパイル時にwinbindヘルパーの利用を明示的に指定する必要はありません。(指定してもSamba-3.xでは動作しません)

Samba-2.2.xではSquidとwinbindヘルパーデーモンを経由したSambaの内部インターフェースが使ってサポートされています。 このため、Sambaチームのインターフェースへの変更に対して非常に敏感(バージョンアップで動かなくなってしまう事がある)です。

winbindヘルパーは、Squid-2.5 STABLE2から同梱されて、Samba-2.2.6 から Samba-2.2.7aともしかしたらSanba-2.xでもサポートされているかも知れません。
Squid-2.5.STABLE2とともにSambaのバージョン2.2.5以後を使う場合には、configureオプションとして --with-samba-sources=... を必要としてます。
また、Samba-2.2.xバージョンにSamba-2.2.7aまでのパッチを適用したらな、このオプションを適用できるでしょう。

Squid-2.5.STABLE1 では Samba 2.2.4 と 2.2.5 だけをサポートしてます。 Squid-2.5.STABLE2 以上を使う場合には現在のバージョンのSamba-2.Xを使う事をお勧めします。

Samba3.Xについてはntlm_authがパーツとして提供されているので此方を使ってください。このヘルパーは、全てのバージョンのSquidにおいてntlmおよびベーシック認証スキームをサポートします。 このSambaのヘルパーの利用方法の詳細については、Sambaドキュメンテーションを見てください。
グループ検索については、Squidからwbinfo_groupヘルパーが使用することができます(これはSambaのwbinfoプログラムのラッパーで、Sambaのすべてのバージョンで機能します)。

■ SambaのConfigure

Sambaを生成(configure)する方法については、Sambaのドキュメントの中の how to configure Samba and joining a domain を参照してください。Sambaチームは、NT領域を連結する方法、およびアクティブ・ディレクトリーツリーを連結する方法の両方についての広範囲なドキュメンテーションを持っています。

Samba-3.xでのインストール

Sambaを生成するにあたって、configureのオプションとして以下を指定してください。

--with-winbind

その他の指定についてはSambaのインストールガイドに従ってください。 もしドメインとUNIX OSのアカウントを統合したいのなら、Squidのインストールにおいてnsswitch か pamモジュールを必要しますので忘れないでください。

Samba-2.xでのインストール:

Sambaを生成するにあたって、configureのオプションとして以下を指定してください。

--with-winbind
--with-winbind-auth-challenge

Samba 2.2.5を生成する場合、smbpasswd.diff パッチを適用するようにしてください。 SMBD and Machine Trust Accountsをみれば、パッチを当てることに価値を見いだせることでしょう。

winbindのテスト:

winbinddの

  1. 機能のためのsmb.confを編集して下さい。テンプレートとして、smbd.confの[global] セクションに対する設定を以下に示します。
    workgroup = mydomain
    password server = myPDC
    security = domain
    winbind uid = 10000-20000
    winbind gid = 10000-20000
    winbind use default domain = yes
  2. あなたのバージョンのSambaのwinbinddのマニュアルを参考にNTドメインに参加してください。
  3. nmbd をスタートさせてください。
  4. winbinddをスタートさせてください。
  5. 基本的なテストとして "wbinfo -t" を使用します。
    # wbinfo -t
    Secret is good
  6. winbinddによるユーザ認証のテスト
    # wbinfo -a mydomain\\myuser%mypasswd
    plaintext password authentication succeeded
    error code was NT_STATUS_OK (0x0)
    challenge/response password authentication succeeded
    error code was NT_STATUS_OK (0x0)

注意: プレーンテキストの場合でもチャレンジ/レスポンス(NTLM認証)の場合でも "succeeded." が戻る筈です。もしチャレンジ/レスポンスで戻らなかったなら、"--with-winbind-auth-challenge"を指定してコンパイルしていないか、NTLN認証が無効になっています。

■ SMBD とマシン認証アカウント(machine trust account:信頼出来るマシンアカウント)

Samba-3.x:

Sambaチームは、マシン認証アカウント(machine trust account)のパスワードを変更する為の機能を取り入れた新しい"net"コマンドを用意しました。 これは、cronジョブによって変更するのが一般的です。

Samba-2.2.x

Sambaのsmbdデーモンは、マシン認証アカウントをまったく管理できません。
上手に振る舞うドメインメンバは、定期的にパスワードを変更します。 デフォルトではWindowsとSambaサーバでは7日ごとにパスワードを変更します。
Sambaのコンポーネントのsmbdがマシン認証パスワードに責任を持ちます。 smbdはパスワードの変更を引き起こします。 もしマシンがファイルとプリンタサーバであるのならば常にsmbdを実行するようにしておくべきでしょう。
しかしもし、Squidを動かす為のwinbindヘルパーを使う為だけであるなら、smbdは実行されている必要はありません。 

以下は、認証パスワードを変更するための2つの方法です。

UglySolution.pl はsmbdをロードしてから使うperlのスクリプトです。 これはsmbclientを利用しSambaに接続してsmbdのマシン認証パスワードの変更を行います。

smbpasswd.diffは、好きなときにマシン認証パスワードを変えるSamba2.2.5へのsmbpasswdユーティリティへのパッチです。それは、コマンドライン・インターフェースをSambaへ機能させるためのパッチです。

注:このパッチは、2.2.6pre2以降のSambaに含まれます。

パッチを適用したなら、 smbpasswd で次のようにする事でパスワードを変更できます。:

% smbpasswd -t DOMAIN -r PDC

winbindではパイプアクセスの権限を与えてください。(Samba-3.x):

ntlm_authは、適切に機能するために特権のあるwinbindパイプへのアクセスを要求します。 実行できるようにする為にwinbind_privilegedディレクトリをSquidの実行グループと同じに設定してください。(squid.confの中でcache_effective_groupをセットしてください)。

# chgrp squid /path/to/winbind_privileged

■ Squidの設定

Squidのインストール時の指定

Samba-3.xの時:

Samba-3.xが認証ヘルパーを持っているので、Squid側でヘルパーを構築する必要はありません。 (例え構築しても動作しないでしょう) Samba-3.xのヘルパーを使うのであれば、Squid の構成において、ntlmスキームのサポートを有効にする必要があります。さらに、グループ検査のためにwbinfo_groupヘルパーを使用したいと思うかもしれません。

--enable-auth="ntlm,basic"
--enable-external-acl-helpers="wbinfo_group"
Samba-2.x以上の時:
Squidの構築の際に以下の指定が必要です。
--enable-auth="ntlm,basic"
--enable-basic-auth-helpers="winbind"
--enable-ntlm-auth-helpers="winbind"
--enable-external-acl-helpers="wb_group"

認証なしのテスト:

認証を構成する前に、この機能のない状態でのSquidの動作を確認して、確認できてから構成するようにすると良いでしょう。

Samba-3.xヘルパーのテスト:

コマンドラインから winbind ntlm ヘルパーを試す事はできませんが、winbindベーシック認証のヘルパーを試す事はできます。cache_effective_user を確認して実行してみてください。

# /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic mydomain+myuser mypasswd
OK

妥当なユーザ名/パスワードを与えると、「OK」が返ってきます。 +は、smb.conf で指定したドメイン・セパレーター・セットです。

Samba-2.2.xヘルパーのテスト:

コマンドラインから winbind ntlm ヘルパーを試す事はできませんが、winbindベーシック認証のヘルパーを試す事はできます。cache_effective_user を確認して実行してみてください。

# /usr/local/squid/libexec/wb_auth -d
/wb_auth[65180](wb_basic_auth.c:136): basic winbindd auth helper ...
mydomain\myuser mypasswd
/wb_auth[65180](wb_basic_auth.c:107): Got 'mydomain\myuser mypasswd' from squid (length: 24).
/wb_auth[65180](wb_basic_auth.c:54): winbindd result: 0
/wb_auth[65180](wb_basic_auth.c:57): sending 'OK' to squid
OK

妥当なユーザ名/パスワードを与えると、「OK」が返ってきます。

squid.confの編集:

・認証をセットしてください(Samba-3.x)
以下の項目を設定して、winbindベーシック認証とntlm認証を有効にしてください。 
auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 30
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes

auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
注意: もしあなたのSambaがバイナリパッケージからインストールされたなら、ntlm_auth は/usr/local/bin/ntlm_auth ではなく /usr/bin/ntlm_auth にある事でしょう。 その場合、上記の設定の該当箇所を書き直してください。
・認証をセットしてください(Samba-2.2.x)
以下の項目を設定して、winbindベーシック認証とntlm認証を有効にしてください。 
auth_param ntlm program /usr/local/squid/libexec/wb_ntlmauth
auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes

auth_param basic program /usr/local/squid/libexec/wb_auth
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
注意: もしあなたのSambaがバイナリパッケージからインストールされたなら、ntlm_auth は/usr/local/bin/ntlm_auth ではなく /usr/bin/ntlm_auth にある事でしょう。 その場合、上記の設定の該当箇所を書き直してください。

・ACLのエントリに認証を使うように追加します

acl AuthorizedUsers proxy_auth REQUIRED
..
http_access allow all AuthorizedUsers

認証のテスト:

・IEでテストした場合:
IEによってSquidにアクセスした場合、ログインの為のポップアップが現れることなくログインされる事でしょう。  きちんと認証が行われたどうかはaccess.logを確認してください。 domain\username は実在する必要があります。
・Netscape, mozilla, opera..等:
IE以外のブラウザでは、ユーザのパスワードを入力させるダイアログがポップアップしてきます。
ユーザ名はには "domain+username" の形式("+"はsmb.conf で指定したドメインセパレータです)を入力します。

ユーザー名がaccess.logに記録されなかったり、ポップアップが出てこない場合には、squid.conf の acl/http_access部分に誤りがあります。

23.6 リバースプロキシやアクセラレータで認証機能が使えません。

リバースプロキシや、アクセラレータのように他のIPアドレス宛のパケットを取り込んで処理するする場合、Squidの認証機構は機能しません。 本来、認証はソースサーバ(オリジナルWebサーバ)側で行うべきと考えられます。
しかし、どうしてもリバースプロキシやアクセラレータ側で認証を行わせたい場合には、Squidをコンパイルする際に、src/Makefile中で、「 DEFS = 」の行で「 -DAUTH_ON_ACCELERATION 」をコンパイルオプションに与えることで可能になります。 この設定について詳しくはこちらをご覧ください。