CentOS 7에서 LDAP 인증


11

CentOS 7로 업그레이드 한 후에는 더 이상 LDAP를 통해 로그인 할 수 없습니다. CentOS 6에서는 잘 작동하는 pam_ldap 패키지를 사용 했지만 이제는 CentOS의 새 버전에서 pam_ldap을 더 이상 사용할 수 없습니다.

ldapsearch 를 통한 연결은 여전히 잘 작동하지만 ssh를 통한 인증은 작동하지 않습니다.

nss-pam-ldapd 패키지를 다시 설치하고 authconfig-tui 를 통해 인증을 재구성 했지만 여전히 작동하지 않습니다.

나는 내 이름 대신 아래 user.name 과 함께 기본 DC = 서브, DC = 예, DC = 조직을 .

호스트 OS는 CentOS 7입니다. 현재 사용 가능한 모든 업데이트가 설치되었습니다.

$ uname -a
Linux isfet 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

설치된 패키지

$ rpm -qa | grep -i ldap
openldap-2.4.39-3.el7.x86_64
nss-pam-ldapd-0.8.13-8.el7.x86_64
openldap-clients-2.4.39-3.el7.x86_64

/etc/openldap/ldap.conf의 내용

URI ldap://172.16.64.25
BASE dc=sub,dc=example,dc=org

/etc/nslcd.conf의 내용

ldap_version 3
uri ldap://172.16.64.25
base dc=sub,dc=example,dc=org
ssl no

/ var / log / secure의 출력

Oct  6 12:12:16 isfet sshd[3937]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=172.16.64.1  user=user.name
Oct  6 12:12:17 isfet sshd[3937]: Failed password for user.name from 172.16.64.1 port 18877 ssh2

/var/log/audit/audit.log 출력

type=USER_AUTH msg=audit(1412590243.286:364): pid=3912 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:authentication acct="user.name" exe="/usr/sbin/sshd" hostname=172.16.64.1 addr=172.16.64.1 terminal=ssh res=failed'
type=USER_AUTH msg=audit(1412590243.287:365): pid=3912 uid=0 auid=4294967295 ses=4294967295 msg='op=password acct="user.name" exe="/usr/sbin/sshd" hostname=? addr=172.16.64.1 terminal=ssh res=failed'

ldapserach 명령의 출력

$ ldapsearch -H ldap://172.16.64.25/ -D cn=Manager,dc=sub,dc=example,dc=org -W -x -b dc=sub,dc=example,dc=org -d1

