OpenLDAPを認証に使っているが一部のユーザーはActive Directory(以降、AD)に問い合わせて認証を行いたいケースが出てきたので、OpenLDAPのPass-Through認証について調べてみた。
前提となる環境
- CentOS 6.7 (64bit)
- OpenLDAP 2.4.40 ※yumでインストール
方式
OpenLDAPでは認証処理をSASLに委譲できるとのこと。SASLはSimple Authentication and Security Layeの略で、認証のフレームワークの1つ。CentOSだとsaslauthd
というデーモンサービスを起動し、こいつに認証を任せることができる。
さらに、このSASLの中で外部のADなどのLDAPサーバーに対して認証をさらに委譲することができるようになっている。
つまり、OpenLDAP --> SASL --> AD という経路でPass-Through認証が実現できる。
設定方法
saslauthdの設定
yumでサクッとインストール。
yum install cyrus-sasl cyrus-sasl-ldap
/etc/sysconfig/saslauthd
を開きsaslauthd
の起動オプションを設定する。SASLでLDAP認証を使うように設定する。
MECH=ldap
FLAGS="-r"
/etc/saslauthd.conf
を新規に作成し、ADへの接続設定を行う。ldap_filter
の内容はAD側ではどの属性を認証IDとするかによって変わってくる。
ldap_servers: ldap://yourad.org
ldap_search_base: dc=yourad,dc=org
ldap_filter: (cn=%u)
ldap_bind_dn: cn=Manager,ou=users,dc=yourad,dc=org
ldap_password: secret
設定後、saslauthd
の自動起動を有効にしつつ起動。
chkconfig saslauthd on
service saslauthd start
saslauthdのテスト
saslauthd
経由でADに認証できるかtestsaslauthd
コマンドを使って試すことができる。設定が正しければADのアカウントで処理成功となるので確認しておく。
testsaslauthd -u foo -p mypass
0: OK "Success."
SASLの設定
/etc/sasl2/slapd.conf
を新規に作成し、OpenLDAPの認証をsaslauthd
に任せるようにする。
mech_list: plain
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
設定後、OpenLDAPを再起動する。
service slapd restart
Pass-Through を行うユーザーの登録
OpenLDAPに下記のようなLDIFを作成してユーザーを登録する。
ポイントは userpassword: {SASL}foo
の部分。こうすると、このユーザーでbindしようとするとSASLを利用してsaslauthd
経由でADにfoo
で検索され、AD側でbindされるようになる。この時使われる検索フィルタが先のldap_filter: (cn=%u)
の設定になる。この例だと、cn=foo
でADを検索して存在すればAD側でbindが行われることになる。
dn: cn=foo,ou=users,dc=example,dc=com
objectclass: inetorgperson
cn: foo
userpassword: {SASL}foo
givenname: foo
sn: somebodyson
mail: foo@example.com
実行
ldapwhoami
コマンドで試す。-w mypass
のパスワードはADに格納されているパスワードだが、Pass-Through認証が行われてAD側で処理され結果が返ってきている。
ldapwhoami -x -D cn=foo,ou=users,dc=example,dc=com -w mypass
dn:cn=foo,ou=users,dc=example,dc=com