Hits :
4799
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. Βασικά αρχεία ρύθμισης
- /etc/openldap/slapd.conf
- /etc/nslcd.conf
- /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