Posted at

Squid3でgetpwnam(サーバのユーザアカウント)認証を設定する

必要なくなったのですが、折角調べて試したのでメモしておきます。


環境

Ubuntu 16.04.6 LTS (Xenial Xerus)

squid 3.5.12


やり方

全てここに書いてあります。

ではなんなので、読んでいきます。


auth_paramディレクティブ


You tell Squid which authentication helper program to use with the auth_param directive in squid.conf. Specify the name of the program, plus any command line options if necessary.


とあるので、auth_paramディレクティブについて見てみましょう。


format: auth_param scheme parameter [setting]


ということで、scheme, parameterは"Suggested Config"のところに挙げられています。では例えばschemeを"basic"にしてparameterを"program"にしたとき、つまり


auth_param basic program <complete this line>


の"<complete this line>"はどうすればいいのか。

そのヒントはここにあります。Basic認証で、今回はサーバのユーザアカウント認証にすることにしたので(これは後々面倒になるのですが)ここを見ることになります。

どうやら"basic_getpwnam_auth"というコマンドで、引数は特に要らないようです。しかしバイナリはどこにあるのか。

これはおそらくインストール方法によって異なるでしょう。本記事の環境では/usr/lib/squid/basic_getpwnam_authにありました。

以上から

auth_param basic program /usr/lib/squid/basic_getpwnam_auth

でよさそうです。


getpwnamのケア

次に進む前に


Make sure that your authentication program is installed and working correctly. You can test it by hand.


と書いてあるので試してみましょう。いやちょっと待って。どうやって使うの。


When Squid starts, it spawns a number of authentication subprocesses. These processes read user credentials on stdin, and reply with "OK" or "ERR" on stdout.


とは書いてあるけど、標準入力に何を入れればいいの。

それはここに書いてあります。Basic認証なのでここの通り、アカウント名とパスワードを書けば良さそうです。では早速。

$ /usr/lib/squid/basic_getpwnam_auth

testuser testpassword
ERR Wrong password

ええなんで……。

これはgetpwnamだからです。パスワードファイルはrootしか読み取りできないのです。こうしてみましょう。

# /usr/lib/squid/basic_getpwnam_auth

testuser testpassword
OK

一件落着! とはなりませんね。squidをrootで動かしませんからね。basic_getpwnam_authのmanページには以下のようにあります。


When used for authenticating to local UNIX shadow password databases the program must be running as root or else it won’t have sufficient permissions to access the user password database. Such use of this program is not recommended, but if you absolutely need to then make the program setuid root

chown root basic_getpwnam_auth

chmod u+s basic_getpwnam_auth


これはまずいですね。basic_getpwnam_authを実行できるユーザなら誰でも総当たり攻撃ができてしまいますからね。代替案としてsudoを使うことを考えてみました。


basic_getpwnam_auth_wrapper.sh

#! /bin/sh

sudo /usr/lib/squid/basic_getpwnam_auth

で、認証用子プロセスのユーザがbasic_getpwnam_authをパスワード無しでrootとして実行できればよいです。sudoersの出番ですね。sudoersの書き方はこちらの記事が参考になりました。/etc/sudoers.d/以下にファイルを作って書くのがナウいらしいのでそうしましょう。

# visudo -f /etc/sudoers.d/basic_getpwnam_auth

proxy ALL=(root) NOPASSWD: /usr/lib/squid/basic_getpwnam_auth

ご覧のとおり、認証用子プロセスのユーザは本環境ではsquidではなくproxyでした。これでハマりました。

ともあれ、auth_paramディレクティブを以下のように修正して完了です。

auth_param basic program /path/to/basic_getpwnam_auth_wrapper.sh


認可

認証だけ設定したのでは話になりません。


Users will be authenticated if squid is configured to use proxy_auth ACLs.


ということでそのように設定しましょう。これは例をそのままやってみればよいでしょう。


acl foo proxy_auth REQUIRED

http_access allow foo

http_access deny all


これで認証できた者は誰でも、そして認証できた者だけがsquidを使えます。他の条件がいい場合はここを見て考えてください(丸投げ)。


終わりに

squidでの認証について色々調べて試しました。結局使うのをやめたのですが、折角なのでこうしてまとめました。