Hits : 4832


openLDAP :: Centralized Authentication


openLDAP


http://www.openldap.org/

A Quick-Start Guide


http://www.openldap.org/doc/admin24/quickstart.html


top


Αυθεντικοποίηση Χρηστών μέσω LDAP


[ Οι οδηγίες γράφτηκαν Δεκ 2013 χρησιμοποιώντας archlinux ]


top



1. Εγκατάσταση OpenLDAP


# pacman -S openldap nss-pam-ldapd


top


2. Έλεγχος έκδοσης


# /usr/bin/slapd -VVV
@(#) $OpenLDAP: slapd 2.4.38 (Nov 20 2013 22:51:42) $
	nobody@mnt-storage-buildroots-extra-x86_64-eric:/build/openldap/src/openldap-2.4.38/servers/slapd

Included static backends:
    config
    ldif
    monitor
    bdb
    hdb
    mdb
    relay


# /usr/bin/nslcd --version
nss-pam-ldapd 0.8.13
Written by Luke Howard and Arthur de Jong.

Copyright (C) 1997-2013 Luke Howard, Arthur de Jong and West Consulting
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


top



3. Βασικά αρχεία ρύθμισης


  1. /etc/openldap/slapd.conf
  2. /etc/nslcd.conf
  3. /etc/nsswitch.conf

top



4. slapd.conf


Για την δημιουργία των χρηστών στον ldap πρέπει να προσομοιώσουμε τα πεδία ενός χρήστη από τα αρχεία passwd, group & shadow σε ldap attributes. Για να γίνει αυτό, θα πρέπει να προσθέσουμε στον ldap τα απαραίτητα "σχήματα" – αρχεία.


include     /etc/openldap/schema/cosine.schema
include     /etc/openldap/schema/inetorgperson.schema
include     /etc/openldap/schema/nis.schema

Έπειτα πρέπει να ορίσουμε την "βάση του καταλόγου" μας και τον διαχειριστή αυτής:
suffix      "dc=mydomain,dc=lan"
rootdn      "cn=admin,dc=mydomain,dc=lan"

Θα πρέπει να αντικαταστήσουμε το default συνθηματικό του rootdn:
# slappasswd 
New password: [admin]
Re-enter new password: [admin]
{SSHA}3ZD5fVfs+/ZYe9SdQEd2+txGusdF8/Y1

Αντικαθιστούμε το "{SSHA}3ZD5fVfs+/ZYe9SdQEd2+txGusdF8/Y1" με το secret


top



5. Δικαιώματα και κατάλογοι


Για να κάνουμε τις πρώτες δοκιμές μας, πληκτρολογούμε την παρακάτω εντολή:

# slaptest -f /etc/openldap/slapd.conf


Εάν μας βγάλει το παρακάτω μήνυμα λάθους:

"no DB_CONFIG file found in directory /var/lib/openldap/openldap-data"

πρέπει να δημιουργήσουμε το απαραίτητο αρχείο:
# cp /var/lib/openldap/openldap-data/DB_CONFIG.example /var/lib/openldap/openldap-data/DB_CONFIG

Για να ξεκινήσουμε τον δαίμονα openldap σε debug mode θα πρέπει να τρέξουμε την παρακάτω εντολή:
# /usr/bin/slapd -u ldap -g ldap -d 1 -4

Μερικές ενέργειες που πρέπει να κάνουμε:


Δημιουργία του καταλόγου: /run/openldap/ κι αλλαγή δικαιωμάτων στον χρήστη ldap σε όλους τους relative openldap καταλόγους:

# mkdir -pv /run/openldap/

# chown -R ldap:ldap /var/lib/openldap/ /etc/openldap/ /run/openldap/

Αφού γίνουν όλα αυτά, και τρέξουμε τον openldap daemon, θα δημιουργηθούν όλα τα κατάλληλα bdb αρχεία. Τα bdb αρχεία (berkeley database files) αποτελούν το backend του openldap για το directory informational structure που έχουμε.


top



6. Έλεγχος λειτουργίας του openldap

# ldapsearch -LLL -x -b '' -s base '(objectclass=*)' namingContexts 
dn:
namingContexts: dc=mydomain,dc=lan

Το slaptest θα πρέπει να μας επιστρέψει το εξής:
# slaptest -f /etc/openldap/slapd.conf
config file testing succeeded

top



7. base


Η εισαγωγή/εξαγωγή δεδομένων/πληροφοριών στον ldap γίνεται μέσω text based αρχείων που ονομάζονται ldif (LDAP Data Interchange Format).


Για να δημιουργήσουμε την απαραίτητη δομή αποθηκεύουμε τις παρακάτω γραμμές σε ένα text αρχείο, έστω: base.ldif

# mydomain.lan
dn: dc=mydomain,dc=lan
dc: mydomain
o: mydomain Organization
objectClass: dcObject
objectClass: organization

# admin, mydomain.lan
dn: cn=admin,dc=mydomain,dc=lan
cn: admin
description: LDAP administrator
objectClass: organizationalRole
objectClass: top
roleOccupant: dc=mydomain,dc=lan

και το εισάγουμε στον ldap με την παρακάτω εντολή:
# ldapmodify -a -f base.ldif -D "dc=admin,dc=mydomain,dc=lan" -W
Enter LDAP Password: [admin]


Μπορούμε να το επιβεβαιώσουμε με το εξής:

# ldapsearch -LLL -x -D "cn=admin,dc=mydomain,dc=lan" -b "dc=mydomain,dc=lan" -W
Enter LDAP Password: [admin]
dn: dc=mydomain,dc=lan
dc: mydomain
o: mydomain Organization
objectClass: dcObject
objectClass: organization

dn: cn=admin,dc=mydomain,dc=lan
cn: admin
description: LDAP administrator
objectClass: organizationalRole
objectClass: top
roleOccupant: dc=mydomain,dc=lan

top



8. user/group ldif


Έπειτα θα πρέπει να δημιουργήσουμε την δομή για τους χρήστες και τις ομάδες. Όταν ολοκληρωθεί αυτό οι χρήστες που θα φτιάξουμε, θα μπορούν να ανήκουν (όπως δλδ και οι φυσικοί χρήστες) σε users/groups.


Ας δημιουργήσουμε το user_group.ldif

# user @ mydomain.lan
dn: ou=user,dc=mydomain,dc=lan
ou: user
objectClass: top
objectClass: organizationalUnit

# group @ mydomain.lan
dn: ou=group,dc=mydomain,dc=lan
ou: group
objectClass: top
objectClass: organizationalUnit

# ldapmodify -a -f user_group.ldif -D "cn=admin,dc=mydomain,dc=lan" -W
Enter LDAP Password: [admin]
adding new entry "ou=user,dc=mydomain,dc=lan"

adding new entry "ou=group,dc=mydomain,dc=lan"


Μπορούμε να επιβεβαιώσουμε με την παραπάνω ldapsearch εντολή.


top



9. users ldif


Δημιουργούμε το users.ldif – θα περιέχει όλες τις απαραίτητες πληροφορίες για να εισάγουμε έναν virtual χρήστη.

dn: uid=ebal2,ou=user,dc=mydomain,dc=lan
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
# posixAccount
# Must Have
uid: ebal2
uidNumber: 9999
gidNumber: 9999
homeDirectory: /home/ebal2/
cn: Evaggelos Balaskas
loginShell: /bin/bash
# shadowAccount
# Must Have
userPassword: test

dn: cn=ebal2,ou=group,dc=mydomain,dc=lan
objectClass: top
objectClass: posixGroup
# Must Have
cn: ebal2
gidNumber: 9999
# May Have
## description: This is ebal2 group
## memberUid: 500

και περνάμε τα στοιχεία με την παρακάτω εντολή:
# ldapmodify -a -f users.ldif -D "cn=admin,dc=mydomain,dc=lan" -W
Enter LDAP Password:
adding new entry "uid=ebal2,ou=user,dc=mydomain,dc=lan"

adding new entry "cn=ebal2,ou=group,dc=mydomain,dc=lan"

επιβεβαιώνουμε με την παραπάνω ldapsearch εντολή.


top



10. nslcd – nss-pam-ldapd


http://arthurdejong.org/nss-pam-ldapd/


Το πρόγραμμα αυτό (nss-pam-ldapd) μας προσφέρει την διασύνδεση μεταξύ του pluggable authentication module (PAM) και του openLDAP. To PAM είναι ένας μηχανισμός για να μεταφέρουμε/υλοποιήσουμε το κομμάτι της αυθεντικοποίησης σε ένα πρόγραμμα (όπως είναι το login,sudo ή το ssh) με το σύστημά μας. Έτσι για να "δει" ένα από τα παραπάνω προγράμματα τους χρήστες που έχουμε υλοποιήσει στον openLDAP χρειάζεται να γίνει μέσα από το nss-pam-ldapd.


To nss-pam-ldapd ενεργοποιεί ένα service, που εκτελείται στο background μας. Το βασικό του αρχείο ρυθμίσεων είναι το /etc/nslcd.conf και χρειάζεται ελάχιστες ρυθμίσεις από εμάς.

# grep -Ev '^$|#' /etc/nslcd.conf
uid nslcd
gid nslcd
uri ldap://127.0.0.1/
base dc=mydomain,dc=lan

Εάν θέλουμε να τρέξει στο προσκήνιο σε debug mode πληκτρολογούμε το παρακάτω:
# /usr/bin/nslcd -d

top



11. Name Service Switch


Χρειάζεται να επεξεργαστούμε το αρχείο: /etc/nsswitch.conf ώστε να δείχνει ως εξής:

passwd: files ldap
group:  files ldap
shadow: files ldap

Με αυτό το τρόπο το σύστημά μας θα γνωρίζει ότι όταν θα χρειαστεί εκτός από τα αρχεία /etc/passwd /etc/group & /etc/shadow να ρωτήσει και τον ldap. Οι ερωτήσεις φυσικά θα γίνουν μέσω του nslcd


top



12. getent


Με την χρήση του getent (get entries from Name Service Switch libraries) θα επιβεβαιώσουμε ότι υπάρχει επικοινωνία και μπορούμε να μιλήσουμε με τον openLDAP από το σύστημά μας. Για το παράδειγμά μας θα πρέπει να φέρει τα παρακάτω αποτελέσματα:

# getent passwd | grep ebal2
ebal2:x:9999:9999:Evaggelos Balaskas:/home/ebal2/:/bin/bash

# getent group | grep ebal2
ebal2:*:9999:

# getent shadow | grep ebal2
ebal2:*:::::::0

top


13. PAM 


Είμαστε έτοιμοι για να τροποποιήσουμε τα απαραίτητα service pam configuration files για να "συνδέσουμε" τις υπηρεσίες που θέλουμε να μιλάνε με ldap. Κάθε διανομή μπορεί να έχει τις δικές της "ιδιαιτερότητες" μα η βασική αρχή είναι μια. Χρειάζεται να προσθέσουμε τις απαραίτητες ρυθμίσεις ώστε:


a. Να μπορεί να κάνει local login
b. Να μπορεί να αλλάξει το συνθηματικό του
c. Να μπορεί να συνδεθεί μέσω ssh
d. Να μπορεί κάποιος να αλλάξει σε αυτόν τον χρήστη (su)


Η βασική αρχή είναι πριν από κάθε pam_unix.so να προσθέσουμε το 

SERVICE        sufficient  pam_ldap.so


a. /etc/pam.d/login


διαβάζοντας προσεκτικά, θα δούμε ότι κάνει include το system-local-login, το οποίο με την σειρά του καλεί το system-login


Για το συνθηματικό θα δούμε ότι καλεί το system-auth
Οπότε κι αρκεί να επεξεργαστούμε το τελευταίο αρχείο κατάλληλα:


/etc/pam.d/system-auth

auth    sufficient  pam_ldap.so
account sufficient  pam_ldap.so
password    sufficient  pam_ldap.so
session sufficient  pam_ldap.so

b. /etc/pam.d/passwd
password    sufficient  pam_ldap.so

(δες 14.)


c. /etc/pam.d/sshd


Δεν χρειάζεται να κάνουμε κάτι, γιατί καλεί το system-remote-login που καλεί το system-login που όπως είδαμε και παραπάνω καλεί το system-auth


d.
Πρακτικά πρέπει και τα δύο αρχεία να είναι πανομοιότυπα.
Πριν από κάθε pam_unix.so (auth,account & session) προσθέτουμε τα παρακάτω:

auth        sufficient  pam_ldap.so
account     sufficient  pam_ldap.so
session     sufficient  pam_ldap.so

1. /etc/pam.d/su-l
[~]> su ebal2
[password: test]

2. /etc/pam.d/su-l


και δοκιμάζουμε ως εξής:

[~]> su - ebal2
[password: test]


top


14. Αλλαγή συνθηματικού


Για να μπορούμε να αλλάξουμε το συνθηματικό ενός ldap account μέσω της εντολής passwd, θα πρέπει να έχουμε πρόσβαση στο πεδίο userPassword. Το πεδίο αυτό ναι μεν είναι encrypt αλλά δεν σημαίνει ότι θέλουμε να δώσουμε πρόσβαση σε όλους ώστε να μπορούν να το διαβάσουν.


ΠΡΟΣΟΧΗ: ο χρήστης rootDN έχει πρόσβαση σε όλα


έτσι στο αρχείο: /etc/openldap/slapd.conf


πρέπει να προσθέσουμε τα παρακάτω:

access to attrs=userPassword
    by self write
    by anonymous auth
    by * none

access to *
    by self write
    by * read

και να κάνουμε restart το openldap service.


# systemctl restart slapd.service


top