projet_serveur_krkn/applicatif/zone_interne/ldap/interface_web_ldap.md

7.5 KiB

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

Interface réseau

  • eth0 : vmbr1 / VLAN 30 / IP 10.0.2.15 / GW 10.0.2.254

Le proxy

/root/.gitconfig

[http]
        proxy = http://10.0.0.252:3128
[https]
        proxy = https://10.0.0.252:3128

/etc/apt/apt.conf.d/01proxy

Acquire::http {
 Proxy "http://10.0.0.252:9999";
};

Il vous faut mettre en place le certificat SSL pour LDAP. La démarche et la même que dans la partie LDAP.

Installation

git clone https://github.com/kakwa/ldapcherry
cd 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: "2147483648 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 = '10.0.2.15'
server.socket_port = 80
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=krhacken,dc=org'
#ldap.binddn = 'cn=writer,ou=system,dc=krhacken,dc=org'
ldap.password = '8PizMOVqhDwSVChJwNy8Xcb1rPzDEuYbwXdd'
ldap.timeout = 1
ldap.groupdn = 'ou=krhacken,ou=group,dc=krhacken,dc=org'
ldap.userdn = 'ou=krhacken,ou=people,dc=krhacken,dc=org'
ldap.user_filter_tmpl = '(uid=%(username)s)'
ldap.group_filter_tmpl = '(member=uid=%(username)s,ou=krhacken,ou=people,dc=krhacken,dc=org)'
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/ldapui

server {
        listen 80;
        server_name ldapui.krhacken.org;
        location / {
                proxy_pass http://10.0.2.15:80/;
                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 ldapui

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

[Unit]
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