====== MDS ====== Objectif: une interface cool pour LDAP... parce que LDAP, c'est inbitable et indispensable. Liens: *http://www.howtoforge.com/mandriva-directory-server-on-debian-etch *http://www.vogelweith.com/debian_server/050_openldap.php *http://www.otasc.org/tuts_linux/openldap/index.html # 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 ... ... 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:: 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" ... ... 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: ... ... 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 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... | :!: A noter: le mot de passe n'est pas retourné ! (sans doute en relation avec les schémas) | | :!: **''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 | :!: Sorte de recherche "polonaise". operateur(a)(b) | ====== 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 ===== Lien: http://www.free-4ever.info/index.php/Openldap:configuration_slapd_standard ==== creer CA ==== Source: *http://mathiaz.com/index.php?n=AdministrationLinux.Ldap *http://www.free-4ever.info/index.php/Openssl:Creation_du_CA # 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 | :!: la pass-phrase est obligatoire ! donc, bien la choisir pour s'en souvenir ! | "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...