sssd e ldap

Voglio ora utilizzare il db ldap per effettuare l'autenticazione degli utenti su un sistema linux.
Ho quindi bisogno che nel db ci siano memorizzate tutte le informazioni necessarie e che le entry siano nella forma della objectClass posixAccount

Il mio db ha questa forma

+--> dc=merli,dc=lab (4)
+--> ou=group (1)
| ---> cn=utenti
+--> ou=People (3)
| ---> cn=Alligatore Verdolino

Il mio utente ha questi attributi (persino eccessivi)

# Entry 1: cn=Alligatore Verdolino,ou=People,dc=merli,dc=lab
dn: cn=Alligatore Verdolino,ou=People,dc=merli,dc=lab
cn: Alligatore Verdolino
displayname: Alligatore Verdolino
gidnumber: 10000
givenname: Alligatore
homedirectory: /home/averdolino
initials: AV
loginshell: /bin/bash
objectclass: sambaSamAccount
objectclass: shadowAccount
objectclass: posixAccount
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
sambaacctflags: [XU         ]
sambadomainname: merlilab
sambahomedrive: U:
sambantpassword: C466DDB6B2E3C8C8685524301B52E0F1
sambapwdlastset: 1369381885
sambasid: S-1-5-21-4036476082-4153129556-3089177936-21004
shadowinactive: 10
shadowlastchange: 15849
shadowmax: 365
shadowmin: 1
shadowwarning: 10
sn: Verdolino
uid: averdolino
uidnumber: 10002
userpassword: {SSHA}jKQTBWJ7ASuBseKeht86DKMp3nhmaDVK

Il gruppo ha questi attributi

# Entry 1: cn=utenti,ou=group,dc=merli,dc=lab
dn: cn=utenti,ou=group,dc=merli,dc=lab
cn: utenti
gidnumber: 10000
objectclass: posixGroup

Voglio che il login sia da gnome/kde, sia da cli si faccia con le credenziali

User: averdolino
Password: averdolino

Un po' di teoria
Ciascuna chiamata a funzioni che recuperano dati identificativi come password, user, gruppi viene gestita dal Name Service Switch (NSS) implementato nella glibc.
Il sistema riesce a loggarsi anche in assenza del file di configurazione di nss perchè glibc ha dei default da utilizzarsi in questi casi.
Quindi NSS controlla dove le informazioni vengono cercate

PAM invece si occupa dell'autenticazione (e di tante altre cose, accounting,session,gestione password)

Il file di configurazione di nsswitch è
/etc/nsswitch.conf
All'interno di questo file trovo il nome dei database su cui si va a cercare gli utenti e l'ordine di ricerca

I file di configurazione di pam sono in
/etc/pam.d
dove puoi trovare i file che i vari programmi che si affidano a pam usano per l'autenticazione, e le indicazioni di che moduli utilizzare per effettuare la stessa

sssd è un demone che fornisce accesso a differenti sistemi di identificazione e autenticazione, quindi "incasina" sia nss che pam.

 OPERATIVAMENTE

Installo il demone sssd
yum install sssd
Questo comando installa
client -> Il modulo pam_sss.so e la libreria libnss_sss.so
sssd -> Il demone e alcuni programmi di controllo tipo sss_cache
yum remove pam_ldap
->Questo lo rimuovo per essere sicuro di non usarlo visto che tanto passo da sssd

Quando ho dei dubbi le 2 man page interessate sono
man sssd-ldap
man sssd.conf

NSS

/etc/nsswitch.conf
passwd:     files sss
shadow:     files sss
group:      files sss

In sostanza gli dico che password,shadow,gruppi li deve andare a cercare prima nei file (/etc/passwd,/etc/shadow,/etc/group) in locale, e poi interrogare sss.

NSS ha un suo demone che effettua il caching delle credenziali che si chiama nscd ed è meglio tenerlo spento

SSSD

/etc/sssd/sssd.conf
[sssd]
config_file_version = 2
reconnection_retries = 3
sbus_timeout = 30
services = nss, pam
domains = LOCAL,LDAP

[nss]
filter_groups = root
filter_users = root
reconnection_retries = 3
; entry_cache_timeout = 600
; entry_cache_nowait_timeout = 300

