diff --git a/README.md b/README.md index 613e113..1d6f35b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Services fournis -Installation de openldap sur un serveur docker_host +Installation de l'image bitnami openldap sur un serveur docker_host avec schemas rfc2307bis, owncloud (pour quotas) et postfix-book. ## Variables @@ -12,72 +12,85 @@ Fournir les variables suivantes. Par exemple : ```yaml docker_openldap_data_dir: /data1 -docker_openldap_service_id: openldap +docker_openldap_service_id: ldap_example_com +docker_openldap_version: latest +docker_openldap_rootdn: "dc=example,dc=com" +docker_openldap_admin_password: "pwdAdmin" +docker_openldap_config_password: "pwdConfig" ``` -| Option | Valeur par défaut | Description | -|--------------------------------|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------------| -| docker_openldap_data_dir | | L'emplacement dans lequel se trouvent les volumes de donnees docker pour le service | -| docker_openldap_service_id | | Le nom de service souhaité : conditionne le nommage des volumes | -| docker_openldap_port | 389 | Le numero de port local pour la connexion à openldap | -| docker_openldap_version | | Version du conteneur docker souhaité | -| docker_openldap_rootdn | | dn de la racine de l'annuaire (par exemple: dc=example,dc=com) | -| docker_openldap_admin_password | | Mot de passe administrateur de l'annuaire ; le dn de l'administrateur est cn=admin suivi du rootdn, par exemple : cn=admin,dc=example,dc=com) | -| docker_openldap_organization | | Le nom de l'organisation pour cet annuaire (attribut o de la racine) | +| Option | Valeur par défaut | Description | +|----------------------------------------|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| docker_openldap_data_dir | | L'emplacement dans lequel se trouvent les volumes de donnees docker pour le service | +| docker_openldap_service_id | | Le nom de service souhaité : conditionne le nommage des volumes | +| docker_openldap_version | | Version du conteneur docker souhaité | +| docker_openldap_port | 389 | Le numero de port local pour la connexion à openldap non chiffré | +| docker_openldap_port_tls | 636 | Le numero de port local pour la connexion à openldap via tls | +| docker_openldap_rootdn | | dn de la racine de l'annuaire (par exemple: dc=example,dc=com) | +| docker_openldap_admin_username | ldapadmin | Nom de l'administrateur de l'annuaire | +| docker_openldap_admin_password | | Mot de passe administrateur de l'annuaire ; le dn de l'administrateur est cn=admin suivi du rootdn, par exemple : cn=admin,dc=example,dc=com) | +| docker_openldap_config_username | configadmin | Nom de l'administrateur de configuration de l'annuaire | +| docker_openldap_config_password | | Mot de passe administrateur de configuration de l'annuaire ; le dn de l'administrateur est cn=admin suivi du rootdn, par exemple : cn=admin,dc=example,dc=com) | +| docker_openldap_configure_ppolicy | yes | Permet d'activer la configuration du module openldap ppolicy permettant de définir un stratégie applicable aux mots de passe | +| docker_openldap_ppolicy_hash_cleartext | yes | Si le module ppolicy est activé, configure le hachage des mots de passe si ces derniers sont définis par le client en clair | +| docker_openldap_enable_tls | no | Permet d'activer la configuration de tls. Lire la section TLS ci-dessous. | +| docker_openldap_require_tls | no | Permet d'exiger tls même sur le port non chiffré | +| docker_openldap_allow_anon_binding: | no | Permet d'exiger une authentification pour se connecter à l'annuaire | + + + +## Configuration TLS + +Si la configuration TLS est activée, le dossier certs, présent dans le même dossier que docker-compose.yml, devra contenir : +- pubcert.pem : le certificat présenté par le serveur +- privkey.pem : la clé privée relative à la clé publique du certificat ci-dessus +- chain.pem : la chaine de certification permettant aux clients de vérifier la validité du certificat présenté. # Poursuite de l'installation du serveur openldap +## Vérification de la bonne connexion à l'annuaire + +* Connexion à l'annuaire en tant qu'administrateur +``` +ldapvi -h ldap://fqdn:389 -b "dc=example,dc=org" -D cn=ldapadmin,dc=example,dc=org +``` + +* Connexion à l'annuaire en tant qu'administrateur de configuration (pour modification des acl ou autre) +``` +ldapvi -h ldap://fqdn:389 -b "cn=config" -D cn=configadmin,cn=config +``` + +- dn de base : cn=config => pour configurer le serveur openldap +- dn de base : cn=schema,cn=config => pour consulter les schemas connus par openldap + + + ## Configuration de la strategie de mot de passe avec le module ppolicy -### Activation du module ppolicy +### Vérification que le module ppolicy est bien activé ``` -# docker exec -ti -u openldap 7520847e9e47 bash -openldap@7520847e9e47:/$ cd /tmp - -openldap@7520847e9e47:/tmp$ slapcat -n 0 | grep olcModuleLoad | grep ppolicy - -openldap@7520847e9e47:/tmp$ cat > ppolicy-module.ldif -dn: cn=module,cn=config -objectClass: olcModuleList -cn: module -olcModuleLoad: ppolicy -^D - -openldap@7520847e9e47:/tmp$ slapadd -n0 -l ppolicy-module.ldif -_#################### 100.00% eta none elapsed none fast! -Closing DB... - -openldap@7520847e9e47:/tmp$ slapcat -n 0 | grep olcModuleLoad | grep ppolicy -olcModuleLoad: {0}ppolicy +# docker compose exec -i openldap slapcat -n 0 -F /bitnami/openldap/slapd.d/ | grep olcModuleLoad | grep ppolicy +olcModuleLoad: {0}ppolicy.so ``` -et redémarrer le conteneur +### Configuration du module ppolicy -### Ajout de la configuration du module ppolicy +Repérer l'overlay ppolicy et le modifier comme suit : ``` -# docker exec -ti d7f2803e5cfb bash -root@d7f2803e5cfb:/# cd /tmp/ - -root@d7f2803e5cfb:/tmp# cat > ppolicyoverlay.ldif -dn: olcOverlay={2}ppolicy,olcDatabase={1}mdb,cn=config -changetype: add +# ldapvi -h ldap://fqdn:389 -b "cn=config" -D cn=configadmin,cn=config +[...] +dn: olcOverlay={0}ppolicy,olcDatabase={2}mdb,cn=config objectClass: olcPPolicyConfig objectClass: olcOverlayConfig -olcOverlay: {2}ppolicy -olcPPolicyDefault: cn=defaultPasswordPolicy,ou=policies,dc=libretic,dc=fr +olcOverlay: {0}ppolicy +olcPPolicyDefault: cn=defaultPasswordPolicy,ou=policies,dc=example,dc=org olcPPolicyForwardUpdates: TRUE olcPPolicyHashCleartext: TRUE olcPPolicyUseLockout: TRUE -^D - -root@d7f2803e5cfb:/tmp# ldapadd -Y EXTERNAL -H ldapi:// -f ppolicyoverlay.ldif -SASL/EXTERNAL authentication started -SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth -SASL SSF: 0 -adding new entry "olcOverlay={2}ppolicy,olcDatabase={1}mdb,cn=config" +[...] ``` ### Ajout d'une stratégie de mot de passe par défaut @@ -85,12 +98,13 @@ adding new entry "olcOverlay={2}ppolicy,olcDatabase={1}mdb,cn=config" Valeurs à adapter en fonction du besoin. ``` -root@d7f2803e5cfb:/tmp# cat > defaultppolicy.ldif -dn: ou=policies,dc=libretic,dc=fr +# ldapvi -h ldap://fqdn:389 -b "dc=example,dc=org" -D cn=ldapadmin,dc=example,org +[...] +add: ou=policies,dc=example,dc=org objectClass: organizationalUnit ou: policies -dn: cn=defaultPasswordPolicy,ou=policies,dc=libretic,dc=fr +add: cn=defaultPasswordPolicy,ou=policies,dc=example,dc=org objectClass: top objectClass: device objectClass: pwdPolicyChecker @@ -108,55 +122,120 @@ pwdMaxAge: 0 pwdExpireWarning: 1209600 pwdLockoutDuration: 900 pwdLockout: TRUE -root@d7f2803e5cfb:/tmp# ldapadd -Y EXTERNAL -H ldapi:// -f defaultppolicy.ldif -SASL/EXTERNAL authentication started -SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth -SASL SSF: 0 -adding new entry "ou=policies,dc=libretic,dc=fr" - -adding new entry "cn=defaultPasswordPolicy,ou=policies,dc=libretic,dc=fr" +[...] ``` -## Accès à l'annuaire en tant qu'administrateur de config +## Ajout des overlays memberOf et refint -Permet par exemple une modification des acl pour une modification avec apache directory studio (pratique). +Ces overlays permettent d'avoir des attributs "virtuels" memberof dans les utilisateurs qui contiennent les groupes auxquels un utilisateur appartient. +Adapter les valeurs si besoin. -### Modifier le mdp de l'administrateur de config +Ne s'applique qu'aux groupes créés postérieurement à la configuration. -#### Créer la valeur chiffrée du mdp ``` -root@docker-host:/# docker exec -ti 04a84d35f749 bash +# ldapvi -h ldap://fqdn:389 -b "cn=config" -D cn=configadmin,cn=config +[...] +add cn=module{2},cn=config +objectClass: olcModuleList +cn: module{2} +olcModulePath: /opt/bitnami/openldap/lib/openldap +olcModuleLoad: {0}memberof.so -root@04a84d35f749:/# slappasswd +add cn=module{3},cn=config +objectClass: olcModuleList +cn: module{3} +olcModulePath: /opt/bitnami/openldap/lib/openldap +olcModuleLoad: {0}refint.so + +add olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config +objectClass: olcConfig +objectClass: olcMemberOfConfig +objectClass: olcOverlayConfig +objectClass: top +olcOverlay: {0}memberof +olcMemberOfDangling: ignore +olcMemberOfRefInt: TRUE +olcMemberOfGroupOC: groupOfUniqueNames +olcMemberOfMemberAD: uniqueMember +olcMemberOfMemberOfAD: memberOf + +add olcOverlay={1}refint,olcDatabase={2}mdb,cn=config +objectClass: olcConfig +objectClass: olcOverlayConfig +objectClass: olcRefintConfig +objectClass: top +olcOverlay: {1}refint +olcRefintAttribute: manager +olcRefintAttribute: member +olcRefintAttribute: memberof +olcRefintAttribute: owner +olcRefintAttribute: uniqueMember +[...] +``` + + + +## Changer un mot de passe admin + +* Obtenir le mot de passe chiffré +``` +# docker compose exec -i openldap slappasswd New password: Re-enter new password: {SSHA}FqKYv/azMmj/tp2LTSWzOzJf65h/nRKp ``` -#### Créer un fichier modify.ldif pour +* Se connecter avec le compte administrateur approprié et editer l'attribut userPassword pour remplacer l'ancien mot de passe chiffré par le nouveau + + +## Configuration TLS + +Le conteneur prend en charge la configuration de TLS dans OpenLDAP si cette configuration est présente dans les variables d'environnement lors du premier démarrage. Il est donc préférable de disposer des certificats avant le premier démarrage. + +Dans le cas contraire, l'ajout des directives *TLS* dans la configuration sera sans effet. Pour configurer TLS à posteriori : + +``` +# ldapvi -h ldap://fqdn:389 -b "cn=config" -D cn=configadmin,cn=config +0 cn=config +objectClass: olcGlobal +cn: config +[...] +olcTLSCACertificateFile: /bitnami/certs/chain.pem +olcTLSCertificateFile: /bitnami/certs/pubcert.pem +olcTLSCertificateKeyFile: /bitnami/certs/privkey.pem +olcTLSVerifyClient: never +[...] ``` -root@04a84d35f749:/# cd /tmp/ -root@04a84d35f749:/tmp# cat > modify.ldif -dn: olcDatabase={0}config,cn=config -changetype: modify -delete: olcRootPW -- -add: olcRootPW -olcRootPW: {SSHA}FqKYv/azMmj/tp2LTSWzOzJf65h/nRKp -^D +Pour tester et deboguer : +``` +ldapsearch -d 1 -LLL -H ldaps://fqdn:636 -x "dc=example,dc=org" -D cn=ldapadmin,dc=example,org +``` -root@04a84d35f749:/tmp# ldapmodify -Y EXTERNAL -H ldapi:// -f modify.ldif +Pour tester la chaine de certification : +``` +openssl s_client -connect fqdn:636 -msg -verify 1 +``` + +Et en, cas de problème tel que : +``` +ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1) +``` + +vérifier que le fichier de configuration du client LDAP contient bien un trousseau de certificats contenant la racine, par exemple : +``` +# cat /etc/ldap/ldap.conf +TLS_CACERTDIR /etc/ssl/certs/ ``` -## Connection depuis apache directory studio +## Ajout de schemas supplémentaires -Configurer ADS avec : -- compte : cn=admin,cn=config -- mdp : celui utilisé avec slappasswd -- dn de base : olcDatabase={1}mdb,cn=config => pour configurer le serveur openldap -- dn de base : cn=schema,cn=config => pour consulter les schemas connus par openldap +Si des schémas supplémentaires sont présents dans le dossier custom-schemas avant le premier démarrage, ils seront intégrés à l'annuaire. Dans le cas contraire, pour en ajouter, placer le fichier ldif du schema à ajouter dans le dossier custom-schemas puis faire : + +``` +ldapadd -H ldap://fqdn:389 -x -W -D "cn=configadmin,cn=config" -f custom-schemas/monschema.ldif +``` diff --git a/defaults/main.yml b/defaults/main.yml index 552532b..7b51810 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1 +1,10 @@ docker_openldap_port: "389" +docker_openldap_port_tls: "636" +docker_openldap_admin_username: ldapadmin +docker_openldap_config_username: configadmin +docker_openldap_configure_ppolicy: "yes" +docker_openldap_ppolicy_hash_cleartext: "yes" +docker_openldap_enable_tls: "no" +docker_openldap_require_tls: "no" +docker_openldap_allow_anon_binding: "no" + diff --git a/files/owncloud.ldif b/files/owncloud.ldif new file mode 100644 index 0000000..a3870c2 --- /dev/null +++ b/files/owncloud.ldif @@ -0,0 +1,33 @@ +# +# SCHEMA 'ownCloud' for OpenLDAP OLC (cn=config) +# +# From http://doc.owncloud.org/server/6.0/admin_manual/configuration/auth_ldap.html +# +# Quota Field: +# ownCloud can read an LDAP attribute and set the user quota according to its value. +# Specify the attribute here, otherwise keep it empty. The attribute shall return +# human readable values, e.g. "2 GB". +# +# INSTALLATION: +# sudo ldapadd -Y EXTERNAL -H ldapi:/// -f owncloud.ldif +# +# SOURCE: +# https://github.com/valerytschopp/owncloud-ldap-schema +# +# WARNING: the spaces ' ' in the definitions are very important!!! + +dn: cn=owncloud,cn=schema,cn=config +objectClass: olcSchemaConfig +cn: owncloud +olcAttributeTypes: ( 1.3.6.1.4.1.39430.1.1.1 + NAME 'ownCloudQuota' + DESC 'User Quota (e.g. 2 GB)' + EQUALITY caseExactMatch + SUBSTR caseIgnoreSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 + SINGLE-VALUE ) +olcObjectClasses: ( 1.3.6.1.4.1.39430.1.2.1 + NAME 'ownCloud' + DESC 'ownCloud LDAP Schema' + AUXILIARY + MAY ( ownCloudQuota ) ) diff --git a/files/postfix-book.ldif b/files/postfix-book.ldif new file mode 100644 index 0000000..e2410e1 --- /dev/null +++ b/files/postfix-book.ldif @@ -0,0 +1,23 @@ +# +# SCHEMA 'postfix-book' for OpenLDAP OLC (cn=config) +# +# Fait depuis https://github.com/variablenix/ldap-mail-schema/blob/master/postfix-book.schema +# +# INSTALLATION: +# sudo ldapadd -Y EXTERNAL -H ldapi:/// -f postfix-book.ldif +# +dn: cn=postfix-book,cn=schema,cn=config +objectClass: olcSchemaConfig +cn: postfix-book +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.1 NAME 'mailHomeDirectory' DESC 'The absolute path to the mail user home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.2 NAME 'mailAlias' DESC 'RFC822 Mailbox - mail alias' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.3 NAME 'mailUidNumber' DESC 'UID required to access the mailbox' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.4 NAME 'mailGidNumber' DESC 'GID required to access the mailbox' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.5 NAME 'mailEnabled' DESC 'TRUE to enable, FALSE to disable account' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.6 NAME 'mailGroupMember' DESC 'Name of a mail distribution list' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.7 NAME 'mailQuota' DESC 'Mail quota limit in kilobytes' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.8 NAME 'mailStorageDirectory' DESC 'The absolute path to the mail users mailbox' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.9 NAME 'mailSieveRuleSource' DESC 'Sun ONE Messaging Server defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Sun ONE Messaging Server' ) +olcAttributeTypes: ( 1.3.6.1.4.1.29426.1.10.10 NAME 'mailForwardingAddress' DESC 'Address(es) to forward all incoming messages to.' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{320} ) +olcObjectClasses: ( 1.3.6.1.4.1.29426.1.2.2.1 NAME 'PostfixBookMailAccount' DESC 'Mail account used in Postfix Book' SUP top AUXILIARY MUST mail MAY ( mailHomeDirectory $ mailAlias $ mailGroupMember $ mailUidNumber $ mailGidNumber $ mailEnabled $ mailQuota $ mailStorageDirectory $ mailSieveRuleSource ) ) +olcObjectClasses: ( 1.3.6.1.4.1.29426.1.2.2.2 NAME 'PostfixBookMailForward' DESC 'Mail forward used in Postfix Book' SUP top AUXILIARY MUST ( mail $ mailAlias ) MAY mailForwardingAddress ) diff --git a/files/rfc2307bis.ldif b/files/rfc2307bis.ldif new file mode 100644 index 0000000..54cb345 --- /dev/null +++ b/files/rfc2307bis.ldif @@ -0,0 +1,52 @@ +dn: cn=rfc2307bis,cn=schema,cn=config +objectClass: olcSchemaConfig +cn: rfc2307bis +olcAttributeTypes: ( 1.3.6.1.1.1.1.2 NAME 'gecos' DESC 'The GECOS field; the common name' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'The absolute path to the home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.4 NAME 'loginShell' DESC 'The path to the login shell' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.6 NAME 'shadowMin' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.7 NAME 'shadowMax' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.12 NAME 'memberUid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Netgroup triple' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' DESC 'Service port number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' DESC 'Service protocol name' SUP name ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' DESC 'IP protocol number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' DESC 'ONC RPC number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' DESC 'IPv4 addresses as a dotted decimal omitting leading zeros or IPv6 addresses as defined in RFC2373' SUP name ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' DESC 'IP network as a dotted decimal, eg. 192.168, omitting leading zeros' SUP name SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' DESC 'IP netmask as a dotted decimal, eg. 255.255.255.0, omitting leading zeros' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.22 NAME 'macAddress' DESC 'MAC address in maximal, colon separated hex notation, eg. 00:00:92:90:ee:e2' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.23 NAME 'bootParameter' DESC 'rpc.bootparamd parameter' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.24 NAME 'bootFile' DESC 'Boot image name' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.26 NAME 'nisMapName' DESC 'Name of a A generic NIS map' SUP name ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' DESC 'A generic NIS entry' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.28 NAME 'nisPublicKey' DESC 'NIS public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.29 NAME 'nisSecretKey' DESC 'NIS secret key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.30 NAME 'nisDomain' DESC 'NIS domain' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.31 NAME 'automountMapName' DESC 'automount Map Name' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.32 NAME 'automountKey' DESC 'Automount Key value' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: ( 1.3.6.1.1.1.1.33 NAME 'automountInformation' DESC 'Automount information' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcObjectClasses: ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Abstraction of an account with POSIX attributes' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) ) +olcObjectClasses: ( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' DESC 'Additional attributes for shadow passwords' SUP top AUXILIARY MUST uid MAY ( userPassword $ description $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ) ) +olcObjectClasses: ( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top AUXILIARY MUST gidNumber MAY ( userPassword $ memberUid $ description ) ) +olcObjectClasses: ( 1.3.6.1.1.1.2.3 NAME 'ipService' DESC 'Abstraction an Internet Protocol service. Maps an IP port and protocol (such as tcp or udp) to one or more names; the distinguished value of the cn attribute denotes the services canonical name' SUP top STRUCTURAL MUST ( cn $ ipServicePort $ ipServiceProtocol ) MAY description ) +olcObjectClasses: ( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' DESC 'Abstraction of an IP protocol. Maps a protocol number to one or more names. The distinguished value of the cn attribute denotes the protocols canonical name' SUP top STRUCTURAL MUST ( cn $ ipProtocolNumber ) MAY description ) +olcObjectClasses: ( 1.3.6.1.1.1.2.5 NAME 'oncRpc' DESC 'Abstraction of an Open Network Computing (ONC) [RFC1057] Remote Procedure Call (RPC) binding. This class maps an ONC RPC number to a name. The distinguished value of the cn attribute denotes the RPC services canonical name' SUP top STRUCTURAL MUST ( cn $ oncRpcNumber ) MAY description ) +olcObjectClasses: ( 1.3.6.1.1.1.2.6 NAME 'ipHost' DESC 'Abstraction of a host, an IP device. The distinguished value of the cn attribute denotes the hosts canonical name. Device SHOULD be used as a structural class' SUP top AUXILIARY MUST ( cn $ ipHostNumber ) MAY ( userPassword $ l $ description $ manager ) ) +olcObjectClasses: ( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' DESC 'Abstraction of a network. The distinguished value of the cn attribute denotes the networks canonical name' SUP top STRUCTURAL MUST ipNetworkNumber MAY ( cn $ ipNetmaskNumber $ l $ description $ manager ) ) +olcObjectClasses: ( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' DESC 'Abstraction of a netgroup. May refer to other netgroups' SUP top STRUCTURAL MUST cn MAY ( nisNetgroupTriple $ memberNisNetgroup $ description ) ) +olcObjectClasses: ( 1.3.6.1.1.1.2.9 NAME 'nisMap' DESC 'A generic abstraction of a NIS map' SUP top STRUCTURAL MUST nisMapName MAY description ) +olcObjectClasses: ( 1.3.6.1.1.1.2.10 NAME 'nisObject' DESC 'An entry in a NIS map' SUP top STRUCTURAL MUST ( cn $ nisMapEntry $ nisMapName ) MAY description ) +olcObjectClasses: ( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' DESC 'A device with a MAC address; device SHOULD be used as a structural class' SUP top AUXILIARY MAY macAddress ) +olcObjectClasses: ( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' DESC 'A device with boot parameters; device SHOULD be used as a structural class' SUP top AUXILIARY MAY ( bootFile $ bootParameter ) ) +olcObjectClasses: ( 1.3.6.1.1.1.2.14 NAME 'nisKeyObject' DESC 'An object with a public and secret key' SUP top AUXILIARY MUST ( cn $ nisPublicKey $ nisSecretKey ) MAY ( uidNumber $ description ) ) +olcObjectClasses: ( 1.3.6.1.1.1.2.15 NAME 'nisDomainObject' DESC 'Associates a NIS domain with a naming context' SUP top AUXILIARY MUST nisDomain ) +olcObjectClasses: ( 1.3.6.1.1.1.2.16 NAME 'automountMap' SUP top STRUCTURAL MUST automountMapName MAY description ) +olcObjectClasses: ( 1.3.6.1.1.1.2.17 NAME 'automount' DESC 'Automount information' SUP top STRUCTURAL MUST ( automountKey $ automountInformation ) MAY description ) +olcObjectClasses: ( 1.3.6.1.4.1.5322.13.1.1 NAME 'namedObject' SUP top STRUCTURAL MAY cn ) diff --git a/tasks/main.yml b/tasks/main.yml index 554dde2..18e7ded 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -3,6 +3,25 @@ path: /opt/{{ docker_openldap_service_id }}/ state: directory +- name: custom schemas directory + file: + path: /opt/{{ docker_openldap_service_id }}/custom-schemas + state: directory + +- name: certificates directory + file: + path: /opt/{{ docker_openldap_service_id }}/certs + state: directory + +- name: copy custom schemas + copy: + src: "{{ item }}" + dest: /opt/{{ docker_openldap_service_id }}/custom-schemas/ + with_items: + - rfc2307bis.ldif + - owncloud.ldif + - postfix-book.ldif + - name: prepare docker-compose.yml template: src: "{{ item }}" diff --git a/templates/docker-compose.yml b/templates/docker-compose.yml index e421f83..b29e544 100644 --- a/templates/docker-compose.yml +++ b/templates/docker-compose.yml @@ -3,19 +3,33 @@ version: '3.1' services: openldap: - image: osixia/openldap:{{ docker_openldap_version }} + image: bitnami/openldap:{{ docker_openldap_version }} environment: - - LDAP_ORGANISATION={{ docker_openldap_organization }} - - LDAP_DOMAIN={{ docker_openldap_rootdn }} - - LDAP_ADMIN_PASSWORD={{ docker_openldap_admin_password }} - - LDAP_TLS=false - - LDAP_RFC2307BIS_SCHEMA=true + LDAP_ROOT: "{{ docker_openldap_rootdn }}" + LDAP_ADMIN_USERNAME: "{{ docker_openldap_admin_username }}" + LDAP_ADMIN_PASSWORD: "{{ docker_openldap_admin_password }}" + LDAP_CONFIG_ADMIN_ENABLED: "yes" + LDAP_CONFIG_ADMIN_USERNAME: "{{ docker_openldap_config_username }}" + LDAP_CONFIG_ADMIN_PASSWORD: "{{ docker_openldap_config_password }}" + LDAP_USER_DC: users + LDAP_CONFIGURE_PPOLICY: "{{ docker_openldap_configure_ppolicy }}" + LDAP_PPOLICY_HASH_CLEARTEXT: "{{ docker_openldap_ppolicy_hash_cleartext }}" + LDAP_ENABLE_TLS: "{{ docker_openldap_enable_tls }}" + LDAP_REQUIRE_TLS: "{{ docker_openldap_require_tls }}" + LDAP_ALLOW_ANON_BINDING: "{{ docker_openldap_allow_anon_binding }}" + LDAP_CUSTOM_SCHEMA_DIR: /bitnami/custom-schemas + LDAP_EXTRA_SCHEMAS: cosine, inetorgperson +{% if docker_openldap_enable_tls == "yes" %} + LDAP_TLS_CERT_FILE: /bitnami/certs/pubcert.pem + LDAP_TLS_KEY_FILE: /bitnami/certs/privkey.pem + LDAP_TLS_CA_FILE: /bitnami/certs/chain.pem +{% endif %} restart: always volumes: - - {{ docker_openldap_data_dir }}/{{ docker_openldap_service_id }}/ldap:/var/lib/ldap - - {{ docker_openldap_data_dir }}/{{ docker_openldap_service_id }}/slapd.d:/etc/ldap/slapd.d - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro + - {{ docker_openldap_data_dir }}/{{ docker_openldap_service_id }}/ldap:/bitnami/openldap + - ./certs:/bitnami/certs + - ./custom-schemas:/bitnami/custom-schemas ports: - - {{ docker_openldap_port }}:389 + - {{ docker_openldap_port }}:1389 + - {{ docker_openldap_port_tls }}:1636