diff --git a/Présentation_auto-héhergement_Kr[HACK]en.pdf b/PDF_présentation_auto-héhergement_Kr[HACK]en.pdf similarity index 100% rename from Présentation_auto-héhergement_Kr[HACK]en.pdf rename to PDF_présentation_auto-héhergement_Kr[HACK]en.pdf diff --git a/applicatif/README.md b/applicatif/README.md index 42db77c..8645475 100644 --- a/applicatif/README.md +++ b/applicatif/README.md @@ -1,5 +1,7 @@ # Applicatif -Vous trouverez ici toute la documentation relative à la partie applicative. Les services sont découpés en plusieurs zones qui sont décrites dans le premier point. L'accès au réseau des services est décrit dans la partie réseau, il est donc impératif de mettre en place le réseau avant de s'occuper de l'applicatif. +Vous trouverez ici toute la documentation relative à la partie applicative. Les services sont découpés en plusieurs zones qui sont décrites dans le premier point. + +L'accès au réseau des services est décrit dans la partie réseau, il est donc impératif de mettre en place le réseau avant de s'occuper de l'applicatif. # Table des matières 1. [Répartition des services dans les zones](repartition_en_zones.md) diff --git a/applicatif/zone_ctf/nginx_ctf.md b/applicatif/zone_ctf/nginx_ctf.md index bd1bd59..37d564d 100644 --- a/applicatif/zone_ctf/nginx_ctf.md +++ b/applicatif/zone_ctf/nginx_ctf.md @@ -1,7 +1,8 @@ # Reverse proxy NGINX sur le réseau CTF ## Spécification du conteneur -Ce service n'est pas redondé car non vital. Il portera le numéro 145. +Ce service n'est pas redondé car non vital. Il portera le numéro 145 sur Beta. + #### Deux interfaces - eth0 : vmbr1 / VLAN 40 / IP 10.0.3.3 / GW 10.0.2.254 - eth1 : vmbr2 / VLAN 100 / IP 10.1.0.145 / GW 10.1.0.254 diff --git a/applicatif/zone_dmz/dns.md b/applicatif/zone_dmz/dns.md index c30723e..4373836 100644 --- a/applicatif/zone_dmz/dns.md +++ b/applicatif/zone_dmz/dns.md @@ -6,6 +6,23 @@ Il y a deux types principaux de configurations possible pour les serveurs DNS : On conseille généralement de ne pas faire les deux sur un même serveur. En effet, une attaque peut être menée sur un serveur récursif ce qui impacterait le service d'autorité. Grâce à la gestion de vu pas de risque vu que seul les conteneurs / VM on accès au récursif. +## Le conteneur +Numéro 107 (Beta) +#### Trois interfaces +- eth0 : vmbr1 / VLAN 10 / IP 10.0.0.253 / GW 10.0.0.254 +- eth1 : vmbr1 / VLAN 20 / IP 10.0.1.253 / GW 10.0.1.254 +- eth2 : vmbr1 / VLAN 30 / IP 10.0.2.253 / GW 10.0.2.254 +- eth3 : vmbr2 / VLAN 100 / IP 10.1.0.107 / GW 10.1.0.254 + + +### Le proxy +#### /etc/apt/apt.conf.d/01proxy +``` +Acquire::http { + Proxy "http://10.0.2.252:9999"; +}; +``` + ## Installation Faites par le playbook Ansible. diff --git a/applicatif/zone_dmz/haproxy.md b/applicatif/zone_dmz/haproxy.md index ff868b0..9ab2820 100644 --- a/applicatif/zone_dmz/haproxy.md +++ b/applicatif/zone_dmz/haproxy.md @@ -8,6 +8,27 @@ Deux conteneurs Debian 10 identiques, un sur Alpha l'autre sur Bêta avec deux i - Sur Beta le conteneur HAProxy a comme IP 10.0.0.7/24 sur DMZ et 10.0.1.7/24 sur CTF L'option Firewall PVE des interfaces est désactivée +## Le conteneur +Numéro 102 (Alpha) +#### Trois interfaces +- eth0 : vmbr1 / VLAN 10 / IP 10.0.0.6 / GW 10.0.0.254 +- eth1 : vmbr1 / VLAN 20 / IP 10.0.1.1 / GW 10.0.1.254 +- eth2 : vmbr2 / VLAN 100 / IP 10.1.0.102 / GW 10.1.0.254 + +Numéro 103 (Beta) +#### Trois interfaces +- eth0 : vmbr1 / VLAN 10 / IP 10.0.0.7 / GW 10.0.0.254 +- eth1 : vmbr1 / VLAN 20 / IP 10.0.1.2 / GW 10.0.1.254 +- eth2 : vmbr2 / VLAN 100 / IP 10.1.0.103 / GW 10.1.0.254 + +### Le proxy +#### /etc/apt/apt.conf.d/01proxy +``` +Acquire::http { + Proxy "http://10.0.2.252:9999"; +}; +``` + ## Objectifs et choix techniques Trois objectifs pour la gestion du flux post-firewall : diff --git a/applicatif/zone_dmz/proxy_interne.md b/applicatif/zone_dmz/proxy_interne.md index 41d787d..2e01c8f 100644 --- a/applicatif/zone_dmz/proxy_interne.md +++ b/applicatif/zone_dmz/proxy_interne.md @@ -5,11 +5,10 @@ Nous allons mettre en place un proxy interne pour permettre au services des zone ## Création du conteneur Comme dit dans la partie déploiement, c'est le seul conteneur qu'il faut mettre en place manuellement. Avant de le mettre en place il faut avoir mis en place le réseau et générer la clé SSH du conteneur Ansible. -Pour mon installation ce conteneur porte le numéro 103. +Pour mon installation ce conteneur porte le numéro 104 sur Alpha. Au niveau de la clé SSH, mettez celle que vous avez générer dans le conteneur Ansible. Elle se trouve dans `/root/.ssh/id_ed25519.pub` - Au niveau des ressources allouées : - 2Gb de RAM - 1Gb de SWAP diff --git a/applicatif/zone_interne/LDAP/interface_web_ldap.md b/applicatif/zone_interne/LDAP/interface_web_ldap.md index d43582f..10add7c 100644 --- a/applicatif/zone_interne/LDAP/interface_web_ldap.md +++ b/applicatif/zone_interne/LDAP/interface_web_ldap.md @@ -1,944 +1,314 @@ -# LDAP - -Nous allons ici mettre en place le serveur LDAP qui sera répliqué sur les deux nodes. Tout les services utiliseront LDAP pour l'authentification des utilisateurs. -A noté que pour des questions pratique nous n'allons pas utilisé Fusion Directory, il faudra donc créer un schéma pour chaque service et modifier les utilisateur avec ldapadd et ldapmodify. -Pour la sécurisation de LDAP nous allons utiliser LDAP avec STARTTLS. - -## Installation slapd -On commence par installer le serveur ldap. -``` -apt-get update -apt-get install -y slapd ldap-utils -``` - -## Configuration de sladp -On commence par reconfigurer le packet -``` -dpkg-reconfigure slapd -``` -Il faut répondre de la manière suivante -``` -Omit OpenLDAP server configuration? No -DNS domain name: krhacken.org -Organization name? Kr[HACK]en -Administrator password: PASSWORD -Confirm password: PASSWORD -Database backend to use: MDB -Do you want the database to be removed when slapd is purged? Yes -Move old database? Yes -``` - -## Centralisation des fichiers de configuration -Nous allons créer un répertoire /root/ldap/conf qui va centraliser tous nos fichiers de configuration -``` -mkdir -p /root/ldap/conf/ -``` - -## Stockage du mot de passe administrateur -Mettez le mot de passe d'administration de l'annuaire LDAP. -``` -echo -n "mdpadmin" > /root/pwdldap -chmod 600 /root/pwdldap -``` - -## Mise en place SSL -``` -apt-get install -y gnutls-bin ssl-cert -mkdir /etc/ssl/templates -``` -### /etc/ssl/templates/ca_server.conf -``` -cn = LDAP Server CA -ca -cert_signing_key -``` -### /etc/ssl/templates/ldap_server.conf -``` -organization = "krhacken" -cn = ldap.krhacken.org -tls_www_server -encryption_key -signing_key -expiration_days = 3652 -``` -### CA clé et certificat -``` -certtool -p --outfile /etc/ssl/private/ca_server.key -certtool -s --load-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ca_server.conf --outfile /etc/ssl/certs/ca_server.pem -``` -### LDAP clé et certificat -``` -certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key -certtool -c --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ldap_server.conf --outfile /etc/ssl/certs/ldap_server.pem -``` -Nous avons maintenant créer tout les certificats nécessaire pour pouvoir chiffrer LDAP avec STARTTLS. - -## Chiffrement par STARTTLS -Nous avons choisi STARTTLS au lieu de LDAPS car il est plus sûr pour notre usage. -### Gestion des permissions -``` -usermod -aG ssl-cert openldap -chown :ssl-cert /etc/ssl/private/ldap_server.key -chmod 640 /etc/ssl/private/ldap_server.key -``` - -## Ajout des certificat à OpenLDAP -### /root/ldap/conf/addCAcerts.ldif -``` -dn: cn=config -changetype: modify -replace: olcTLSCACertificateFile -olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem -``` -Application des modification et redémarrage de slapd -``` -ldapmodify -H ldapi:// -Y EXTERNAL -f /root/ldap/conf/addCAcerts.ldif -service slapd force-reload -``` - -### /root/ldap/conf/addcerts.ldif -``` -dn: cn=config -changetype: modify -replace: olcTLSCertificateKeyFile -olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key -- -replace: olcTLSCertificateFile -olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem -``` -Application des modification et redémarrage de slapd -``` -ldapmodify -H ldapi:// -Y EXTERNAL -f /root/ldap/conf/addcerts.ldif -service slapd force-reload -``` - -Le retour de la commande -``` -ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config | grep olcTLS -``` -doit contenir les informations ci-dessous, cela confirme l'installation des certificats. -``` -olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem -olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem -olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key -``` - -## Sur le serveur -``` -cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem -``` - -Il faut ensuite ajuster la configuration en modifiant les paramètres de connexions -### /etc/ldap/ldap.conf -``` -BASE dc=krhacken,dc=org -URI ldap://alpha.ldap.krhacken.org/ -TLS_CACERT /etc/ldap/ca_certs.pem -``` -On redémarre le serveur slapd. -``` -service slapd force-reload -``` - -### Vérification -La commande `ldapsearch -xLLL -H ldap://alpha.ldap.krhacken.org -ZZ` doit retourner des informations sur l'arbre. - - -## Droits d'accès pour la configuration -### /root/ldap/conf/acces-conf-admin.ldif -``` -dn: olcDatabase={0}config,cn=config -changeType: modify -add: olcAccess -olcAccess: to * by dn.exact=cn=admin,dc=krhacken,dc=org manage by * break -``` -Puis on applique le .ldif -``` -ldapmodify -Y external -H ldapi:/// -f acces-conf-admin.ldif -``` - -# Les overlays -Les overlays sont des fonctionnalités supplémentaires. - -Voici l'ensemble des overlays que nous allons utiliser - -## MemberOf -L’overlay memberof permet de savoir dans quels groupes se trouve un utilisateur. -### /root/ldap/conf/memberof_act.ldif -``` -dn: cn=module,cn=config -cn:module -objectclass: olcModuleList -objectclass: top -olcmoduleload: memberof.la -olcmodulepath: /usr/lib/ldap -``` -### /root/ldap/conf/memberof_conf.ldif -``` -dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config -changetype: add -objectClass: olcMemberOf -objectClass: olcOverlayConfig -objectClass: olcConfig -objectClass: top -olcOverlay: memberof -olcMemberOfDangling: ignore -olcMemberOfRefInt: TRUE -olcMemberOfGroupOC: groupOfNames -olcMemberOfMemberAD: member -olcMemberOfMemberOfAD: memberOf -``` -On applique les modifications -``` -ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_act.ldif -ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_conf.ldif -``` -Vérification -``` -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList" -``` - -## refint -L'overlay permet de s’assurer de la cohérence de l’annuaire lors de suppression d’entrées. -### /root/ldap/conf/refint_act.ldif -``` -dn: cn=module,cn=config -cn: module -objectclass: olcModuleList -objectclass: top -olcmoduleload: refint.la -olcmodulepath: /usr/lib/ldap -``` -### /root/ldap/conf/refint_conf.ldif -``` -dn: olcOverlay=refint,olcDatabase={1}mdb,cn=config -objectClass: olcConfig -objectClass: olcOverlayConfig -objectClass: olcRefintConfig -objectClass: top -olcOverlay: refint -olcRefintAttribute: memberof member manager owner -olcRefintNothing: cn=admin,dc=krhacken,dc=org -``` -On applique les modifications -``` -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint_act.ldif -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint_conf.ldif -``` -Vérifications -``` -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList" -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcRefintConfig" -``` - -## Audit Log -Cet overlay audite chaque modification faites sur l’annuaire, les logs seront dans `/var/log/openldap/audit.ldif` - -### /root/ldap/conf/auditlog_act.ldif -``` -dn: cn=module,cn=config -cn: module -objectclass: olcModuleList -objectclass: top -olcModuleLoad: auditlog.la -olcmodulepath: /usr/lib/ldap -``` -### /root/ldap/conf/auditlog_conf.ldif -``` -dn: olcOverlay=auditlog,olcDatabase={1}mdb,cn=config -objectClass: olcOverlayConfig -objectClass: olcAuditLogConfig -olcOverlay: auditlog -olcAuditlogFile: /var/log/openldap/auditlog.ldif -``` -On applique les modifications -``` -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f auditlog_act.ldif -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f auditlog_conf.ldif -``` -On créer le fichier -``` -mkdir /var/log/openldap -chmod 755 /var/log/openldap -chown openldap:openldap /var/log/openldap -touch /var/log/openldap/auditlog.ldif -chmod 755 /var/log/openldap/auditlog.ldif -chown openldap:openldap /var/log/openldap/auditlog.ldif -``` -Vérifications -``` -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList" -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcAuditLogConfig" -``` - -## Unique -Cet overlay permet de nous assurer l’unicité des attributs que l’on spécifie. -### /root/ldap/conf/unique_act.ldif -``` -dn: cn=module,cn=config -cn: module -objectclass: olcModuleList -objectclass: top -olcModuleLoad: unique.la -olcmodulepath: /usr/lib/ldap -``` -### /root/ldap/conf/unique_conf.ldif -``` -dn: olcOverlay=unique,olcDatabase={1}mdb,cn=config -objectClass: olcOverlayConfig -objectClass: olcUniqueConfig -olcOverlay: unique -olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?uid?sub -olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?mail?sub -olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?uidNumber?sub -olcUniqueUri: ldap:///ou=groups,dc=krhacken,dc=org?cn?sub -``` -Nous demandons ici à ce que les attributs UI, mail et uidNumber dans l’ou people soient uniques. Et que l’attribut cn dans l’ou groups soit lui aussi unique. -On applique les modifications, -``` -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f unique_act.ldif -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f unique_conf.ldif -``` -Vérifications, -``` -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList" -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcUniqueConfig" -``` - -## Ppolicy -Cet overlay va nous permettre de spécifier une politique de mot de passe. - -On va ajouter son schéma dans l’annuaire -``` -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif -``` -Dans la branche cn=schema, on doit voir le schéma ppolicy, -``` -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=schema,cn=config" cn -``` -### /root/ldap/conf/ppolicy_act.ldif -``` -dn: cn=module,cn=config -cn: module -objectclass: olcModuleList -objectclass: top -olcModuleLoad: ppolicy.la -olcmodulepath: /usr/lib/ldap -``` -### /root/ldap/conf/ppolicy_conf.ldif -``` -dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config -objectClass: olcOverlayConfig -objectClass: olcPpolicyConfig -olcOverlay: ppolicy -olcPPolicyDefault: cn=ppolicy,dc=krhacken,dc=org -olcPPolicyHashCleartext: TRUE -olcPPolicyUseLockout: FALSE -``` -Explication, -- olcPPolicyDefault : Indique le DN de configuration utilisé -- olcPPolicyHashCleartext : Indique si les mots de passe doivent être cryptés. - -On applique les modifications, -``` -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ppolicy_act.ldif -ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ppolicy_conf.ldif -``` -On va maintenant créer la politique par défaut. - -### /root/ldap/conf/ppolicy_def.ldif -``` -dn: cn=ppolicy,dc=krhacken,dc=org -objectClass: top -objectClass: device -objectClass: pwdPolicy -cn: ppolicy -pwdAllowUserChange: TRUE -pwdAttribute: userPassword -pwdCheckQuality: 1 -pwdExpireWarning: 0 -pwdFailureCountInterval: 30 -pwdGraceAuthNLimit: 5 -pwdInHistory: 5 -pwdLockout: TRUE -pwdLockoutDuration: 60 -pwdMaxAge: 0 -pwdMaxFailure: 5 -pwdMinAge: 0 -pwdMinLength: 5 -pwdMustChange: FALSE -pwdSafeModify: FALSE -``` -La signification des attributs est : -- pwdAllowUserChange : indique si l’utilisateur peut changer son mot de passe. -- pwdCheckQuality : indique si OpenLDAP renvoie une erreur si le mot de passe n’est pas conforme -- pwdExpireWarning : avertissement d’expiration. -- pwdFailureCountInterval : Intervalle de temps entre deux tentatives infructueuses pour qu’elles soient considérées comme « à la suite ». -- pwdGraceAuthNLimit : période de grâce suite à l’expiration du mot de passe. -- pwdInHistory : nombre de mots de passe dans l’historique. -- pwdLockout : indique si on bloque le compte au bout de X échecs. -- pwdLockoutDuration : durée du blocage du compte (en secondes). -- pwdMaxAge : age maximal du mot de passe (en secondes). -- pwdMaxFailure : nombre d’échecs de saisie du mot de passe maximal (avant blocage). -- pwdMinAge : age minimal du mot de passe (en secondes). -- pwdMinLength : longueur minimale du mot de passe. -- pwdMustChange : indique si l’utilisateur doit changer son mot de passe. -- pwdSafeModify : indique si il faut envoyer l’ancien mot de passe avec le nouveau pour modification. - -On applique les modifications, -``` -ldapadd -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f ppolicy_def.ldif -``` -Vérifications -``` -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=schema,cn=config" cn -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcPpolicyConfig" -LLL -ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "dc=krhacken,dc=org" "Objectclass=pwdPolicy" -``` - - -## Structuration de l'annuaire LDAP. - -Maintenant que la base de l'annuaire est en place nous allons structurer l'intérieur de l'annuaire. - -Avant ça nous allons décrire la structure comme un arbre. - -### Le tronc (le DC) -- Le tronc de cet arbre : `dc=krhacken,dc=org`, c'est ce que l'on appelle le DN de base. - -### Les grosses branches (les OU) -- Une grosse branche pour les utilisateurs : `ou=people,dc=krhacken,dc=org`. -- Une sous branche des utilisateurs pour les membres krhacken : `ou=krhacken,ou=people,dc=krhacken,dc=org`. -- Une grosse branche pour les groupes : `ou=group,dc=krhacken,dc=org`. -- Une sous branche des groupes pour les groupes krhacken : `ou=krhacken,ou=group,dc=krhacken,dc=org`. - -### Les petites branches (les CN) -- Une petite branche pour le groupe des adminsys : `cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org` -- Une petite branche pour le groupe des webmestres : `cn=webmestre,ou=krhacken,ou=group,dc=krhacken,dc=org` -- Une petite branche pour le groupe des membres krhacken : `cn=krhacken,ou=krhacken,ou=group,dc=krhacken,dc=org` -- Une petite branche pour le groupe des membres extérieur : -`cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org` - -## Mise en place des grosses branches - -Les OUs sont des conteneurs qui permettent de ranger les données dans l’annuaire et de les hiérarchiser. - -### /root/ldap/conf/OU.ldif -``` -dn: ou=people,dc=krhacken,dc=org -ou: people -objectClass: organizationalUnit - -dn: ou=group,dc=krhacken,dc=org -ou: group -objectClass: organizationalUnit - -dn: ou=system,dc=krhacken,dc=org -ou: system -objectClass: organizationalUnit - -dn: ou=krhacken,ou=people,dc=krhacken,dc=org -ou: krhacken -objectClass: organizationalUnit - -dn: ou=krhacken,ou=group,dc=krhacken,dc=org -ou: krhacken -objectClass: organizationalUnit -``` -On rajoute les OU au ldap -``` -ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f OU.ldif -``` - -## Mise en place des petites branches - -Il existe deux types de groupes : les posixgroup et les groupofnames. - -Les posixgroup sont similaires au groupes Unix. - -Pour faire simple, l’avantage des groupofnames est qu’avec un filtre sur un utilisateur, on peut connaitre ses groupes (avec l’overlay memberof). Chose impossible avec les posixgroups. On va donc utiliser des groupofnames. - -### /root/ldap/conf/group.ldif -``` -dn: cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org -cn: adminsys -description: AdminSys Kr[HACK]en -objectClass: groupOfNames -member: cn=admin,dc=krhacken,dc=org - -dn: cn=webmestre,ou=krhacken,ou=group,dc=krhacken,dc=org -cn: webmestre -description: Webmestre Kr[HACK]en -objectClass: groupOfNames -member: cn=admin,dc=krhacken,dc=org - -dn: cn=krhacken,ou=krhacken,ou=group,dc=krhacken,dc=org -cn: krhacken -description: Membres du Kr[HACK]en -objectClass: groupOfNames -member: cn=admin,dc=krhacken,dc=org - -dn: cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org -cn: ext -description: Personnes extérieure au Kr[HACK]en -objectClass: groupOfNames -member: cn=admin,dc=krhacken,dc=org -``` -On ajoute les groupes -``` -ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f group.ldif -``` -On peu utiliser **memberof** pour voir dans quels groupes est l'utilisateur admin -``` -ldapsearch -xLLLH ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -b "dc=krhacken,dc=org" "cn=admin" memberof -``` - -## Création d'un compte root - -Cet utilisateur aura tout les droits sur l'annuaire, on ne lui donnera pas accès aux services son rôle est seulement d'administrer l'annuaire LDAP. - -### /root/ldap/conf/root.ldif -``` -dn: uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org -objectclass: person -objectclass: organizationalPerson -objectclass: inetOrgPerson -uid: root -cn: root -sn: root -displayName: root -userPassword: PASSWORD -mail: root@krhacken.org -``` -On ajoute l'utilisateur -``` -ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f root.ldif -``` - -Ajout de compte root au groupe adminsys pour qu'il est accès à l'interface d'administration - -### /root/ldap/conf/adminsysaddroot.ldif -``` -dn: cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org -changetype: modify -add: member -member: uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org -``` -``` -ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f adminsysaddroot.ldif -``` - -Commande pour afficher les informations de l'utilisateur root -``` -ldapsearch -xLLLH ldap://localhost -D uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org -W -b "dc=krhacken,dc=org" "uid=root" -``` - -# Sécurisation de l'annuaire - -## Comptes avec permissions réduite -Nous allons créer deux compte systèmes. -- Un viewer qui aura uniquement les droits en lecture de l'arbre -- Un Writer qui lui aura les droits en écriture - -### /root/ldap/conf/viewer.ldif -``` -dn: cn=viewer,ou=system,dc=krhacken,dc=org -objectClass: simpleSecurityObject -objectClass: organizationalRole -cn: viewer -description: LDAP Viewer -userPassword: passview -``` - -### /root/ldap/conf/writer.ldif -``` -dn: cn=writer,ou=system,dc=krhacken,dc=org -objectClass: simpleSecurityObject -objectClass: organizationalRole -cn: writer -description: LDAP Writer -userPassword: passwrite -``` -Ajout des utilisateurs, -``` -ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f viewer.ldif -ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f writer.ldif -``` - -On autorise la lecture de l'arbre uniquement au utilisateur authentifié en modifiant une ACL -### /root/ldap/conf/acl.ldif -``` -dn: olcDatabase={1}mdb,cn=config -changetype: modify -replace: olcAccess -olcAccess: to attrs=userPassword by self write by anonymous auth by dn="cn=writer,ou=system,dc=krhacken,dc=org" write by dn="cn=viewer,ou=system,dc=krhacken,dc=org" read by dn="cn=admin,dc=krhacken,dc=org" write by * none -olcAccess: to dn.base="dc=krhacken,dc=org" by users read -olcAccess: to * by self write by dn="cn=admin,dc=krhacken,dc=org" write by * read by anonymous none -``` -On modife l'ACL -``` -ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f acl.ldif -``` - -## Forcer SSL -Si c'est le cas on peut maintenant forcer la connexion SSL -### /root/ldap/conf/forcetls.ldif -``` -dn: olcDatabase={1}mdb,cn=config -changetype: modify -add: olcSecurity -olcSecurity: tls=1 -``` -Ajout des modifications et application -``` -ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif -systemctl restart slapd -``` - -### Vérification -La commande -``` -ldapsearch -xLLL -H ldap://localhost -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b "dc=krhacken,dc=org" -``` -doit retourner une erreur, si on ajout -ZZ à la fin ça doit fonctionner - -Voilà pour la mise en place de base du LDAP cependant il faut configuré chaque client pour se connecter au serveur avec STARTTLS. - -## Réplication de l'annuaire LDAP - -Nous allons mettre en place une réplication Master/Master. L’idée est de faire en sorte que n’importe lequel de nos serveurs LDAP soit capable à la fois de lire les données, mais également de les modifier. De plus, nous allons mettre en place une réplication, à la fois sur l’arbre de données dc=krhacken,dc=org mais également sur l’arbre de configuration cn=config. - -Vous avez déjà fait toute la configuration du premier conteneur LDAP (CT107). Pour gagner du temps clonez ce conteneur vers le conteneur 108 sur l'autre node. - -Avant le démarrage il vous faudra reconfigurer les interfaces comme suis : -- eth0 : vmbr1 / VLAN: 30 / IP: 10.0.2.2/24 / GW: 10.0.2.254 -- eth1 : vmbr2 / VLAN: 100 / IP: 10.1.0.108/24 / GW: 10.1.0.254 - -Nous avons désormais deux conteneurs LDAP identique, ce qui ne fonctionnera pas dans l'état. - -Il faut donc ajuster la configuration en modifiant les paramètres de connexions - - -### /etc/ldap/ldap.conf -Sur Alpha : -``` -BASE dc=krhacken,dc=org -URI ldap://alpha.ldap.krhacken.org/ -URI ldap://vip.ldap.krhacken.org/ -TLS_CACERT /etc/ldap/ca_certs.pem -``` -Sur Beta : -``` -BASE dc=krhacken,dc=org -URI ldap://beta.ldap.krhacken.org/ -URI ldap://vip.ldap.krhacken.org/ -TLS_CACERT /etc/ldap/ca_certs.pem -``` - -On redémarre les serveurs slapd. -``` -service slapd force-reload -``` - -## Réplication de l'arbre de configuration - -### 01-syncprov_act.ldif -``` -dn: cn=module,cn=config -cn: module -objectclass: olcModuleList -objectclass: top -olcmoduleload: syncprov.la -olcmodulepath: /usr/lib/ldap -``` -``` -ldapadd -Y EXTERNAL -H ldapi:/// -f 01-syncprov_act.ldif -``` - -Vérifications : -``` -ldapsearch -LLLY external -H ldapi:/// -b "cn=config" "objectClass=olcModuleList" -ldapsearch -LLLY external -H ldapi:/// -b "cn=module{6},cn=config" -``` - -### 02-serverid.ldif -X vaut 1 sur Alpha 2 sur Beta. -``` -dn: cn=config -changetype: modify -add: olcServerID -olcServerID: X -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 02-serverid.ldif -``` -Vérification : -``` -ldapsearch -LLLY external -H ldapi:/// -b "cn=config" "objectClass=olcGlobal" olcServerID -``` - -### 03-replica_account.ldif -``` -dn: cn=replica,ou=system,dc=krhacken,dc=org -userPassword: PASS -cn: replica -objectclass: top -objectclass: person -sn: replica -``` -``` -ldapadd -x -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f 03-replica_account.ldif -``` - -### 04-droit_conf.ldif -Gestion des droits du CN *replica* -``` -dn: olcDatabase={0}config,cn=config -changeType: modify -add: olcAccess -olcAccess: to * by dn.exact=cn=replica,ou=system,dc=krhacken,dc=org manage by * break -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 04-droit_conf.ldif -``` - -### 05-syncprov_conf_conf.ldif -``` -dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config -changetype: add -objectClass: olcOverlayConfig -objectClass: olcSyncProvConfig -olcOverlay: syncprov -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 05-syncprov_conf_conf.ldif -``` - -### 06-repl_conf_conf.ldif -``` -dn: olcDatabase={0}config,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=01 provider=ldap://alpha.ldap.krhacken.org - binddn="cn=replica,ou=system,dc=krhacken,dc=org" bindmethod=simple - credentials=password searchbase="cn=config" - type=refreshAndPersist retry="5 5 300 5" timeout=1 -olcSyncRepl: rid=02 provider=ldap://beta.ldap.krhacken.org - binddn="cn=replica,ou=system,dc=krhacken,dc=org" bindmethod=simple - credentials=password searchbase="cn=config" - type=refreshAndPersist retry="5 5 300 5" timeout=1 -- -add: olcMirrorMode -olcMirrorMode: TRUE -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 06-repl_conf_conf.ldif -``` -Vérification : -``` -ldapsearch -QLLLY external -H ldapi:/// -b "cn=config" "olcDatabase={0}config" olcSyncRepl -``` - -A partir d'ici l'arbre de configuration cn=config est synchronisé entre les deux conteneurs LDAP. Pour le reste de la configuration il faut faire les manipulations que sur un des deux conteneurs LDAP - -## Réplication de l'arbre de données -Nous allons ici mettre en place la synchronisation automatique de l'arbre de données entre les deux conteneurs LDAP. - -### 07-acl_replica.ldif -``` -dn: olcDatabase={1}mdb,cn=config -changetype: modify -replace: olcAccess -olcAccess: to attrs=userPassword by self write by anonymous auth by dn="cn=writer,ou=system,dc=krhacken,dc=org" write by dn="cn=viewer,ou=system,dc=krhacken,dc=org" read by dn="cn=admin,dc=krhacken,dc=org" write by dn.exact="cn=replica,ou=system,dc=krhacken,dc=org" read by * none -olcAccess: to dn.subtree="dc=krhacken,dc=org" by users read by * none -olcAccess: to * by self write by dn="cn=admin,dc=krhacken,dc=org" write by * read by anonymous none -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 07-acl_replica.ldif -``` -Vérification : -``` -ldapsearch -QLLLY external -H ldapi:/// -b "cn=config" "olcDatabase={1}mdb" olcAccess -``` - -### 08-limit.ldif -``` -dn: olcDatabase={1}mdb,cn=config -changetype: modify -add: olcLimits -olcLimits: dn.exact="cn=replica,ou=system,dc=krhacken,dc=org" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 08-limit.ldif -``` - -### 09-index.ldif -``` -dn:olcDatabase={1}mdb,cn=config -changetype: modify -add: olcDbIndex -olcDbIndex: entryCSN,entryUUID eq -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 09-index.ldif -``` - -### 10-syncprov_conf_data.ldif -``` -dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config -changetype: add -objectClass: olcOverlayConfig -objectClass: olcSyncProvConfig -olcOverlay: syncprov -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 10-syncprov_conf_data.ldif -``` - -### 11-repl_conf_data.ldif -``` -dn: olcDatabase={1}mdb,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=01 provider=ldap://alpha.ldap.krhacken.org - binddn="cn=replica,ou=system,dc=krhacken,dc=org" - bindmethod=simple credentials=password - searchbase="dc=krhacken,dc=org" - type=refreshAndPersist retry="5 5 300 5" timeout=1 -olcSyncRepl: rid=02 provider=ldap://beta.ldap.krhacken.org - binddn="cn=replica,ou=system,dc=krhacken,dc=org" - bindmethod=simple credentials=password - searchbase="dc=krhacken,dc=org" - type=refreshAndPersist retry="5 5 300 5" timeout=1 -- -add: olcMirrorMode -olcMirrorMode: TRUE -``` -``` -ldapmodify -Y EXTERNAL -H ldapi:/// -f 11-repl_conf_data.ldif -``` - -## Configuration des ServerID -A cause de la synchronisation de l'arbre de configuration les ServerID sont les mêmes. - -Il faut stoper **slapd** sur les deux conteneurs avec `systemctl stop slapd` - -Puis éditer `/etc/ldap/slapd.d/cn\=config.ldif` de la manière suivante -- Alpha -> `olcServerID: 1` -- Beta -> `olcServerID: 2` - -On peut maintenant relancer slapd sur les deux conterneurs avec `systemctl start slapd` - -Maintenant la commande ci-dessous donne un ID différent selon le conteneur. -``` -ldapsearch -x -LLL -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -w passadmin -b cn=config "objectClass=olcGlobal" -``` - -## Accès via une IP virtuelle -Comme pour HAProxy nous allons utiliser keepalived pour avoir une IP virtuelle que se déplace entre les deux conteneurs en fonction de la disponibilité de l'annuaire LDAP. - -``` -apt-get install -y keepalived -``` - -### Script pour vérifier l'état des conteneurs LDAP - -Créer, sur les deux serveurs, le script `/etc/keepalived/test_ldap.sh` - -Il faut spécifier le mot de passe du compte viewer. -``` -#!/bin/bash - -ldapsearch -x -H ldap://$1 -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b dc=krhacken,dc=org -l 3 > /dev/null 2>&1 -ldapresponse=$? - -if [ "$ldapresponse" -gt 0 ]; then - echo "down" - exit 1 -else - echo "up" -fi - -exit 0 -``` -``` -chmod /etc/keepalived/test_ldap.sh +x -``` - -## Configuration de keepalived - -### Configuration sur Alpha -#### /etc/keepalived/keepalived.conf -``` -vrrp_script check_server_health { - script "/etc/keepalived/test_ldap.sh 10.0.2.1" (mettre l'ip réel de votre serveur) - interval 2 - fall 2 - rise 2 -} -vrrp_instance VI_LDAP { - interface eth0 - state MASTER - virtual_router_id 50 - priority 101 # 101 on master, 100 on backup - virtual_ipaddress { - 10.0.2.3 - } - track_script { - check_server_health - } +# Interface Web de gestion LDAP + +Nous avons fait le choix de ne pas utiliser FusionDirectory principalement pour des questions de sureté car avec FusionDirectory il est très simple de tout casser. Le services que nous allons utilisé restreint ce que la personne peux casser. + +L'interface que nous allons utilisé et une version légèrement modifié de ce [projet](https://github.com/kakwa/ldapcherry) sous Licence MIT donc réutilisable / modifiable à souhait. + +Cette interface permet aussi aux utilisateurs non admin de changer de mot de passe. + +## Le conteneur +Numéro 115 (Beta) +#### Deux interfaces +- eth0 : vmbr1 / VLAN 30 / IP 10.0.2.15 / GW 10.0.2.254 +- eth1 : vmbr2 / VLAN 100 / IP 10.1.0.115 / GW 10.1.0.254 + +### Le proxy + +#### /root/.gitconfig +``` +[http] + proxy = http://10.0.2.252:3128 +[https] + proxy = https://10.0.2.252:3128 +``` + +#### /etc/apt/apt.conf.d/01proxy +``` +Acquire::http { + Proxy "http://10.0.2.252:9999"; +}; +``` + + +## Installation +``` +git clone https://github.com/kakwa/ldapcherry +apt-get install python-ldap python-pip +pip install --proxy http://10.0.2.252:3128 cherrypy mako pyyaml +export SYSCONFDIR=/etc +export DATAROOTDIR=/usr/share/ +python setup.py install +``` + +## Configuration +Modification des fichiers de configuration et modification de l'interface web. + +### /etc/ldapcherry/attributes.yml +``` +cn: + description: "Prénom" + display_name: "Prénom" + type: string + weight: 10 + backends: + ldap: cn + +sn: + description: "Nom de famille" + display_name: "Nom" + search_displayed: True + weight: 20 + type: string + backends: + ldap: sn + +given: + description: "Prénom & Nom" + display_name: "Nom d'affichage" + search_displayed: True + type: string + weight: 30 + backends: + ldap: displayName + +email: + description: "Email" + display_name: "Email" + search_displayed: True + type: email + weight: 40 + backends: + ldap: mail + +uid: + description: "UID de l'utilisateur" + display_name: "UID" + search_displayed: True + key: True + type: string + weight: 50 + backends: + ldap: uid + +password: + description: "Mot de passe de l'utilisateur" + display_name: "Mot de passe" + weight: 31 + self: True + type: password + backends: + ldap: userPassword + +mailaccountactif: + description: "YES ou NO" + display_name: "Mail Actif" + search_displayed: True + weight: 60 + type: string + autofill: + function: lcMailActif + args: + - 'YES' + backends: + ldap: mailaccountactif + +mailaccountquota: + description: "0 par défaut" + display_name: "Mail Quota" + search_displayed: True + weight: 61 + type: string + autofill: + function: lcMailQuota + args: + - '2147483648' + backends: + ldap: mailaccountquota + +cloudaccountactif: + description: "YES or NO" + display_name: "Cloud Actif" + search_displayed: True + weight: 70 + type: string + autofill: + function: lcCloudActif + args: + - 'YES' + backends: + ldap: cloudaccountactif + +cloudaccountquota: + description: "5GB par défaut" + display_name: "Cloud Quota" + search_displayed: True + weight: 71 + type: string + autofill: + function: lcCloudQuota + args: + - '5GB' + backends: + ldap: cloudaccountquota + +gitaccountactif: + description: "YES or NO" + display_name: "Git Actif" + search_displayed: True + weight: 80 + type: string + autofill: + function: lcGitActif + args: + - 'YES' + backends: + ldap: gitaccountactif +``` + + + +### /etc/ldapcherry/ldapcherry.ini +``` +[global] +server.socket_host = '0.0.0.0' +server.socket_port = 8080 +server.thread_pool = 8 + +request.show_tracebacks = False +log.error_handler = 'syslog' +log.access_handler = 'none' +log.level = 'info' +tools.sessions.on = True +tools.sessions.timeout = 10 + +[attributes] +attributes.file = '/etc/ldapcherry/attributes.yml' + +[roles] +roles.file = '/etc/ldapcherry/roles.yml' + +[backends] +ldap.module = 'ldapcherry.backend.backendLdap' +ldap.display_name = 'My Ldap Directory' +ldap.uri = 'ldap://alpha.ldap.sessionkrkn.fr' +ldap.ca = '/etc/ldap/ca_certs.pem' +ldap.starttls = 'on' +ldap.checkcert = 'off' +ldap.binddn = 'cn=admin,dc=sessionkrkn,dc=fr' +#ldap.binddn = 'cn=writer,ou=system,dc=sessionkrkn,dc=fr' +ldap.password = '8PizMOVqhDwSVChJwNy8Xcb1rPzDEuYbwXdd' +ldap.timeout = 1 +ldap.groupdn = 'ou=workgroup,ou=group,dc=sessionkrkn,dc=fr' +ldap.userdn = 'ou=krhacken,ou=people,dc=sessionkrkn,dc=fr' +ldap.user_filter_tmpl = '(uid=%(username)s)' +ldap.group_filter_tmpl = '(member=uid=%(username)s,ou=krhacken,ou=people,dc=sessionkrkn,dc=fr)' +ldap.search_filter_tmpl = '(|(uid=%(searchstring)s*)(sn=%(searchstring)s*))' +ldap.group_attr.member = "%(dn)s" +ldap.dn_user_attr = 'uid' + +# Ajouter les classes nécessaire en cas de création de nouveau service +ldap.objectclasses = 'person, organizationalPerson, inetOrgPerson, mailaccountkrhacken, cloudaccountkrhacken gitaccountkrhacken' + +[ppolicy] +ppolicy.module = 'ldapcherry.ppolicy.simple' +min_length = 8 +min_upper = 1 +min_digit = 1 + +[auth] +auth.mode = 'or' + +[resources] +templates.dir = '/usr/share/ldapcherry/templates/' + +[/static] +tools.staticdir.on = True +tools.staticdir.dir = '/usr/share/ldapcherry/static/' +``` + +### /etc/ldapcherry/roles.yml +``` +admin: + display_name: AdminSys + description: Administrateur total de l'annuaire LDAP + LC_admins: True + backends_groups: + ldap: + - cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org + +webmestre: + display_name: Webmestre + description: Webmestre des services + LC_admins: True + backends_groups: + ldap: + - cn=webmestre,ou=krhacken,ou=group,dc=krhacken,dc=org + +club: + display_name: Membre du Club + description: Membre du Bureau + backends_groups: + ldap: + - cn=krhacken,ou=krhacken,ou=group,dc=krhacken,dc=org + +ext: + display_name: Personne extérieure + description: Membre Actif + backends_groups: + ldap: + - cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org +``` + +### Interface Web +Placer le contenu du dossier **sources** dans **/usr/share/ldapcherry/** + +## Mise en place +Mise en place de HAProxy et de NGINX pour l'accès à l'interface et mise en place d'un daemon systemd pour le démarrage automatique de l'interface Web. + +### Dans le conteneur Nginx +#### /etc/nginx/sites-available/nextcloud +``` +server { + listen 80; + server_name ldapui.krhacken.org; + location / { + proxy_pass http://10.0.2.15:8080/; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } } ``` ``` -systemctl restart keepalived -``` - authentication { - auth_type PASS - auth_pass MON_MOT_DE_PASSE_SECRET - } - -### Configuration sur Beta -#### /etc/keepalived/keepalived.conf -``` -vrrp_script check_server_health { - script "/etc/keepalived/test_ldap.sh 10.0.2.2" (mettre l'ip réel de votre serveur) - interval 2 - fall 2 - rise 2 -} -vrrp_instance VI_LDAP { - interface eth0 - state MASTER - virtual_router_id 50 - priority 101 # 101 on master, 100 on backup - virtual_ipaddress { - 10.0.2.3 - } - track_script { - check_server_health - } -} -``` -``` -systemctl restart keepalived -``` -Un des deux conteneur est maintenant accessible à l'adresse 10.0.2.3. Les requêtes se feront sur cette adresse. - - -## Configuration des futurs client LDAP -Sur tout les futurs client LDAP il faudra activer la connexion SSL. -Il faut commencer par copier le certificat de la CA (ca_server.pem qu'il faudra copier via scp) -``` -cat ca_server.pem | tee -a /etc/ldap/ca_certs.pem -``` -Il faut ensuite modifier la configuration en modifiant la ligne suivante -### /etc/ldap/ldap.conf -``` -TLS_CACERT /etc/ldap/ca_certs.pem +sh ~/deploy-webhost.sh nextcloud ``` -La commande, +### Dans le conteneur HAProxy +Obtention du certificat ``` -ldapsearch -xLLL -H ldap://vip.ldap.krhacken.org -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b "dc=krhacken,dc=org" -ZZ +certbot certonly --webroot -w /home/hasync/letsencrypt-requests/ -d ldapui.krhacken.org ``` -doit retourner des informations sur l'arbre. +``` +sh ~/install-certs.sh +``` + +## Daemon Systemd +### /etc/systemd/system/ldapui.service +``` +Description=LDAP WebUI +Requires=ldapui.service +After=ldapui.service +[Service] +Restart=always +ExecStart=ldapcherryd -c /etc/ldapcherry/ldapcherry.ini -D -p /etc/ldapcherry/proc.pid +ExecStop=kill -9 `cat /etc/ldapcherry/proc.pid` +[Install] +WantedBy=multi-user.target +``` +``` +systemctl enable ldapui.service +systemctl start ldapui.service +``` + +L'interface de gestion LDAP est désormais accessible à l'adresse **https://ldapui.sessionkrkn.fr** diff --git a/applicatif/zone_interne/LDAP/serveur_ldap.md b/applicatif/zone_interne/LDAP/serveur_ldap.md index 6165b49..c4cb064 100644 --- a/applicatif/zone_interne/LDAP/serveur_ldap.md +++ b/applicatif/zone_interne/LDAP/serveur_ldap.md @@ -1,290 +1,958 @@ -# Interface Web de gestion LDAP +# LDAP -Nous avons fait le choix de ne pas utiliser FusionDirectory principalement pour des questions de sureté car avec FusionDirectory il est très simple de tout casser. Le services que nous allons utilisé restreint ce que la personne peux casser. +Nous allons ici mettre en place le serveur LDAP qui sera répliqué sur les deux nodes. Tout les services utiliseront LDAP pour l'authentification des utilisateurs. +A noté que pour des questions pratique nous n'allons pas utilisé Fusion Directory, il faudra donc créer un schéma pour chaque service et modifier les utilisateur avec ldapadd et ldapmodify. +Pour la sécurisation de LDAP nous allons utiliser LDAP avec STARTTLS. -L'interface que nous allons utilisé et une version légèrement modifié de ce [projet](https://github.com/kakwa/ldapcherry) sous Licence MIT donc réutilisable / modifiable à souhait. +## Le conteneur +Numéro 107 (Alpha) +#### Deux interfaces +- eth0 : vmbr1 / VLAN 30 / IP 10.0.2.1 / GW 10.0.2.254 +- eth1 : vmbr2 / VLAN 100 / IP 10.1.0.107 / GW 10.1.0.254 -Cette interface permet aussi aux utilisateurs non admin de changer de mot de passe. - -## Installation +### Le proxy +#### /etc/apt/apt.conf.d/01proxy ``` -git clone https://github.com/kakwa/ldapcherry -apt-get install python-ldap python-pip -pip install --proxy http://10.0.2.252:3128 cherrypy mako pyyaml -export SYSCONFDIR=/etc -export DATAROOTDIR=/usr/share/ -python setup.py install +Acquire::http { + Proxy "http://10.0.2.252:9999"; +}; ``` -## Configuration -Modification des fichiers de configuration et modification de l'interface web. - -### /etc/ldapcherry/attributes.yml +## Installation slapd +On commence par installer le serveur ldap. +``` +apt-get update +apt-get install -y slapd ldap-utils ``` -cn: - description: "Prénom" - display_name: "Prénom" - type: string - weight: 10 - backends: - ldap: cn -sn: - description: "Nom de famille" - display_name: "Nom" - search_displayed: True - weight: 20 - type: string - backends: - ldap: sn +## Configuration de sladp +On commence par reconfigurer le packet +``` +dpkg-reconfigure slapd +``` +Il faut répondre de la manière suivante +``` +Omit OpenLDAP server configuration? No +DNS domain name: krhacken.org +Organization name? Kr[HACK]en +Administrator password: PASSWORD +Confirm password: PASSWORD +Database backend to use: MDB +Do you want the database to be removed when slapd is purged? Yes +Move old database? Yes +``` -given: - description: "Prénom & Nom" - display_name: "Nom d'affichage" - search_displayed: True - type: string - weight: 30 - backends: - ldap: displayName +## Centralisation des fichiers de configuration +Nous allons créer un répertoire /root/ldap/conf qui va centraliser tous nos fichiers de configuration +``` +mkdir -p /root/ldap/conf/ +``` -email: - description: "Email" - display_name: "Email" - search_displayed: True - type: email - weight: 40 - backends: - ldap: mail +## Stockage du mot de passe administrateur +Mettez le mot de passe d'administration de l'annuaire LDAP. +``` +echo -n "mdpadmin" > /root/pwdldap +chmod 600 /root/pwdldap +``` -uid: - description: "UID de l'utilisateur" - display_name: "UID" - search_displayed: True - key: True - type: string - weight: 50 - backends: - ldap: uid +## Mise en place SSL +``` +apt-get install -y gnutls-bin ssl-cert +mkdir /etc/ssl/templates +``` +### /etc/ssl/templates/ca_server.conf +``` +cn = LDAP Server CA +ca +cert_signing_key +``` +### /etc/ssl/templates/ldap_server.conf +``` +organization = "krhacken" +cn = *.ldap.krhacken.org +tls_www_server +encryption_key +signing_key +expiration_days = 3652 +``` +### CA clé et certificat +``` +certtool -p --outfile /etc/ssl/private/ca_server.key +certtool -s --load-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ca_server.conf --outfile /etc/ssl/certs/ca_server.pem +``` +### LDAP clé et certificat +``` +certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key +certtool -c --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ldap_server.conf --outfile /etc/ssl/certs/ldap_server.pem +``` +Nous avons maintenant créer tout les certificats nécessaire pour pouvoir chiffrer LDAP avec STARTTLS. -password: - description: "Mot de passe de l'utilisateur" - display_name: "Mot de passe" - weight: 31 - self: True - type: password - backends: - ldap: userPassword +## Chiffrement par STARTTLS +Nous avons choisi STARTTLS au lieu de LDAPS car il est plus sûr pour notre usage. +### Gestion des permissions +``` +usermod -aG ssl-cert openldap +chown :ssl-cert /etc/ssl/private/ldap_server.key +chmod 640 /etc/ssl/private/ldap_server.key +``` -mailaccountactif: - description: "YES ou NO" - display_name: "Mail Actif" - search_displayed: True - weight: 60 - type: string - autofill: - function: lcMailActif - args: - - 'YES' - backends: - ldap: mailaccountactif +## Ajout des certificat à OpenLDAP +### /root/ldap/conf/addCAcerts.ldif +``` +dn: cn=config +changetype: modify +replace: olcTLSCACertificateFile +olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem +``` +Application des modification et redémarrage de slapd +``` +ldapmodify -H ldapi:// -Y EXTERNAL -f /root/ldap/conf/addCAcerts.ldif +service slapd force-reload +``` -mailaccountquota: - description: "0 par défaut" - display_name: "Mail Quota" - search_displayed: True - weight: 61 - type: string - autofill: - function: lcMailQuota - args: - - '2147483648' - backends: - ldap: mailaccountquota +### /root/ldap/conf/addcerts.ldif +``` +dn: cn=config +changetype: modify +replace: olcTLSCertificateKeyFile +olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key +- +replace: olcTLSCertificateFile +olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem +``` +Application des modification et redémarrage de slapd +``` +ldapmodify -H ldapi:// -Y EXTERNAL -f /root/ldap/conf/addcerts.ldif +service slapd force-reload +``` -cloudaccountactif: - description: "YES or NO" - display_name: "Cloud Actif" - search_displayed: True - weight: 70 - type: string - autofill: - function: lcCloudActif - args: - - 'YES' - backends: - ldap: cloudaccountactif +Le retour de la commande +``` +ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config | grep olcTLS +``` +doit contenir les informations ci-dessous, cela confirme l'installation des certificats. +``` +olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem +olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem +olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key +``` -cloudaccountquota: - description: "5GB par défaut" - display_name: "Cloud Quota" - search_displayed: True - weight: 71 - type: string - autofill: - function: lcCloudQuota - args: - - '5GB' - backends: - ldap: cloudaccountquota +## Sur le serveur +``` +cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem +``` -gitaccountactif: - description: "YES or NO" - display_name: "Git Actif" - search_displayed: True - weight: 80 - type: string - autofill: - function: lcGitActif - args: - - 'YES' - backends: - ldap: gitaccountactif +Il faut ensuite ajuster la configuration en modifiant les paramètres de connexions +### /etc/ldap/ldap.conf +``` +BASE dc=krhacken,dc=org +URI ldap://alpha.ldap.krhacken.org/ +TLS_CACERT /etc/ldap/ca_certs.pem +``` +On redémarre le serveur slapd. +``` +service slapd force-reload +``` + +### Vérification +La commande `ldapsearch -xLLL -H ldap://alpha.ldap.krhacken.org -ZZ` doit retourner des informations sur l'arbre. + + +## Droits d'accès pour la configuration +### /root/ldap/conf/acces-conf-admin.ldif +``` +dn: olcDatabase={0}config,cn=config +changeType: modify +add: olcAccess +olcAccess: to * by dn.exact=cn=admin,dc=krhacken,dc=org manage by * break +``` +Puis on applique le .ldif +``` +ldapmodify -Y external -H ldapi:/// -f acces-conf-admin.ldif +``` + +# Les overlays +Les overlays sont des fonctionnalités supplémentaires. + +Voici l'ensemble des overlays que nous allons utiliser + +## MemberOf +L’overlay memberof permet de savoir dans quels groupes se trouve un utilisateur. +### /root/ldap/conf/memberof_act.ldif +``` +dn: cn=module,cn=config +cn:module +objectclass: olcModuleList +objectclass: top +olcmoduleload: memberof.la +olcmodulepath: /usr/lib/ldap +``` +### /root/ldap/conf/memberof_conf.ldif +``` +dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config +changetype: add +objectClass: olcMemberOf +objectClass: olcOverlayConfig +objectClass: olcConfig +objectClass: top +olcOverlay: memberof +olcMemberOfDangling: ignore +olcMemberOfRefInt: TRUE +olcMemberOfGroupOC: groupOfNames +olcMemberOfMemberAD: member +olcMemberOfMemberOfAD: memberOf +``` +On applique les modifications +``` +ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_act.ldif +ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_conf.ldif +``` +Vérification +``` +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList" +``` + +## refint +L'overlay permet de s’assurer de la cohérence de l’annuaire lors de suppression d’entrées. +### /root/ldap/conf/refint_act.ldif +``` +dn: cn=module,cn=config +cn: module +objectclass: olcModuleList +objectclass: top +olcmoduleload: refint.la +olcmodulepath: /usr/lib/ldap +``` +### /root/ldap/conf/refint_conf.ldif +``` +dn: olcOverlay=refint,olcDatabase={1}mdb,cn=config +objectClass: olcConfig +objectClass: olcOverlayConfig +objectClass: olcRefintConfig +objectClass: top +olcOverlay: refint +olcRefintAttribute: memberof member manager owner +olcRefintNothing: cn=admin,dc=krhacken,dc=org +``` +On applique les modifications +``` +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint_act.ldif +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint_conf.ldif +``` +Vérifications +``` +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList" +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcRefintConfig" +``` + +## Audit Log +Cet overlay audite chaque modification faites sur l’annuaire, les logs seront dans `/var/log/openldap/audit.ldif` + +### /root/ldap/conf/auditlog_act.ldif +``` +dn: cn=module,cn=config +cn: module +objectclass: olcModuleList +objectclass: top +olcModuleLoad: auditlog.la +olcmodulepath: /usr/lib/ldap +``` +### /root/ldap/conf/auditlog_conf.ldif +``` +dn: olcOverlay=auditlog,olcDatabase={1}mdb,cn=config +objectClass: olcOverlayConfig +objectClass: olcAuditLogConfig +olcOverlay: auditlog +olcAuditlogFile: /var/log/openldap/auditlog.ldif +``` +On applique les modifications +``` +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f auditlog_act.ldif +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f auditlog_conf.ldif +``` +On créer le fichier +``` +mkdir /var/log/openldap +chmod 755 /var/log/openldap +chown openldap:openldap /var/log/openldap +touch /var/log/openldap/auditlog.ldif +chmod 755 /var/log/openldap/auditlog.ldif +chown openldap:openldap /var/log/openldap/auditlog.ldif +``` +Vérifications +``` +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList" +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcAuditLogConfig" +``` + +## Unique +Cet overlay permet de nous assurer l’unicité des attributs que l’on spécifie. +### /root/ldap/conf/unique_act.ldif +``` +dn: cn=module,cn=config +cn: module +objectclass: olcModuleList +objectclass: top +olcModuleLoad: unique.la +olcmodulepath: /usr/lib/ldap +``` +### /root/ldap/conf/unique_conf.ldif +``` +dn: olcOverlay=unique,olcDatabase={1}mdb,cn=config +objectClass: olcOverlayConfig +objectClass: olcUniqueConfig +olcOverlay: unique +olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?uid?sub +olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?mail?sub +olcUniqueUri: ldap:///ou=people,dc=krhacken,dc=org?uidNumber?sub +olcUniqueUri: ldap:///ou=groups,dc=krhacken,dc=org?cn?sub +``` +Nous demandons ici à ce que les attributs UI, mail et uidNumber dans l’ou people soient uniques. Et que l’attribut cn dans l’ou groups soit lui aussi unique. +On applique les modifications, +``` +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f unique_act.ldif +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f unique_conf.ldif +``` +Vérifications, +``` +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcModuleList" +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcUniqueConfig" +``` + +## Ppolicy +Cet overlay va nous permettre de spécifier une politique de mot de passe. + +On va ajouter son schéma dans l’annuaire +``` +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif +``` +Dans la branche cn=schema, on doit voir le schéma ppolicy, +``` +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=schema,cn=config" cn +``` +### /root/ldap/conf/ppolicy_act.ldif +``` +dn: cn=module,cn=config +cn: module +objectclass: olcModuleList +objectclass: top +olcModuleLoad: ppolicy.la +olcmodulepath: /usr/lib/ldap +``` +### /root/ldap/conf/ppolicy_conf.ldif +``` +dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config +objectClass: olcOverlayConfig +objectClass: olcPpolicyConfig +olcOverlay: ppolicy +olcPPolicyDefault: cn=ppolicy,dc=krhacken,dc=org +olcPPolicyHashCleartext: TRUE +olcPPolicyUseLockout: FALSE +``` +Explication, +- olcPPolicyDefault : Indique le DN de configuration utilisé +- olcPPolicyHashCleartext : Indique si les mots de passe doivent être cryptés. + +On applique les modifications, +``` +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ppolicy_act.ldif +ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ppolicy_conf.ldif +``` +On va maintenant créer la politique par défaut. + +### /root/ldap/conf/ppolicy_def.ldif +``` +dn: cn=ppolicy,dc=krhacken,dc=org +objectClass: top +objectClass: device +objectClass: pwdPolicy +cn: ppolicy +pwdAllowUserChange: TRUE +pwdAttribute: userPassword +pwdCheckQuality: 1 +pwdExpireWarning: 0 +pwdFailureCountInterval: 30 +pwdGraceAuthNLimit: 5 +pwdInHistory: 5 +pwdLockout: TRUE +pwdLockoutDuration: 60 +pwdMaxAge: 0 +pwdMaxFailure: 5 +pwdMinAge: 0 +pwdMinLength: 5 +pwdMustChange: FALSE +pwdSafeModify: FALSE +``` +La signification des attributs est : +- pwdAllowUserChange : indique si l’utilisateur peut changer son mot de passe. +- pwdCheckQuality : indique si OpenLDAP renvoie une erreur si le mot de passe n’est pas conforme +- pwdExpireWarning : avertissement d’expiration. +- pwdFailureCountInterval : Intervalle de temps entre deux tentatives infructueuses pour qu’elles soient considérées comme « à la suite ». +- pwdGraceAuthNLimit : période de grâce suite à l’expiration du mot de passe. +- pwdInHistory : nombre de mots de passe dans l’historique. +- pwdLockout : indique si on bloque le compte au bout de X échecs. +- pwdLockoutDuration : durée du blocage du compte (en secondes). +- pwdMaxAge : age maximal du mot de passe (en secondes). +- pwdMaxFailure : nombre d’échecs de saisie du mot de passe maximal (avant blocage). +- pwdMinAge : age minimal du mot de passe (en secondes). +- pwdMinLength : longueur minimale du mot de passe. +- pwdMustChange : indique si l’utilisateur doit changer son mot de passe. +- pwdSafeModify : indique si il faut envoyer l’ancien mot de passe avec le nouveau pour modification. + +On applique les modifications, +``` +ldapadd -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f ppolicy_def.ldif +``` +Vérifications +``` +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=schema,cn=config" cn +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcPpolicyConfig" -LLL +ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "dc=krhacken,dc=org" "Objectclass=pwdPolicy" ``` +## Structuration de l'annuaire LDAP. -### /etc/ldapcherry/ldapcherry.ini +Maintenant que la base de l'annuaire est en place nous allons structurer l'intérieur de l'annuaire. + +Avant ça nous allons décrire la structure comme un arbre. + +### Le tronc (le DC) +- Le tronc de cet arbre : `dc=krhacken,dc=org`, c'est ce que l'on appelle le DN de base. + +### Les grosses branches (les OU) +- Une grosse branche pour les utilisateurs : `ou=people,dc=krhacken,dc=org`. +- Une sous branche des utilisateurs pour les membres krhacken : `ou=krhacken,ou=people,dc=krhacken,dc=org`. +- Une grosse branche pour les groupes : `ou=group,dc=krhacken,dc=org`. +- Une sous branche des groupes pour les groupes krhacken : `ou=krhacken,ou=group,dc=krhacken,dc=org`. + +### Les petites branches (les CN) +- Une petite branche pour le groupe des adminsys : `cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org` +- Une petite branche pour le groupe des webmestres : `cn=webmestre,ou=krhacken,ou=group,dc=krhacken,dc=org` +- Une petite branche pour le groupe des membres krhacken : `cn=krhacken,ou=krhacken,ou=group,dc=krhacken,dc=org` +- Une petite branche pour le groupe des membres extérieur : +`cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org` + +## Mise en place des grosses branches + +Les OUs sont des conteneurs qui permettent de ranger les données dans l’annuaire et de les hiérarchiser. + +### /root/ldap/conf/OU.ldif ``` -[global] -server.socket_host = '0.0.0.0' -server.socket_port = 8080 -server.thread_pool = 8 +dn: ou=people,dc=krhacken,dc=org +ou: people +objectClass: organizationalUnit -request.show_tracebacks = False -log.error_handler = 'syslog' -log.access_handler = 'none' -log.level = 'info' -tools.sessions.on = True -tools.sessions.timeout = 10 +dn: ou=group,dc=krhacken,dc=org +ou: group +objectClass: organizationalUnit -[attributes] -attributes.file = '/etc/ldapcherry/attributes.yml' +dn: ou=system,dc=krhacken,dc=org +ou: system +objectClass: organizationalUnit -[roles] -roles.file = '/etc/ldapcherry/roles.yml' +dn: ou=krhacken,ou=people,dc=krhacken,dc=org +ou: krhacken +objectClass: organizationalUnit -[backends] -ldap.module = 'ldapcherry.backend.backendLdap' -ldap.display_name = 'My Ldap Directory' -ldap.uri = 'ldap://alpha.ldap.sessionkrkn.fr' -ldap.ca = '/etc/ldap/ca_certs.pem' -ldap.starttls = 'on' -ldap.checkcert = 'off' -ldap.binddn = 'cn=admin,dc=sessionkrkn,dc=fr' -#ldap.binddn = 'cn=writer,ou=system,dc=sessionkrkn,dc=fr' -ldap.password = '8PizMOVqhDwSVChJwNy8Xcb1rPzDEuYbwXdd' -ldap.timeout = 1 -ldap.groupdn = 'ou=workgroup,ou=group,dc=sessionkrkn,dc=fr' -ldap.userdn = 'ou=krhacken,ou=people,dc=sessionkrkn,dc=fr' -ldap.user_filter_tmpl = '(uid=%(username)s)' -ldap.group_filter_tmpl = '(member=uid=%(username)s,ou=krhacken,ou=people,dc=sessionkrkn,dc=fr)' -ldap.search_filter_tmpl = '(|(uid=%(searchstring)s*)(sn=%(searchstring)s*))' -ldap.group_attr.member = "%(dn)s" -ldap.dn_user_attr = 'uid' - -# Ajouter les classes nécessaire en cas de création de nouveau service -ldap.objectclasses = 'person, organizationalPerson, inetOrgPerson, mailaccountkrhacken, cloudaccountkrhacken gitaccountkrhacken' - -[ppolicy] -ppolicy.module = 'ldapcherry.ppolicy.simple' -min_length = 8 -min_upper = 1 -min_digit = 1 - -[auth] -auth.mode = 'or' - -[resources] -templates.dir = '/usr/share/ldapcherry/templates/' - -[/static] -tools.staticdir.on = True -tools.staticdir.dir = '/usr/share/ldapcherry/static/' +dn: ou=krhacken,ou=group,dc=krhacken,dc=org +ou: krhacken +objectClass: organizationalUnit +``` +On rajoute les OU au ldap +``` +ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f OU.ldif ``` -### /etc/ldapcherry/roles.yml +## Mise en place des petites branches + +Il existe deux types de groupes : les posixgroup et les groupofnames. + +Les posixgroup sont similaires au groupes Unix. + +Pour faire simple, l’avantage des groupofnames est qu’avec un filtre sur un utilisateur, on peut connaitre ses groupes (avec l’overlay memberof). Chose impossible avec les posixgroups. On va donc utiliser des groupofnames. + +### /root/ldap/conf/group.ldif ``` -admin: - display_name: AdminSys - description: Administrateur total de l'annuaire LDAP - LC_admins: True - backends_groups: - ldap: - - cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org +dn: cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org +cn: adminsys +description: AdminSys Kr[HACK]en +objectClass: groupOfNames +member: cn=admin,dc=krhacken,dc=org -webmestre: - display_name: Webmestre - description: Webmestre des services - LC_admins: True - backends_groups: - ldap: - - cn=webmestre,ou=krhacken,ou=group,dc=krhacken,dc=org +dn: cn=webmestre,ou=krhacken,ou=group,dc=krhacken,dc=org +cn: webmestre +description: Webmestre Kr[HACK]en +objectClass: groupOfNames +member: cn=admin,dc=krhacken,dc=org -club: - display_name: Membre du Club - description: Membre du Bureau - backends_groups: - ldap: - - cn=krhacken,ou=krhacken,ou=group,dc=krhacken,dc=org +dn: cn=krhacken,ou=krhacken,ou=group,dc=krhacken,dc=org +cn: krhacken +description: Membres du Kr[HACK]en +objectClass: groupOfNames +member: cn=admin,dc=krhacken,dc=org -ext: - display_name: Personne extérieure - description: Membre Actif - backends_groups: - ldap: - - cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org +dn: cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org +cn: ext +description: Personnes extérieure au Kr[HACK]en +objectClass: groupOfNames +member: cn=admin,dc=krhacken,dc=org +``` +On ajoute les groupes +``` +ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f group.ldif +``` +On peu utiliser **memberof** pour voir dans quels groupes est l'utilisateur admin +``` +ldapsearch -xLLLH ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -b "dc=krhacken,dc=org" "cn=admin" memberof ``` -### Interface Web -Placer le contenu du dossier **sources** dans **/usr/share/ldapcherry/** +## Création d'un compte root -## Mise en place -Mise en place de HAProxy et de NGINX pour l'accès à l'interface et mise en place d'un daemon systemd pour le démarrage automatique de l'interface Web. +Cet utilisateur aura tout les droits sur l'annuaire, on ne lui donnera pas accès aux services son rôle est seulement d'administrer l'annuaire LDAP. -### Dans le conteneur Nginx -#### /etc/nginx/sites-available/nextcloud +### /root/ldap/conf/root.ldif ``` -server { - listen 80; - server_name ldapui.krhacken.org; - location / { - proxy_pass http://10.0.2.15:8080/; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } +dn: uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org +objectclass: person +objectclass: organizationalPerson +objectclass: inetOrgPerson +uid: root +cn: root +sn: root +displayName: root +userPassword: PASSWORD +mail: root@krhacken.org +``` +On ajoute l'utilisateur +``` +ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f root.ldif +``` + +Ajout de compte root au groupe adminsys pour qu'il est accès à l'interface d'administration + +### /root/ldap/conf/adminsysaddroot.ldif +``` +dn: cn=adminsys,ou=krhacken,ou=group,dc=krhacken,dc=org +changetype: modify +add: member +member: uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org +``` +``` +ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f adminsysaddroot.ldif +``` + +Commande pour afficher les informations de l'utilisateur root +``` +ldapsearch -xLLLH ldap://localhost -D uid=root,ou=krhacken,ou=people,dc=krhacken,dc=org -W -b "dc=krhacken,dc=org" "uid=root" +``` + +# Sécurisation de l'annuaire + +## Comptes avec permissions réduite +Nous allons créer deux compte systèmes. +- Un viewer qui aura uniquement les droits en lecture de l'arbre +- Un Writer qui lui aura les droits en écriture + +### /root/ldap/conf/viewer.ldif +``` +dn: cn=viewer,ou=system,dc=krhacken,dc=org +objectClass: simpleSecurityObject +objectClass: organizationalRole +cn: viewer +description: LDAP Viewer +userPassword: passview +``` + +### /root/ldap/conf/writer.ldif +``` +dn: cn=writer,ou=system,dc=krhacken,dc=org +objectClass: simpleSecurityObject +objectClass: organizationalRole +cn: writer +description: LDAP Writer +userPassword: passwrite +``` +Ajout des utilisateurs, +``` +ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f viewer.ldif +ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f writer.ldif +``` + +On autorise la lecture de l'arbre uniquement au utilisateur authentifié en modifiant une ACL +### /root/ldap/conf/acl.ldif +``` +dn: olcDatabase={1}mdb,cn=config +changetype: modify +replace: olcAccess +olcAccess: to attrs=userPassword by self write by anonymous auth by dn="cn=writer,ou=system,dc=krhacken,dc=org" write by dn="cn=viewer,ou=system,dc=krhacken,dc=org" read by dn="cn=admin,dc=krhacken,dc=org" write by * none +olcAccess: to dn.base="dc=krhacken,dc=org" by users read +olcAccess: to * by self write by dn="cn=admin,dc=krhacken,dc=org" write by * read by anonymous none +``` +On modife l'ACL +``` +ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f acl.ldif +``` + +## Forcer SSL +Si c'est le cas on peut maintenant forcer la connexion SSL +### /root/ldap/conf/forcetls.ldif +``` +dn: olcDatabase={1}mdb,cn=config +changetype: modify +add: olcSecurity +olcSecurity: tls=1 +``` +Ajout des modifications et application +``` +ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif +systemctl restart slapd +``` + +### Vérification +La commande +``` +ldapsearch -xLLL -H ldap://localhost -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b "dc=krhacken,dc=org" +``` +doit retourner une erreur, si on ajout -ZZ à la fin ça doit fonctionner + +Voilà pour la mise en place de base du LDAP cependant il faut configuré chaque client pour se connecter au serveur avec STARTTLS. + +## Réplication de l'annuaire LDAP + +Nous allons mettre en place une réplication Master/Master. L’idée est de faire en sorte que n’importe lequel de nos serveurs LDAP soit capable à la fois de lire les données, mais également de les modifier. De plus, nous allons mettre en place une réplication, à la fois sur l’arbre de données dc=krhacken,dc=org mais également sur l’arbre de configuration cn=config. + +Vous avez déjà fait toute la configuration du premier conteneur LDAP (CT107). Pour gagner du temps clonez ce conteneur vers le conteneur 108 sur Beta. + +Avant le démarrage il vous faudra reconfigurer les interfaces comme suis : +- eth0 : vmbr1 / VLAN: 30 / IP: 10.0.2.2/24 / GW: 10.0.2.254 +- eth1 : vmbr2 / VLAN: 100 / IP: 10.1.0.108/24 / GW: 10.1.0.254 + +Nous avons désormais deux conteneurs LDAP identique, ce qui ne fonctionnera pas dans l'état. + +Il faut donc ajuster la configuration en modifiant les paramètres de connexions + + +### /etc/ldap/ldap.conf +Sur Alpha : +``` +BASE dc=krhacken,dc=org +URI ldap://alpha.ldap.krhacken.org/ +URI ldap://vip.ldap.krhacken.org/ +TLS_CACERT /etc/ldap/ca_certs.pem +``` +Sur Beta : +``` +BASE dc=krhacken,dc=org +URI ldap://beta.ldap.krhacken.org/ +URI ldap://vip.ldap.krhacken.org/ +TLS_CACERT /etc/ldap/ca_certs.pem +``` + +On redémarre les serveurs slapd. +``` +service slapd force-reload +``` + +## Réplication de l'arbre de configuration + +### 01-syncprov_act.ldif +``` +dn: cn=module,cn=config +cn: module +objectclass: olcModuleList +objectclass: top +olcmoduleload: syncprov.la +olcmodulepath: /usr/lib/ldap +``` +``` +ldapadd -Y EXTERNAL -H ldapi:/// -f 01-syncprov_act.ldif +``` + +Vérifications : +``` +ldapsearch -LLLY external -H ldapi:/// -b "cn=config" "objectClass=olcModuleList" +ldapsearch -LLLY external -H ldapi:/// -b "cn=module{6},cn=config" +``` + +### 02-serverid.ldif +X vaut 1 sur Alpha 2 sur Beta. +``` +dn: cn=config +changetype: modify +add: olcServerID +olcServerID: X +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 02-serverid.ldif +``` +Vérification : +``` +ldapsearch -LLLY external -H ldapi:/// -b "cn=config" "objectClass=olcGlobal" olcServerID +``` + +### 03-replica_account.ldif +``` +dn: cn=replica,ou=system,dc=krhacken,dc=org +userPassword: PASS +cn: replica +objectclass: top +objectclass: person +sn: replica +``` +``` +ldapadd -x -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f 03-replica_account.ldif +``` + +### 04-droit_conf.ldif +Gestion des droits du CN *replica* +``` +dn: olcDatabase={0}config,cn=config +changeType: modify +add: olcAccess +olcAccess: to * by dn.exact=cn=replica,ou=system,dc=krhacken,dc=org manage by * break +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 04-droit_conf.ldif +``` + +### 05-syncprov_conf_conf.ldif +``` +dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config +changetype: add +objectClass: olcOverlayConfig +objectClass: olcSyncProvConfig +olcOverlay: syncprov +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 05-syncprov_conf_conf.ldif +``` + +### 06-repl_conf_conf.ldif +``` +dn: olcDatabase={0}config,cn=config +changetype: modify +add: olcSyncRepl +olcSyncRepl: rid=01 provider=ldap://alpha.ldap.krhacken.org + binddn="cn=replica,ou=system,dc=krhacken,dc=org" bindmethod=simple + credentials=password searchbase="cn=config" + type=refreshAndPersist retry="5 5 300 5" timeout=1 +olcSyncRepl: rid=02 provider=ldap://beta.ldap.krhacken.org + binddn="cn=replica,ou=system,dc=krhacken,dc=org" bindmethod=simple + credentials=password searchbase="cn=config" + type=refreshAndPersist retry="5 5 300 5" timeout=1 +- +add: olcMirrorMode +olcMirrorMode: TRUE +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 06-repl_conf_conf.ldif +``` +Vérification : +``` +ldapsearch -QLLLY external -H ldapi:/// -b "cn=config" "olcDatabase={0}config" olcSyncRepl +``` + +A partir d'ici l'arbre de configuration cn=config est synchronisé entre les deux conteneurs LDAP. Pour le reste de la configuration il faut faire les manipulations que sur un des deux conteneurs LDAP + +## Réplication de l'arbre de données +Nous allons ici mettre en place la synchronisation automatique de l'arbre de données entre les deux conteneurs LDAP. + +### 07-acl_replica.ldif +``` +dn: olcDatabase={1}mdb,cn=config +changetype: modify +replace: olcAccess +olcAccess: to attrs=userPassword by self write by anonymous auth by dn="cn=writer,ou=system,dc=krhacken,dc=org" write by dn="cn=viewer,ou=system,dc=krhacken,dc=org" read by dn="cn=admin,dc=krhacken,dc=org" write by dn.exact="cn=replica,ou=system,dc=krhacken,dc=org" read by * none +olcAccess: to dn.subtree="dc=krhacken,dc=org" by users read by * none +olcAccess: to * by self write by dn="cn=admin,dc=krhacken,dc=org" write by * read by anonymous none +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 07-acl_replica.ldif +``` +Vérification : +``` +ldapsearch -QLLLY external -H ldapi:/// -b "cn=config" "olcDatabase={1}mdb" olcAccess +``` + +### 08-limit.ldif +``` +dn: olcDatabase={1}mdb,cn=config +changetype: modify +add: olcLimits +olcLimits: dn.exact="cn=replica,ou=system,dc=krhacken,dc=org" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 08-limit.ldif +``` + +### 09-index.ldif +``` +dn:olcDatabase={1}mdb,cn=config +changetype: modify +add: olcDbIndex +olcDbIndex: entryCSN,entryUUID eq +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 09-index.ldif +``` + +### 10-syncprov_conf_data.ldif +``` +dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config +changetype: add +objectClass: olcOverlayConfig +objectClass: olcSyncProvConfig +olcOverlay: syncprov +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 10-syncprov_conf_data.ldif +``` + +### 11-repl_conf_data.ldif +``` +dn: olcDatabase={1}mdb,cn=config +changetype: modify +add: olcSyncRepl +olcSyncRepl: rid=01 provider=ldap://alpha.ldap.krhacken.org + binddn="cn=replica,ou=system,dc=krhacken,dc=org" + bindmethod=simple credentials=password + searchbase="dc=krhacken,dc=org" + type=refreshAndPersist retry="5 5 300 5" timeout=1 +olcSyncRepl: rid=02 provider=ldap://beta.ldap.krhacken.org + binddn="cn=replica,ou=system,dc=krhacken,dc=org" + bindmethod=simple credentials=password + searchbase="dc=krhacken,dc=org" + type=refreshAndPersist retry="5 5 300 5" timeout=1 +- +add: olcMirrorMode +olcMirrorMode: TRUE +``` +``` +ldapmodify -Y EXTERNAL -H ldapi:/// -f 11-repl_conf_data.ldif +``` + +## Configuration des ServerID +A cause de la synchronisation de l'arbre de configuration les ServerID sont les mêmes. + +Il faut stoper **slapd** sur les deux conteneurs avec `systemctl stop slapd` + +Puis éditer `/etc/ldap/slapd.d/cn\=config.ldif` de la manière suivante +- Alpha -> `olcServerID: 1` +- Beta -> `olcServerID: 2` + +On peut maintenant relancer slapd sur les deux conterneurs avec `systemctl start slapd` + +Maintenant la commande ci-dessous donne un ID différent selon le conteneur. +``` +ldapsearch -x -LLL -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -w passadmin -b cn=config "objectClass=olcGlobal" +``` + +## Accès via une IP virtuelle +Comme pour HAProxy nous allons utiliser keepalived pour avoir une IP virtuelle que se déplace entre les deux conteneurs en fonction de la disponibilité de l'annuaire LDAP. + +``` +apt-get install -y keepalived +``` + +### Script pour vérifier l'état des conteneurs LDAP + +Créer, sur les deux serveurs, le script `/etc/keepalived/test_ldap.sh` + +Il faut spécifier le mot de passe du compte viewer. +``` +#!/bin/bash + +ldapsearch -x -H ldap://$1 -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b dc=krhacken,dc=org -l 3 > /dev/null 2>&1 +ldapresponse=$? + +if [ "$ldapresponse" -gt 0 ]; then + echo "down" + exit 1 +else + echo "up" +fi + +exit 0 +``` +``` +chmod /etc/keepalived/test_ldap.sh +x +``` + +## Configuration de keepalived + +### Configuration sur Alpha +#### /etc/keepalived/keepalived.conf +``` +vrrp_script check_server_health { + script "/etc/keepalived/test_ldap.sh 10.0.2.1" (mettre l'ip réel de votre serveur) + interval 2 + fall 2 + rise 2 +} +vrrp_instance VI_LDAP { + interface eth0 + state MASTER + virtual_router_id 50 + priority 101 # 101 on master, 100 on backup + virtual_ipaddress { + 10.0.2.3 + } + track_script { + check_server_health + } } ``` ``` -sh ~/deploy-webhost.sh nextcloud +systemctl restart keepalived +``` + authentication { + auth_type PASS + auth_pass MON_MOT_DE_PASSE_SECRET + } + +### Configuration sur Beta +#### /etc/keepalived/keepalived.conf +``` +vrrp_script check_server_health { + script "/etc/keepalived/test_ldap.sh 10.0.2.2" (mettre l'ip réel de votre serveur) + interval 2 + fall 2 + rise 2 +} +vrrp_instance VI_LDAP { + interface eth0 + state MASTER + virtual_router_id 50 + priority 101 # 101 on master, 100 on backup + virtual_ipaddress { + 10.0.2.3 + } + track_script { + check_server_health + } +} +``` +``` +systemctl restart keepalived +``` +Un des deux conteneur est maintenant accessible à l'adresse 10.0.2.3. Les requêtes se feront sur cette adresse. + + +## Configuration des futurs client LDAP +Sur tout les futurs client LDAP il faudra activer la connexion SSL. +Il faut commencer par copier le certificat de la CA (ca_server.pem qu'il faudra copier via scp) +``` +cat ca_server.pem | tee -a /etc/ldap/ca_certs.pem +``` +Il faut ensuite modifier la configuration en modifiant la ligne suivante +### /etc/ldap/ldap.conf +``` +TLS_CACERT /etc/ldap/ca_certs.pem ``` -### Dans le conteneur HAProxy -Obtention du certificat +La commande, ``` -certbot certonly --webroot -w /home/hasync/letsencrypt-requests/ -d ldapui.krhacken.org +ldapsearch -xLLL -H ldap://vip.ldap.krhacken.org -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b "dc=krhacken,dc=org" -ZZ ``` -``` -sh ~/install-certs.sh -``` - -## Daemon Systemd -### /etc/systemd/system/ldapui.service -``` -Description=LDAP WebUI -Requires=ldapui.service -After=ldapui.service -[Service] -Restart=always -ExecStart=ldapcherryd -c /etc/ldapcherry/ldapcherry.ini -D -p /etc/ldapcherry/proc.pid -ExecStop=kill -9 `cat /etc/ldapcherry/proc.pid` -[Install] -WantedBy=multi-user.target -``` -``` -systemctl enable ldapui.service -systemctl start ldapui.service -``` - -L'interface de gestion LDAP est désormais accessible à l'adresse **https://ldapui.sessionkrkn.fr** +doit retourner des informations sur l'arbre. diff --git a/applicatif/zone_interne/gitea.md b/applicatif/zone_interne/gitea.md index 3a4fdb5..7dc7313 100644 --- a/applicatif/zone_interne/gitea.md +++ b/applicatif/zone_interne/gitea.md @@ -1,7 +1,7 @@ # Gitea ## Le conteneur -Numéro 121 +Numéro 121 (Beta) #### Deux interfaces - eth0 : vmbr1 / VLAN 30 / IP 10.0.2.21 / GW 10.0.2.254 - eth1 : vmbr2 / VLAN 100 / IP 10.1.0.121 / GW 10.1.0.254 @@ -58,26 +58,22 @@ ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f schemagit.ldif -ZZ Ce .ldif permet d'ajouter un nouvel utilisateur dans l'anuaire LDAP et de lui autorisé l'accès au mail et au cloud. ### addusermailcloudgit.ldif -Pour GROUPE : -- ou=krhacken,ou=people -> Membre actif du club -- ou=people -> Le reste ``` -dn: uid=new,GROUPE,dc=krhacken,dc=org +dn: uid=identifiant,ou=krhacken,ou=people,dc=krhacken,dc=org objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson objectclass: mailaccountkrhacken objectclass: cloudaccountkrhacken objectclass: gitaccountkrhacken -uid: new -sn: new -givenName: new -cn: new -displayName: new +uid: identifiant +cn: Prénom +sn: Nom +displayName: Nom d'affichage userPassword: PASSWORD -mail: new@krhacken.org -mailaccountquota: 0 +mail: identifiant@krhacken.org +mailaccountquota: 2147483648 mailaccountactif: YES cloudaccountquota: 5GB cloudaccountactif: YES @@ -92,12 +88,8 @@ ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f addusermailcloudgi Permet d'ajouter la classe cloudaccountkrhacken à un utilisateur, il pourra ensuite utiliser NextCloud. ### addtogit.ldif -Pour GROUPE : -- ou=krhacken,ou=people -> Membre actif du club -- ou=people -> Le reste - ``` -dn: uid=adminsys,GROUPE,dc=krhacken,dc=org +dn: uid=adminsys,ou=krhacken,ou=people,dc=krhacken,dc=org changetype: modify add: objectclass objectclass: gitaccountkrhacken diff --git a/applicatif/zone_interne/mail.md b/applicatif/zone_interne/mail.md index 4f113de..7f453ec 100644 --- a/applicatif/zone_interne/mail.md +++ b/applicatif/zone_interne/mail.md @@ -3,6 +3,20 @@ Nous allons ici mettre en place tout un service de mail qui va utiliser LDAP, Po Il faut avoir établie une connexion TLS avec le serveur LDAP, la marche à suivre est disponible dans la partie LDAP (à la toute fin). +## Le conteneur +Numéro 111 (Alpha) +#### Deux interfaces +- eth0 : vmbr1 / VLAN 30 / IP 10.0.2.11 / GW 10.0.2.254 +- eth1 : vmbr2 / VLAN 100 / IP 10.1.0.111 / GW 10.1.0.254 + +### Le proxy +#### /etc/apt/apt.conf.d/01proxy +``` +Acquire::http { + Proxy "http://10.0.2.252:9999"; +}; +``` + # Configuration du serveur LDAP Le serveur LDAP est déjà en place sur le conteneur LDAP il faut cependant faire ce qu'il suit pour ajouter le support des mails sur LDAP. @@ -55,19 +69,18 @@ Ce .ldif permet d'ajouter un nouvel utilisateur dans l'anuaire LDAP et de lui au ### adduser.ldif ``` -dn: uid=new,ou=people,dc=krhacken,dc=org +dn: uid=identifiant,ou=krhacken,ou=people,dc=krhacken,dc=org objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson objectclass: mailaccountkrhacken -uid: new -sn: new -givenName: new -cn: new -displayName: new +uid: identifiant +cn: Prénom +sn: Nom +displayName: Nom d'affichage userPassword: PASSWORD -mail: new@krhacken.org -mailaccountquota: 0 +mail: identifiant@krhacken.org +mailaccountquota: 2147483648 mailaccountactif: YES ``` ``` @@ -79,15 +92,14 @@ ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f adduser.ldif -ZZ Permet d'ajouter la classe mailaccountkrhacken à un utilisateur, il pourra ensuite utilisé le service. ### addtomail.ldif -Pour le groupe, soit krhacken soit people. ``` -dn: uid=NAME,ou=GROUP,dc=krhacken,dc=org +dn: uid=NAME,ou=krhacken,ou=people,dc=krhacken,dc=org changetype: modify add: objectclass objectclass: mailaccountkrhacken - add: mailaccountquota -mailaccountquota: 0 +mailaccountquota: 2147483648 - add: mailaccountactif mailaccountactif: YES @@ -96,7 +108,7 @@ mailaccountactif: YES ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f addtomail.ldif -ZZ ``` -On crée dès maintenant une adresse adminsys@krhacken.org, c'est impératif pour la suite. +On ajoute crée dès maintenant l'adresse adminsys@krhacken.org avec une template fournis. C'est impératif pour la suite. ## Ajout d'un alias pour le postmaster diff --git a/applicatif/zone_interne/nextcloud.md b/applicatif/zone_interne/nextcloud.md index af5726f..95a8d92 100644 --- a/applicatif/zone_interne/nextcloud.md +++ b/applicatif/zone_interne/nextcloud.md @@ -3,7 +3,7 @@ Mise en place du conteneur pour NextCloud et intégration à l'annuaire LDAP. ## Le conteneur -Numéro 120 +Numéro 120 (Beta) #### Deux interfaces - eth0 : vmbr1 / VLAN 30 / IP 10.0.2.20 / GW 10.0.2.254 - eth1 : vmbr2 / VLAN 100 / IP 10.1.0.120 / GW 10.1.0.254 @@ -50,25 +50,20 @@ ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f schemacloud.ldif - Ce .ldif permet d'ajouter un nouvel utilisateur dans l'anuaire LDAP et de lui autorisé l'accès au mail et au cloud. ### addusermailcloud.ldif -Pour GROUPE : -- ou=krhacken,ou=people -> Membre actif du club -- ou=people -> Le reste - ``` -dn: uid=new,GROUPE,dc=krhacken,dc=org +dn: uid=identifiant,ou=krhacken,ou=people,dc=krhacken,dc=org objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson objectclass: mailaccountkrhacken objectclass: cloudaccountkrhacken -uid: new -sn: new -givenName: new -cn: new -displayName: new +uid: identifiant +cn: Prénom +sn: Nom +displayName: Nom d'affichage userPassword: PASSWORD -mail: new@krhacken.org -mailaccountquota: 0 +mail: identifiant@krhacken.org +mailaccountquota: 2147483648 mailaccountactif: YES cloudaccountquota: 5GB cloudaccountactif: YES @@ -82,12 +77,8 @@ ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f addusermailcloud.l Permet d'ajouter la classe cloudaccountkrhacken à un utilisateur, il pourra ensuite utiliser NextCloud. ### addtocloud.ldif -Pour GROUPE : -- ou=krhacken,ou=people -> Membre actif du club -- ou=people -> Le reste - ``` -dn: uid=NAME,GROUPE,dc=krhacken,dc=org +dn: uid=NAME,ou=krhacken,ou=people,dc=krhacken,dc=org changetype: modify add: objectclass objectclass: cloudaccountkrhacken @@ -107,9 +98,6 @@ Lister les utilisateurs : ldapsearch -xLLL -H ldap://vip.ldap.krhacken.org -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -b "ou=people,dc=krhacken,dc=org" "(&(objectClass=cloudaccountkrhacken))" -ZZ ``` - - - ## Installation des prérequis ``` apt-get install -y postgresql postgresql-contrib nginx php7.3-cli php7.3-common php7.3-mbstring php7.3-gd php-imagick php7.3-intl php7.3-bz2 php7.3-xml php7.3-pgsql php7.3-zip php7.3-dev php7.3-curl php7.3-fpm php-dompdf redis-server php-redis php-smbclient php7.3-ldap wget curl sudo unzip diff --git a/applicatif/zone_proxy/nginx_principal.md b/applicatif/zone_proxy/nginx_principal.md index 7a27161..b1edf5e 100644 --- a/applicatif/zone_proxy/nginx_principal.md +++ b/applicatif/zone_proxy/nginx_principal.md @@ -1,7 +1,27 @@ # Reverse proxy NGINX sur le réseau public ## Spécification des conteneurs -Ce service est redondé car vital, son IP est 10.0.1.3 sur Alpha et 10.0.1.4 sur Beta. +Ce service est redondé car vital, il n'a pas d'IP virtuelle. + +Numéro 105 (Alpha) +#### Trois interfaces +- eth0 : vmbr1 / VLAN 20 / IP 10.0.1.3 / GW 10.0.1.254 +- eth1 : vmbr1 / VLAN 30 / IP 10.0.2.4 / GW 10.0.2.254 +- eth2 : vmbr2 / VLAN 100 / IP 10.1.0.105 / GW 10.1.0.254 + +Numéro 106 (Beta) +#### Trois interfaces +- eth0 : vmbr1 / VLAN 20 / IP 10.0.1.4 / GW 10.0.1.254 +- eth1 : vmbr1 / VLAN 30 / IP 10.0.2.5 / GW 10.0.2.254 +- eth2 : vmbr2 / VLAN 100 / IP 10.1.0.106 / GW 10.1.0.254 + +### Le proxy +#### /etc/apt/apt.conf.d/01proxy +``` +Acquire::http { + Proxy "http://10.0.2.252:9999"; +}; +``` ## Objectif Il doit rediriger les requêtes arrivant de HAProxy vers le bon conteneur en fonction de l'hostname. Pour cela nous allons utiliser des serveurs web HTTP avec des proxy sur Nginx sans s'occuper de l'autre serveur web. diff --git a/deploiement/deploiement_avec_ansible.md b/deploiement/deploiement_avec_ansible.md index c82131c..9090730 100644 --- a/deploiement/deploiement_avec_ansible.md +++ b/deploiement/deploiement_avec_ansible.md @@ -73,11 +73,11 @@ Voici les tâches à réaliser avant de lancer le playbook. Ajoutez ``` [haproxy] -10.1.0.100 #HAProxy Alpha -10.1.0.101 #HAProxy Beta +10.1.0.102 #HAProxy Alpha +10.1.0.103 #HAProxy Beta [dns] -10.1.0.106 #DNS +10.1.0.107 #DNS [zonedmz:children] haproxy diff --git a/deploiement/sources/zone_dmz/ct_dmz.yml b/deploiement/sources/zone_dmz/ct_dmz.yml index 83b598a..e67c279 100644 --- a/deploiement/sources/zone_dmz/ct_dmz.yml +++ b/deploiement/sources/zone_dmz/ct_dmz.yml @@ -1,7 +1,7 @@ # HAProxy et DNS -# HAProxy Master (CT100) : 10.0.0.6 | 10.0.1.1 | 10.0.3.1 | 10.1.0.100 -# HAProxy Slave (CT101) : 10.0.0.7 | 10.0.1.2 10.0.3.2 | 10.1.0.101 -# DNS (CT106): 10.0.0.253 | | 10.0.1.253 | 10.0.2.253 | 10.1.0.106 +# HAProxy Master (CT102) : 10.0.0.6 | 10.0.1.1 | 10.0.3.1 | 10.1.0.102 +# HAProxy Slave (CT103) : 10.0.0.7 | 10.0.1.2 10.0.3.2 | 10.1.0.103 +# DNS (CT107): 10.0.0.253 | | 10.0.1.253 | 10.0.2.253 | 10.1.0.107 # Gateway 10.0.0.0/24 -> 10.0.0.254 # Gateway 10.0.1.0/24 -> 10.0.1.254 # Gateway 10.0.3.0/24 -> 10.0.3.254 @@ -32,11 +32,11 @@ ostemplate: 'local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz' password: "{{ pass_haproxy_master }}" hostname: HAProxyMaster - vmid: 101 + vmid: 102 onboot: yes unprivileged: yes nameserver: '10.0.0.253' - netif: '{"net0":"name=eth0,ip=10.0.0.6/24,gw=10.0.0.254,bridge=vmbr1,tag=10","net1":"name=eth1,ip=10.0.1.1/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net2":"name=eth2,ip=10.0.3.1/24,gw=10.0.3.254,bridge=vmbr1,tag=40","net3":"name=eth3,ip=10.1.0.101/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' + netif: '{"net0":"name=eth0,ip=10.0.0.6/24,gw=10.0.0.254,bridge=vmbr1,tag=10","net1":"name=eth1,ip=10.0.1.1/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net2":"name=eth2,ip=10.0.3.1/24,gw=10.0.3.254,bridge=vmbr1,tag=40","net3":"name=eth3,ip=10.1.0.102/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' pubkey: "{{ ssh_pub }}" state: present @@ -55,11 +55,11 @@ ostemplate: 'local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz' password: "{{ pass_haproxy_slave }}" hostname: HAProxySlave - vmid: 102 + vmid: 103 onboot: yes unprivileged: yes nameserver: '10.0.0.253' - netif: '{"net0":"name=eth0,ip=10.0.0.7/24,gw=10.0.0.254,bridge=vmbr1,tag=10","net1":"name=eth1,ip=10.0.1.2/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net2":"name=eth2,ip=10.0.3.2/24,gw=10.0.3.254,bridge=vmbr1,tag=40","net3":"name=eth3,ip=10.1.0.102/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' + netif: '{"net0":"name=eth0,ip=10.0.0.7/24,gw=10.0.0.254,bridge=vmbr1,tag=10","net1":"name=eth1,ip=10.0.1.2/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net2":"name=eth2,ip=10.0.3.2/24,gw=10.0.3.254,bridge=vmbr1,tag=40","net3":"name=eth3,ip=10.1.0.103/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' pubkey: "{{ ssh_pub }}" state: present @@ -78,11 +78,11 @@ ostemplate: 'local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz' password: "{{ pass_dns }}" hostname: DNS - vmid: 106 + vmid: 107 onboot: yes unprivileged: yes nameserver: '80.67.169.12,80.67.169.40' - netif: '{"net0":"name=eth0,ip=10.0.0.253/24,gw=10.0.0.254,bridge=vmbr1,tag=10","net1":"name=eth1,ip=10.0.1.253/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net2":"name=eth2,ip=10.0.2.253/24,gw=10.0.2.254,bridge=vmbr1,tag=30","net3":"name=eth3,ip=10.1.0.106/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' + netif: '{"net0":"name=eth0,ip=10.0.0.253/24,gw=10.0.0.254,bridge=vmbr1,tag=10","net1":"name=eth1,ip=10.0.1.253/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net2":"name=eth2,ip=10.0.2.253/24,gw=10.0.2.254,bridge=vmbr1,tag=30","net3":"name=eth3,ip=10.1.0.107/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' pubkey: "{{ ssh_pub }}" state: present @@ -94,9 +94,9 @@ vmid: "{{ item }}" state: started with_items: - - '101' - '102' - - '106' + - '103' + - '107' # Pas de config des proxy car sur accès au net depuis la DMZ. diff --git a/deploiement/sources/zone_proxy/ct_proxy.yml b/deploiement/sources/zone_proxy/ct_proxy.yml index 4eabfb2..356f658 100644 --- a/deploiement/sources/zone_proxy/ct_proxy.yml +++ b/deploiement/sources/zone_proxy/ct_proxy.yml @@ -1,6 +1,6 @@ # NGINX REVERSE -# Nginx Alpha (CT104) : 10.0.1.3 | 10.0.2.4 | 10.1.0.104 -# Nginx Beta (CT105) : 10.0.1.4 | 10.0.2.5 | 10.1.0.105 +# Nginx Alpha (CT105) : 10.0.1.3 | 10.0.2.4 | 10.1.0.105 +# Nginx Beta (CT106) : 10.0.1.4 | 10.0.2.5 | 10.1.0.106 # Gateway 10.0.1.0/24 -> 10.0.1.254 # Gateway 10.0.2.0/24 -> 10.0.2.254 # Gateway 10.1.0.0/24 -> 10.1.0.254 @@ -34,7 +34,7 @@ onboot: yes unprivileged: yes nameserver: '10.0.1.253' - netif: '{"net0":"name=eth0,ip=10.0.1.3/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net1":"name=eth1,ip=10.0.2.4/24,gw=10.0.2.254,bridge=vmbr1,tag=30","net3":"name=eth3,ip=10.1.0.104/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' + netif: '{"net0":"name=eth0,ip=10.0.1.3/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net1":"name=eth1,ip=10.0.2.4/24,gw=10.0.2.254,bridge=vmbr1,tag=30","net3":"name=eth3,ip=10.1.0.105/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' pubkey: "{{ ssh_pub }}" state: present @@ -57,7 +57,7 @@ onboot: yes unprivileged: yes nameserver: '10.0.1.253' - netif: '{"net0":"name=eth0,ip=10.0.1.4/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net1":"name=eth1,ip=10.0.2.5/24,gw=10.0.2.254,bridge=vmbr1,tag=30","net3":"name=eth3,ip=10.1.0.105/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' + netif: '{"net0":"name=eth0,ip=10.0.1.4/24,gw=10.0.1.254,bridge=vmbr1,tag=20","net1":"name=eth1,ip=10.0.2.5/24,gw=10.0.2.254,bridge=vmbr1,tag=30","net3":"name=eth3,ip=10.1.0.106/24,gw=10.1.0.254,bridge=vmbr2,tag=100"}' pubkey: "{{ ssh_pub }}" state: present diff --git a/proxmox/securisation/template_ferm.md b/proxmox/securisation/template_ferm.md index 9b00edd..cba4ec1 100644 --- a/proxmox/securisation/template_ferm.md +++ b/proxmox/securisation/template_ferm.md @@ -26,6 +26,7 @@ La template utilise des paramètres pour éviter d'avoir à modifier la configur - IF_ADMIN : Nom de l'interface d'administration - IF_FRONT : Nom du point d'entrée principal sur le conteneur - IF_BACK : Liste des interfaces secondaire, ne doit inclure ni l'interface administration ni les interfaces qui n'ont pas besoin de règles autre que DROP. +- IF_VRRP : Nom de l'interface ayant besoin d'utiliser le protocole VRRP, mettre NEED_VRRP à 1 si besoin de VRRP. #### Ports TCP ouverts - HAVE_BACK_ACCESS : Doit accéder à des conteneurs qui sont sur des interfaces secondaires diff --git a/reseau/mise_en_place.md b/reseau/mise_en_place.md index ebaab1b..9e8536e 100644 --- a/reseau/mise_en_place.md +++ b/reseau/mise_en_place.md @@ -43,6 +43,7 @@ Switch Interne VLAN 30 - Nginx Public Beta : 10.0.2.5 - Mail Frontend : 10.0.2.10 - Mail Backend : 10.0.2.11 +- LDAP WebUI : 10.0.2.15 - Nextcloud : 10.0.2.20 - Gitea : 10.0.2.21 - [...] diff --git a/reseau/topologie_globale.md b/reseau/topologie_globale.md index b3ab30c..7b63ea2 100644 --- a/reseau/topologie_globale.md +++ b/reseau/topologie_globale.md @@ -1,7 +1,7 @@ # Topologie globale de l'infrastructure Le réseau sera découpé en deux sous-réseaux matérialisés par des switchs virtuels : le réseau interne accessible directement depuis l'extérieur et le réseau d'administration accessible uniquement via un VPN. -## Schéma simplifié +## Schéma simplifié de la zone interne ![Topologie du réseau](topologie_reseau.png)