[pam]
reconnection_retries = 3

[domain/LOCAL]
description = LOCAL Users domain
id_provider = local
enumerate = true
min_id = 500
max_id = 999

[domain/LDAP]
domain_type = ldap
chpass_provider = ldap
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://centoslab
ldap_search_base = dc=merli,dc=lab

ldap_default_bind_dn = cn=accesso1,dc=access,dc=lab
ldap_default_authtok_type = password
ldap_default_authtok  = accesso1
ldap_user_search_base = ou=People,dc=merli,dc=lab
ldap_group_search_base = ou=group,dc=merli,dc=lab
cache_credentials = true
enumerate = true
ldap_tls_cacert = /etc/openldap/certs/centoslab.crt
ldap_tls_reqcert = allow

In sostanza ho configurato 2 domini di credenziali.
- Quello LOCAL che memorizza gli utenti in un db interno a sssd (configurazione di default, è da capire cosa serva).
- Quello LDAP che si occupa sia di identificazione (id_provider), sia di autenticazione (auth_provider), sia di cambio password (chpass_provider). Qui avrò le canoniche configurazioni di ldap, con che utente bindarsi,dove cercare utenti gruppi etc...

Anche sssd cacha le credenziali, per evitarlo basta dire cache_credentials = false. Se invece vuoi mantenere il caching ma eliminare determinate credenziali cachate usa il comando
sss_cache
per esempio in questo modo elimino (dalla cache)tutti gli utenti memorizzati nel dominio LDAP
sss_cache -U -d LDAP
Così elimino (dalla cache) un solo utente
sss_cache -u averdolino -d LDAP

Nota che avrei potuto configurare sssd per far si che utilizzasse ldap come id_provider e altro come auth_provider (per esempio kerberos). Se ne sarebbe comunque sempre occupato solo sssd e solo li avrei dovuto agire, lasciando tutto il resto inalterato (nsswitch.conf e pam).

Puoi far partire il demone in modalità di debug (anche se non la trovo particolarmente utile) digitando il comando
[root@centos6vm sssd]# /usr/sbin/sssd -i -d 5

PAM
Ora ci manca PAM da configurare. Vado a modificare 2 file, system-auth (che viene usato da client, per il login via shell o cli), password-auth (che viene usato da gdm per il login grafico).
Il modulo da utilizzare si chiama pam_sss.so e ho inserito anche il pam_mkhomedir per fare la creazione automatica della home al primo login.

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_fprintd.so
#auth        optional      pam_mount.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_sss.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     required      pam_mkhomedir.so umask=0022 skel=/etc/skel
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
#sessio     optional      pam_mount.so
session     sufficient    pam_sss.so
session     required      pam_unix.so

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        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_sss.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     required      pam_mkhomedir.so umask=0022 skel=/etc/skel
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     sufficient    pam_sss.so
session     required      pam_unix.so

TEST FINALI
Fatto questo provo a effettuare il login via shell, oppure facendo su - (che tanto usa system-auth) o anche via gdm.

Il tutto funziona e questi sono i log di ldap.
Da qui si vede piuttosto bene il bind effettuato con l'utente di accesso, la ricerca del dn con uuid=averdolino, la ricerca dei vari attributi della objectCLass posixAccount e la successiva fase di autenticazione tramite bind con il dn appena trovato (cn=Alligatore Verdolino,ou=People,dc=merli,dc=lab)

