# Gérer les hôtes virtuels

La configuration de LemonLDAP::NG est construite autour des hôtes virtuels Apache ou Nginx. Chaque hôte virtuel est une ressource protégée, avec règles d'accès, en-têtes, options et données POST.

## Configuration d'Apache

Pour protéger un hôte virtuel dans Apache, l'agent LemonLDAP::NG doit être activé (voir configuration globale d'Apache).

Ainsi n'importe quel hôte virtuel peut être protégé en ajoutant cette ligne :

    PerlHeaderParserHandler Lemonldap::NG::Handler

### Application hébergée

Exemple d'hôte virtuel protégé pour une application locale :

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

            PerlHeaderParserHandler Lemonldap::NG::Handler

            DocumentRoot /var/www/localsite

            ErrorLog /var/log/apache2/localsite_error.log
            CustomLog /var/log/apache2/localsite_access.log combined

    </VirtualHost>

### Proxy inverse

Exemple d'hôte virtuel protégé avec Lemonldap::NG en proxy-inverse :

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

            PerlHeaderParserHandler Lemonldap::NG::Handler

            # Reverse-Proxy
            ProxyPass / http://private-name/
            # Changer l'en-tête "Location" dans les redirections
            ProxyPassReverse / http://private-name/
            # Changer le domaine des cookies
            ProxyPassReverseCookieDomain private-name application.example.com

            ErrorLog /var/log/apache2/proxysite_error.log
            CustomLog /var/log/apache2/proxysite_access.log combined
    </VirtualHost>

La même chose avec le serveur distant configuré avec le même nom d'hôte :

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

            PerlHeaderParserHandler Lemonldap::NG::Handler

            # Reverse-Proxy
            ProxyPass / http://APPLICATION_IP/

            ProxyPreserveHost on

            ErrorLog /var/log/apache2/proxysite_error.log
            CustomLog /var/log/apache2/proxysite_access.log combined
    </VirtualHost>

La directive `ProxyPreserveHost` transfère l'en-tête Host à l'application protégée.
Pour en savoir plus sur l'utilisation d' Apache en reverse-proxy, consultez la documentation d'Apache.
Certaines applications ont besoin de la variable d'environnement `REMOTE_USER` pour connaître le nom d'utilisateur connecté, qui n'est pas renseignée en mode reverse-proxy. Dans ce cas, voir comment convertir les en-têtes en variable d'environnement.

### Ajouter un menu flottant

Un petit menu flottant peut être ajouté aux applications par une seimple configuration Apache :

    PerlModule Lemonldap::NG::Handler::Menu
    PerlOutputFilterHandler Lemonldap::NG::Handler::Menu->run

Les pages où ce menu est affiché peuvent être restreintes, par exemple :

    <Location /var/www/html/index.php>
    PerlOutputFilterHandler Lemonldap::NG::Handler::Menu->run
    </Location>

Il faut désactiver mod_deflate pour utiliser le menu flottant

## Configuration de Nginx

Pour protéger un hôte virtuel dans Nginx, le serveur FastCGI de LemonLDAP::NG doit être lancé (voir Serveur FastCGI de LemonLDAP::NG).

Then you can take any virtual host and modify it:

- Declare the /lmauth endpoint

      location = /lmauth {
        internal;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/llng-fastcgi-server/llng-fastcgi.sock;

        # Ignorer les données postées
        fastcgi_pass_request_body  off;
        fastcgi_param CONTENT_LENGTH "";

        # Conserver le nom d'hôte original
        fastcgi_param HOST $http_host;

        # Conserver la requête originale (le serveur LLNG va recevoir /llauth)
        fastcgi_param X_ORIGINAL_URI  $request_uri;
      }

