Interface Web pour la gestion du LDAP
parent
aeefa218dc
commit
0b5ee7039a
|
@ -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)
|
|
@ -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
|
||||
```
|
||||
|
|
@ -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**
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
|
Loading…
Reference in New Issue