conn=1000 fd=15 ACCEPT from IP=192.168.0.5:33215 (IP=0.0.0.0:636)
TLS: error: the certificate '/etc/ssl/certs/centoslab.crt' could not be found in the database - error -8174:security library: bad database..
TLS: certificate '/etc/ssl/certs/centoslab.crt' successfully loaded from PEM file.
TLS: no unlocked certificate for certificate 'E=gabriele.merli@unipv.it,CN=centoslab,O=merli.lab,L=Pavia,ST=Italy,C=IT'.
TLS: Warning: ignoring error for certificate [E=gabriele.merli@unipv.it,CN=centoslab,O=merli.lab,L=Pavia,ST=Italy,C=IT] - error -8172:Peer's certificate issuer has been marked as not trusted by the user..
conn=1000 fd=15 TLS established tls_ssf=256 ssf=256
conn=1000 op=0 SRCH base="" scope=0 deref=0 filter="(objectClass=*)"
conn=1000 op=0 SRCH attr=* altServer namingContexts supportedControl supportedExtension supportedFeatures supportedLDAPVersion supportedSASLMechanisms domainControllerFunctionality defaultNamingContext lastUSN highestCommittedUSN
conn=1000 op=0 SEARCH RESULT tag=101 err=0 nentries=1 text=
conn=1000 op=1 BIND dn="cn=accesso1,dc=access,dc=lab" method=128
slap_global_control: unrecognized control: 1.3.6.1.4.1.42.2.27.8.5.1
conn=1000 op=1 BIND dn="cn=accesso1,dc=access,dc=lab" mech=SIMPLE ssf=0
conn=1000 op=1 RESULT tag=97 err=0 text=
conn=1000 op=2 SRCH base="ou=People,dc=merli,dc=lab" scope=2 deref=0 filter="(&(uid=averdolino)(objectClass=posixAccount))"
conn=1000 op=2 SRCH attr=objectClass uid userPassword uidNumber gidNumber gecos homeDirectory loginShell krbPrincipalName cn modifyTimestamp modifyTimestamp shadowLastChange shadowMin shadowMax shadowWarning shadowInactive shadowExpire shadowFlag krbLastPwdChange krbPasswordExpiration pwdAttribute authorizedService accountExpires userAccountControl nsAccountLock host loginDisabled loginExpirationTime loginAllowedTimeMap
conn=1000 op=2 SEARCH RESULT tag=101 err=0 nentries=1 text=
conn=1000 op=3 SRCH base="ou=group,dc=merli,dc=lab" scope=2 deref=0 filter="(&(memberUid=averdolino)(objectClass=posixGroup)(cn=*)(&(gidNumber=*)(!(gidNumber=0))))"
conn=1000 op=3 SRCH attr=objectClass cn userPassword gidNumber modifyTimestamp modifyTimestamp
conn=1000 op=3 SEARCH RESULT tag=101 err=0 nentries=0 text=
conn=1001 fd=21 ACCEPT from IP=192.168.0.5:33216 (IP=0.0.0.0:636)
conn=1001 fd=21 TLS established tls_ssf=256 ssf=256
conn=1001 op=0 BIND dn="cn=Alligatore Verdolino,ou=People,dc=merli,dc=lab" method=128
slap_global_control: unrecognized control: 1.3.6.1.4.1.42.2.27.8.5.1
conn=1001 op=0 BIND dn="cn=Alligatore Verdolino,ou=People,dc=merli,dc=lab" mech=SIMPLE ssf=0
conn=1001 op=0 RESULT tag=97 err=0 text=
conn=1001 op=1 UNBIND
conn=1001 fd=21 closed
connection_read(21): no connection!

Funziona anche il cambio della password una volta loggati, questo il log di ldap

Si binda, (by anonymous auth, quindi ce la fa)

=> acl_mask: access to entry "cn=Alligatore Verdolino,ou=People,dc=merli,dc=lab", attr "userPassword" requested
=> acl_mask: to value by "", (=0)
<= check a_dn_pat: self
<= check a_dn_pat: anonymous
<= acl_mask: [2] applying auth(=xd) (stop)
<= acl_mask: [2] mask: auth(=xd)

Una volta bindato prova a cambiare la password(by self write, quindi può scrivere)

=> acl_mask: access to entry "cn=Alligatore Verdolino,ou=People,dc=merli,dc=lab", attr "userPassword" requested
=> acl_mask: to value by "cn=alligatore verdolino,ou=people,dc=merli,dc=lab", (=0)
<= check a_dn_pat: self
<= acl_mask: [1] applying write(=wrscxd) (stop)
<= acl_mask: [1] mask: write(=wrscxd)
=> slap_access_allowed: auth access granted by write(=wrscxd)
=> access_allowed: auth access granted by write(=wrscxd)

DOMANDA

Meglio utilizzare sssd con id_provider=ldap e auth_provider=krb5 oppure utilizzare kr5b e winbind?
https://www.fedorahosted.org/sssd/wiki/SSSD-vs-Winbind

Print Friendly, PDF & Email