ldap_url_parse_ext(ldap://172.16.64.25/)
ldap_create
ldap_url_parse_ext(ldap://172.16.64.25:389/??base)
Enter LDAP Password:
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP 172.16.64.25:389
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 172.16.64.25:389
ldap_pvt_connect: fd: 3 tm: -1 async: 0
attempting to connect:
connect success
ldap_open_defconn: successful
ldap_send_server_request
ber_scanf fmt ({it) ber:
ber_scanf fmt ({i) ber:
ber_flush2: 61 bytes to sd 3
ldap_result ld 0x7f9b07402110 msgid 1
wait4msg ld 0x7f9b07402110 msgid 1 (infinite timeout)
wait4msg continue ld 0x7f9b07402110 msgid 1 all 1
** ld 0x7f9b07402110 Connections:
* host: 172.16.64.25  port: 389  (default)
  refcnt: 2  status: Connected
  last used: Mon Oct  6 12:04:38 2014


** ld 0x7f9b07402110 Outstanding Requests:
 * msgid 1,  origid 1, status InProgress
   outstanding referrals 0, parent count 0
  ld 0x7f9b07402110 request count 1 (abandoned 0)
** ld 0x7f9b07402110 Response Queue:
   Empty
  ld 0x7f9b07402110 response count 0
ldap_chkResponseList ld 0x7f9b07402110 msgid 1 all 1
ldap_chkResponseList returns ld 0x7f9b07402110 NULL
ldap_int_select
read1msg: ld 0x7f9b07402110 msgid 1 all 1
ber_get_next
ber_get_next: tag 0x30 len 50 contents:
read1msg: ld 0x7f9b07402110 msgid 1 message type bind
ber_scanf fmt ({eAA) ber:
read1msg: ld 0x7f9b07402110 0 new referrals
read1msg:  mark request completed, ld 0x7f9b07402110 msgid 1
request done: ld 0x7f9b07402110 msgid 1
res_errno: 0, res_error: <>, res_matched: <cn=Manager,dc=sub,dc=example,dc=org>
ldap_free_request (origid 1, msgid 1)
ldap_parse_result
ber_scanf fmt ({iAA) ber:
ber_scanf fmt (}) ber:
ldap_msgfree
ldap_err2string
ldap_bind: Success (0)
        matched DN: cn=Manager,dc=sub,dc=example,dc=org
...

_ / etc / pam.d / password-auth의 내용

auth        required      pam_env.so
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    requisite     pam_pwquality.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 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

_ / etc / pam.d / system-auth의 내용

auth        required      pam_env.so
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    requisite     pam_pwquality.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 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

"getent passwd user.name"또는 "su-user.name"을 실행 한 결과가 있습니까?
Andy

사용자는 로컬로 존재하지만 비밀번호는 없습니다. 인증은 LDAP에 대한 것입니다. / etc / passwd : user.name:x:1028:1031::/home/user.name:/bin/bash / etc / shadow : user.name : !! : 16348 : 0 : 99999 : 7 :::
Lukas Schulze

? pam_ldap와 다른 파일을 사용 하지 /etc/openldap/ldap.conf않습니까? 나는 말하고 싶다 /etc/ldap.conf. debug추가 로깅 verbosiry, 즉 옵션을 추가 하여 모듈을 디버깅하려고합니다 auth sufficient pam_ldap.so use_first_pass debug. 이 외에도 Joffrey의 조언에 따라 그 질문이 혼란스러워 졌다고 생각합니다. 다른 사람들이 당신을 도울 수있게하려면 원래 구성으로 되 돌리십시오.
Andrew B

의 내용을 추가 할 수 있습니까 /etc/ldap.conf?
Andrew B

감사합니다! 디버그 모드에서 nslcd를 실행하면 오류를 찾는 데 도움이되었습니다. 나는 그것을 답으로 썼다.
Lukas Schulze

답변:


4

디버그 모드에서 nslcd 를 실행 하면 문제가 표시됩니다.

$ $(which nslcd) -d
...
nslcd: [8b4567] <authc="user.name"> DEBUG: myldap_search(base="dc=sub,dc=example,dc=org", filter="(&(objectClass=posixAccount)(uid=user.name))")
...
nslcd: [8b4567] <authc="user.name"> DEBUG: ldap_result(): end of results (0 total)
nslcd: [8b4567] <authc="user.name"> DEBUG: "user.name": user not found: No such object
...

nslcd 는 기본적으로 필터를 설정합니다. 이 필터를 제거하거나 비워 둘 수 없습니다.

내 LDAP 사용자 중 posixAccount 라는 objectClass 가 없으므로 사용자를 찾을 수없고 로그인이 거부됩니다.

이 문제를 해결하려면이 필터를 자체 필터로 덮어 써야했습니다. uid를 찾고 있기 때문에 어쨌든 검색되는 속성에 필터를 설정하는 것이 유용합니다.

/etc/nslcd.conf 의 새로운 내용 :

filter passwd (uid=*)
uri ldap://172.16.64.25
base dc=sub,dc=example,dc=org
ssl no

nslcd.conf를 변경 한 후 서비스 nslcd를 다시 시작해야했습니다.systemctl restart nslcd

출처 : http://lists.arthurdejong.org/nss-pam-ldapd-users/2014/msg00025.html

.

CentOS 7의 _nss-pam-ldapd-0.8.13-8.el7.x86_64_에 문제가있는 것 같습니다!

$ nslcd -V
nss-pam-ldapd 0.8.13

CentOS 6에서 문제를 재현하려고 시도했지만이 nss-pam-ldapd에는 /etc/pam_ldap.conf에 구성 파일이 있고 작동 방식에 /etc/nslcd.conf를 사용하지 않는 pam_ldap에 대한 종속성 이 있습니다. CentOS 7에서.


1
네, pam_ldap이름 충돌은 매우 혼란 스럽습니다. :( 모두 해당 모듈 이름을 주장하는 여러 구현이 있습니다.
Andrew B
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.