Interface Web pour la gestion du LDAP

master
Pierre Coimbra 2020-03-12 18:30:02 +01:00
parent aeefa218dc
commit 0b5ee7039a
No known key found for this signature in database
GPG Key ID: F9C449C78F6FAEE6
6 changed files with 316 additions and 12 deletions

View File

@ -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)

View File

@ -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
Loverlay memberof permet de savoir dans quels groupes se trouve un utilisateur en une seule requête au lieu de deux.
Loverlay 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 lannuaire. Dans notre cas, cela sera inscrit dans le fichier : /var/log/openldap/audit.ldif
Cet overlay audite chaque modification faites sur lannuaire, 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 lannuaire 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
```

View File

@ -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**

View File

@ -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)

View File

@ -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

View File

@ -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
```