- Protect the application (/ or /path/to/protect):

      location /path/to/protect {
        auth_request /lmauth;
        auth_request_set $lmremote_user $upstream_http_lm_remote_user;
        auth_request_set $lmlocation $upstream_http_location;
        # Uncomment this if CDA is used
        #auth_request_set $cookie_value $upstream_http_set_cookie;
        #add_header Set-Cookie $cookie_value;
        error_page 401 $lmlocation;
        try_files $uri $uri/ =404;

        ...
      }

- Use LUA or set manually the headers:

      location /path/to/protect {

        ...

        # SI LUA EST SUPPORTÉ
        #include /etc/lemonldap-ng/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 dans le bloc correspondant
        #fastcgi_param HTTP_COOKIE $lmcookie;

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

### Application hébergée

Exemple d'hôte virtuel protégé pour une application locale :

    # Format des journaux
    include /path/to/lemonldap-ng/nginx-lmlog.conf;
    server {
      listen 80;
      server_name myserver;
      root /var/www/html;
      # Requête interne d'authentification
      location = /lmauth {
        internal;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass /path/to/llng-fastcgi-server.sock;
        # Ignorer les données postées
        fastcgi_pass_request_body  off;
        fastcgi_param CONTENT_LENGTH "";
        # Conserver le nom d'hôte original
        fastcgi_param HOST $http_host;
        # Conserver la requête originale (le serveur LLNG va recevoir /llauth)
        fastcgi_param X_ORIGINAL_URI  $request_uri;
      }

      # Requêtes clients
      location ~ \.php$ {
        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;
        include fastcgi_params;
        try_files $fastcgi_script_name =404;
        fastcgi_pass /path/to/php-fpm/socket;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_hide_header X-Powered-By;

        ######################################
        # 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;
        #fastcgi_param HTTP_AUTH_USER $authuser;
      }
      location / {
        try_files $uri $uri/ =404;
      }
    }

### Proxy inverse

Exemple de reverse-proxy protégé :

    # Format des journaux
    include /path/to/lemonldap-ng/nginx-lmlog.conf;
    server {
      listen 80;
      server_name myserver;
      root /var/www/html;
      # Requête interne d'authentification
      location = /lmauth {
        internal;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass /path/to/llng-fastcgi-server.sock;
        # Ignorer les données postées
        fastcgi_pass_request_body  off;
        fastcgi_param CONTENT_LENGTH "";
        # Conserver le nom d'hôte original
        fastcgi_param HOST $http_host;
        # Conserver la requête originale (le serveur LLNG va recevoir /llauth)
        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;

        proxy_pass http://remote.server/;
        include /etc/nginx/proxy_params;

        ######################################
        # 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 HTTP_AUTH_USER $authuser;
      }
    }

## Configuration de LemonLDAP::NG

Un hôte virtuel apache protégé par un agent LemonLDAP::NG doit être enregistré dans la configuration LemonLDAP::NG.

Pour ce faire, utiliser le manager, et aller dans la branche `Virtual Hosts`. Il est possible d'ajouter, effacer ou modifier un hôte virtuel ici.

Un hôte vituel contient :

- Des règles d'accès : examine les droits de l'utilisateur via des expressions sur les URL
- En-têtes HTTP : construit l'information à envoyer aux applications protégées
- Des données POST : à utiliser pour répondre aux formulaires
- Des options : port de redirection et protocole

### Règles d'accès et en-têtes HTTP

Voir Écrire des règles et des en-têtes pour savoir comment configurer le contrôle d'accès et les en-têtes HTTP transmis à l'application par LL::NG.

### Données POST

Voir Rejeu des formulaires pour savoir comment configurer le rejeu des formulaires pour poster des données à une applications protégée.

### Options

Quelques options sont disponibles :

- Port
- HTTPS
- Mode maintenance

Ces options sont utilisées dans la construction des URL de redirection (lorsque l'utilisateur n'est pas connecté ou pour les requêtes CDA). Sauf modification, les valeurs par défaut sont utilisées. Ces options ne sont à utiliser que pour surcharger les valeurs par défaut.