404Blog

28 February , 2012
by seynhaeve
0 comments

OpenLDAP 2.4.23 Centos 6.2 replication

Objectifs

Mettre en place un “réplica” du provider que nous avons configuré dans le post précédent: http://www.404blog.net/?p=253

Informations sur la réplication

Sous Centos, slapd a été compilé avec un support pour des overlays chargés dynamiquement. Ces overlays permettent de modifier le comportement de notre backend, BDB dans notre cas. Pour rendre la réplication possible, nous allons charger l’overlay Sync Provider sur notre provider qui active la synchronisation du contenu et la réplication (syncrepl).

Pour plus d’info: man slapd.overlays, man slapo-syncprov

Nous allons voir 2 modes de réplications: RefreshOnly (pull-based) et RefreshAndPersist (push-based). Dans les 2 cas, la connexion est initiée depuis le consumer vers le provider.
Le mode de réplication est configuré directement sur notre consumer.

Provider

Nous allons ajouter un utilisateur replicator qui aura un accès en lecture sur tout l’arbre LDAP. C’est cet utilisateur qui sera utilisé par le consumer afin de récupérer les données à répliquer.

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/replicator.ldif
dn: cn=replicator,dc=zz
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: replicator
description: replicator
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxx

[root@ldap-provider2 ~]# ldapadd -x -D "cn=admin,dc=zz" -W -f /etc/openldap/ldif/replicator.ldif -Z

L’utilisateur replicator doit avoir un droit en lecture sur tout notre arbre LDAP.

On supprime tout d’abord les droits d’accès configurés précédemment:

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/del-access.ldif
dn: olcDatabase={2}bdb,cn=config
delete: olcAccess
olcAccess: to attrs=userPassword by self write by anonymous auth by * none
olcAccess: to * by * read

[root@ldap-provider2 ~]# ldapmodify -Y EXTERNAL -H ldapi:// -f /etc/openldap/ldif/del-access.ldif

On ajoute ensuite les nouveaux droits d’accès en incluant replicator. Dans le LDIF ci-dessous les utilisateurs peuvent modifier leur propre mot de passe, replicator à un accès en lecture à l’attribut userPassword, les utilisateurs anonymes n’ont pas accès à cet attribut. La ligne suivante indique que tous les autres attributs sont accessibles en lecture pour tout le monde.

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/access-replicator.ldif
dn: olcDatabase={2}bdb,cn=config
add: olcAccess
olcAccess: to attrs=userPassword by self write by dn="cn=replicator,dc=zz" read by anonymous auth by * none
olcAccess: to * by * read

[root@ldap-provider2 ~]# ldapmodify -Y EXTERNAL -H ldapi:// -f /etc/openldap/ldif/access-replicator.ldif

Test du compte replicator pour voir si il a accès aux données du provider:

[root@ldap-provider2 ~]# ldapsearch -x -D "cn=replicator,dc=zz" -W -ZZ

Si notre configuration est correcte, l’utilisateur replicator devrait pouvoir afficher l’attribut userPassword des utilisateurs.

On configure ensuite la réplication en chargeant le module qui se trouve dans le répertoire /usr/lib64/openldap sur le provider:

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/modules.ldif
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModuleLoad: {0}back_bdb
olcModuleLoad: {1}syncprov
olcModulePath: /usr/lib64/openldap

[root@ldap-provider2 ~]# ldapadd -Y external -H ldapi:/// -f /etc/openldap/ldif/modules.ldif

On ajoute la configuration:

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/overlay.ldif
dn: olcOverlay={0}syncprov,olcDatabase={2}bdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100

Les informations sur olcSpCheckpoint & olcSpSessionlog se trouvent dans la man page de slapo-syncprov

[root@ldap-provider2 ~]# ldapadd -Y external -H ldapi:/// -f /etc/openldap/ldif/overlay.ldif

Consumer

Pour que la replication se déroule convenablement, assurez-vous d’avoir les mêmes schémas sur le provider et le consumer. Si vous avez ajouté le schéma samba sur votre provider mais que vous ne l’avez pas fait sur votre consumer, les entrées qui utilisent des objectClass provenant de ce schéma ne seront pas répliquées sur votre provider.

Installation des paquets:

Même chose que sur le provider:

[root@ldap-consumer2 ~]# yum install -y openldap-servers openldap-clients ldapvi

