普段は PostgreSQL 内にパスワードを保存する、password (md5) な認証方式を使うのですが、必要なスタッフ分のパスワードをサーバ構築ごとに設定するのも面倒なため、認証をまとめられないかな、と思って調べてみました。
うちの環境では Kerberos は使っていないのでこれはパス。
LDAP は利用しているので、これが楽かなあ、と思いつつ、ネットワーク上のほかのサーバに依存する、というのは DB 用の環境としてはちょっと避けたいのでこれも一旦パス。
ということで、PAM で行ってみることにしました。
PAM を使う設定は簡単で、pg_hba.conf に
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host all kuriyama 192.168.0.0/24 pam
と記述し、/etc/pam.d/postgresql (FreeBSD の場合) に
auth required pam_unix.so no_warn try_first_pass
と記述したものを新規に作成します。
これで OK、と思ったのですが、認証用のプロンプト(PAM経由)は出てくるものの、正しいパスワードを入れても
pam_authenticate failed: authentication error
というエラーになってしまいます。おかしいなあ、と思い、PostgreSQL のソースコードの PAM まわりの手順を確認して、問題なさそうと思いつつ簡単なテストコードを書いて、他の PAM 利用ツールと比較してみたりしました。
手順は特に問題なさそう。
ふとそのテストコードを root 権限で試してみると、こちらは認証が成功します!
そりゃそうだ。PAM は pluggable な共有ライブラリとして存在しているので、ライブラリのコードが実行されるのは、呼び出す側のプログラムの実行権限に依存します。そして pam_unix.so の認証は、getpwent(3) を使うので、root 権限ではパスワードハッシュが取得できるけどそれ以外の権限ではその部分が空の struct passwd 構造体しか返ってこない。PostgreSQL のデーモンも、専用のユーザー権限で動いているので、pam_unix.so の認証は必ず失敗する、ということでした。
試しに別の PAM 認証 (pam_ssh.so など) を試したところ、こちらではうまく認証されました。が、ちょっとこれだと今回の私の目的とは合わないのでパス。
というわけで、PostgreSQL の PAM 認証は私の用途では使えない、ということのようです。うーむ、何か他に手はないかなあ。
ちなみに、参考にした su(1), login(1) などは、root 権限に setuid されているので、問題なく pam_unix.so を使うことができるようになっています。

コメントする