Εξυπηρετητής OpenLDAP

Το LDAP είναι ακρώνυμο για το Lightweight Directory Access Protocol (Ελαφρύ Πρωτόκολλο Πρόσβασης σε Καταλόγους), που αποτελεί απλοποιημένη εκδοχή του πρωτοκόλλου X.500. Στην ενότητα αυτή θα χρησιμοποιήσουμε τις ρυθμίσεις καταλόγου για πιστοποίηση. Ωστόσο, το LDAP μπορεί να χρησιμοποιηθεί για πολλά διαφορετικά πράγματα: πιστοποίηση, κοινόχρηστος κατάλογος (για πελάτες ηλ. ταχυδρομείου), βιβλίο διευθύνσεων, κτλ.

Ας περιγράψουμε συνοπτικά το LDAP. Όλες οι πληροφορίες αποθηκεύονται σε μια δομή δέντρου. Με το OpenLDAP έχετε τη δυνατότητα να καθορίζετε εσείς η ίδιοι τη δομή του δέντρου του καταλόγου (Δέντρο Πληροφοριών Καταλόγου: DIT). Ξεκινάμε με ένα απλό δέντρο, με δύο κόμβους κάτω από τη ρίζα:

  • "Άνθρωποι" - ο κόμβος όπου θα αποθηκεύονται οι χρήστες σας

  • "Ομάδες" - ο κόμβος όπου θα αποθηκεύονται οι ομάδες σας

Πριν ξεκινήσετε, πρέπει να ορίσετε τη ρίζα του καταλόγου LDAP. Η προεπιλογή είναι να χρησιμοποιείται το Πλήρως Ορισμένο Όνομα Τομέα (FQDN - Fully Qualified Domain Name - ). Αν ο τομέας σας είναι π.χ. το example.com, ο ριζικός κόμβος θα είναι dc=example,dc=com.

Εγκατάσταση

Καταρχάς, εγκαταστήστε την υπηρεσία εξηπηρετητή του OpenLDAP, το slapd, καθώς και το ldap-utils, ένα πακέτο με εργαλεία διαχείρισης του LDAP:

sudo apt-get install slapd ldap-utils

Η προεπιλεγμένες ρυθμίσεις του slapd είναι οι ελάχιστες που απαιτούνται για την εκτέλεση της υπηρεσίας slapd.

Το παράδειγμα ρύθμισης των ενοτήτων που ακολουθούν θα αντιστοιχεί στο όνομα τομέα του εξυπηρετητή. Π.χ., αν το Πλήρως Ορισμένο Όνομα Τομέα (FQDN) είναι ldap.example.com, η προεπιλεγμένη κατάληξη θα είναι dc=example,dc=com.

Πλήρωση του LDAP

Το OpenLDAP χρησιμοποιεί έναν ξεχωριστό κατάλογο που περιέχει το cn=config του Δέντρου Πληροφοριών Καταλόγου (DIT) . Το cn=config DIT χρησιμοποιείται για τη δυναμική ρύθμιση της υπηρεσίας slapd, και επιτρέπει την τροποποίηση των ορισμών σχημάτων, ευρετηρίων, ACL, κτλ. χωρίς να απαιτείται διακοπή της υπηρεσίας.

The backend cn=config directory has only a minimal configuration and will need additional configuration options in order to populate the frontend directory. The frontend will be populated with a "classical" scheme that will be compatible with address book applications and with Unix Posix accounts. Posix accounts will allow authentication to various applications, such as web applications, email Mail Transfer Agent (MTA) applications, etc.

[Σημείωση]

Για να μπορεί μια εξωτερική εφαρμογή να κάνει πιστοποίηση μέσω LDAP, θα πρέπει να έχει ρυθμιστεί ειδικά. Ανατρέξτε στην τεκμηρίωση της κάθε μεμονωμένης εφαρμογής για περισσότερες λεπτομέρειες.

[Σημείωση]

Μην ξεχάσετε να αλλάξετε τα dc=example,dc=com των παρακάτω παραδειγμάτων, ανάλογα με τις ρυθμίσεις του LDAP σας.

Καταρχάς, πρέπει να φορτωθούν ορισμένα επιπλέον αρχεία σχημάτων. Στο τερματικό, εισάγετε:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif

Στη συνέχεια, αντιγράψτε το παρακάτω υπόδειγμα αρχείου LDIF, ονομάζοντάς το backend.example.com.ldif, και τοποθετώντας το κάπου στο σύστημά σας:

# Load dynamic backend modules
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb

# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=example,dc=com
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=example,dc=com
olcRootPW: secret
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=example,dc=com" write by * read

[Σημείωση]

Στο olcRootPW: secret τοποθετήστε τον κωδικό της επιλογής σας.