[root@ldap-consumer2 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

[root@ldap-consumer2 ~]# /etc/init.d/slapd start
[root@ldap-consumer2 ~]# chkconfig slapd on

Tester le compte replicator depuis le consumer:

[root@ldap-consumer2 ~]# ldapsearch -D "cn=replicator,dc=zz" -h ldap-provider2.exemple.zz -W -b "dc=zz"

Pour tester en StartTLS, il faut tout d’abord modifier notre fichier /etc/openldap/ldap.conf:

[root@ldap-consumer2 ~]# vi /etc/openldap/ldap.conf
BASE dc=zz
URI ldap://ldap-provider2.exemple.zz
TLS_CACERT /etc/ssl/certs/cacert.pem

[root@ldap-consumer2 ~]# ldapsearch -D "cn=replicator,dc=zz" -h ldap-provider2.exemple.zz -W -b "dc=zz" -ZZ

Maintenant que nous avons confirmé que l’utilisateur replicator avait accès à l’arbre LDAP que nous devons répliquer, nous allons passer à la configuration de la réplication.

[root@ldap-consumer2 ~]# ldapvi -Y EXTERNAL -h ldapi:// -b cn=config

Changez le RootDN et le Suffix pour qu’il corresponde au provider.

[root@ldap-provider2 ~]# ldapvi -Y external -h ldapi:// -b cn=config

olcRootDN: cn=admin,dc=zz
olcSuffix: dc=zz

RefreshOnly

Dans ce mode, notre consumer va interroger le provider à des intervalles réguliers pour voir si il y a eu des modifications.

[root@ldap-consumer2 ~]# mkdir /etc/openldap/ldif

[root@ldap-consumer2 ~]# vi /etc/openldap/ldif/refreshonly.ldif
dn: olcDatabase={2}bdb,cn=config
add: olcSyncrepl
olcSyncrepl: {0}rid=123 provider=ldap://ldap-provider2.exemple.zz type=refreshOnly interval=00:00:00:10 searchbase="dc=zz" retry="5 5 300 +" schemachecking=off attrs="*,+" bindmethod=simple binddn="cn=replicator,dc=zz" credentials=rrrrrr

[root@ldap-consumer2 ~]# ldapmodify -Y EXTERNAL -H ldapi:// -f /etc/openldap/ldif/refreshonly.ldif

Réplication en TLS:

[root@ldap-consumer2 ~]# vi /etc/openldap/ldif/refreshonly.ldif
dn: olcDatabase={2}bdb,cn=config
add: olcSyncrepl
olcSyncrepl: {0}rid=123 provider=ldap://ldap-provider2.exemple.zz type=refreshOnly interval=00:00:00:10 searchbase="dc=zz" retry="5 5 300 +" schemachecking=off attrs="*,+" bindmethod=simple binddn="cn=replicator,dc=zz" credentials=rrrrrr starttls=yes tls_cacert=/etc/ssl/certs/cacert.pem

[root@ldap-consumer2 ~]# ldapmodify -Y EXTERNAL -H ldapi:// -f /etc/openldap/ldif/refreshonly.ldif

N’oubliez pas de modifier les droits d’accès afin qu’ils correspondent à ceux du provider:

olcAccess: {0}to attrs=userPassword by anonymous auth by * none
olcAccess: {2} to * by * read

L’utilisateur replicator n’a pas besoin d’avoir un accès aux données sur le “réplica”.

RefreshAndPersist

Dans ce mode, notre consumer maintient une connexion vers le provider qui envoie les informations nécessaires lors d’une modification.

[root@ldap-consumer2 ~]# vi /etc/openldap/ldif/refreshandpersist.ldif
dn: olcDatabase={2}bdb,cn=config
add: olcSyncrepl
olcSyncrepl: {0}rid=123 provider=ldap://ldap-provider2.exemple.zz type=refreshAndPersist retry="5 5 300 5" searchbase="dc=zz" retry="5 5 300 +" schemachecking=off attrs="*,+" bindmethod=simple binddn="cn=replicator,dc=zz" credentials=rrrrrr starttls=yes tls_cacert=/etc/ssl/certs/cacert.pem

[root@ldap-consumer2 ~]# ldapmodify -Y EXTERNAL -H ldapi:// -f /etc/openldap/ldif/refreshandpersist.ldif

24 February , 2012
by seynhaeve
0 comments

OpenLDAP 2.4.23 Centos 6.2

Objectif

Mettre en place un annuaire LDAP sur Centos 6.2 avec openLDAP 2.4.23-20. Notre annuaire LDAP hébergera un arbre constitué de 2 branches exemple.zz et demo.zz. Dans chaque branche nous ajouterons une sous-organisation (OU) People qui contiendra quelques utilisateurs. Nous interdirons aux utilisateurs anonymes l’accès à certains attributs. Toutes les transactions entre le serveur LDAP et les clients pourront s’effectuer de manière chiffrée (LDAPS ou StartTLS).

Paquets à installer

[root@ldap-provider2 ~]# yum install openldap-servers openldap-clients

Ces 2 paquets se trouvent dans les repository de base Centos.

Configuration de base

Avant de démarrer slapd, copiez le fichier d’exemple de configuration de la base de données dans /var/lib/ldap:

[root@ldap-provider2 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

Rendez slapd persistant:

[root@ldap-provider2 ~]# chkconfig slapd on

Démarrer le serveur LDAP:

[root@ldap-provider2 ~]# service slapd start

Configuration de l’administrateur

Avant de pouvoir ajouter notre nouvel arbre LDAP, nous devons définir un utilisateur qui pourra effectuer des modifications dans cet arbre.
Pour ajouter et configurer notre administrateur nous allons utiliser ldapvi qui est disponible sur EPEL.

[root@ldap-provider2 ~]# wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm

[root@ldap-provider2 ~]# yum localinstall epel-release-6-5.noarch.rpm -y

[root@ldap-provider2 ~]# yum install ldapvi -y

Depuis la version 2.3 la configuration de notre serveur peut-être stockée directement dans notre arbre LDAP dans la branche cn=config. Cette nouvelle approche va nous permettre d’effectuer des modifications “à chaud” sur la configuration du serveur via un client LDAP. Toutes ces modifications seront appliquées sans devoir redémarrer le service slapd.

Pour accéder à votre configuration, utilisez la commande suivante:

[root@ldap-provider2 ~]# ldapvi -Y external -h ldapi:// -b cn=config

Modifier le suffixe de notre arbre:

Rendez-vous en bas du fichier et remplacer la ligne

olcSuffix: dc=my-domain,dc=com

par

olcSuffix: dc=zz

sauvegardez et acceptez les changements.

Changer le DN de notre administrateur et lui attribuer un mot de passe:

Remplacez la ligne

olcRootDN: cn=Manager,dc=my-domain,dc=com

par

olcRootDN: cn=admin,dc=zz

Définissez le mot de passe de l’administrateur en ajoutant la ligne suivante:

olcRootPW: {SSHA}password

Le mot de passe peut être généré avec la commande slappasswd:

slappasswd -s motdepasse

Si vous lancer de nouveau votre client LDAP vous devriez retrouver les lignes suivantes en fin de fichier:

[root@ldap-provider2 ~]# ldapvi -Y external -h ldapi:// -b cn=config
olcSuffix: dc=zz
olcRootDN: cn=admin,dc=zz
olcRootPW: {SSHA}password

Ajout de nouveaux schemas

Avant de peupler notre base de données, nous allons tout d’abord voir comment ajouter un nouveau schema. Dans notre exemple nous allons utiliser le schema samba.schema fourni par le paquet samba-3.5.10-114.el6.x86_64.rpm.

Téléchargez le RPM:

[root@ldap-provider2 tmp]# wget http://mirror.centos.org/centos/6/os/x86_64/Packages/samba-3.5.10-114.el6.x86_64.rpm

Récupérez le schema qui se trouve dans le RPM:

[root@ldap-provider2 tmp]# rpm2cpio samba-3.5.10-114.el6.x86_64.rpm |cpio -ivd ./etc/openldap/schema/samba.schema
./etc/openldap/schema/samba.schema
35763 blocks

Copiez-le dans le répertoire schema de openldap:

[root@ldap-provider2 ~]# cp /tmp/etc/openldap/schema/samba.schema /etc/openldap/schema/

Avant d’ajouter notre nouveau schema, nous devons le convertir au format LDIF.

Le schéma samba est dépendant d’autres schémas, nous devons donc inclure tous les schémas dont il dépend avant d’effectuer la conversion.

On crée un fichier texte dans lequel on renseigne les différents schémas que nous allons convertir:

[root@ldap-provider2 ~]# vi /tmp/schema_to_convert.txt
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/samba.schema

On crée le répertoire qui va contenir les schémas au format LDIF:
[root@ldap-provider2 ~]# mkdir /tmp/converted_schema

On lance la conversion avec slaptest:

[root@ldap-provider2 ~]# slaptest -f /tmp/schema_to_convert.txt -F /tmp/converted_schema/

Les schémas au format LDIF se retrouveront dans /tmp/converted_schema/cn\=config/cn\=schema/

Avant de pouvoir ajouter notre schéma samba, nous devons l’éditer:

[root@ldap-provider2 ~]# vi /tmp/converted_schema/cn\=config/cn\=schema/cn\=\{4\}samba.ldif

Editez la première ligne et remplacez là par:

dn: cn=samba,cn=schema,cn=config

La troisième ligne doit également être adaptée pour correspondre au DN:

cn: samba

Il faut également supprimer les dernières lignes du fichier LDIF:

structuralObjectClass: organization
entryUUID: 157352d4-228b-102a-9b33-e79503e120b9
creatorsName: cn=ldapadmin,ou=admin,dc=zz
createTimestamp: 20060126074245Z
entryCSN: 2006012607:42:45Z#0x0001#0#0000
modifiersName: cn=ldapadmin,ou=admin,dc=zz
modifyTimestamp: 20060126074245Z

Il ne reste plus qu’à ajouter le schéma

[root@ldap-provider2 ~]# ldapadd -Y EXTERNAL -H ldapi:// -f /tmp/converted_schema/cn\=config/cn\=schema/cn\=\{4\}samba.ldif

Pour vérifier que le schéma a bien été ajouté:

[root@ldap-provider2 ~]# ldapsearch -LLL -b cn=schema,cn=config -H ldapi:/// dn

Peupler notre arbre LDAP

Maintenant que nous avons un administrateur et nos schémas nous pouvons enfin peupler notre arbre LDAP

[root@ldap-provider2 ~]# mkdir /etc/openldap/ldif

Ajout de l’organisation zz:

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/zz.ldif
dn: dc=zz
objectClass: top
objectClass: dcObject
objectClass: organization
o: zz
dc: zz

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/zz.ldif -W

Ensuite, nous ajoutons demo.zz:

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/demo.zz.ldif
dn: dc=demo,dc=zz
objectClass: top
objectClass: dcObject
objectClass: organization
o: demo.zz
dc: demo

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/demo.zz.ldif -W

Même chose pour exemple.zz

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/exemple.zz.ldif
dn: dc=exemple,dc=zz
objectClass: top
objectClass: dcObject
objectClass: organization
o: exemple.zz
dc: exemple

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/exemple.zz.ldif -W

Ajout des OU People pour demo.zz et exemple.zz.

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/people.demo.zz.ldif
dn: ou=People,dc=demo,dc=zz
objectClass: organizationalUnit
ou: People

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/people.demo.zz.ldif -W

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/people.exemple.zz.ldif
dn: ou=People,dc=exemple,dc=zz
objectClass: organizationalUnit
ou: People

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/people.exemple.zz.ldif -W

Nous allons maintenant ajouter 2 utilisateurs dans chaque OU People:

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/dupond.demo.zz.ldif
dn: cn=dupond,ou=People,dc=demo,dc=zz
givenName: Jean
mailRoutingAddress: dupond@demo.zz
uid: dupond
mail: jean.dupond@demo.zz
cn: dupond
initials: 1
loginShell: /bin/bash
sn: Dupond
telephoneNumber: +32-01-23457
uidNumber: 8099
sambaDomainName: demozz
sambaPrimaryGroupSID: S-1-5-32-590
sambaHomeDrive: U:
displayName: Jean Dupond
gidNumber: 10000
shadowLastChange: 14452
sambaSID: S-1-5-21-2902724253-31401442-67869251-3333
sambaPwdLastSet: 999999999
sambaAcctFlags: [UX]
objectClass: top
objectClass: posixAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
objectClass: sambaSamAccount
objectClass: shadowAccount
homeDirectory: /home/dupond
departmentNumber: maildir:storage=400000
userPassword: {SSHA}sL5ukz/38fxHeIFsx+K/qYbFpqRXdHN2cTc4d3ZMWW9ZRkZJ
sambaLMPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
sambaNTPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
mailLocalAddress: dupond
mailLocalAddress: jean.dupond

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/dupond.demo.zz.ldif -W

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/zeman.demo.zz.ldif
dn: cn=zeman,ou=People,dc=demo,dc=zz
givenName: Jean
mailRoutingAddress: zeman@demo.zz
uid: zeman
mail: jean.zeman@demo.zz
cn: zeman
initials: 1
loginShell: /bin/bash
sn: Zeman
telephoneNumber: +32-01-23457
uidNumber: 8100
sambaDomainName: demozz
sambaPrimaryGroupSID: S-1-5-32-590
sambaHomeDrive: U:
displayName: Jean Zeman
gidNumber: 10001
shadowLastChange: 14452
sambaSID: S-1-5-21-2902724253-31401442-67869251-3333
sambaPwdLastSet: 999999999
sambaAcctFlags: [UX]
objectClass: top
objectClass: posixAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
objectClass: sambaSamAccount
objectClass: shadowAccount
homeDirectory: /home/zeman
departmentNumber: maildir:storage=400000
userPassword: xxxxxxxxxxxxxxxxXXXXXXXXXXXXx
sambaLMPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
sambaNTPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
mailLocalAddress: zeman
mailLocalAddress: jean.zeman

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/zeman.demo.zz.ldif -W

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/dupond.exemple.zz.ldif
dn: cn=dupond,ou=People,dc=exemple,dc=zz
givenName: Pierre
mailRoutingAddress: dupond@exemple.zz
uid: dupond
mail: pierre.dupond@exemple.zz
cn: dupond
initials: 1
loginShell: /bin/bash
sn: Dupond
telephoneNumber: +32-01-23456
uidNumber: 8099
sambaDomainName: exemplezz
sambaPrimaryGroupSID: S-1-5-32-590
sambaHomeDrive: U:
displayName: Pierre Dupond
gidNumber: 10000
shadowLastChange: 14452
sambaSID: S-1-5-21-2902724253-31401442-67869251-2222
sambaPwdLastSet: 999999999
sambaAcctFlags: [UX]
objectClass: top
objectClass: posixAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
objectClass: sambaSamAccount
objectClass: shadowAccount
homeDirectory: /home/dupond
departmentNumber: maildir:storage=400000
userPassword: xxxxxxxXXXXXXXXXXXXXXXxxxxxxxXXXXx
sambaLMPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
sambaNTPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
mailLocalAddress: dupond
mailLocalAddress: pierre.dupond

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/dupond.exemple.zz.ldif -W

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/zeman.exemple.zz.ldif
dn: cn=zeman,ou=People,dc=exemple,dc=zz
givenName: Pierre
mailRoutingAddress: zeman@exemple.zz
uid: zeman
mail: pierre.zeman@exemple.zz
cn: zeman
initials: 1
loginShell: /bin/bash
sn: Zeman
telephoneNumber: +32-01-234568
uidNumber: 8039
sambaDomainName: exemplezz
sambaPrimaryGroupSID: S-1-5-32-590
sambaHomeDrive: U:
displayName: Pierre Zeman
gidNumber: 10002
shadowLastChange: 14452
sambaSID: S-1-5-21-2902724253-31401442-67869251-2222
sambaPwdLastSet: 999999999
sambaAcctFlags: [UX]
objectClass: top
objectClass: posixAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
objectClass: sambaSamAccount
objectClass: shadowAccount
homeDirectory: /home/zeman
departmentNumber: maildir:storage=400000
userPassword: xxxxxxxXXXXXXXXXXXXXXXxxxxxxxXXXXx
sambaLMPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
sambaNTPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
mailLocalAddress: zeman
mailLocalAddress: pierre.zeman

[root@ldap-provider2 ~]# ldapadd -D "cn=admin,dc=zz" -H ldapi:// -f /etc/openldap/ldif/zeman.exemple.zz.ldif -W

Pour afficher les entrées que vous venez de rajouter:

[root@ldap-provider2 ~]# slapcat
[root@ldap-provider2 ~]# ldapsearch -x -b "dc=demo,dc=zz"

Sécurité

  • Droit d’accès

Par défaut, si vous lancez un ldapsearch en anonyme vous avez accès à tous les attributs sans aucune exception.

Certains attributs doivent être protégés comme par exemple l’attribut userPassword.

Par défaut le RootDN (cn=admin,dc=zz) peut accéder à tous les attributs, il ne faut donc plus l’indiquer dans les différentes ACL.

Nous allons empêcher les utilisateurs anonyme d’accéder à l’attribut userPassword. Seul les utilisateurs authentifiés auront accès à leur propre mot de passe.

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/access.ldif
dn: olcDatabase={2}bdb,cn=config
add: olcAccess
olcAccess: to attrs=userPassword by self write by anonymous auth by * none
olcAccess: to * by * read

Modification de notre configuration avec les informations présentes dans notre LDIF:

[root@ldap-provider2 ~]# ldapmodify -Y EXTERNAL -H ldapi:// -f /etc/openldap/ldif/access.ldif

Si on relance un ldapsearch en anonyme, l’attribut userPassword des utilisateurs ne s’affiche plus:

ldapsearch -x -b

  • Chiffrement

Pour éviter que les données critiques stockées dans notre arbre LDAP ne transitent en clair sur le réseau, nous allons mettre en place du chiffrement grâce à startTLS.
Nous avons besoin de 3 fichiers pour mettre ça en place:
- un certificat signé
- la clef privée qui va avec ce certificat
- l’autorité de certification qui a validé notre certificat

Si vous ne savez pas comment faire rendez-vous sur http://www.404blog.net/?p=122 pour créer une autorité de certification et sur http://www.404blog.net/?p=165 pour générer et signer une demande de certificat.

[root@ldap-provider2 ~]# vi /etc/openldap/ldif/tls.ldif
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap-provider2.exemple.zz.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/ldap-provider2.exemple.zz.key

[root@ldap-provider2 ~]# ldapmodify -Y EXTERNAL -H ldapi:// -f /etc/openldap/ldif/tls.ldif

Placer le certificat, la clef et l’autorité de certification aux endroits indiqués dans le fichier LDIF. Veillez à ce que l’utilisateur ldap((utilisateur qui lance splad)) puisse lire ces différents fichiers. Le CN de votre certificat doit correspondre exactement au FQDN de votre serveur LDAP.

Modifier le fichier /etc/openldap/ldap.conf sur le client:

# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable
BASE dc=zz
URI ldap://ldap-provider2.exemple.zz
TLS_CACERT /etc/ssl/certs/cacert.pem

Par défaut on pourra interroger le LDAP sur le port 389 en TLS:

[root@ldap-provider2 ~]# ldapsearch -x -ZZ

Si vous êtes en mode enforcing vous risqueriez d’avoir l’erreur suivante:
[root@ldap-provider2 ~]# ldapsearch -x -Z
ldap_start_tls: Connect error (-11)
additional info: TLS error -5938:Encountered end of file

Veillez à donner comme contexte cert_t à votre CA et votre certificat:

[root@ldap-provider2 ~]# restorecon -Rv /etc/ssl/certs/

Si l’on veut pouvoir interroger le serveur en LDAPS, il faudra éditer /etc/sysconfig/ldap

SLAPD_LDAPS=yes

redémarrez slapd

[root@ldap-provider2 ~]# service slapd restart

Vous pouvez désormais interroger votre serveur ldap en LDAPS:

[root@ldap-provider2 ~]# ldapsearch -x -H ldaps://ldap-provider2.exemple.zz

  • Firewalling

Par défaut sur Centos, netfilter empêche les connexions de l’extérieur vers le port LDAP et LDAPS.

[root@ldap-provider2 ~]# iptables -I INPUT -p tcp --dport 389 -j ACCEPT
[root@ldap-provider2 ~]# iptables -I INPUT -p tcp --dport 636 -j ACCEPT

On sauvegarde les règles:

[root@ldap-provider2 ~]# /etc/init.d/iptables save

Backup

Etant donné que notre configuration est sauvegardée dans notre arbre LDAP, un simple slapcat suffit pour faire une sauvegarde:

[root@ldap-provider2 ~]# slapcat -b cn=config > config.ldif

Pour sauvegarder notre organisation zz:

[root@ldap-provider2 ~]# slapcat -b cn=zz > zz.ldif

Restore

Voici les différentes étapes afin de récupérer notre serveur LDAP depuis nos sauvegardes au format LDIF:

[root@ldap-provider2 ~]# /etc/init.d/slapd stop

Supprimez le contenu du dossier /var/lib/ldap/ sauf la configuration de notre DB:

[root@ldap-provider2 ~]# for i in $(ls /var/lib/ldap/|grep -v DB_CONFIG);do rm /var/lib/ldap/$i;done

Supprimez le contenu du dossier /etc/openldap/slapd.d

[root@ldap-provider2 ~]# rm -r /etc/openldap/slapd.d/*

Restaurez la configuration depuis notre sauvegarde:

[root@ldap-provider2 ~]# slapadd -F /etc/openldap/slapd.d/ -b cn=config -l config.ldif

Restaurez le contenu de notre organisation zz:

[root@ldap-provider2 ~]# slapadd -b dc=be -l be.ldif

Restaurez les droits:

[root@ldap-provider2 ~]# chown -R ldap /etc/openldap/slapd.d/

[root@ldap-provider2 ~]# chown -R ldap /var/lib/ldap

Redémarrez le serveur:

[root@ldap-provider2 ~]# /etc/init.d/slapd start

8 June , 2011
by seynhaeve
0 comments

Drupal7 + Posgresql sur Debian Squeeze

Installer les paquets suivants:

apt-get install apache2 php5 postgresql php5-pgsql php5-gd -y

Créer l’utilisateur et la base de données qui seront utilisés par Drupal:

su - postgres
createuser --pwprompt --encrypted --no-createrole --no-createdb drupal7
Saisir le mot de passe pour le nouveau rôle :
Le saisir de nouveau :
Le nouveau rôle est-il super-utilisateur ? (o/n) n

createdb --encoding=UTF8 --owner=drupal7 drupal7

Récupérer l’archive de la dernière version de Drupal sur http://drupal.org/download et la décompresser sous /var/www/:

cd /var/www
wget http://ftp.drupal.org/files/projects/drupal-7.2.tar.gz
tar -xvzf drupal-7.2.tar.gz
mv drupal-7.2 drupal
chown -R root:www-data drupal

Créer et donner les bons droits sur les fichiers pour terminer l’installation via l’interface web:

chmod g+w /var/www/drupal/sites/default
cp -p /var/www/drupal/sites/default/default.settings.php /var/www/drupal/sites/default/settings.php
chmod g+w /var/www/drupal/sites/default/settings.php

Pour terminer l’installation rendez-vous sur http://votre_adresse_ip/drupal et remplissez les champs avec ce que vous avez renseigné lors de la création de l’utilisateur et de la base de données.

Une fois l’installation terminée vous pouvez retirer les droits d’écriture sur le settings.php et /var/www/drupal/sites/default

chmod g-w /var/www/drupal/sites/default/settings.php
chmod g-w /var/www/drupal/sites/default

20 April , 2011
by seynhaeve
0 comments

Openssl – générer et signer une demande de signature(CSR)

Dans l’article précédent, nous avons vu comment créer un autorité de certification(CA). Le but de cette autorité de certification est de pouvoir signer des certificats. Dans cet article nous allons voir comment générer une demande de signature(CSR: Common Signing Request) et comment la signer avec notre autorité de certification.

Générer une demande de signature(CSR)

On commence par générer la clef privée pour notre certificat, c’est elle qui va nous permettre de déchiffrer la clef de session que le client aura chiffrée avec notre clef publique(voir étape 3 de l’article Openssl – création d’une autorité de certification). Dans ce cas-ci, la clef privée ne sera pas protégée par un mot de passe. Nous allons tester notre certificat avec le serveur web Apache, si nous mettons un mot de passe sur cette clef, il faudra le taper à chaque fois que le serveur Apache sera démarré.

Générer le clef privée:

openssl genrsa 1024 > www.test.net.key

Cette clef ne doit être lisible que par l’utilisateur root:

chmod 600 www.test.net.key

On génère la demande de signature(CSR):

openssl req -new -key www.test.net.key -out www.test.net.csr

Signature du CSR avec notre CA

openssl ca -in www.test.net.csr -out www.test.net.crt

On peut copier le certificat www.test.net.crt dans /etc/ssl/certs et la clef privée www.test.net.key dans /etc/ssl/private sur le serveur web.

Tester le nouveau certificat avec Apache

Installer Apache:

apt-get install apache2

Activer le module ssl:

a2enmod ssl

Activer le virtual host default-ssl:

a2ensite default-ssl

Il faut maintenant indiquer le chemin vers la clef et le certifcat que nous avons créés auparavant.
Dans /etc/apache2/sites-available/default-ssl, on remplace:

SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

Par:

SSLCertificateFile /etc/ssl/certs/www.test.net.crt
SSLCertificateKeyFile /etc/ssl/private/www.test.net.key

On redémarre apache:

/etc/init.d/apache2 restart

Si on se connecte en https sur notre serveur web on reçoit un avertissement. Si l’on veut éviter ce problème, il suffit d’importer le CA que nous avons créé dans l’article précédent sur notre navigateur.

Sur Firefox on peut l’installer via:

Edit -> Préférences -> Advanced -> View Certificates -> Import

Commandes openssl utiles

Afficher tout ce qui se trouve dans le certificat:

openssl x509 -in www.test.net.crt -text

Afficher le sujet du certificat:

openssl x509 -in www.test.net.crt -noout -subject

Afficher l’issuer du certificat:

openssl x509 -in www.test.net.crt -noout -issuer

20 April , 2011
by seynhaeve
0 comments

Openssl – création d’une autorité de certification

Explication d’un échange entre un serveur web et en client chiffré avec SSL.

  1. Le client se connecte au serveur web via son navigateur.
  2. Le serveur web présente son certificat qui contient sa clef publique. Ce certificat est signé par une autorité de certification, ce qui permet de valider l’identité du serveur avec lequel on dialogue. Pour valider l’identité de ce serveur il faut que le certificat de l’autorité de certification qui a signé ce certificat soit installé sur le navigateur.
  3. Le client génère une clef de session et la chiffre avec la clef publique du serveur qui se trouve dans le certificat. Cette clef de session chiffrée est envoyée au serveur web.
  4. Le serveur web déchiffre la clef de session grâce à sa clef privée.
  5. Le client et le serveur web peuvent maintenant chiffrer leur trafic grâce à cette clef de session.

Création d’une autorité de certification (CA) avec openssl

  1. modifier le fichier /etc/ssl/openssl.conf.

Dans la section [CA_default]:

# L'endroit où l'on va stocker les différents fichiers
dir = /etc/ssl/CA
certificate = $dir/my-ca.crt # Le certificat de mon CA
crl = $dir/my-ca.crl # Liste de révocation de certificat
private_key = $dir/private/my-ca.key # La clef privée de mon CA

Les autres paramètres de la section [CA_default] ne changent pas.

Il faut maintenant créer l’arboresence avec les différents dossiers pour notre CA.

mkdir -p /etc/ssl/CA/{certs,crl,private,newcerts}
chmod -R 700 /etc/ssl/CA

Il faut également créer le fichier serial qui contiendra le numéro de série du prochain certificat signé par notre CA et index.txt qui contiendra certaines informations concernant les certificats signés par notre CA.

touch /etc/ssl/CA/index.txt
echo 01 > /etc/ssl/CA/serial

Une fois que l’on a modifié le fichier de configuration et créé l’arboresence, il faut créer la clef privée de notre CA qui sera protégée par un mot de passe. C’est ce mot de passe qui sera demandé à chaque fois que l’on signera un nouveau certificat.

openssl genrsa -out /etc/ssl/CA/private/my-ca.key -des3 2048

Une règle de bonne pratique est de mettre des droits assez restrictifs sur cette clef privée qui ne devrait être lisible que par l’utilisateur root.

chmod 600 /etc/ssl/CA/private/my-ca.key

On peut maintenant créer notre certificat auto-signé, ce certificat pourra être installé sur les clients (navigateur web, client mail…) pour éviter que nos utilisateurs ne recoivent une alerte lorsqu’il se connecteront sur un service qui présente un certificat signé par notre autorité de certification.

Création du self signed:

openssl -req -new -x509 -key /etc/ssl/CA/private/my-ca.key -days 3650 > my-ca.crt

Enter pass phrase for private/my-ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BE]:
State or Province Name (full name) [Hainaut]:
Locality Name (eg, city) [Kain]:
Organization Name (eg, company) [Test, Inc.]:
Organizational Unit Name (eg, section) []:Test CA
Common Name (eg, YOUR name) []:Test Certificate Authority
Email Address []:test@test.net

Toutes les paramètres qui se trouvent entre crochets sont les valeurs par défaut que l’on peut définir dans la section req_distinguished_name du fichier /etc/ssl/openssl.conf.

Tout est en place pour signer les demandes de signatures de certificats (CSR) pour nos différentes services.

11 April , 2011
by seynhaeve
0 comments

Chiffrement d’une partition avec cryptsetup

Formater le partition avec cryptsetup:

cryptsetup luksFormat /dev/sdb1

Ouvrir la partition chiffrée afin de pouvoir la formater:

cryptsetup luksOpen /dev/sdb1 usb_crypted

Créer le filesystem sur la partition que l’on va retrouver déchiffrée sous /dev/mapper/usb_crypted:

mkfs.ext4 /dev/mapper/usb_crypted

La partition est maintenant accessible comme n’importe quelle autre partition.
Lorsque vous montrez la partition, vous devrez taper le mot de passe que vous aviez fourni lors de la première étape.

Autre commande utile:

Fermer la partition pour qu’elle ne soit plus accessible:

cryptsetup luksClose /dev/mapper/usb_crypted

6 May , 2010
by seynhaeve
0 comments

Apache2 + Webdav + openldap + ssl

Installation des paquets:

[root@webdav:~]$apt-get install apache2

Apache

On active les modules nécessaires pour le webdav, le ssl et l’authentification ldap:

[root@webdav:~]$a2enmod authnz_ldap ssl dav dav_fs dav_lock
Considering dependency ldap for authnz_ldap:
Enabling module ldap.
Enabling module authnz_ldap.
Enabling module ssl.
See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.
Enabling module dav.
Run '/etc/init.d/apache2 restart' to activate new configuration!

On créé un répertoire qui sera accessible pour l’utilisateur test:

[root@webdav:~]$mkdir -p /var/www/webdav/test
[root@webdav:~]$chmod 770 /var/www/webdav/test
[root@webdav:~]$chown .www-data /var/www/webdav/test

On créé le fichier lock pour webdav:

[root@webdav:~]$mkdir /var/lock/DAVLock
[root@webdav:~]$touch /var/lock/DAVLock/DAVLock
[root@webdav:~]$chown -R www-data:www-data /var/lock/DAVLock

On créé le fichier virtual host:

<VirtualHost *:443>
ServerAdmin webmaster@frites.be
ServerAlias webdav.frites.be

SSLEngine on

SSLCertificateFile /etc/apache2/ssl/webdav.frites.be.pem
SSLCertificateKeyFile /etc/apache2/ssl/webdav.frites.be.key

DocumentRoot /var/www/webdav

ErrorLog /var/log/webdav_ssl_error.log
CustomLog /var/log/webdav_ssl_access.log combined
LogLevel warn

#WEBDAV

DavLockDB /var/lock/DAVLock/DAVLock

DAVMinTimeout 600

<Directory /var/www/webdav/test>
Dav On
AuthType Basic
AuthName "Accès RÉSERVÉ"
AuthName DAV
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPRemoteUserIsDN off
AuthLDAPGroupAttributeIsDN off
AuthLDAPURL ldaps://ldap.frites.be/ou=Webdav,dc=frites,dc=be?uid?sub?(objectClass=*)
require ldap-filter &(uid=test)
</Directory>
</VirtualHost>

On active le virtual host:

a2ensite webdav

Ne pas oublier de créer le dossier /etc/apache2/ssl et d’y placer le certificat et la clef du serveur webdav.frites.be

On redémarre apache:

[root@webdav:~]$/etc/init.d/apache2 restart

Authentification:

On modifie le fichier /etc/ldap/ldap.conf où l’on indique le seveur ldap et l’endroit où se trouve le ca:

#
# LDAP Defaults

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

BASE dc=frites,dc=be
URI ldaps://ldap.frites.be
TLS_CACERT /etc/ssl/certs/cacert.pem

#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never

Il ne faut pas oublier de placer le ca dans le répertoire /etc/ssl/certs

Accès au répertoire

On peut accéder au répertoire en lecture via un navigateur web à l’adresse suivante https://webdav.frites.be/test avec comme login test et le mot de passe qui se trouve dans le ldap.

Si l’on veut faire des modifications il faut utiliser un autre client, sous Linux on peut y accéder en ligne de commande via cadaver, en graphique via nautilus par exemple.
Sous Windows on peut rajouter un favori réseau afin d’éditer, créer et lire ce qui se trouve dans le répertoire test.
Attention le bloc-notes de Windows n’est pas compatible avec webdav, si l’on veut modifier/lire un fichier texte avec le bloc-notes il faudra le rapatrier en local et ensuite le copier avec les modifications sur le serveur.

13 July , 2009
by seynhaeve
0 comments

Samba pdc

apt-get install samba

Pour que samba joue le rôle de pdc il faut remplir les 5 conditions suivantes:

1 activer security=user
2 activer le support des mots de passe cryptés encrypt password = yes
3 avoir un partage netlogon
4 le pdc doit être l’explorateur maître de son domaine domain master = yes
5 le pdc doit être serveur de connexion de son domaine domain logons = yes

Voici le /etc/samba/smb.conf pour remplir les 5 conditions ci-dessus:

[global]
netbios name = samba-server
workgroup    = samba
security     = user
encrypt passwords = yes
enable privileges = yes

domain master = yes
domain logons = yes

add machine script = /usr/sbin/useradd -g machines -s /bin/false %u

logon script = %U.bat

[netlogon]
path = /home/netlogon
read only = yes
write list = +ntadmin

Ajout de l’utilisateur root:

samba:~# smbpasswd -a root

Il faut ensuite associer les groupes unix aux groupes windows pour permettre la gestion du domaine (ajout d’une machine, création d’un partage,…).
On commence par ajouter le groupe ntadmin qui sera associé au groupe Administrators

samba:~# addgroup ntadmin

Pour pouvoir associer le groupe ntadmin au Builtin group Administrators il faut récupérer le sid du domaine que l’on vient de créer:

samba:~# net getlocalsid samba

Association du groupe ntadmin au Builtin group Administrators, il faut toujours l’associer avec le RID 512:

samba:~# net groupmap add sid=S-1-5-21-1167086687-1543078166-3842405581-512 \ ntgroup="Administrators" unixgroup=ntadmin

Toutes les personnes qui se trouveront dans le groupe ntadmin seront considérées comme appartenant au groupe Administrators sur les clients Windows. Ces personnes auront les droits d’administration sur les machines Windows et bénéficieront de tous les droits disponibles sur le domaine.
On peut lister ces droits via la commande suivante:

samba:~# net -S localhost -U% rpc rights list accounts 'Builtin\Administrators'

Si l’on affiche les membres du groupe Administrators sur une machine Windows qui se trouve dans le domaine, on peut voir que le groupe SAMBA/Administrators se retrouve automatiquement dans le groupe Administrators!

On peut également créer un autre groupe dans lequel on ajoutera les personnes qui peuvent joindre de nouvelles machines au domaine.

addgroup serveuradmin
net groupmap add ntgroup="Server Admins" unixgroup=serveuradmin

Ajout des droits pour le groupe Server Admins:

net rpc rights grant 'SAMBA\Server Admins' SeMachineAccountPrivilege -U root

Les personnes du groupe Server Admins auront donc le droit de joindre de nouvelles machines au domaine, par contre elles n’auront aucun droit d’administration sur ces machines.
Pour leur donner ces droits, il faudra les rajouter manuellement dans le groupe Power Users localement sur chaque machine, il n’existe pas d’autres moyens.

Dernière étape avant de pouvoir ajouter une machine dans le domaine, il faut créer le groupe qui contiendra les machines du domaine(cfr: commande add machine dans smb.conf):

addgroup machines

Ajout des répertoires personnels connectés automatiquement au login de l’utilisateur.

Il faut ajouter les lignes suivantes dans /etc/samba/smb.conf:

[global]
logon drive = H:

[homes]
comment = Home directories
read only = no
create mask = 0700
directory mask = 0700
valid users = %S

Ajout des profiles itinérants.

Pour que les profils itinérants fonctionnent il faut effectuer la modification suivante sur les postes de travail Windows.

gpedit.msc -> Local Computer Policy -> Computer Configuration -> System -> User Profiles
Activer l’option Do not check ownership of roaming profile forlders.

Si vous conservez le smb.conf actuel, le profil itinérant des utilisateurs sera sauvegardé dans leurs répertoires personnels.
Il est préférable les mettre à un autre endroit pour éviter les mauvaises manipulations de la part des utilisateurs!

[global]
logon path = \\samba\profiles$\%U\%a

[profiles$]
comment = profile directory
path = /home/profiles
read only = no
inherit permissions = yes

Le %U correpond au nom de l’utilisateur, %a correspond à la version version de l’os(Xp, Vista,…)

Il faut également créer le dossier /home/profiles et celui de chaque utilisateur:
samba:~# mkdir /home/profiles
samba:~#mkdir /home/profiles/user1
samba:~#chmod 700 /home/profiles/user1
samba:~#chown user1. /home/profiles/user1

Ajout d’un lecteur réseau

smb.conf:

[test]
comment = répertoire de test
path = /home/test
read only = no
valid users = user1

/home/profile/user1.bat:

NET USE X: \\samba\test

samba:~# mkdir /home/test
samba:~# chown user1. /home/test/

Le lecteur réseau X: sera connecté automatiquement lors de l’ouverture de session de user1.

19 June , 2009
by seynhaeve
0 comments

Serveur ssh avec authentification ldap

Il faut tout d’abord installer libnss-ldap qui va nous fournir tous les paquets nécessaires:

debian:~# apt-get install libnss-ldap

/etc/libnss-ldap.conf:

base dc=frite,dc=be
uri ldaps://ldap.frite.be
ldap_version 3
port 636
tls_cacertfile /etc/ssl/cacert.pem

Modifier le fichier /etc/nsswitch.conf pour que la recherche d’utilisateurs et de groupes se fasse également sur le ldap:

/etc/nsswitch.conf:

passwd: compat ldap
group: compat ldap
shadow: compat ldap

Modifier le fichier /etc/ldap/ldap.conf en lui indiquant l’emplacement du certificat nécessaire pour le ldaps:

/etc/ldap/ldap.conf

BASE dc=frite,dc=be
URI ldaps://ldap.frite.be
TLS_CACERT /etc/ssl/cacert.pem

Pour l’authentification il faut indiquer à pam de tenir compte des utilisateurs présents sur le ldap.

/etc/pam.d/common-auth:

auth sufficient /lib/security/pam_ldap.so
auth required /lib/security/pam_unix_auth.so try_first_pass

/etc/pam_ldap.conf:

base dc=frite,dc=be
uri ldaps://ldap.frite.be
ldap_version 3
port 636

Si on teste cette configuration l’utilisateur ldap qui va se connecter n’aura pas de répertoire personnel, il faut donc ajouter la ligne suivante au fichier /etc/pam.d/common_session pour que son répertoire personnel soit créé automatiquement lors de sa première connexion:

/etc/pam.d/common_session

session required pam_mkhomedir.so skel=/etc/skel umask=0077
session required pam_unix.so

En cas de problème désactiver nscd:

/etc/init.d/nscd stop