【LDAP】LDAP障害時、ローカルアカウントを利用する方法(PAM)


Warning: getimagesize(http://images.amazon.com/images/P/4798018007.09.THUMBZZZ.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/blog/wp-content/plugins/simple-amazon/include/sa_generate_html_class.php on line 137
Linuxのユーザ認証にLDAPを利用する場合の注意点を紹介します。
※設定方法等の詳細については今回は割愛します。
通常Linuxのアカウント認証にLDAPを利用する場合、PAMを経由して認証させるかと思います。
その時、LDAPサーバになんらかの障害が発生し、LDAPサービスを利用出来なくなった場合、
そのサービスを受けているクライアントサーバでは、ローカルユーザでのログインすら出来なくなります。
そこで、LDAPサービスを利用出来ない状況の場合は、即座にLDAP認証を諦め、ローカルアカウント認証に切り替える設定方法を紹介します。
なお、本記事は、nss_ldap, nsswitch, authconfigを利用している場合の話になります。
PAMの設定ファイルを誤って設定してしまうと、次回からログインすら出来なくなる可能性がありますので細心の注意を払って設定に臨んでください。また、作業する際は、設定後に接続確認を行うまで、現在利用しているターミナルを切断しないでください。
設定直後の各種設定ファイル
通常、ローカルユーザ認証をLDAPを利用するように設定した場合、各設定ファイルは次のようになるかと思います。
/etc/pam.d/system-auth
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth sufficient pam_ldap.so use_first_pass auth required pam_deny.so account required pam_unix.so broken_shadow account sufficient pam_succeed_if.so uid < 500 quiet account [default=bad success=ok user_unknown=ignore] pam_ldap.so account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password sufficient pam_ldap.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session optional pam_ldap.so
ここで注目すべきは12行目の「account」のpam_ldap.soを利用している部分です。
LDAPサーバを利用出来ない場面では、最終的に「default」で指定した「bad」に該当してしまいます。
そのため、最終的に、ローカルアカウント認証を行なう前に、「bad」として終了していまうのです。
/etc/ldap.conf
: # Bind/connect timelimit #bind_timelimit 30 bind_timelimit 120 # Reconnect policy: hard (default) will retry connecting to # the software with exponential backoff, soft will fail # immediately. #bind_policy hard # Idle timelimit; client will close connections # (nss_ldap only) if the server has not been contacted # for the number of seconds specified below. #idle_timelimit 3600 idle_timelimit 3600 :
またこちらの9行目「bind_policy」はコメントアウトされていますが、デフォルトの設定は「hard」です。
この項目は、LDAPの再接続のポリシーを設定します。
「hard」の場合は、LDAPサーバへ接続出来る状態になるまで再試行を繰り返します(正確には2分くらいでタイムアウトします)
「soft」の場合は、LDAPサーバへ接続出来ない場合は、即座に諦め、次へ進みます。
ですので、デフォルトのままでは、LDAPサーバに障害が発生した場合、LDAP接続を諦めるまでに長い間再接続を試みる事になります。
オススメ設定
/etc/pam.d/system-auth
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth sufficient pam_ldap.so use_first_pass auth required pam_deny.so account required pam_unix.so broken_shadow account sufficient pam_succeed_if.so uid < 500 quiet account [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] pam_ldap.so account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password sufficient pam_ldap.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session optional pam_ldap.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
注目すべきは先ほどと同じく、12行目の「account」の行です。
先ほどのコントローラ「default」「success」「user_unknown」に加え、「service_err」「system_err」「authinfo_unavail」のコントローラを追加しています。
いずれもignoreに設定し、マッチした場合は、この項目を飛ばして次に行きます。
/etc/ldap.conf
: # Bind/connect timelimit #bind_timelimit 30 bind_timelimit 120 # Reconnect policy: hard (default) will retry connecting to # the software with exponential backoff, soft will fail # immediately. #bind_policy hard bind_policy soft # Idle timelimit; client will close connections # (nss_ldap only) if the server has not been contacted # for the number of seconds specified below. #idle_timelimit 3600 idle_timelimit 3600 :
「bind_policy」を「soft」に設定しています。
先ほど説明したように「soft」にする事で、接続に失敗したら、即座に再接続を諦めます。
これらの設定をする事により、LDAPサーバに障害が発生した場合は、ローカルアカウントではログイン出来るようにすることが出来ます。
実際に利用する場合は、まずテスト環境を構築して試してみてくださいね。
でわでわ☆
Comment from 名無しのkopug
2011年3月13日 at 23:00
今試してみたけど、bind_policy hardでも問題なくできた。
あと ldap.conf に uriを複数指定したほうがいいかと。
(レプリカがある前提だけど)