PAM を使って Active Directory で認証する方法
2008/03/09 | ラベル: Linux, Tips |PAM を使った自作アプリ(C/C++)で、ユーザの認証を Active Directory で行う方法を紹介。
C/C++アプリのコーディングでは、Active Directory を意識する必要はなく、単に PAM に問い合わせるだけ。認証方法に依存しちゃったら PAM を使う意味ないしね。ここでは PAM ライブラリを用いたコーディングについては触れません。
アプリのプラットフォームは Linux 。今回は、ユーザの認証だけができればよく、Linuxシステム上にアカウントは存在しなくてよい。というより作りたくない。
手順はたかはしもとのぶ氏の Linux の認証を Active Directory で行なう方法 の通りでOK。また、Windows ActiveDirectory を利用した Linux ログイン認証環境構築時のメモ は Windows と Linux の認証の統合の方法についてよくまとまっている。
手順
- PAM、Kerberos といった必要なライブラリをインストールする。RHEL4 ではデフォルトで入るかな?
- /etc/krb5.conf を設定する。
- /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++ アプリで認証ができるか確認する。
ふと気になったこと
- Active Directory 側のユーザアカウントが無効、パスワード切れ、パスワード切れ間近、ログイン不可時間帯とかの場合は認証はどうなるんだろう?PAM の設定で auth だけでなく account も必要かも。要確認。
(2008.4.30追記) - account はなくても OK。
- アカウントが無効、ログオン可能時間帯以外(ログオン拒否時間帯)の場合は認証エラーとなる。Clients credentials have been revoked.
- パスワード有効期限切れの場合は、エラーにはならず認証が通る。
- 次回ログオン時にパスワード変更が必要である状態の場合は認証エラー。KDC has no support for encryption type.
- 対話型ログオンにスマートカードが必要とされている場合は認証エラー。KDC policy rejects request.
- 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 } }