Kerberos και LDAP

Η αντιγραφή μιας βάσης δεδομένων principal Kerberos μεταξύ δύο εξυπηρετητών μπορεί να είναι πολύπλοκη διαδικασία, ενώ επίσης προσθέτει μία ακόμη βάση δεδομένων χρήστη στο δίκτυό σας. Ευτυχώς, το Kerberos του MIT μπορεί να ρυθμιστεί έτσι ώστε να χρησιμοποιεί έναν κατάλογο LDAP ως βάση δεδομένων principal. Αυτή η ενότητα καλύπτει τη διαδικασία ρύθμισης ενός πρωτεύοντος και ενός δευτερεύοντος εξυπηρετητή kerberos ώστε να χρησιμοποιούν το OpenLDAP για τη βάση δεδομένων principal.

Ρύθμιση του OpenLDAP

Καταρχάς, πρέπει να φορτωθεί το κατάλληλο σχήμα neσε έναν εξυπηρετητή OpenLDAP με δικτυακή σύνδεση στα πρωτεύοντα και δευτερεύοντα KDC. Στο υπόλοιπο αυτής της ενότητας υποθέτουμε ότι έχετε ρυθμίσει την αντιγραφή του LDAP μεταξύ δύο τουλάχιστον εξυπηρετητών. Για πληροφορίες σχετικά με τη ρύθμιση του OpenLDAP δείτε το “Εξυπηρετητής OpenLDAP”.

Επίσης, απαιτείται η ρύθμιση του OpenLDAP για συνδέσεις TLS και SSL, έτσι ώστε να κρυπτογραφείται η κίνηση μεταξύ KDC και εξυπηρετητή LDAP. Δείτε το “TLS και SSL” για λεπτομέρειες.

  • Για να φορτώσετε το σχήμα στο LDAP, εγκαταστήστε το πακέτο krb5-kdc-ldap στον εξυπηρετητή LDAP. Από το τερματικό, δίνετε:

    sudo apt-get install krb5-kdc-ldap
    
  • Στη συνέχεια, εξάγετε το αρχείο 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/
    
  • Το σχήμα του kerberos πρέπει να προστεθεί στο δέντρο του cn=config. Η διαδικασία προσθήκης νέου σχήματος στο slapd περιγράφεται και στο “Περαιτέρω ρυθμίσεις”.

    1. Καταρχάς, δημιουργήστε ένα αρχείο ρυθμίσεων με όνομα schema_convert.conf, ή κάτι εξίσου περιγραφικό, που θα περιέχει τις ακόλουθες γραμμές:

      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. Δημιουργήστε έναν προσωρινό κατάλογο για τα αρχεία LDIF:

      mkdir /tmp/ldif_output
      
    3. Τώρα, χρησιμοποιήστε το slapcat για να μετατρέψετε τα αρχεία σχημάτων:

      slapcat -f schema_convert.conf -F /tmp/ldif_output -n0 -s "cn={12}kerberos,cn=schema,cn=config" > /tmp/cn=kerberos.ldif
      

      Αλλάξτε τα ονόματα των αρχείων και διαδρομών αν έχετε χρησιμοποιήσει διαφορετικά.

    4. Τροποποιήστε το αρχείο /tmp/cn\=kerberos.ldif που προκύπτει, αλλάζοντας τα ακόλουθα γνωρίσματα:

      dn: cn=kerberos,cn=schema,cn=config
      ...
      cn: kerberos
      

      Και αφαιρέστε τις ακόλουθες γραμμές από το τέλος του αρχείου:

      structuralObjectClass: olcSchemaConfig
      entryUUID: 18ccd010-746b-102d-9fbe-3760cca765dc
      creatorsName: cn=config
      createTimestamp: 20090111203515Z
      entryCSN: 20090111203515.326445Z#000000#000#000000
      modifiersName: cn=config
      modifyTimestamp: 20090111203515Z
      
      [Σημείωση]

      Οι τιμές των γνωρισμάτων μπορεί να διαφέρουν, εσείς απλά βεβαιωθείτε ότι αφαιρέθηκαν τα συγκεκριμένα γνωρίσματα.

    5. Φορτώστε το νέο αρχείο με το ldapadd:

      ldapadd -x -D cn=admin,cn=config -W -f /tmp/cn\=kerberos.ldif
      
    6. Προσθέστε ένα ευρετήριο για το γνώρισμα 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. Τέλος, ενημερώστε τις Λίστες Ελέγχου Πρόσβασης (ACL):

      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"
      
      

Αυτό ήταν, ο κατάλογος LDAP είναι τώρα έτοιμος να λειτουργήσει ως βάση δεδομένων principal Kerberos.

Ρύθμιση πρωτεύοντος KDC