Τώρα, προσθέστε το LDIF στον κατάλογο:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f backend.example.com.ldif

Ο κατάλογος του συστήματος διασύνδεσης (frontend) είναι τώρα έτοιμος να συμπληρωθεί. Δημιουργήστε ένα αρχείο frontend.example.com.ldif που θα περιέχει τα εξής:

# Δημιουργία ριζικού αντικειμένου στον τομέα
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: Example Organization
dc: Example
description: LDAP Example 

# Χρήστης - διαχειριστής.
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: secret

dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups

dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@example.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress: 
initials: JD

dn: cn=example,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: example
gidNumber: 10000

Σε αυτό το παράδειγμα δομής του καταλόγου, δημιουργούνται ένας χρήστης και μία ομάδα. Σε άλλα παραδείγματα μπορεί να εμφανίζεται το objectClass: top σε όλες τις εγγραφές, αλλά η προσθήκη του δεν είναι απαραίτητη, καθώς αντιστοιχεί στην προεπιλεγμένη συμπεριφορά.

Προσθέστε τις εγγραφές στον κατάλογο LDAP:

sudo ldapadd -x -D cn=admin,dc=example,dc=com -W -f frontend.example.com.ldif

Μπορούμε να ελέγξουμε αν το περιεχόμενο προστέθηκε σωστά, χρησιμοποιώντας το εργαλείο ldapsearch. Συγκεκριμένα, κάνουμε μία αναζήτηση στον κατάλογο LDAP:

ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn

dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
sn: Doe
givenName: John

Σύντομη επεξήγηση:

  • -x: δεν χρησιμοποιείται η προεπιλεγμένη μέθοδος πιστοποίησης, η SASL.

  • -LLL: απενεργοποίηση της εκτύπωσης πληροφοριών του σχήματος LDIF.

Περαιτέρω ρυθμίσεις

Μπορείτε να επεξεργαστείτε το δέντρο του cn=config χρησιμοποιώντας τα εργαλεία του πακέτου ldap-utils. Π.χ.:

  • Χρησιμοποιήστε το ldapsearch για να προβάλετε το δέντρο, εισάγοντας τον κωδικό διαχειριστή που είχατε επιλέξει κατά την εγκατάσταση ή επαναρρύθμιση.:

    sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
    
    
    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    dn: cn=config
    
    dn: cn=module{0},cn=config
    
    dn: cn=schema,cn=config
    
    dn: cn={0}core,cn=schema,cn=config
    
    dn: cn={1}cosine,cn=schema,cn=config
    
    dn: cn={2}nis,cn=schema,cn=config
    
    dn: cn={3}inetorgperson,cn=schema,cn=config
    
    dn: olcDatabase={-1}frontend,cn=config
    
    dn: olcDatabase={0}config,cn=config
    
    dn: olcDatabase={1}hdb,cn=config
    
    

    Η παραπάνω έξοδος αντιστοιχεί στις τρέχουσες ρυθμίσεις της βάσης δεδομένων cn=config του συστήματος υποστήριξης (backend). Η δική σας έξοδος μπορεί να διαφέρει.

  • Για να πειραματιστείτε με την τροποποίηση του δέντρου του cn=config, προσθέστε άλλο ένα γνώρισμα στο ευρετήριο, χρησιμοποιώντας το ldapmodify:

    sudo ldapmodify -Y EXTERNAL -H ldapi:///
    
    
    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    dn: olcDatabase={1}hdb,cn=config
    add: olcDbIndex
    olcDbIndex: uidNumber eq
    
    modifying entry "olcDatabase={1}hdb,cn=config"
    
    

    Μόλις ολοκληρωθεί η τροποποίηση, πατήστε Ctrl+D για να εγκαταλείψετε την εφαρμογή.

  • Το ldapmodify μπορεί επίσης να διαβάζει αλλαγές που περιέχονται σε αρχείο. Αντιγράψτε και επικολλήστε τα ακόλουθα σε αρχείο με το όνομα uid_index.ldif:

    dn: olcDatabase={1}hdb,cn=config
    add: olcDbIndex
    olcDbIndex: uid eq,pres,sub
    

    Τώρα, εκτελέστε το ldapmodify:

    sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f uid_index.ldif
    
    
    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    modifying entry "olcDatabase={1}hdb,cn=config"
    
    

    Η χρήση αρχείου είναι πολύ χρήσιμη όταν απαιτούνται πολλές αλλαγές.

  • Η προσθήκη επιπλέον σχημάτων στο slapd απαιτεί τη μετατροπή κάθε σχήματος σε μορφή LDIF. Ο κατάλογος /etc/ldap/schema περιέχει ορισμένα αρχεία σχημάτων που έχουν ήδη μετατραπεί σε μορφή LDIF με τη μέθοδο που περιγράφηκε στην προηγούμενη ενότητα. Ευτυχώς, το slapd μπορεί να χρησιμοποιηθεί για την αυτοματοποίηση της μετατροπής. Στο παράδειγμα που ακολουθεί προσθέτουμε το σχήμα dyngoup.schema:

    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
      
    2. Στη συνέχεια, δημιουργήστε έναν προσωρινό κατάλογο για την έξοδο:

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

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

      Αλλάξτε τα ονόματα του αρχείου ρυθμίσεων και του προσωρινού καταλόγου, αν έχετε χρησιμοποιήσει διαφορετικά ονόματα. Επίσης, ίσως θα ήταν χρήσιμο να διατηρήσετε τον κατάλογο ldif_output, σε περίπτωση που επιθυμείτε να προσθέσετε νέα σχήματα στο μέλλον.

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

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

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

      structuralObjectClass: olcSchemaConfig
      entryUUID: 10dae0ea-0760-102d-80d3-f9366b7f7757
      creatorsName: cn=config
      createTimestamp: 20080826021140Z
      entryCSN: 20080826021140.791425Z#000000#000#000000
      modifiersName: cn=config
      modifyTimestamp: 20080826021140Z
      
      [Σημείωση]

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

    5. Τέλος, χρησιμοποιώντας το ldapadd, προσθέστε το νέο σχήμα στον κατάλογο:

      sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/cn\=dyngroup.ldif
      

    Τώρα θα πρέπει να έχετε αποκτήσει μία εγγραφή dn: cn={4}dyngroup,cn=schema,cn=config στο δέντρο του cn=config.

