PAM を使って Active Directory で認証する方法

2008/03/09 | ラベル: , | このエントリーを含むはてなブックマークを表示

PAM を使った自作アプリ(C/C++)で、ユーザの認証を Active Directory で行う方法を紹介。

C/C++アプリのコーディングでは、Active Directory を意識する必要はなく、単に PAM に問い合わせるだけ。認証方法に依存しちゃったら PAM を使う意味ないしね。ここでは PAM ライブラリを用いたコーディングについては触れません。

アプリのプラットフォームは Linux 。今回は、ユーザの認証だけができればよく、Linuxシステム上にアカウントは存在しなくてよい。というより作りたくない。

手順はたかはしもとのぶ氏の Linux の認証を Active Directory で行なう方法 の通りでOK。

また、Windows ActiveDirectory を利用した Linux ログイン認証環境構築時のメモ は Windows と Linux の認証の統合の方法についてよくまとまっている。

手順

  1. PAM、Kerberos といった必要なライブラリをインストールする。RHEL4 ではデフォルトで入るかな?
  2. /etc/krb5.conf を設定する。
  3. /etc/pam.d/hoge を作成する。"hoge" はC/C++アプリ側で指定する PAM の認証サービス名。

これだけ。

/etc/krb5.conf の設定

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = TEST.LOCAL
 default_tkt_enctypes = des-cbc-md5
 default_tgs_enctypes = des-cbc-md5
 dns_lookup_realm = false
 dns_lookup_kdc = false

[realms]
 TEST.LOCAL = {
  kdc = dc1.test.local:88
  admin_server = kerberos.example.com:749
  default_domain = test.local
 }

[domain_realm]
 .test.local = TEST.LOCAL
 test.local = TEST.LOCAL

[kdc]
 profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
 }

Active Directory 側で、Administrator のパスワードを一度も変更していない場合、kinit に失敗するので注意。

簡易テスト

ここで Active Directory で認証できるか簡易なテストをする。Active Directory 上に存在するユーザと同名のユーザを Linux 上にも作る。パスワードは未設定でよい。/etc/pam.d/system-auth の先頭エントリに次の1行を加える。

auth        sufficient    /lib/security/$ISA/pam_krb5.so

そのユーザで Linux にログインしてみる。成功すると、/var/log/messages に次のようなログが記録される。

Mar  5 16:39:02 localhost sshd: pam_krb5[22867]: authentication succeeds for 'test01' (test01@TEST.LOCAL)

テストが成功したら、/etc/pam.d/system-auth を元に戻し、Linux 上のユーザは削除しておく。

PAMサービスのコンフィグを書く

#%PAM-1.0
auth       required     /lib/security/pam_krb5.so no_user_check

認証のみでユーザが(ローカル)システムに存在するかチェックしなくてよいので、no_user_check オプションをつけること。

あとは C/C++ アプリで認証ができるか確認する。

ふと気になったこと

  1. Active Directory 側のユーザアカウントが無効、パスワード切れ、パスワード切れ間近、ログイン不可時間帯とかの場合は認証はどうなるんだろう?PAM の設定で auth だけでなく account も必要かも。要確認。
    (2008.4.30追記)
    1. account はなくても OK。
    2. アカウントが無効、ログオン可能時間帯以外(ログオン拒否時間帯)の場合は認証エラーとなる。Clients credentials have been revoked.
    3. パスワード有効期限切れの場合は、エラーにはならず認証が通る。
    4. 次回ログオン時にパスワード変更が必要である状態の場合は認証エラー。KDC has no support for encryption type.
    5. 対話型ログオンにスマートカードが必要とされている場合は認証エラー。KDC policy rejects request.
  2. kdc(=Active Directory)の冗長化はどう図ればよいのか。kdc は複数指定可能?
    ググってみたら kdc は複数指定可能みたい。

krb5.conf から引用。HP-UXのだけど、Linuxでも多分同じ。

[realms]
ATHENA.MIT.EDU = {
        kdc = KERBEROS.MIT.EDU
        kdc = KERBEROS-1.MIT.EDU:750
        kdc = KERBEROS-2.MIT.EDU:88
        admin_server = KERBEROS.MIT.EDU
        default_domain = MIT.EDU
        v4_instance_convert = {
                mit = mit.edu
                lithium = lithium.lcs.mit.edu
        }
}

0 コメント: