Kerberos e 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.

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 la sezione chiamata «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 la sezione chiamata «TLS e SSL».

  • 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 la sezione chiamata «Further Configuration».

    1. 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
      
    2. Creare una directory temporanea in cui salvare i file LDIF:

      mkdir /tmp/ldif_output
      
    3. 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.

    4. 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
      
      [Nota]

      I valori degli attributi possono variare, basta solo assicurarsi che gli attributi siano rimossi.

    5. Caricare il nuovo schema con ldapadd:

      ldapadd -x -D cn=admin,cn=config -W -f /tmp/cn\=kerberos.ldif
      
    6. 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"
      
    7. 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=exampl
       e,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
            }
    
    [Nota]

    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
    
    [Nota]

    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.

[Nota]

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/
    
    [Nota]

    Ricordarsi di sostituire EXAMPLE.COM con il reame in uso.

  • Infine. avviare il demone krb5-kdc:

    sudo /etc/init.d/krb5-kdc start
    

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