LDAP Replication

Συχνά, το LDAP μετατρέπεται γρήγορα σε ζωτικής σημασίας υπηρεσία για το δίκτυο. Πολλαπλά συστήματα εξαρτώνται από το LDAP για την παροχή πιστοποιήσεων, εξουσιοδοτήσεων, ρυθμίσεων, κτλ. Αξίζει λοιπόν τον κόπο να υπάρχει ένα εφεδρικό σύστημα - αντίγραφο.

Replication is achieved using the Syncrepl engine. Syncrepl allows the changes to be synced using a consumer, provider model. A provider sends directory changes to consumers.

Provider Configuration

The following is an example of a Single-Master configuration. In this configuration one OpenLDAP server is configured as a provider and another as a consumer.

  1. First, configure the provider server. Copy the following to a file named provider_sync.ldif:

    # Add indexes to the frontend db.
    dn: olcDatabase={1}hdb,cn=config
    changetype: modify
    add: olcDbIndex
    olcDbIndex: entryCSN eq
    -
    add: olcDbIndex
    olcDbIndex: entryUUID eq
    
    #Load the syncprov and accesslog modules.
    dn: cn=module{0},cn=config
    changetype: modify
    add: olcModuleLoad
    olcModuleLoad: syncprov
    -
    add: olcModuleLoad
    olcModuleLoad: accesslog
    
    # Accesslog database definitions
    dn: olcDatabase={2}hdb,cn=config
    objectClass: olcDatabaseConfig
    objectClass: olcHdbConfig
    olcDatabase: {2}hdb
    olcDbDirectory: /var/lib/ldap/accesslog
    olcSuffix: cn=accesslog
    olcRootDN: cn=admin,dc=example,dc=com
    olcDbIndex: default eq
    olcDbIndex: entryCSN,objectClass,reqEnd,reqResult,reqStart
    
    # Accesslog db syncprov.
    dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
    changetype: add
    objectClass: olcOverlayConfig
    objectClass: olcSyncProvConfig
    olcOverlay: syncprov
    olcSpNoPresent: TRUE
    olcSpReloadHint: TRUE
    
    # syncrepl Provider for primary db
    dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
    changetype: add
    objectClass: olcOverlayConfig
    objectClass: olcSyncProvConfig
    olcOverlay: syncprov
    olcSpNoPresent: TRUE
    
    # accesslog overlay definitions for primary db
    dn: olcOverlay=accesslog,olcDatabase={1}hdb,cn=config
    objectClass: olcOverlayConfig
    objectClass: olcAccessLogConfig
    olcOverlay: accesslog
    olcAccessLogDB: cn=accesslog
    olcAccessLogOps: writes
    olcAccessLogSuccess: TRUE
    # scan the accesslog DB every day, and purge entries older than 7 days
    olcAccessLogPurge: 07+00:00 01+00:00
    
  2. The AppArmor profile for slapd will need to be adjusted for the accesslog database location. Edit /etc/apparmor.d/usr.sbin.slapd adding:

      /var/lib/ldap/accesslog/ r,
      /var/lib/ldap/accesslog/** rwk,
    

    Then create the directory, reload the apparmor profile, and copy the DB_CONFIG file:

    sudo -u openldap mkdir /var/lib/ldap/accesslog
    sudo -u openldap cp /var/lib/ldap/DB_CONFIG /var/lib/ldap/accesslog/
    sudo /etc/init.d/apparmor reload
    
    [Σημείωση]

    Using the -u openldap option with the sudo commands above removes the need to adjust permissions for the new directory later.

  3. Edit the file and change the olcRootDN to match your directory:

    olcRootDN: cn=admin,dc=example,dc=com
    
  4. Next, add the LDIF file using the ldapadd utility:

    sudo ldapadd -Y EXTERNAL -H ldapi:/// -f provider_sync.ldif
    
  5. Restart slapd:

    sudo /etc/init.d/slapd restart
    

The Provider server is now configured, and it is time to configure a Consumer server.

Consumer Configuration

  1. On the Consumer server configure it the same as the Provider except for the Syncrepl configuration steps.

    Add the additional schema files:

    sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
    sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
    sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
    

    Also, create, or copy from the provider server, the backend.example.com.ldif

    # Load dynamic backend modules
    dn: cn=module,cn=config
    objectClass: olcModuleList
    cn: module
    olcModulepath: /usr/lib/ldap
    olcModuleload: back_hdb
    
    # Database settings
    dn: olcDatabase=hdb,cn=config
    objectClass: olcDatabaseConfig
    objectClass: olcHdbConfig
    olcDatabase: {1}hdb
    olcSuffix: dc=example,dc=com
    olcDbDirectory: /var/lib/ldap
    olcRootDN: cn=admin,dc=example,dc=com
    olcRootPW: secret
    olcDbConfig: set_cachesize 0 2097152 0
    olcDbConfig: set_lk_max_objects 1500
    olcDbConfig: set_lk_max_locks 1500
    olcDbConfig: set_lk_max_lockers 1500
    olcDbIndex: objectClass eq
    olcLastMod: TRUE
    olcDbCheckpoint: 512 30
    olcAccess: to attrs=userPassword by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none
    olcAccess: to attrs=shadowLastChange by self write by * read
    olcAccess: to dn.base="" by * read
    olcAccess: to * by dn="cn=admin,dc=example,dc=com" write by * read
    

    Και προσθέστε το LDIF, δίνοντας τα εξής:

    sudo ldapadd -Y EXTERNAL -H ldapi:/// -f backend.example.com.ldif
    
  2. Do the same with the frontend.example.com.ldif file listed above, and add it:

    sudo ldapadd -x -D cn=admin,dc=example,dc=com -W -f frontend.example.com.ldif
    

    The two severs should now have the same configuration except for the Syncrepl options.

  3. Now create a file named consumer_sync.ldif containing:

    #Load the syncprov module.
    dn: cn=module{0},cn=config
    changetype: modify
    add: olcModuleLoad
    olcModuleLoad: syncprov
    
    # syncrepl specific indices
    dn: olcDatabase={1}hdb,cn=config
    changetype: modify
    add: olcDbIndex
    olcDbIndex: entryUUID eq
    -
    add: olcSyncRepl
    olcSyncRepl: rid=0 provider=ldap://ldap01.example.com bindmethod=simple binddn="cn=admin,dc=example,dc=com" 
     credentials=secret searchbase="dc=example,dc=com" logbase="cn=accesslog" 
     logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=on 
     type=refreshAndPersist retry="60 +" syncdata=accesslog
    -
    add: olcUpdateRef
    olcUpdateRef: ldap://ldap01.example.com
    

    You will probably want to change the following attributes:

    • ldap01.example.com to your server's hostname.

    • binddn

    • credentials

    • searchbase

    • olcUpdateRef:

  4. Add the LDIF file to the configuration tree:

    sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f consumer_sync.ldif
    

The frontend database should now sync between servers. You can add additional servers using the steps above as the need arises.

[Σημείωση]

Η υπηρεσία slapd στέλνει από προεπιλογή τις καταγραφές στο /var/log/syslog. Άρα, αν κάτι δεν πάει καλά, ανατρέξτε εκεί για σφάλματα και πληροφορίες αποσφαλμάτωσης. Επίσης, βεβαιωθείτε ότι κάθε εξυπηρετητής γνωρίζει το Πλήρως Ορισμένο Όνομα Τομέα(FQDN) του. Καταγράφεται στο αρχείο /etc/hosts με μια γραμμή που μοιάζει με:

127.0.0.1	ldap01.example.com ldap01

.

Ρύθμιση ACL

Η πιστοποίηση απαιτεί πρόσβαση στο πεδίο του κωδικού, που δεν πρέπει να είναι προσβάσιμο από προεπιλογή. Επίσης, για να μπορούν οι χρήστες να αλλάζουν τον κωδικό τους, χρησιμοποιώντας το passwd ή άλλα εργαλεία, θα πρέπει να αποκτάται πρόσβαση στο shadowLastChange μετά την πιστοποίηση του χρήστη.

To view the Access Control List (ACL) for the cn=config tree, use the ldapsearch utility:

sudo ldapsearch -c -Y EXTERNAL -H ldapi:///  -LLL -b cn=config olcDatabase=config olcAccess
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={0}config,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
 ,cn=auth manage by * break

To see the ACL for the frontend tree enter:

sudo ldapsearch -c -Y EXTERNAL -H ldapi:///  -LLL -b cn=config olcDatabase={1}hdb olcAccess

TLS και SSL

Κατά την πιστοποίηση σε εξυπηρετητή OpenLDAP, συνίσταται η χρήση κρυπτογραφημένης συνεδρίας. Αυτό επιτυγχάνεται μέσω της χρήσης του TLS (Transport Layer Security) ή του SSL (Secure Sockets Layer).

The first step in the process is to obtain or create a certificate. Because slapd is compiled using the gnutls library, the certtool utility will be used to create certificates.

  1. First, install gnutls-bin by entering the following in a terminal:

    sudo apt-get install gnutls-bin
    
  2. Next, create a private key for the Certificate Authority (CA):

    sudo sh -c "certtool --generate-privkey > /etc/ssl/private/cakey.pem"
    
  3. Create a /etc/ssl/ca.info details file to self-sign the CA certificate containing:

    cn = Example Company
    ca
    cert_signing_key
    
  4. Now create the self-signed CA certificate:

    sudo certtool --generate-self-signed --load-privkey /etc/ssl/private/cakey.pem \ 
     --template  /etc/ssl/ca.info --outfile /etc/ssl/certs/cacert.pem
    
  5. Make a private key for the server:

    sudo sh -c "certtool --generate-privkey > /etc/ssl/private/ldap01_slapd_key.pem"
    
    [Σημείωση]

    Replace ldap01 in the filename with your server's hostname. Naming the certificate and key for the host and service that will be using them will help keep filenames and paths straight.

  6. To sign the server's certificate with the CA, create the /etc/ssl/ldap01.info info file containing:

    organization = Example Company
    cn = ldap01.example.com
    tls_www_server
    encryption_key
    signing_key
    
  7. Create the server's certificate:

    sudo certtool --generate-certificate --load-privkey /etc/ssl/private/x01-test_slapd_key.pem \
     --load-ca-certificate /etc/ssl/certs/cacert.pem --load-ca-privkey /etc/ssl/private/cakey.pem \
     --template /etc/ssl/x01-test.info --outfile /etc/ssl/certs/x01-test_slapd_cert.pem
    

Αφού εγκατασταθούν το πιστοποιητικό, το κλειδί και η πιστοποίηση CA, χρησιμοποιήστε το ldapmodify για να προσθέσετε τις νέες επιλογές ρυθμίσεων:

sudo ldapmodify -Y EXTERNAL -H ldapi:///
Enter LDAP Password:
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap01_slapd_cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap01_slapd_key.pem

modifying entry "cn=config"

[Σημείωση]

Adjust the ldap01_slapd_cert.pem, ldap01_slapd_key.pem, and cacert.pem names if yours are different.

Στη συνέχεια, επεξεργαστείτε το /etc/default/slapd και επανενεργοποιήστε τη σχολιασμένη επιλογή SLAPD_SERVICES:

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

Τώρα, ο χρήστης του openldap χρειάζεται πρόσβαση στο πιστοποιητικό:

sudo adduser openldap ssl-cert
sudo chgrp ssl-cert /etc/ssl/private/ldap01_slapd_key.pem
sudo chmod g+r /etc/ssl/private/ldap01_slapd_key.pem
[Σημείωση]

Αν τα αρχεία /etc/ssl/private και /etc/ssl/private/server.key διαθέτουν διαφορετικά δικαιώματα, τροποποιήστε κατάλληλα τις εντολές.

Τέλος, επανεκκινήστε το slapd:

sudo /etc/init.d/slapd restart

Κανονικά, η υπηρεσία slapd θα πρέπει τώρα να αφουγκράζεται συνδέσεις LDAPS και να μπορεί να χρησιμοποιεί το STARTTLS κατά την πιστοποίηση.

[Σημείωση]

Αν δεν ξεκινά ο εξυπηρετητής, ελέγξτε το /var/log/syslog. Αν υπάρχουν λάθη του τύπου main: TLS init def ctx failed: -1, μάλλον πρόκειται για πρόβλημα ρυθμίσεων. Ελέγξτε αν το πιστοποιητικό υπογράφεται από την κατάλληλη αρχή και αν η ομάδα ssl-cert διαθέτει δικαιώματα ανάγνωσης του ιδιωτικού κλειδιού.

Αντιγραφή TLS

Αν έχετε χρησιμοποιήσει το Syncrepl για τους εξυπηρετητές σας, θα ήταν προνοητικό να κρυπτογραφείτε την κίνηση δεδομένων κατά την αντιγραφή, μέσω TLS (Transport Layer Security). Για περισσότερες λεπτομέρειες σχετικά με τη χρήση αντιγραφής, δείτε το “LDAP Replication”.

Assuming you have followed the above instructions and created a CA certificate and server certificate on the Provider server. Follow the following instructions to create a certificate and key for the Consumer server.

  1. Create a new key for the Consumer server:

    mkdir ldap02-ssl
    cd ldap02-ssl
    certtool --generate-privkey > ldap02_slapd_key.pem
    
    [Σημείωση]

    Creating a new directory is not strictly necessary, but it will help keep things organized and make it easier to copy the files to the Consumer server.

  2. Next, create an info file, ldap02.info for the Consumer server, changing the attributes to match your locality and server:

    country = US
    state = North Carolina
    locality = Winston-Salem
    organization = Example Company
    cn = ldap02.salem.edu
    tls_www_client
    encryption_key
    signing_key
    
  3. Create the certificate:

    sudo certtool --generate-certificate --load-privkey ldap02_slapd_key.pem \
     --load-ca-certificate /etc/ssl/certs/cacert.pem --load-ca-privkey /etc/ssl/private/cakey.pem \
     --template ldap02.info --outfile ldap02_slapd_cert.pem
    
  4. Copy the cacert.pem to the dicretory:

    cp /etc/ssl/certs/cacert.pem .
    
  5. The only thing left is to copy the ldap02-ssl directory to the Consumer server, then copy ldap02_slapd_cert.pem and cacert.pem to /etc/ssl/certs, and copy ldap02_slapd_key.pem to /etc/ssl/private.

  6. Once the files are in place adjust the cn=config tree by entering:

    sudo ldapmodify -Y EXTERNAL -H ldapi:///
    
    Enter LDAP Password:
    dn: cn=config
    add: olcTLSCACertificateFile
    olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
    -
    add: olcTLSCertificateFile
    olcTLSCertificateFile: /etc/ssl/certs/ldap02_slapd_cert.pem
    -
    add: olcTLSCertificateKeyFile
    olcTLSCertificateKeyFile: /etc/ssl/private/ldap02_slapd_key.pem
    
    modifying entry "cn=config"
    
    
  7. As with the Provider you can now edit /etc/default/slapd and add the ldaps:/// parameter to the SLAPD_SERVICES option.

Now that TLS has been setup on each server, once again modify the Consumer server's cn=config tree by entering the following in a terminal:

sudo ldapmodify -Y EXTERNAL -H ldapi:///
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0

dn: olcDatabase={1}hdb,cn=config
replace: olcSyncrepl
olcSyncrepl: {0}rid=0 provider=ldap://ldap01.example.com bindmethod=simple binddn="cn=ad
 min,dc=example,dc=com" credentials=secret searchbase="dc=example,dc=com" logbas
 e="cn=accesslog" logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" s
 chemachecking=on type=refreshAndPersist retry="60 +" syncdata=accesslog starttls=yes

modifying entry "olcDatabase={1}hdb,cn=config"

Αν το όνομα του εξυπηρετητή LDAP δεν αντιστοιχεί στο Πλήρως Ορισμένο Όνομα Τομέα (FQDN) του πιστοποιητικού, ίσως χρειαστεί να τροποποιήσετε το /etc/ldap/ldap.conf και να προσθέσετε τις ακόλουθες επιλογές TLS:

TLS_CERT /etc/ssl/certs/ldap02_slapd_cert.pem
TLS_KEY /etc/ssl/private/ldap02_slapd_key.pem
TLS_CACERT /etc/ssl/certs/cacert.pem

Τέλος, επανεκκινήστε το slapd σε όλους τους εξυπηρετητές:

sudo /etc/init.d/slapd restart

Πιστοποίηση LDAP

Αφού αποκτήσετε έναν λειτουργικό εξυπηρετητή LDAP, τα πακέτα auth-client-config και libnss-ldap απλοποιούν τη διαδικασία ρύθμισης ενός πελάτη Ubuntu για πιστοποίηση μέσω LDAP. Για να εγκαταστήσετε τα πακέτα από το τερματικό, εισάγετε:

sudo apt-get install libnss-ldap

Κατά τη διάρκεια της εγκατάστασης, ένα μενού διαλόγου θα σας ζητήσει τα στοιχεία σύνδεσης του εξυπηρετητή LDAP.

Αν κάνετε λάθος στην εισαγωγή των στοιχείων, μπορείτε να επανεμφανίσετε το διάλογο πληκτρολογώντας:

sudo dpkg-reconfigure ldap-auth-config

Τα αποτελέσματα των επιλογών σας στο διάλογο φαίνονται στο αρχείο /etc/ldap.conf. Αν ο εξυπηρετητής σας απαιτεί επιλογές που δεν περιλαμβάνονται στο μενού, θα χρειαστεί να επεξεργαστείτε αυτό το αρχείο.

Τώρα που έχετε ρυθμίσει το libnss-ldap, ενεργοποιήστε το προφίλ LDAP του auth-client-config, πληκτρολογώντας:

sudo auth-client-config -t nss -p lac_ldap
  • -t: τροποποιεί μόνο το /etc/nsswitch.conf.

  • -p: όνομα του προφίλ που ενεργοποιείται, απενεργοποιείται, κτλ.

  • lac_ldap: Το προφίλ του auth-client-config που περιλαμβάνεται στο πακέτο ldap-auth-config.

Χρησιμοποιώντας το εργαλείο pam-auth-update, ρυθμίστε το σύστημα ώστε να χρησιμοποιεί το LDAP για πιστοποίηση:

sudo pam-auth-update

Από το μενού του pam-auth-update, επιλέξτε LDAP, καθώς και τους υπόλοιπους μηχανισμούς πιστοποίησης που χρειάζεστε.

Κανονικά, θα μπορείτε τώρα να συνδέεστε χρησιμοποιώντας τα στοιχεία χρήστη που έχουν αποθηκευτεί στον κατάλογο LDAP.

[Σημείωση]

Αν πρόκειται να χρησιμοποιήσετε το LDAP για να αποθηκεύσετε χρήστες Samba, θα πρέπει να ρυθμίσετε τον εξυπηρετητή ώστε να κάνει πιστοποίηση μέσω LDAP. Δείτε το “Samba και LDAP” για περισσότερες λεπτομέρειες.

Διαχείριση χρηστών και ομάδων

Το πακέτο ldap-utils περιέχει διάφορα εργαλεία διαχείρισης του καταλόγου, αλλά η πληθώρα των απαιτούμενων επιλογών μπορεί να δυσκολέψει τη χρήση του. Το πακέτο ldapscripts περιέχει προσαρμόσιμα σενάρια που επιτρέπουν την εύκολη διαχείριση των χρηστών και ομάδων του LDAP.

Για να εγκαταστήσετε το πακέτο από το τερματικό, εισάγετε:

sudo apt-get install ldapscripts

Στη συνέχεια, τροποποιήστε το αρχείο ρυθμίσεων /etc/ldapscripts/ldapscripts.conf, επανενεργοποιώντας τις σχολιασμένες γραμμές και τροποποιώντας τα παρακάτω, ανάλογα με το περιβάλλον σας:

SERVER=localhost
BINDDN='cn=admin,dc=example,dc=com'
BINDPWDFILE="/etc/ldapscripts/ldapscripts.passwd"
SUFFIX='dc=example,dc=com'
GSUFFIX='ou=Groups'
USUFFIX='ou=People'
MSUFFIX='ou=Computers'
GIDSTART=10000
UIDSTART=10000
MIDSTART=10000

Τώρα, δημιουργήστε το αρχείο ldapscripts.passwd για να επιτρέψετε την πιστοποιημένη πρόσβαση στον κατάλογο:

sudo sh -c "echo -n 'secret' > /etc/ldapscripts/ldapscripts.passwd"
sudo chmod 400 /etc/ldapscripts/ldapscripts.passwd
[Σημείωση]

Αντικαταστήστε το “secret” με τον κωδικό του διαχειριστή LDAP.

To ldapscripts είναι πλέον έτοιμο να σας βοηθήσει να διαχειριστείτε τον κατάλογό σας. Ακολουθούν ορισμένα παραδείγματα χρήσης των σεναρίων:

  • Δημιουργία νέου χρήστη:

    sudo ldapadduser george example
    

    Δημιουργεί χρήστη με uid george και ορίζει την example ως πρωτεύουσα ομάδα του χρήστη (gid).

  • Αλλαγή κωδικού χρήστη:

    sudo ldapsetpasswd george
    Changing password for user uid=george,ou=People,dc=example,dc=com
    New Password: 
    New Password (verify): 
    
  • Διαγραφή χρήστη:

    sudo ldapdeleteuser george
    
  • Προσθήκη ομάδας:

    sudo ldapaddgroup qa
    
  • Διαγραφή ομάδας:

    sudo ldapdeletegroup qa
    
  • Προσθήκη χρήστη σε ομάδα:

    sudo ldapaddusertogroup george qa
    

    Θα πρέπει να έχει εμφανιστεί ένα γνώρισμα memberUid για την ομάδα qa, με τιμή george.

  • Αφαίρεση χρήστη από ομάδα:

    sudo ldapdeleteuserfromgroup george qa
    

    Το γνώρισμα memberUid θα πρέπει να έχει αφαιρεθεί από την ομάδα qa.

  • Το σενάριο ldapmodifyuser σας επιτρέπει να προσθέτετε, να αφαιρείτε και να αντικαθιστάτε τα γνωρίσματα ενός χρήστη. The Το σενάριο αυτό χρησιμοποιεί την ίδια σύνταξη με το ldapmodify. Π.χ.:

    sudo ldapmodifyuser george
    # Θα τροποποιηθεί η ακόλουθη εγγραφή :
    dn: uid=george,ou=People,dc=example,dc=com
    objectClass: account
    objectClass: posixAccount
    cn: george
    uid: george
    uidNumber: 1001
    gidNumber: 1001
    homeDirectory: /home/george
    loginShell: /bin/bash
    gecos: george
    description: User account
    userPassword:: e1NTSEF9eXFsTFcyWlhwWkF1eGUybVdFWHZKRzJVMjFTSG9vcHk=
    
    # Εισάγετε τις αλλαγές σας εδώ και τελειώστε με CTRL-D.
    dn: uid=george,ou=People,dc=example,dc=com
    replace: gecos
    gecos: George Carlin
    

    Το gecos θα πρέπει να έχει γίνει “George Carlin”.

  • Άλλο ένα σημαντικό χαρακτηριστικό του ldapscripts είναι το σύστημα προτύπων. Τα πρότυπα σας επιτρέπουν να προσαρμόζετε τα γνωρίσματα των αντικειμένων των χρηστών, ομάδων και μηχανημάτων σας. Π.χ., για να ενεργοποιήσετε το πρότυπο χρήστη, τροποποιήστε το /etc/ldapscripts/ldapscripts.conf, αλλάζοντας τα παρακάτω:

    UTEMPLATE="/etc/ldapscripts/ldapadduser.template"
    

    Στον κατάλογο /etc/ldapscripts υπάρχουν δείγματα προτύπων. Αντιγράψτε ή μετονομάστε το αρχείο ldapadduser.template.sample σε /etc/ldapscripts/ldapadduser.template:

    sudo cp /etc/ldapscripts/ldapadduser.template.sample /etc/ldapscripts/ldapadduser.template
    

    Επεξεργαστείτε το νέο πρότυπο και προσθέστε τα επιθυμητά γνωρίσματα. Στο παράδειγμα που ακολουθεί δημιουργείται νέος χρήστης με objectClass inetOrgPerson:

    dn: uid=<user>,<usuffix>,<suffix>
    objectClass: inetOrgPerson
    objectClass: posixAccount
    cn: <user>
    sn: <ask>
    uid: <user>
    uidNumber: <uid>
    gidNumber: <gid>
    homeDirectory: <home>
    loginShell: <shell>
    gecos: <user>
    description: User account
    title: Employee
    

    Σημείώστε την επιλογή <ask> που χρησιμοποιείται για την τιμή cn. Η χρήση του <ask> ρυθμίζει το ldapadduser ώστε να ζητά την τιμή του γνωρίσματος κατά τη δημιουργία χρηστών.

Το πακέτο περιέχει και άλλα χρήσιμα σενάρια. Μπορείτε να δείτε τον πλήρη κατάλογο εισάγοντας: dpkg -L ldapscripts | grep bin

Πόροι

  • The OpenLDAP Ubuntu Wiki page has more details.

  • Για περισσότερες πληροφορίες ανατρέξτε στην ιστοσελίδα του OpenLDAP.

  • Αν και έχει αρχίσει να φαίνεται η ηλικία του, το LDAP System Administration του οίκου O'Reilly αποτελεί εξαιρετικό πηγή για εις βάθος πληροφόρηση σχετικά με το LDAP.

  • Το Mastering OpenLDAP του οίκου Packt είναι ένα εξαιρετικό εγχειρίδιο αναφοράς για τις νεότερες εκδόσεις του OpenLDAP.

  • Για περισσότερες πληροφορίες σχετικά με το auth-client-config δείτε τη σελίδα τεκμηρίωσης (man) του: man auth-client-config.

  • Για περισσότερες λεπτομέρειες σχετικά με το πακέτο ldapscripts δείτε τις σελίδες τεκμηρίωσης (man): man ldapscripts, man ldapadduser, man ldapaddgroup, κτλ.