Kerberos e LDAP
Most people will not use Kerberos by itself; once an user is authenticated (Kerberos), we need to figure out what this user can do (authorization). And that would be the job of programs such as LDAP.
Sostituire un database principale di Kerberos tra due server può essere complicato e aggiunge un ulteriori database all'interno della rete. Il server Kerberos può comunque essere configurato per utilizzare una directory LDAP come database principale. In questa sezione viene descritto come configurare un server Kerberos, primario e secondario, affinché utilizzi OpenLDAP come database principale.
The examples presented here assume MIT Kerberos and OpenLDAP.
Configurare OpenLDAP
Per prima cosa è necessario caricare lo schema all'interno del server OpenLDAP collegato ai KDC primario e secondario. I successivi passi qui descritti hanno come presupposto la presenza di un server LDAP di replica configurato tra due server. Per maggiori informazioni su come impostare un server OpenLDAP, consultare Server OpenLDAP.
È inoltre richiesto per configurare OpenLDAP all'uso di connessioni TLS e SSL, in modo che il traffico tra il KDC e il server LDAP sia cifrato. Per maggiori informazioni, consultare TLS.
cn=admin,cn=config is a user we created with rights to edit the ldap database. Many times it is the RootDN. Change its value to reflect your setup.
-
Per caricare lo schema all'interno del server LDAP, installare su tale server il pacchetto krb5-kdc-ldap. Da un terminale, digitare:
sudo apt-get install krb5-kdc-ldap
-
Estrarre il file kerberos.schema.gz:
sudo gzip -d /usr/share/doc/krb5-kdc-ldap/kerberos.schema.gz sudo cp /usr/share/doc/krb5-kdc-ldap/kerberos.schema /etc/ldap/schema/
-
Lo schema kerberos deve essere aggiunto all'albero cn=config. La procedura per aggiungere un nuovo schema a slapd è descritta anche in Modifying the slapd Configuration Database.
-
Creare un file di configurazione chiamato schema_convert.conf, o simile, contenente quanto segue:
include /etc/ldap/schema/core.schema include /etc/ldap/schema/collective.schema include /etc/ldap/schema/corba.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/duaconf.schema include /etc/ldap/schema/dyngroup.schema include /etc/ldap/schema/inetorgperson.schema include /etc/ldap/schema/java.schema include /etc/ldap/schema/misc.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/openldap.schema include /etc/ldap/schema/ppolicy.schema include /etc/ldap/schema/kerberos.schema
-
Creare una directory temporanea in cui salvare i file LDIF:
mkdir /tmp/ldif_output
-
Usare quindi slapcat per convertire i file schema:
slapcat -f schema_convert.conf -F /tmp/ldif_output -n0 -s \ "cn={12}kerberos,cn=schema,cn=config" > /tmp/cn=kerberos.ldif
Modificare i percorsi e i nomi dei file in base alla proprie esigenze.
-
Modificare il file /tmp/cn\=kerberos.ldif generato sistemando i seguenti attributi:
dn: cn=kerberos,cn=schema,cn=config ... cn: kerberos
Rimuovere le seguenti righe dalla fine del file:
structuralObjectClass: olcSchemaConfig entryUUID: 18ccd010-746b-102d-9fbe-3760cca765dc creatorsName: cn=config createTimestamp: 20090111203515Z entryCSN: 20090111203515.326445Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20090111203515Z
I valori degli attributi possono variare, basta solo assicurarsi che gli attributi siano rimossi.
-
Caricare il nuovo schema con ldapadd:
ldapadd -x -D cn=admin,cn=config -W -f /tmp/cn\=kerberos.ldif
-
Aggiungere un indice per l'attributo krb5principalname:
ldapmodify -x -D cn=admin,cn=config -W Enter LDAP Password: dn: olcDatabase={1}hdb,cn=config add: olcDbIndex olcDbIndex: krbPrincipalName eq,pres,sub modifying entry "olcDatabase={1}hdb,cn=config"
-
Infine, aggiornare le ACL (Access Control Lists):
ldapmodify -x -D cn=admin,cn=config -W Enter LDAP Password: dn: olcDatabase={1}hdb,cn=config replace: olcAccess olcAccess: to attrs=userPassword,shadowLastChange,krbPrincipalKey by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none - add: olcAccess olcAccess: to dn.base="" by * read - add: olcAccess olcAccess: to * by dn="cn=admin,dc=example,dc=com" write by * read modifying entry "olcDatabase={1}hdb,cn=config"
-
La directory LDAP è ora pronta come database principale per Kerberos.
Configurazione KDC primario
Configurato OpenLDAP, è necessario configurare KDC.
-
Installare i pacchetti necessari. In un terminale, digitare:
sudo apt-get install krb5-kdc krb5-admin-server krb5-kdc-ldap
-
Modificare /etc/krb5.conf aggiungendo le seguenti opzioni all'interno delle sezioni appropriate:
[libdefaults] default_realm = EXAMPLE.COM ... [realms] EXAMPLE.COM = { kdc = kdc01.example.com kdc = kdc02.example.com admin_server = kdc01.example.com admin_server = kdc02.example.com default_domain = example.com database_module = openldap_ldapconf } ... [domain_realm] .example.com = EXAMPLE.COM ... [dbdefaults] ldap_kerberos_container_dn = dc=example,dc=com [dbmodules] openldap_ldapconf = { db_library = kldap ldap_kdc_dn = "cn=admin,dc=example,dc=com" # this object needs to have read rights on # the realm container, principal container and realm sub-trees ldap_kadmind_dn = "cn=admin,dc=example,dc=com" # this object needs to have read and write rights on # the realm container, principal container and realm sub-trees ldap_service_password_file = /etc/krb5kdc/service.keyfile ldap_servers = ldaps://ldap01.example.com ldaps://ldap02.example.com ldap_conns_per_server = 5 }
Modificare example.com, dc=example,dc=com, cn=admin,dc=example,dc=com e ldap01.example.com con i valori corretti del dominio, dell'oggetto e del server LDAP della propria rete.
-
Usare l'utilità kdb5_ldap_util per creare il reame:
sudo kdb5_ldap_util -D cn=admin,dc=example,dc=com create -subtrees \ dc=example,dc=com -r EXAMPLE.COM -s -H ldap://ldap01.example.com
-
Creare un file stash della password utilizzata per l'associazione al server LDAP. Questa password è usata con le opzioni ldap_kdc_dn e ldap_kadmin_dn nel file /etc/krb5.conf:
sudo kdb5_ldap_util -D cn=admin,dc=example,dc=com stashsrvpw -f \ /etc/krb5kdc/service.keyfile cn=admin,dc=example,dc=com
-
Copiare il certificato della CA dal server LDAP:
scp ldap01:/etc/ssl/certs/cacert.pem . sudo cp cacert.pem /etc/ssl/certs
Modificare il file /etc/ldap/ldap.conf affinché utilizzi il certificato:
TLS_CACERT /etc/ssl/certs/cacert.pem
Il certificato deve anche essere copiato nel KDC secondario per consentire la connessione ai server LDAP utilizzando LDAPS.
Ora è possibile aggiungere i principal Kerberos al database LDAP che verranno copiati su tutti gli altri server LDAP di replica. Per aggiungere un principal utilizzando l'utilità kadmin.local, digitare:
sudo kadmin.local Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin.local: addprinc -x dn="uid=steve,ou=people,dc=example,dc=com" steve WARNING: no policy specified for steve@EXAMPLE.COM; defaulting to no policy Enter password for principal "steve@EXAMPLE.COM": Re-enter password for principal "steve@EXAMPLE.COM": Principal "steve@EXAMPLE.COM" created.
Dovrebbero ora essere aggiunti all'oggetto utente uid=steve,ou=people,dc=example,dc=com gli attributi krbPrincipalName, krbPrincipalKey, krbLastPwdChange e krbExtraData. Per verificare che all'utente venga emesso un ticket, utilizzare le utilità kinit e klist.
Se l'oggetto utente è già stato creato, è necessario usare l'opzione -x dn="..." per aggiungere gli attributi Kerberos, altrimenti verrà creato un nuovo oggetto principal nel sottoalbero del reame.
Configurazione KDC secondario
La configurazione di un KDC secondario utilizzando il backend LDAP è molto simile alla configurazione tramite l'utilizzo del database Kerberos.
-
Installare i pacchetti necessari. In un terminale digitare:
sudo apt-get install krb5-kdc krb5-admin-server krb5-kdc-ldap
-
Modificare il file /etc/krb5.conf affinché utilizzi il backend LDAP:
[libdefaults] default_realm = EXAMPLE.COM ... [realms] EXAMPLE.COM = { kdc = kdc01.example.com kdc = kdc02.example.com admin_server = kdc01.example.com admin_server = kdc02.example.com default_domain = example.com database_module = openldap_ldapconf } ... [domain_realm] .example.com = EXAMPLE.COM ... [dbdefaults] ldap_kerberos_container_dn = dc=example,dc=com [dbmodules] openldap_ldapconf = { db_library = kldap ldap_kdc_dn = "cn=admin,dc=example,dc=com" # this object needs to have read rights on # the realm container, principal container and realm sub-trees ldap_kadmind_dn = "cn=admin,dc=example,dc=com" # this object needs to have read and write rights on # the realm container, principal container and realm sub-trees ldap_service_password_file = /etc/krb5kdc/service.keyfile ldap_servers = ldaps://ldap01.example.com ldaps://ldap02.example.com ldap_conns_per_server = 5 }
-
Creare il file stash per la password di associazione LDAP:
sudo kdb5_ldap_util -D cn=admin,dc=example,dc=com stashsrvpw -f \ /etc/krb5kdc/service.keyfile cn=admin,dc=example,dc=com
-
Dal KDC primario, copiare il file di stash della chiave primaria (/etc/krb5kdc/.k5.EXAMPLE.COM) nel KDC secondario. Accertarsi di copiare tale file utilizzando una connessione cifrata come scp o su un supporto fisico.
sudo scp /etc/krb5kdc/.k5.EXAMPLE.COM steve@kdc02.example.com:~ sudo mv .k5.EXAMPLE.COM /etc/krb5kdc/
Ricordarsi di sostituire EXAMPLE.COM con il reame in uso.
-
Back on the Secondary KDC, (re)start the ldap server only,
sudo service slapd restart
-
Infine. avviare il demone krb5-kdc:
sudo /etc/init.d/krb5-kdc start
-
Verify the two ldap servers (and kerberos by extension) are in sync.
All'interno della propria rete sono quindi disponibili dei KDC ridondanti che assieme ai server LDAP ridondanti permettono l'autenticazione degli utenti anche nel caso in cui un server LDAP, un server Kerberos o uno server LDAP e un server Kerberos non siano più disponibili.
Risorse
-
Maggiori informazioni possono essere trovate nella Kerberos Admin Guide.
-
For more information on kdb5_ldap_util see Section 5.6 and the kdb5_ldap_util man page.
-
Another useful link is the krb5.conf man page.
-
Also, see the Kerberos and LDAP Ubuntu wiki page.