Centos 7 と次のパッケージをインストールしました:
[root@centos7 pam.d]# rpm -qa|grep ldap
nss-pam-ldapd-0.8.13-8.el7.x86_64
openldap-2.4.44-5.el7.x86_64
openldap-clients-2.4.44-5.el7.x86_64
私の設定:
/etc/nslcd.conf:
uid nslcd
gid ldap
uri ldap://<my_ldap_server_ip>
base dc=company,dc=org
binddn cn=proxy,ou=users,dc=company,dc=org
bindpw <bind_pw>
nss_initgroups_ignoreusers root,nslcd
nss_min_uid 10000
filter passwd (objectClass=posixAccount)
base passwd ou=users,dc=company,dc=org
base shadow ou=users,dc=company,dc=org
base group ou=groups,dc=company,dc=org
scope passwd one
scope shadow one
scope group one
map group member uniqueMember
ssl start_tls
TLS_REQCERT allow
tls_cacertdir /etc/openldap/cacerts
/etc/nsswitch:
. . .
passwd: files sss ldap
shadow: files sss ldap
group: files sss ldap
. . .
/etc/pam.d/:
[root@centos7 pam.d]# ls -lah password-auth system-auth
lrwxrwxrwx. 1 root root 16 Aug 22 18:53 password-auth -> password-auth-ac
lrwxrwxrwx. 1 root root 14 Aug 22 18:53 system-auth -> system-auth-ac
/etc/pam.d/パスワード認証:
#%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 required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password required pam_deny.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
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 optional pam_systemd.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
password required pam_deny.so
/etc/システム認証:
#%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 required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password required pam_deny.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
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 optional pam_systemd.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
password required pam_deny.so
「su - ldapuser」を実行しているときに入力しました。
しかし、ssh/コンソールからはログインできません。
nslcd -d:
nslcd: [e2a9e3] DEBUG: connection from pid=4867 uid=0 gid=0
nslcd: [e2a9e3] <passwd="ldapuser"> DEBUG: myldap_search(base="ou=users,dc=company,dc=org", filter="(&(objectClass=posixAccount)(uid=ldapuser))")
nslcd: [e2a9e3] <passwd="ldapuser"> DEBUG: ldap_result(): cn=ldapuser,ou=users,dc=company,dc=org
nslcd: [e2a9e3] <passwd="ldapuser"> DEBUG: ldap_result(): end of results (1 total)
nslcd: [45e146] DEBUG: connection from pid=4867 uid=0 gid=0
nslcd: [45e146] <passwd="ldapuser"> DEBUG: myldap_search(base="ou=users,dc=company,dc=org", filter="(&(objectClass=posixAccount)(uid=ldapuser))")
nslcd: [45e146] <passwd="ldapuser"> DEBUG: ldap_result(): cn=ldapuser,ou=users,dc=company,dc=org
nslcd: [45e146] <passwd="ldapuser"> DEBUG: ldap_result(): end of results (1 total)
nslcd: [5f007c] DEBUG: connection from pid=4867 uid=0 gid=0
nslcd: [5f007c] <passwd="ldapuser"> DEBUG: myldap_search(base="ou=users,dc=company,dc=org", filter="(&(objectClass=posixAccount)(uid=ldapuser))")
nslcd: [5f007c] <passwd="ldapuser"> DEBUG: ldap_result(): cn=ldapuser,ou=users,dc=company,dc=org
nslcd: [5f007c] <passwd="ldapuser"> DEBUG: ldap_result(): end of results (1 total)
nslcd: [d062c2] DEBUG: connection from pid=4867 uid=0 gid=0
nslcd: [d062c2] <passwd="ldapuser"> DEBUG: myldap_search(base="ou=users,dc=company,dc=org", filter="(&(objectClass=posixAccount)(uid=ldapuser))")
nslcd: [d062c2] <passwd="ldapuser"> DEBUG: ldap_result(): cn=ldapuser,ou=users,dc=company,dc=org
nslcd: [d062c2] <passwd="ldapuser"> DEBUG: ldap_result(): end of results (1 total)
nslcd: [200854] DEBUG: connection from pid=4867 uid=0 gid=0
nslcd: [200854] <authc="ldapuser"> DEBUG: nslcd_pam_authc("ldapuser","sshd","***")
nslcd: [200854] <authc="ldapuser"> DEBUG: myldap_search(base="ou=users,dc=company,dc=org", filter="(&(objectClass=posixAccount)(uid=ldapuser))")
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_result(): cn=ldapuser,ou=users,dc=company,dc=org
nslcd: [200854] <authc="ldapuser"> DEBUG: myldap_search(base="cn=ldapuser,ou=users,dc=company,dc=org", filter="(objectClass=*)")
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_initialize(ldap://<my_ldap_server_ip>)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_set_rebind_proc()
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_set_option(LDAP_OPT_PROTOCOL_VERSION,3)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_set_option(LDAP_OPT_DEREF,0)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_set_option(LDAP_OPT_TIMELIMIT,30)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_set_option(LDAP_OPT_TIMEOUT,30)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_set_option(LDAP_OPT_NETWORK_TIMEOUT,30)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_set_option(LDAP_OPT_REFERRALS,LDAP_OPT_ON)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_set_option(LDAP_OPT_RESTART,LDAP_OPT_ON)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_start_tls_s()
nslcd: [200854] <authc="ldapuser"> DEBUG: set_socket_timeout(30,500000)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_simple_bind_s("cn=ldapuser,ou=users,dc=company,dc=org","***") (uri="ldap://<my_ldap_server_ip>")
nslcd: [200854] <authc="ldapuser"> ldap_result() failed: No such object
nslcd: [200854] <authc="ldapuser"> cn=ldapuser,ou=users,dc=company,dc=org: lookup failed: No such object
nslcd: [200854] <authc="ldapuser"> DEBUG: set_socket_timeout(15,0)
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_unbind()
nslcd: [200854] <authc="ldapuser"> DEBUG: myldap_search(base="ou=users,dc=company,dc=org", filter="(&(objectClass=shadowAccount)(uid=ldapuser))")
nslcd: [200854] <authc="ldapuser"> DEBUG: ldap_result(): end of results (0 total)
ジャーナルctl -xlf:
Feb 20 20:37:24 centos7.localdomain sshd[4965]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.56.1 user=ldapuser
Feb 20 20:37:24 centos7.localdomain sshd[4965]: pam_ldap(sshd:auth): Authentication failure; user=ldapuser
Feb 20 20:37:26 centos7.localdomain sshd[4965]: Failed password for goncharuk from 192.168.56.1 port 56663 ssh2
追記:このリンクを表示するのを忘れました: このトピックを読みましたが、役に立ちませんでした:
答え1
ついに問題は解決しました。
具体的な手順の前に、いくつか簡単な手順を説明します。LDAP ログイン手順は次の手順に従うことをご存知の方は多いでしょう。
認証:
- LDAP サーバーに接続しています。
- 「検索ユーザー」として「バインド」します。
- 必要なユーザーを検索しています。
- 対応するパスワードを使用して、手順 3 のユーザーとして「バインド」します。
承認:
- 必要な属性を検索しています。
- ログイン
ステップ 3 でログインが正しくない場合は、「ユーザーが見つかりません」というメッセージが表示されます。
ステップ 4 のパスワードが正しくない場合は、「資格情報が無効です」というメッセージが表示されます。
実際、NSLCD はこれらすべてのステップを実行します。
NSLCD のステップ 4 には、セキュリティ上の理由による改善が 1 つあります。見つかったユーザーとして 'bind' した後、NSLCD は 'DN' をベースとしてユーザー 'DN' を検索し、この 'DN' が実際に 'bind' したユーザーの 'DN' であることを確認します。たとえば ('ldapsearch' 要求):
ldapsearch -w <user_passwd> -h <ldap_server_ip> -D "cn=ldapuser,ou=users,dc=company,dc=org" -b "cn=ldapuser,ou=users,dc=company,dc=org"
この動作は、少なくとも次のソースで nss-pam-ldapd の作成者によって説明されています。
これは、NSLCD 経由でログインしたいユーザーは、自身の LDAP 'DN' で検索権限を持っている必要があることを意味します。
NSLCD バージョン 0.9.x より前では、この動作は変更できませんでした。
0.9.x以降のNSLCDバージョンでは、以下の方法で自身の「DN」で検索をスキップすることが可能です。'pam_authc_search なし'オプション。
私の場合、「pam_authc_search NONE」を使用すると本当に助かります。ただし、新しいバージョンの「nss-pam-ldapd」パッケージをビルドしてインストールする必要があります。現在、Centos 7 の VM で LDAP ログインをテストしています。少なくとも 5 つの異なるディストリビューションがあり、それぞれにパッケージをビルドするのは良い解決策ではありません。さらに、2 段階のログイン チェック (バインド + 検索) は、本当に必要なセキュリティ ツールです。そこで、LDAP サーバー (OpenLDAP 2.4) の ACL を変更して、独自の「DN」のユーザーに対するグランド検索アクセスを許可したところ、すべて正常に動作するようになりました。
/etc/openldap/slapd.conf:
. . .
access to attrs=userPassword
by self read
by anonymous auth
by * none
access to *
by self read
by dn="cn=searchuser,ou=users,dc=company,dc=org" read
by * none
. . .