Centos 7 Autenticação LDAP (su funciona mas o login ssh / console não funciona)

1

Eu tenho o Centos 7 e os próximos pacotes instalados:

[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

Minhas configurações:

/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/password-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        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 / 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        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

Quando estou fazendo 'su-ldapuser' eu entrei.

Mas a partir do ssh / console não consigo fazer login.

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)

journalctl -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

UPD: Esqueci de mostrar este link: Eu li esses tópicos e eles não me ajudam:

centos-7-ldap-authentication-permission-denied

ldap-login-fails-but-su-para -ldap-users-works

    
por Yurij Goncharuk 20.02.2018 / 17:43

1 resposta

1

Finalmente, o problema foi resolvido.

Alguns breves passos antes do concreto. Alguém sabe que o procedimento de login LDAP seguiu estas etapas:

Autenticação:

  1. Conectando-se ao servidor LDAP.
  2. 'Vincular' como 'usuário de pesquisa'.
  3. Pesquisando o usuário necessário.
  4. 'Vinculando' como usuário da etapa 3 com a senha correspondente.

Autorização:

  1. Pesquisando os atributos necessários.
  2. Login

Se o login estiver incorreto no passo 3, a mensagem 'Usuário não encontrado' será produzida.

Se a senha na etapa 4 estiver incorreta, será exibida a mensagem "Credenciais inválidas".

De fato, o NSLCD faz todas essas etapas.

O passo 4 no NSLCD tem uma melhoria por motivos de segurança. Depois de 'binding' como usuário encontrado, o NSLCD tentando pesquisar no usuário 'DN' com base como 'DN' para garantir que este 'DN' seja realmente 'DN' de 'bind'-ing user. Por exemplo (solicitação '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"

Este comportamento foi descrito pelo autor do nss-pam-ldapd em pelo menos estas fontes:

número 1

número 2

Isso significa que o usuário que deseja estar conectado ao NSLCD deve ter permissões de pesquisa no próprio 'DN' do LDAP!

Nas versões NSLCD anteriores a 0.9.x, esse comportamento não era alterável.

Na versão do NSLCD que começa em 0.9.x, é possível pular a pesquisa no próprio 'DN' por meio da opção 'pam_authc_search NONE' .

No meu caso, usar 'pam_authc_search NONE' realmente me ajuda, mas é necessário compilar e instalar o pacote 'nss-pam-ldapd' com a nova versão. Agora, estou testando o login LDAP na VM com o Centos 7. Tenho pelo menos 5 distros diferentes e pacotes de construção para cada um não é uma boa solução. Além disso, as verificações de login de dois operadores (bind + search) realmente precisam de ferramentas de segurança. Então, eu mudei o ACL-s do servidor LDAP (OpenLDAP 2.4) para o acesso de pesquisa geral para usuários no próprio 'DN' e agora tudo funciona bem:

/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
. . .
    
por 26.02.2018 / 17:42

Tags