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

categories IT関連, Linux/Unix, サーバ技術 | Tags: , , , | scot_exist | datetime 2011年1月29日 15:22 | Comments (1) | Save & Share

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サーバに障害が発生した場合は、ローカルアカウントではログイン出来るようにすることが出来ます。
実際に利用する場合は、まずテスト環境を構築して試してみてくださいね。

でわでわ☆

入門LDAP/OpenLDAPディレクトリサービス導入・運用ガイド

ページTOPへ

1件のコメント

Comment from 名無しのkopug datetime 2011年3月13日 at 23:00

今試してみたけど、bind_policy hardでも問題なくできた。
あと ldap.conf に uriを複数指定したほうがいいかと。
(レプリカがある前提だけど)