diff --git a/applicatif/zone_interne/LDAP/README.md b/applicatif/zone_interne/LDAP/README.md new file mode 100644 index 0000000..bc68c17 --- /dev/null +++ b/applicatif/zone_interne/LDAP/README.md @@ -0,0 +1,7 @@ +# Mise en place de la partie LDAP + +Vous trouverez ici toute la documentation relative à la mise en place du serveur LDAP (StartTLS) redondé ainsi que la mise en place d'un interface de gestion web pour cet annuaire. + +# Table des matières +1. [Serveur LDAP](serveur_ldap.md) +2. [Inteface de gestion](interface_web_ldap.md) diff --git a/applicatif/zone_interne/ldap.md b/applicatif/zone_interne/LDAP/interface_web_ldap.md similarity index 97% rename from applicatif/zone_interne/ldap.md rename to applicatif/zone_interne/LDAP/interface_web_ldap.md index 30ad93a..d43582f 100644 --- a/applicatif/zone_interne/ldap.md +++ b/applicatif/zone_interne/LDAP/interface_web_ldap.md @@ -1,4 +1,5 @@ # 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. @@ -157,10 +158,12 @@ ldapmodify -Y external -H ldapi:/// -f acces-conf-admin.ldif ``` # Les overlays -Les overlays sont des fonctionnalités supplémentaires. Si dessous l'ensemble des overlays que nous allons utiliser ainsi que leur utilité. +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 en une seule requête au lieu de deux. +L’overlay memberof permet de savoir dans quels groupes se trouve un utilisateur. ### /root/ldap/conf/memberof_act.ldif ``` dn: cn=module,cn=config @@ -187,8 +190,7 @@ olcMemberOfMemberOfAD: memberOf ``` On applique les modifications ``` -ldapadd -Y EXTERNAL -H lda``` -service slapd force-reloadpi:/// -f memberof_act.ldif +ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_act.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_conf.ldif ``` Vérification @@ -230,7 +232,7 @@ ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b "cn=config" "Objectclass=olcRefintCon ``` ## Audit Log -Cet overlay sert à auditer chaque modification au sein de l’annuaire. Dans notre cas, cela sera inscrit dans le fichier : /var/log/openldap/audit.ldif +Cet overlay audite chaque modification faites sur l’annuaire, les logs seront dans `/var/log/openldap/audit.ldif` ### /root/ldap/conf/auditlog_act.ldif ``` @@ -417,7 +419,7 @@ Avant ça nous allons décrire la structure comme un arbre. - Une petite branche pour le groupe des membres extérieur : `cn=ext,ou=krhacken,ou=group,dc=krhacken,dc=org` -## Mise des grosses branches +## 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. @@ -448,7 +450,7 @@ On rajoute les OU au ldap ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f OU.ldif ``` -## Mise des petites branches +## Mise en place des petites branches Il existe deux types de groupes : les posixgroup et les groupofnames. @@ -493,7 +495,7 @@ ldapsearch -xLLLH ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdld ## Création d'un compte root -Cet utilisateur aura tout les droits sur l'annuaire. +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 ``` @@ -505,12 +507,12 @@ uid: root cn: root sn: root displayName: root -userPassword: password +userPassword: PASSWORD mail: root@krhacken.org ``` On ajoute l'utilisateur ``` -ldapadd -cxWD cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f adminsys.ldif +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 @@ -544,7 +546,7 @@ dn: cn=viewer,ou=system,dc=krhacken,dc=org objectClass: simpleSecurityObject objectClass: organizationalRole cn: viewer -description: LDAP viewer +description: LDAP Viewer userPassword: passview ``` diff --git a/applicatif/zone_interne/LDAP/serveur_ldap.md b/applicatif/zone_interne/LDAP/serveur_ldap.md new file mode 100644 index 0000000..6165b49 --- /dev/null +++ b/applicatif/zone_interne/LDAP/serveur_ldap.md @@ -0,0 +1,290 @@ +# 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. + +## 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; + } +} +``` +``` +sh ~/deploy-webhost.sh nextcloud +``` + +### Dans le conteneur HAProxy +Obtention du certificat +``` +certbot certonly --webroot -w /home/hasync/letsencrypt-requests/ -d ldapui.krhacken.org +``` +``` +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/README.md b/applicatif/zone_interne/README.md index cef3185..8df1f77 100644 --- a/applicatif/zone_interne/README.md +++ b/applicatif/zone_interne/README.md @@ -9,7 +9,7 @@ Les services de la zone INT devront avoir les interfaces réseau suivantes : - Bridge Admin VLAN 100 (ADMIN) # Table des matières -1. [LDAP](ldap.md) +1. [LDAP](ldap/README.md) 2. [Serveur Mail](mail.md) 3. [NextCloud](nextcloud.md) 4. [Gitea](gitea.md) diff --git a/applicatif/zone_interne/mail.md b/applicatif/zone_interne/mail.md index 79c79b9..4f113de 100644 --- a/applicatif/zone_interne/mail.md +++ b/applicatif/zone_interne/mail.md @@ -891,6 +891,10 @@ changetype: modify replace: mailaccountquota mailaccountquota: 2147483648 ``` + +Au niveau des Quota voici le calcul : +- Une unité vaut 1073741824 + A partir de là on peut envoyer et recevoir des mails avec par exemple Thunderbird pour augmenter la protection et la fiabilité de notre service des mails on va rajouter un antispam qui utile du machine learning. Pour authentifier notre serveur nous allons rajouter des entrées DNS # Rspamd diff --git a/applicatif/zone_interne/nextcloud.md b/applicatif/zone_interne/nextcloud.md index 2c5e530..af5726f 100644 --- a/applicatif/zone_interne/nextcloud.md +++ b/applicatif/zone_interne/nextcloud.md @@ -272,6 +272,7 @@ wget https://download.nextcloud.com/server/releases/latest-18.zip unzip latest-18.zip chown -R www-data:www-data /var/www/nextcloud/ ``` + ### Sur le conteneur HAProxy Obtention du certificat ```