# Vue d'ensemble de la configuration

## Backends

La configuration de LemonLDAP::NG est stockée dans un backend permettant à tous les modules d'y accéder.

Tous les composants de LL::NG doivent avoir accès :

- au système de stockage de la configuration
- au système de stockage des sessions

La configuration détaillée des backends de stockage est disponible ici.

Par défaut, la configuration est stockée dans des fichiers, donc l'accès par le réseau n'est en général pas possible. Pour contourner ce problème, utiliser SOAP pour l'accès à la configuration ou un service réseau tel une base de donnée SQL ou un annuaire LDAP.

Le backend de configuration peut être indiqué dans le fichier local de configuration, dans la section `configuration`.

Par exemple, pour configurer le backend de configuration `File` :

    [configuration]
    type=File
    dirName = /usr/local/lemonldap-ng/data/conf

Voir Comment changer le backend de configuration.

## Manager

La majeure partie de la configuration peut être réalisée via le manager LemonLDAP::NG (par défaut http://manager.example.com).

Par défaut, le manager est protégé et n'autorise que l'utilisateur de démonstration “dwho”.

Cet utilisateur n'est plus disponible si on change de backend d'authentification ! Ne pas oublier de changer la règle d'accès à l'hôte virtuel du manager pour autoriser les nouveaux administrateurs.

SI l'accès au manager est perdu, on peut le déprotéger en éditant `lemonldap-ng.in` et en changeant le paramètre `protection` :

    [manager]

    # Manager protection: by default, the manager is protected by a demo account.
    # You can protect it :
    # * by Apache itself,
    # * by the parameter 'protection' which can take one of the following
    # values :
    #   * authenticate : all authenticated users can access
    #   * manager      : manager is protected like other virtual hosts: you
    #                    have to set rules in the corresponding virtual host
    #   * rule: <rule> : you can set here directly the rule to apply
    #   * none         : no protection

Voir la documentation de protection du manager pour savoir comment utiliser les modules d'Apache ou LL::NG pour gérer l'accès au manager.

Le manager affiche des branches principales :

- Paramètres généraux : modules d'authentification, portail, etc...
- Variables : informations utilisateur, macros et groupes utilisés pour renseigner la session SSO
- Hôtes virtuels : règles d'accès, en-têtes, etc...
- Service SAML : administration des métadonnées SAML
- Fournisseurs d'identité SAML : IDP enregistrés
- Fournisseurs de service SAML : SP enregistrés
- Service OpenID-Connect: configuration du service OpenID-Connect
- Fournisseurs OpenID-Connect : OP enregistrés
- Clients OpenID-Connect : RP enregistrés

La configuration de LemonLDAP::NG est essentiellement une structure clef/valeur, ainsi le manager présente toutes les clefs en un arbre structuré. Un click sur la clef affiche la valeur associée.

Lorsque toutes les modifications sont effectuées, cliquer sur `Sauver` pour enregistrer la configuration.

LemonLDAP::NG effectue ensuite quelques tests sur la configuration et affiche les éventuelles erreurs et avertissements. La configuration n'est pas sauvée en cas d'erreur.

## Éditeur de configuration en mode text

LemonLDAP::NG provide a script that allows one to edit configuration without graphical interface, this script is called `lmConfigEditor` and is stored in the LemonLDAP::NG bin/ directory, for example /usr/share/lemonldap-ng/bin:

    /usr/share/lemonldap-ng/bin/lmConfigEditor

Ce script doit être lancé par root, il utilisera ensuite le compte et le groupe d'Apache pour accéder à la configuration.

Ce script utilise la commande système `editor`, qui est liée à l'éditeur favori. Pour le changer :

    update-alternatives --config editor

La configuration est affichée en une grande table de hachage Perl, qu'on peut éditer :

    $VAR1 = {
              'ldapAuthnLevel' => '2',
              'notificationWildcard' => 'allusers',
              'loginHistoryEnabled' => '1',
              'key' => 'q`e)kJE%<&wm>uaA',
              'samlIDPSSODescriptorSingleSignOnServiceHTTPPost' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;',
              'portalSkin' => 'pastel',
              'failedLoginNumber' => '5',
              ...
              };

Si une modification est effectuée, la configuration est sauvée avec un nouveau numéro. Sinon, la configuration courante est gardée.

## Interface en ligne de commande (CLI)

C'est un outil expérimental qui évoluera dans les prochaines versions.

LemonLDAP::NG provide a script that allows one to edit configuration items in non interactive mode. Ce script se nomme `lemonldap-ng-cli` et se trouve dans le répertoire bin/ de LemonLDAP::NG, par exemple /usr/share/lemonldap-ng/bin:

    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli

Ce script doit être lancé par root, il utilisera ensuite le compte et le groupe d'Apache pour accéder à la configuration.

Pour connaître les actions possibles, lancer :

    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli help

On peut forcer la mise à jour du cache de la configuration :

    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli update-cache

Pour obtenir quelques informations sur la configuration actuelle :

    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli info

Pour voir un paramètre de configuration, par exemple l'URL du portail :

    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli get portal

Pour définir un paramètre, par exemple le domaine :

    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli set domain example.org

On peut utiliser des « accessors » (options) pour modifier le comportement :

- -sep : séparateur des valeurs hiérarchiques (par défaut: /).
- -iniFile : le fichier lemonldap-ng.ini à utiliser si ce n'est pas la valeur par défaut.
- -yes: pour ne pas demander la confirmation avant sauvegarde.
- -cfgNum : le numéro de configuration. S'il n'est pas défini, la dernière configuration sera utilisée.
- -force: mettre à 1 pour sauver une configuration plus ancienne que la dernière.

Quelques exemples:

    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -cfgNum 10 get exportedHeaders/test1.example.com
    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -yes 1 set notification 1
    /usr/share/lemonldap-ng/bin/lemonldap-ng-cli -sep ',' get macros,_whatToTrace

## Apache

LemonLDAP::NG ne gère pas la configuration d'Apache

LemonLDAP::NG fournit 3 fichiers de configuration Apache :

- portal-apache2.conf : hôte virtuel du portail, incluant les points d'accès SOAP et fournisseur d'identité
- manager-apache2.conf : hôte virtuel du manager
- handler-apache2.conf : déclaration du handler, rechargement et exemple d'hôte virtuel

Voir comment les déployer.

Mod Perl doit être chargé avant LemonLDAP::NG, donc les inclusions aprèsla directive `LoadModule` de mod_perl.

### Portail

Dans l'hôte virtuel du portail se trouve plusieurs éléments de configuration :

- Directives standard d'hôte virtuel pour servir les pages du portail :

        ServerName auth.example.com

        # DocumentRoot
        DocumentRoot /usr/local/lemonldap-ng/htdocs/portal/
        <Directory /usr/local/lemonldap-ng/htdocs/portal/>
            Order allow,deny
            Allow from all
            Options +ExecCGI
        </Directory>

        # Perl script
        <Files *.pl>
            SetHandler perl-script
            PerlResponseHandler ModPerl::Registry
        </Files>

        # Directory index
        <IfModule mod_dir.c>
            DirectoryIndex index.pl index.html
        </IfModule>

- Points d'accès SOAP (désactivés par défaut) :

        # Gestion des fonctions SOAP functions pour la gestion des sessions (désactivée par défaut)
        <Location /index.pl/adminSessions>
            Order deny,allow
            Deny from all
        </Location>

        # Fonctions SOAP pour l'accès aux sessions (désactivées par défaut)
        <Location /index.pl/sessions>
            Order deny,allow
            Deny from all
        </Location>

        # Fonctions SOAP pour accéder à la configuration (désactivées par défaut)
        <Location /index.pl/config>
            Order deny,allow
            Deny from all
        </Location>

        # Fonctions SOAP pour insérer des notifications (désactivées par défaut)
        <Location /index.pl/notification>
            Order deny,allow
            Deny from all
        </Location>

- Règles de réécriture pour la fourniture d'identité (requiert `mod_rewrite`):

        # Fournisseur d'identité SAML2
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteRule ^/saml/metadata /metadata.pl
            RewriteRule ^/saml/.* /index.pl
        </IfModule>

        # Fournisseur d'identité CAS
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteRule ^/cas/.* /index.pl
        </IfModule>

        # Fournisseur d'identité OpenID
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteRule ^/openidserver/.* /index.pl
        </IfModule>

        # OpenID Connect Issuer
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteRule ^/oauth2/.* /index.pl
            RewriteRule ^/.well-known/openid-configuration$ /openid-configuration.pl
        </IfModule>

        # Get Issuer
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteRule ^/get/.* /index.pl
        </IfModule>

- Quelques optimisations Perl :

    # Meilleures performances sous ModPerl::Registry
    # A décommenter pour augmenter les performances du portail
    <Perl>
        require Lemonldap::NG::Portal::SharedConf;
        Lemonldap::NG::Portal::SharedConf->compile(
            qw(delete header cache read_from_client cookie redirect unescapeHTML));
        # Décommenter cette ligne si le menu Lemonldap::NG est utilisé
        require Lemonldap::NG::Portal::Menu;
        # Décommenter cette ligne si les fonctions SOAP du portail sont utilisées
        require SOAP::Lite;
    </Perl>

### Manager

L'hôte virtuel du manager est utilisé pour servir l'interface de configuration et la documentation locale. S'il est lancé comme application FastCGI :

        # CONFIGURATION FASTCGI
        # ---------------------

        # 1) Gestion de l'URI
        RewriteEngine on

        RewriteRule "^/$" "/psgi/manager-server.fcgi" [PT]
        # Pour de meilleures performances, on peut effacer la ligne RewriteRule après
        # puttings html files: simply put the HTML results of different modules
        # (configuration, sessions, notifications) en manager.html, sessions.html,
        # notifications.html, puis décommenter les 2 lignes suivantes :
        # DirectoryIndex manager.html
        # RewriteCond "%{REQUEST_FILENAME}" "!\.html$"

        # URLs REST
        RewriteCond "%{REQUEST_FILENAME}" "!^/(?:static|doc|fr-doc|lib).*"
        RewriteRule "^/(.+)$" "/psgi/manager-server.fcgi/$1" [PT]

        Alias /psgi/ /var/lib/lemonldap-ng/manager/psgi/

        # 2) Moteur FastCGI

        # On peut utiliser n'importe quel système FastCGI. Ici un exemple utilisant mod_fcgid
        # configuration mod_fcgid
        <Directory /var/lib/lemonldap-ng/manager/psgi/>
            SetHandler fcgid-script
            Options +ExecCGI
        </Directory>

        # Pour utiliser mod_fastcgi, remplacer les lignes suivantes par :
        #FastCgiServer /var/lib/lemonldap-ng/manager/psgi/manager-server.fcgi

        # Ou pour utiliser simplement CGI, utiliser /psgi/manager-server.cgi à la place de
        # /psgi/manager-server.fcgi et adapter les règles de réécriture.

L'accès à l'interface de configuration n'est pas protégée par Apache mais par LemonLDAP::NG lui-même (voir `lemonldap-ng.ini`) :

### Agent (Handler)

- Charger l'agent dans la mémoire d'Apache :

    PerlOptions +GlobalRequest
    PerlModule Lemonldap::NG::Handler

- Capture des pages d'erreur :

    ErrorDocument 403 http://auth.example.com/?lmError=403
    ErrorDocument 500 http://auth.example.com/?lmError=500
    ErrorDocument 503 http://auth.example.com/?lmError=503

- Hôte virtuel pour le rechargement :

    <VirtualHost *:80>
        ServerName reload.example.com

        # Mécanisme de rechargement de la configuration (un seul par serveur physique
        # est nécessaire): choisir une URL pour éviter d'avoir à redémarrer Apache lorsque
        # la configuration change
        <Location /reload>
            Order deny,allow
            Deny from all
            Allow from 127.0.0.0/8
            SetHandler perl-script
            PerlResponseHandler Lemonldap::NG::Handler->reload
        </Location>

        # Uncomment this to activate status module
        #<Location /status>
        #    Order deny,allow
        #    Deny from all
        #    Allow from 127.0.0.0/8
        #    SetHandler perl-script
        #    PerlResponseHandler Lemonldap::NG::Handler->status
        #</Location>

    </VirtualHost>

Protéger ensuite un hôte virtuel standard, la seul ligne de configuration à ajouter est :

    PerlHeaderParserHandler Lemonldap::NG::Handler

## Nginx

LemonLDAP::NG ne gère pas la configuration de Nginx

LemonLDAP::NG fournit 3 fichiers de configuration Nginx :

- portal-nginx.conf : hôte virtuel du portail, incluant les points d'accès SOAP et fournisseur d'identité
- manager-nginx.conf : hôte virtuel du manager
- handler-nginx.conf : déclaration du handler, rechargement et exemple d'hôte virtuel

Voir comment les déployer.

Le serveur FastCGI LL::NG doit être lancé séparemment.

### Portail

Dans l'hôte virtuel du portail se trouve plusieurs éléments de configuration :

- Directives standard d'hôte virtuel pour servir les pages du portail :

    server {
      listen 80;
      server_name auth.example.com;
      root /var/lib/lemonldap-ng/portal/;

      location ~ \.pl(?:$|/) {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/llng-fastcgi-server/llng-fastcgi.sock;
        fastcgi_param LLTYPE cgi;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        set $sn $request_uri;
        if ($sn ~ "^(.*)\?") {
            set $sn $1;
        }
        fastcgi_param SCRIPT_NAME $sn;
        fastcgi_split_path_info ^(.*\.pl)(/.+)$;
      }

      index index.pl;

      location / {
        try_files $uri $uri/ =404;
      }
    }

- Points d'accès SOAP (désactivés par défaut) :

      # Fonctions SOAP pour la gestion des sessions (désactivée par défaut)
      location /index/adminSessions {
        deny all;
      }

      # Fonctions SOAP pour l'accès aux sessions (désactivées par défaut)
      location /index.pl/sessions {
        deny all;
      }

      # Fonctions SOAP pour accéder à la configuration (désactivées par défaut)
      location /index.pl/config {
        deny all;
      }

      # Fonctions SOAP pour insérer des notifications (désactivées par défaut)
      location /index.pl/notification {
        deny all;
      }

- Régles de réécriture des IdP

        # Fournisseur d'identité SAML2
        rewrite ^/saml/metadata /metadata.pl last;
        rewrite ^/saml/.* /index.pl last;

        # Fournisseur d'identité CAS
        rewrite ^/cas/.* /index.pl;

        # Fournisseur d'identité OpenID
        rewrite ^/openidserver/.* /index.pl last;

        # Fournisseur d'identité OpenID-Connect
        rewrite ^/oauth2/.* /index.pl last;
        rewrite ^/.well-known/openid-configuration$ /openid-configuration.pl last;

        # Get Issuer
        rewrite ^/get/.* /index.pl;

### Manager

L'hôte virtuel du manager est utilisé pour servir l'interface de configuration et la documentation locale.

    server {
      listen 80;
      server_name manager.example.com;
      root /usr/share/lemonldap-ng/manager/;

      if ($uri !~ ^/(static|doc|fr-doc|lib|javascript)) {
        rewrite ^/(.*)$ /manager.psgi/$1 break;
      }

      location /manager.psgi {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/llng-fastcgi-server/llng-fastcgi.sock;
        fastcgi_param LLTYPE manager;
        fastcgi_param SCRIPT_NAME /manager.psgi;
      }

      location / {
        index manager.psgi;
        try_files $uri $uri/ =404;
      }
    }

L'accès à l'interface de configuration n'est pas protégée par Nginx mais par LemonLDAP::NG lui-même (voir `lemonldap-ng.ini`) :

### Agent (Handler)

Le handler Nginx est fourni par le serveur FastCGI LemonLDAP::NG.

- Intercepter les erreurs :

    error_page 403 http://auth.example.com/?lmError=403;
    error_page 500 http://auth.example.com/?lmError=500;
    error_page 503 http://auth.example.com/?lmError=503;

- Hôte virtuel pour le rechargement :

    server {
      listen 80;
      server_name reload.example.com;
      root /var/www/html;

      location = /reload {
        allow 127.0.0.1;
        deny all;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/llng-fastcgi-server/llng-fastcgi.sock;
      }

      # Autres requêtes
      location / {
        deny all;
      }

      # Décommenter ceci si le module de statut est activé
      #location = /status {
      #  allow 127.0.0.1;
      #  deny all;
      #  include /etc/nginx/fastcgi_params;
      #  fastcgi_pass unix:/var/run/llng-fastcgi-server/llng-fastcgi.sock;
      #  fastcgi_param LLTYPE status;
      #}
    }

Pour protéger ensuite un hôte virtuel, il faut insérer ceci (ou créer un fichier à inclure) :

      # Insérer $_user dans les journaux
      include /etc/lemonldap-ng/nginx-lmlog.conf;
      access_log /var/log/nginx/access.log lm_combined;

      # Appe interne au serveur FastCGI
      location = /lmauth {
        internal;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/llng-fastcgi-server/llng-fastcgi.sock;
        fastcgi_pass_request_body  off;
        fastcgi_param CONTENT_LENGTH "";
        fastcgi_param HOST $http_host;
        fastcgi_param X_ORIGINAL_URI  $request_uri;
      }

      # Requêtes clients
      location / {
        auth_request /lmauth;
        auth_request_set $lmremote_user $upstream_http_lm_remote_user;
        auth_request_set $lmlocation $upstream_http_location;
        error_page 401 $lmlocation;
        try_files $uri $uri/ =404;

        # Définir REMOTE_USER (pour les applications FastCGI seulement)
        #fastcgi_param REMOTE_USER $lmremote_user

        ######################################
        # PASSER LES ENTÊTES À L'APPLICATION #
        ######################################

        # SI LUA EST SUPPORTÉ
        #include /path/to/nginx-lua-headers.conf

        # SINON
        # Définir manuellement les en-têtes
        #auth_request_set $authuser $upstream_http_auth_user;
        #proxy_set_header Auth-User $authuser;
        # OU
        #fastcgi_param HTTP_AUTH_USER $authuser;

        # Ensuite (si LUA n'est pas supporté), changer l'en-tête Cookie pour masquer celui de LLNG
        #auth_request_set $lmcookie $upstream_http_cookie;
        #proxy_set_header Cookie: $lmcookie;
        # OU
        #fastcgi_param HTTP_COOKIE $lmcookie;

        # Insérer ensuite la configuration (fastcgi_* ou proxy_*)

## Rechargement de la configuration

Comme les agents gardent leur configuration en cache, lorsque la configuration est changée elle doit être mise à jour dans les agents. Un redémarrage d'Apache marchera, mais LemonLDAP::NG offre le moyen de les recharger via une requête HTTP. Le rechargement de la configuration sera effectif en moins de 10 minutes.

Lorsque la configuration est sauvegardée par le manager, LemonLDAP::NG tente de recharger la configuration des agents distants en envoyant une requête HTTP aux serveurs. Les serveurs et URL peuvent être configurées dans le manager, `Paramètres généraux` > `URL de rechargement de la configuration` : les clefs sont les noms de serveurs ou les adresses IP à qui les requêtes seront envoyées, et les valeurs sont les URL à requêter.

Ces paramètres peuvent être surchargés dans le fichier ini de LemonLDAP::NG ini file, à la section `apply`.

Une URL par serveur physique est nécessaire, car les agents partagent le même cache de configuration pour chaque serveur physique.

The `reload` target is managed in Apache or Nginx configuration, inside a virtual host protected by LemonLDAP::NG Handler (see below examples in Apache→handler or Nginx→Handler).

Il faut autoriser l'accès à l'URL déclarée au manager.

## Fichier local

La configuration LemonLDAP::NG peut être gérée par un fichier local au format INI. Le fichier est nommé `lemonldap-ng.ini` et dispose des sections suivantes :

- configuration : où la configuration est stockée
- apply : les URL de rechargement des agents distants
- all : paramètres pour tous les modules
- portal : paramètres réservés au portail
- manager : paramètres réservés au manager
- manager : paramètres réservés aux agents

Lorsqu'un paramètre et fixé dans `lemonldap-ng.ini`, il surcharge le paramètre issu de la configuration globale.

Par exemple, pour surcharger l'apparence du portail :

    [portal]
    portalSkin = dark

Il est nécessaire de connaître le nom technique du paramètre de configuration pour le faire. Se référer à la liste des paramètres pour le trouver.