Hits : **{{hits}}**
{{anchor href="top"}}
== openLDAP :: Centralized Authentication ==
{{ToC from="h2" to="h4"}}
=== 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))
-----------