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