Αφού ρυθμιστεί το OpenLDAP θα πρέπει να ρυθμιστεί και το KDC.

  • Καταρχάς, εγκαταστήστε τα απαραίτητα πακέτα από το τερματικό, εισάγοντας:

    sudo apt-get install krb5-kdc krb5-admin-server krb5-kdc-ldap
    
  • Τώρα, τροποποιήστε το /etc/krb5.conf, προσθέτοντας τις ακόλουθες επιλογές στα κατάλληλα σημεία:

    [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
            }
    
    [Σημείωση]

    Αντικαταστήστε τα example.com, dc=example,dc=com, cn=admin,dc=example,dc=com, and ldap01.example.com με το κατάλληλο domain, αντικείμενο LDAP, και εξυπηρετητή LDAP.

  • Στη συνέχεια, χρησιμοποιήστε το kdb5_ldap_util για να δημιουργήσετε το realm:

    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
    
  • Αποθηκεύστε κρυφά (stash) τον κωδικό που χρησιμοποιείται σε σύνδεση με τον εξυπηρετητή LDAP. Πρόκειται για τον κωδικό που χρησιμοποιείται στις επιλογές ldap_kdc_dn και ldap_kadmin_dn του /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
    
  • Αντιγράψτε το πιστοποιητικό CA από τον εξυπηρετητή LDAP:

    scp ldap01:/etc/ssl/certs/cacert.pem .
    sudo cp cacert.pem /etc/ssl/certs
    

    Και αλλάξτε το /etc/ldap/ldap.conf έτσι ώστε να χρησιμοποιεί το πιστοποιητικό:

    TLS_CACERT /etc/ssl/certs/cacert.pem
    
    [Σημείωση]

    Το πιστοποιητικό θα πρέπει να αντιγραφεί και στο δευτερεύον KDC, για να επιτρέπεται η σύνδεση στους εξυπηρετητές LDAP μέσω LDAPS.

Τώρα, μπορείτε να προσθέσετε τους principal Kerberos στη βάση δεδομένων LDAP. Θα αντιγραφούν και στους υπόλοιπους εξυπηρετητές LDAP που έχουν ρυθμιστεί για αντιγραφή. Για να προσθέσετε ένα principal χρησιμοποιήστε το kadmin.local και εισάγετε:

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.

Τα γνωρίσματα krbPrincipalName, krbPrincipalKey, krbLastPwdChange, and krbExtraData θα πρέπει πλέον να έχουν προστεθεί στο αντικείμενο χρήστη uid=steve,ou=people,dc=example,dc=com. Χρησιμοποιήστε τα kinit και klist για να ελέγξετε αν όντως εκδόθηκε δελτίο (ticket) για τον χρήστη.

[Σημείωση]

Αν το αντικείμενο χρήστη έχει ήδη δημιουργηθεί, θα χρειαστεί η επιλογή -x dn="..." για την προσθήκη των γνωρισμάτων Kerberos. Διαφορετικά θα δημιουργηθεί νέο αντικείμενο principal στο υποδέντρο του realm.

Ρύθμιση δευτερεύοντος KDC

Η ρύθμιση του δευτερεύοντος KDC μέσω του backend του LDAP είναι παρόμοια με τη ρύθμισή του για χρήση της κανονικής βάσης δεδομένων Kerberos.

  • Καταρχάς, εγκαταστήστε τα απαραίτητα πακέτα από το τερματικό, εισάγοντας:

    sudo apt-get install krb5-kdc krb5-admin-server krb5-kdc-ldap
    
  • Στη συνέχεια, τροποποιήστε το /etc/krb5.conf ώστε να χρησιμοποιεί το 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
            }
    
  • Αποθηκεύστε τον κωδικό (stash) σύνδεσης με το LDAP:

    sudo kdb5_ldap_util -D cn=admin,dc=example,dc=com stashsrvpw -f /etc/krb5kdc/service.keyfile cn=admin,dc=example,dc=com
    
  • Τώρα, στο πρωτεύον KDC αντιγράψτε το κρυμμένο κύριο κλειδί (master) του /etc/krb5kdc/.k5.EXAMPLE.COM στο δευτερεύον KDC. Θυμηθείτε να κάνετε την αντιγραφή μέσω κρυπτογραφημένης σύνδεσης, π.χ. με το scp, ή χρησιμοποιώντας φυσικό μέσο.

    sudo scp /etc/krb5kdc/.k5.EXAMPLE.COM steve@kdc02.example.com:~
    sudo mv .k5.EXAMPLE.COM /etc/krb5kdc/
    
    [Σημείωση]

    Και εδώ, αντικαταστήστε το EXAMPLE.COM με το δικό σας realm.

  • Τέλος, εκκινήστε την υπηρεσία krb5-kdc:

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

Τώρα το δίκτυό σας διαθέτει εφεδρικό KDC και μαζί με εφεδρικούς εξυπηρετητές LDAP, θα μπορείτε να συνεχίζετε να πιστοποιείτε χρήστες, ακόμη και αν δεν είναι διαθέσιμοι ένας εξυπηρετητής Kerberos, ένας εξυπηρετητής LDAP ή ένας εξυπηρετητής Kerberos και ένας LDAP.

Πόροι