Table des matières
MDS
Objectif: une interface cool pour LDAP… parce que LDAP, c'est inbitable et indispensable.
Liens:
# aptitude install openssl
# aptitude install libapache2-mod-php5 apache2
# aptitude install mmc-agent mmc-web-base
$ python -c 'print "{base64}"+"secret".encode("base64")' {base64}c2VjcmV0
ou
echo "{base64}"$( echo -n "secret" | openssl base64 ) {base64}c2VjcmV0
LDAP
LDAP, c'est un annuaire humainement illisible… heureusement, on a inventé l'informatique.
Ce qu'est LDAP: *http://fr.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol
Un serveur LDAP ouvert: *http://fr.wikipedia.org/wiki/OpenLDAP
Une interface humaine pour OpenLDAP: *http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page
Linux Mag: http://articles.mongueurs.net/magazines/linuxmag65.html
Installer
# aptitude install slapd ldap-utils
La config demande le mot de passe de l'“administrateur” .
Je ne rêve pas et j'entre un mot de passe…
Ca semble en place…
# netstat -anp tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 1515/slapd tcp6 0 0 :::389 :::* LISTEN 1515/slapd
La config brut:
# slapcat dn: dc=thierry-jaouen,dc=local objectClass: top objectClass: dcObject objectClass: organization o: thierry-jaouen.local dc: thierry-jaouen ... <snip> ...
Mais il y a plusieurs problèmes:
- la terre entière (ou juste le LAN) a accès à l'annuaire
- la communication n'est pas crypté
- l'usage d'ip6 me deplait… c'est comme ça…
Et enfin: l'installation a créé la base avec “dn: dc=thierry-jaouen,dc=local”, alors que j'aurai préféré:
dn: dc=mds,dc=thierry-jaouen,dc=local
Ce qui est correct, notamment vis a vis du nom de ma machine… mais bon, tant pis… on corrigera cela plus tard.
D'aprés http://damstux.free.fr/wiki/index.php?title=Slapd.conf , modifier la config de /etc/lapd/slapd.conf
, afin d'avoir:
rootdn "cn=admin,dc=thierry-jaouen,dc=local" rootpw {SSHA}+JPSGOfcc9RlZn4R0giSQhrQ/91MiMjY
Le “password” est le même que celui tapé lors de l'installation du package.
Utiliser slappassword
pour obtenir un hash du password:
# slappasswd New password: Re-enter new password: {SSHA}+JPSGOfcc9RlZn4R0giSQhrQ/91MiMjY
Premier test illisible:
$ ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts # extended LDIF # # LDAPv3 # base <> with scope baseObject # filter: (objectclass=*) # requesting: namingContexts # # dn: namingContexts: dc=thierry-jaouen,dc=local # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
On dirait que ca fonctionne en local…
Mais aussi en distant:
$ ldapsearch -x -H ldap://mds.thierry-jaouen.local -b '' -s base '(objectclass=*)' namingContexts
Mouai…
log
voir un peu ce que fait “slapd”:
Dans /etc/syslog.conf
, ajouter une ligne comme ça:
# TJ ------------ local4.* /var/log/ldap.log # ---------------
Recharger la conf:
# /etc/init.d/sysklogd reload
Dans /etc/ldap/slapd.conf
, ajouter/modifier une ligne comme ça:
# Read slapd.conf(5) for possible values # TJ ---------------- #loglevel 0 loglevel 256 # -------------------
Redemarrer slapd
:
# /etc/init.d/slapd restart
slapcat
# slapcat /etc/ldap/slapd.conf: line 106: rootdn is always granted unlimited privileges. /etc/ldap/slapd.conf: line 123: rootdn is always granted unlimited privileges. dn: dc=thierry-jaouen,dc=local objectClass: top objectClass: dcObject objectClass: organization o: thierry-jaouen.local dc: thierry-jaouen structuralObjectClass: organization entryUUID: ab4a2f36-c138-102d-9f24-d35daac5390f creatorsName: modifiersName: createTimestamp: 20090419141816Z modifyTimestamp: 20090419141816Z entryCSN: 20090419141816Z#000000#00#000000 dn: cn=admin,dc=thierry-jaouen,dc=local objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: <XXXXXXXXXXXXXXXXXXXX> structuralObjectClass: organizationalRole entryUUID: ab4e74f6-c138-102d-9f25-d35daac5390f creatorsName: modifiersName: createTimestamp: 20090419141816Z modifyTimestamp: 20090419141816Z entryCSN: 20090419141816Z#000001#00#000000
Je suppose qu'un arbre existe déjà…
Insertions par l'exemple
creer 2 "ou"
“Perso” et “Boulot”.
Créons un fichier “ou.dif” comme cela:
dn: ou=Perso,dc=thierry-jaouen,dc=local ou: Perso objectclass: top objectclass: organizationalUnit dn: ou=Boulot,dc=thierry-jaouen,dc=local ou: Boulot objectclass: top objectclass: organizationalUnit dn: ou=Boursorama,ou=Boulot,dc=thierry-jaouen,dc=local ou: Boursorama objectclass: top objectclass: organizationalUnit dn: ou=Google,ou=Boulot,dc=thierry-jaouen,dc=local ou: Google objectclass: top objectclass: organizationalUnit
Et dans “Boulot”, j'ajoute une “ou” pour “Boursorama” et “Google”.
On y va:
$ ldapadd -x -h localhost -D "cn=admin,dc=thierry-jaouen,dc=local" -W -f ou.dif Enter LDAP Password: adding new entry "ou=Perso,dc=thierry-jaouen,dc=local" ... <snip> ...
Aprés avoir entré le mot de passe “admin”…
Ca marche aussi a distance comme ça:
$ ldapadd -x -H ldap://mds.thierry-jaouen.local -D "cn=admin,dc=thierry-jaouen,dc=local" -W -f ou.dif
slapcat
nous montre bien l'ajout:
... <snip> ... dn: ou=Perso,dc=thierry-jaouen,dc=local ou: Perso objectClass: top objectClass: organizationalUnit structuralObjectClass: organizationalUnit entryUUID: f0fdcdf6-c144-102d-8f2a-31423ce7aaa2 creatorsName: cn=admin,dc=thierry-jaouen,dc=local createTimestamp: 20090419154607Z entryCSN: 20090419154607Z#000000#00#000000 modifiersName: cn=admin,dc=thierry-jaouen,dc=local modifyTimestamp: 20090419154607Z
ajoutons des uid
Enfin, on ajouter des gens dans l'annuaire.
Toujours en composant un DIF, par exemple: persos.dif
dn: uid=pascal,ou=Perso,dc=thierry-jaouen,dc=local objectClass: top objectClass: Person objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount userPassword: secret uid: pascal uidNumber: 10001 cn: pascal loginShell: /bin/bash gidNumber: 10513 description: Un copain d'avant homeDirectory: /home/pascal sn: pascal
Etc…
Et on ajoute (a distance):
$ ldapadd -x -H ldap://mds.thierry-jaouen.local -D "cn=admin,dc=thierry-jaouen,dc=local" -W -f persos.dif Enter LDAP Password: adding new entry "uid=pascal,ou=Perso,dc=thierry-jaouen,dc=local" ... etc ....
On peut faire une recherche dedans, maintenant:
$ ldapsearch -x -H ldap://mds.thierry-jaouen.local -b 'ou=Perso,dc=thierry-jaouen,dc=local' '(objectclass=*)' # extended LDIF # # LDAPv3 # base <ou=Perso,dc=thierry-jaouen,dc=local> with scope subtree # filter: (objectclass=*) # requesting: ALL # # Perso, thierry-jaouen.local dn: ou=Perso,dc=thierry-jaouen,dc=local ou: Perso objectClass: top objectClass: organizationalUnit # pascal, Perso, thierry-jaouen.local dn: uid=pascal,ou=Perso,dc=thierry-jaouen,dc=local objectClass: top objectClass: person objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: pascal uidNumber: 10001 cn: pascal loginShell: /bin/bash gidNumber: 10513 description: Un copain d'avant homeDirectory: /home/pascal sn: pascal
Etc…
|
slapcat retourne bien les mots de passe, mais passé à sauce “crypt” |
Par contre, une recherche en tant qu'admin
retourne bien les mots de passes:
$ ldapsearch -x -H ldap://mds.thierry-jaouen.local -D "cn=admin,dc=thierry-jaouen,dc=local" -W -b 'ou=Perso,dc=thierry-jaouen,dc=local' '(objectclass=*)'
recherches
La liste des “ou” :
$ ldapsearch -s sub -x -H ldap://mds.thierry-jaouen.local -b 'dc=thierry-jaouen,dc=local' '(ou=*)' -LLL dn dn: ou=Perso,dc=thierry-jaouen,dc=local dn: ou=Boulot,dc=thierry-jaouen,dc=local dn: ou=Boursorama,ou=Boulot,dc=thierry-jaouen,dc=local dn: ou=Google,ou=Boulot,dc=thierry-jaouen,dc=local
“-LLL” permet de virer les commentaires |
“dn” permet de ne retourner que la ligne “dn” |
$ ldapsearch -s sub -x -H ldap://mds.thierry-jaouen.local -b 'dc=thierry-jaouen,dc=local' '(objectclass=posixAccount)' -LLL dn dn: uid=pascal,ou=Perso,dc=thierry-jaouen,dc=local dn: uid=chiroki,ou=Perso,dc=thierry-jaouen,dc=local dn: uid=fab4,ou=Perso,dc=thierry-jaouen,dc=local
Ou…
$ ldapsearch -s sub -x -H ldap://mds.thierry-jaouen.local -b 'dc=thierry-jaouen,dc=local' '(|(uid=fab4)(uid=pascal))' -LLL dn dn: uid=pascal,ou=Perso,dc=thierry-jaouen,dc=local dn: uid=fab4,ou=Perso,dc=thierry-jaouen,dc=local
|
TLS/SSL ou LDAPS
Comment chiffrer les communications… je cherche encore.
Lien a voir: http://www.labo-linux.org/articles-fr/gestion-centralisee-des-comptes/le-serveur-ldap
SSL
creer CA
Source:
# dpkg -S CA.pl openssl: /usr/share/man/man1/CA.pl.1ssl.gz openssl: /usr/share/doc/openssl/doc/apps/CA.pl.pod.gz openssl: /usr/lib/ssl/misc/CA.pl
Ce script “CA.pl” va permettre de creer un certificat auto-signé et fier de l'être.
# mkdir /etc/ldap/ssl # cd /etc/ldap/ssl # /usr/lib/ssl/misc/CA.pl -newca
|
“Notre CA est maintenant prêt à être utilisé pour générer des certificats ! ”
Il est dans ./demoCA/cacert.pem
Pour la suite, on le copiera dans /etc/ldap/ssl
:
# cp ./demoCA/cacert.pem .
( Mais faites comme vous voulez, tant que vous adaptez la configuration en conséquence )
server
On va générer un certificat pour le serveur: (toujours dans /etc/ldap/ssl
)
# openssl genrsa -out server.key 1024 # openssl req -new -key server.key -out server.req # openssl ca -in server.req -extensions v3_ca -out server.pem -days 3650
Le nom server
importe peu…
Par contre, le “Common Name” doit être le nom de l'hôte, c'est à dire:
# hostname -f mds.thierry-jaouen.local
Sinon, “slapd” va mystérieusement refuser toutes connexions TLS/SSL !
client
Cerise sur le cake, on peut générer des certificats pour les clients, en changeant simplement “server” par le nom qu'on veut.
configuration simple
serveur
Dans /etc/ldap/slapd.conf
, mettre:
TLSCACertificateFile /etc/ldap/ssl/cacert.pem #TLSCertificateFile /etc/ldap/ssl/cacert.pem TLSCertificateFile /etc/ldap/ssl/server.pem TLSCertificateKeyFile /etc/ldap/ssl/server.key
Confusion étrange entre “TLSCACertificatFile” et “TLSCertificateFile” ….
client
Dans /etc/ldap/ldap.conf
, mettre:
TLS_CACERT /etc/ldap/ssl/cacert.pem
test
A partir du client:
$ ldapsearch -s sub -x -H ldaps://mds.thierry-jaouen.local -b 'dc=thierry-jaouen,dc=local' '(ou=*)' -LLL dn
Ok
Alors que:
$ ldapsearch -s sub -x -H ldap://mds.thierry-jaouen.local:636 -ZZ -b 'dc=thierry-jaouen,dc=local' '(ou=*)' -LLL dn ldap_start_tls: Can't contact LDAP server (-1)
Etrange, ca me semblait équivalent… Le port “636” etant le port “ldaps” et “-ZZ”, forcant le TLS/SSL…
configuration complete
Serveur et Client avec des certificats… on peut rever…