PAM (Pluggable Authentication Modules)認証で、pam_ldap.so モジュールを使用するとき、LDAPに接続できないと、長いこと待たされる。LDAP側で管理しているユーザではなく、shadowファイルなどで認証チェックがOKとなっても、2分くらい待たされる。なんでじゃ。
PAMのsystem-authはこんな感じ。
#%PAM-1.0 auth required /lib/security/pam_env.so auth sufficient /lib/security/pam_unix.so likeauth nullok auth sufficient /lib/security/pam_ldap.so use_first_pass auth required /lib/security/pam_deny.so
account required /lib/security/pam_unix.so broken_shadow account [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] /lib/security/pam_ldap.so account required /lib/security/pam_permit.so
password required /lib/security/pam_cracklib.so retry=3 type= password sufficient /lib/security/pam_unix.so nullok use_authtok md5 shadow password sufficient /lib/security/pam_ldap.so use_authtok password required /lib/security/pam_deny.so
session required /lib/security/pam_limits.so session required /lib/security/pam_unix.so session optional /lib/security/pam_ldap.so
ついでに、nsswitch.confも。
passwd: files ldap shadow: files ldap group: files ldap
まあ、よくある基本的なLDAP認証の設定です。これで、LDAPに登録したアカウントでの認証もできるし、無論LDAPに登録していない元からのアカウントでの認証もできる。つまり、LDAPが落ちていても、shadowファイルとかに情報があれば、認証をパスできるわけです。
ところが、実際にLDAPを落として、SSHでログインを試みると、ログイン認証ごときに尋常じゃなく待たされる。ログ(/var/log/secure)を見てみたら、こんなことに!
sshd[29791]: Accepted password for plab from xxx port 3496 ssh2 sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 4 seconds)... sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 8 seconds)... sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 16 seconds)... sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 32 seconds)... sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 64 seconds)... sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server sshd[29793]: nss_ldap: could not search LDAP server - Server is unavailable
どうやら認証処理うんぬんではなく、LDAPサーバに接続できるまで、時間を置きながら最大5回までチャレンジしているため、時間がかかりまくっているみたい。何らかの原因でLDAPサービスが落ちたとき、復旧でSSH接続しようとしたら2分かかりました、ってのはキツイ。もうちょっと空気読もうよ、nss_ldapさんっ!
実際、LDAPサービスの死活を判断するのに、トータル124秒も待って5回も再接続を試みる必要があるケースは少ないと思う。同じネットワークエリア内にドメインコントローラを置いたりするなら、これは大げさすぎるんじゃないか、と。
ということで、nss_ldapの再試行回数やタイムアウト時間を変更する方法。
続きを読む "nss_ldap の接続タイムアウトを変える"