UNIXのPAM認証をする

RubyプログラムからUNIXのログインIDとパスワードで認証したい。

昔話

昔のUNIXは/etc/passwdファイルにログインIDも
パスワードも入っているものだったので、

# UNIX のログイン認証
require 'etc'

def valid_login?(user, password)
  ent = Etc.getpwnam(user)
  password.crypt(ent.passwd) == ent.passwd
end

p valid_login?("taro", "password")   # => 真偽値が得られる

※ 上記はRubyの公式リファレンス(Stringの部分)からの引用です。

これはさすがにもう使えなくて、今はUNIXは/etc/shadowファイルに
設定が入っていて、PAMのAPIを叩かないと使えません。
しかし、UNIXには、/sbin/unix_chkpwdをいうコマンドがあり、
このコマンドでPAM経由の認証だけはできます。
ちなみに、そのまま実行すると、

% /sbin/unix_chkpwd 
This binary is not designed for running in this way
-- the system administrator has been informed

こんな感じで怒られます。
これを使ってPAM認証するのに便利な
rpam, rpam-ruby19というのを発見しました。
ちなみに、Macだとどうやったらいいのかわかりません。
pam_unixじゃなくて、独自のPAMなんでしょうね。
 
debian squeezeだと仮定して、

apt-get install libpam0g-dev
gem install rpam-ruby19
adduser fujioka shadow

を実行します。shadowグループに
実行するユーザーを入れないとだめなようです。

irb(main):002:0> require 'rpam'
=> true
irb(main):003:0> Rpam.auth("fujioka","invalidpassword")
=> false
irb(main):004:0> Rpam.auth("fujioka","validpassword")
=> true

Rpamの中身をみたら、認証以外の機能は一切ありませんでした。orz