PhpLdapPasswd sous Apache

De EjnTricks

Lors de l'installation de cette application, des fichiers de configuration apache sont mis à disposition. Cependant, ils sont minimalistes et celui mis en place lors de l'installation de phpLDAPAdmin a été repris:


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Icon-Configuration-Settings.png Déploiement site sécurisé

La procédure décrite ci dessous permet de mettre à disposition l'application avec un accès sécurisé HTTPS avec utilisation d'un certificat fourni par Let's Encrypt et un tutoriel très bien réalisé.

L'application sera rendue disponible depuis un sous domaine du domaine principal.

Pour rappel, l'application est déployé dans le répertoire /var/opt/phpLdapPasswd.

System-Install-icon.png Préparation environnement

Certbot sera utilisé pour demander et renouveler le certificat du site. Dans son fonctionnement, le process essaye d'accéder à un .well-known à la racine du site. De plus, une bonne pratique consiste à fournir un répertoire racine pour les sites déployés sous Apache. Le répertoire /var/www/ldappwd est alors créé, ainsi que le sous répertoire .well-known.

#sudo mkdir -p /var/www/ldappwd/.well-known

Pour cette application, il n'est pas nécessaire de placer un fichier index.html, avec un contenu vide, dans le répertoire racine, soit /var/www/ldappwd, car la racine sera sur l'instance qui possède déjà un fichier index.php.

Un fichier robots.txt y est placé avec les directives indiquant aux moteurs de recherche de ne rien indexer.

User-agent: *
Disallow: /

Les permissions mises en place donnent un accès uniquement aux compte du serveur, soit www-data.

#sudo find /var/www/ldappwd -type f -exec chmod 0600 {} \;
#sudo find /var/www/ldappwd -type d -exec chmod 0700 {} \;
#sudo chown -R www-data:www-data /var/www/ldappwd

Configuration-icon.png Configuration HTTP

Dans un premier temps, une configuration temporaire est mise en place pour accéder de façon non sécurisé. Un fichier ldappwd est créé dans le répertoire /etc/apache2/sites-available avec le contenu suivant.

<VirtualHost *:80>
    ServerAdmin contact-email@dummy.net
    ServerName www.ldappwd.dummy.net
    DocumentRoot /var/opt/phpLdapPasswd
    DirectoryIndex index.php

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/ldappwd_error.log
    CustomLog ${APACHE_LOG_DIR}/ldappwd_access.log combined

    Alias /.well-known "/var/www/ldappwd/.well-known"
    <Directory "/var/www/ldappwd/.well-known">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    Alias /robots.txt "/var/www/ldappwd/robots.txt"

    <Directory /var/opt/phpLdapPasswd>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

Les directives sur l'accès à /.well-known et robots.txt permettent de servir les éléments depuis la racine /var/www/ldappwd.

Cette configuration doit être mise à disposition en plaçant un lien dans /etc/apache2/sites-enabled.

#sudo ln -s /etc/apache2/sites-available/ldappwd /etc/apache2/sites-enabled/008-ldappwd.conf

Le nom du lien, à savoir 008-ldappwd.conf, respecte une incrémentation sur la machine utilisée, il peut être remplacé pour tout autre nom valide pour Apache.

Il suffit de relancer la configuration d'Apache pour qu'elle soit prise en compte.

#sudo apache2ctl graceful

Certificate Server icon.png Certificat

L'application est à présent disponible avec l'URL http://www.ldappwd.dummy.net. Un certificat va être demandé à l'aide de Certbot.

#sudo certbot certonly --webroot -w /var/www/ldappwd -d www.ldappwd.dummy.net --email contact-email@dummy.net
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.ldappwd.dummy.net
Using the webroot path /var/www/ldappwd for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.ldappwd.dummy.net/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.ldappwd.dummy.net/privkey.pem
   Your cert will expire on 2018-05-06. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Le certificat est stocké dans le répertoire /etc/letsencrypt/live/www.ldappwd.dummy.net/.

Lock-icon.png Configuration HTTPS

Le certificat étant disponible, la configuration HTTPS peut être mise en place. Un fichier ldappwd-dummy-ssl est créé dans le répertoire /etc/apache2/sites-available avec le contenu suivant.

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin contact-email@dummy.net
    ServerName www.ldappwd.dummy.net
    DocumentRoot /var/opt/phpLdapPasswd
    DirectoryIndex index.php

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/ldappwd_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/ldappwd_ssl_access.log combined

    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    SSLEngine on
    SSLCertificateFile         /etc/letsencrypt/live/www.ldappwd.dummy.net/cert.pem
    SSLCertificateKeyFile      /etc/letsencrypt/live/www.ldappwd.dummy.net/privkey.pem
    SSLCertificateChainFile    /etc/letsencrypt/live/www.ldappwd.dummy.net/chain.pem
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCompression off
    SSLOptions +StrictRequire
    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

    Alias /.well-known "/var/www/ldappwd/.well-known"
    <Directory "/var/www/ldappwd/.well-known">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    Alias /robots.txt "/var/www/ldappwd/robots.txt"

    <Directory /var/opt/phpLdapPasswd>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>
</IfModule>

Les configurations mises en place dans le précédent paragraphe sont reprises et complétées avec la déclaration du certificat et l'alias. De plus, une directive sur le Header est mise en place afin de forcer l'accès au maximum l'accès sur le site sécurisé.

Cette configuration doit être mise à disposition en plaçant un lien dans /etc/apache2/sites-enabled.

#sudo ln -s /etc/apache2/sites-available/ldappwd-dummy-ssl /etc/apache2/sites-enabled/009-ldappwd-ssl.conf

Le nom du lien, à savoir 009-ldappwd-ssl.conf, respecte une incrémentation sur la machine utilisée, il peut être remplacé pour tout autre nom valide pour Apache.

Enfin la configuration HTTP, sur le port 80, est modifiée pour forcer la redirection sur l'accès en HTTPS. Le précédent fichier ldappwd est modifié avec le contenu suivant.

<VirtualHost *:80>
    ServerAdmin contact-email@dummy.net
    ServerName www.ldappwd.dummy.net
    DocumentRoot /var/opt/phpLdapPasswd
    DirectoryIndex index.php

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/ldappwd_error.log
    CustomLog ${APACHE_LOG_DIR}/ldappwd_access.log combined

    RewriteEngine on
    RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

Il suffit de relancer la configuration d'Apache pour que les modifications soient prises en compte.

#sudo apache2ctl graceful


Warning-icon.png Configuration simple

Ce mode de configuration permet de mettre à disposition l'application dans une configuration de site existant, en s'inspirant de celle de Mediawiki par exemple.

Par contre, les modes présentés ne mettent pas en évidence l'utilisation de certificat et sont effectué sur des accès HTTP simple.

Configuration-icon.png Apache 2.2.X

Celle-ci est réalisée à travers le lien phpldappasswd.conf, dans le répertoire /etc/apache2/conf.d, pointant sur le fichier /var/opt/phpLdapPasswd/conf.d/phpldappasswd.conf dont le contenu est:

<IfModule mod_alias.c>
    Alias /phpldappasswd /var/opt/phpLdapPasswd
</IfModule>

<Directory /var/opt/phpLdapPasswd/>

    DirectoryIndex index.php
    Options +FollowSymLinks
    AllowOverride None

    Order allow,deny
    Allow from all

    <IfModule mod_mime.c>

      <IfModule mod_php5.c>
        AddType application/x-httpd-php .php

        php_flag magic_quotes_gpc Off
        php_flag track_vars On
        php_flag register_globals Off
        php_value include_path .
        php_value memory_limit 32M
      </IfModule>

      <IfModule !mod_php5.c>
        <IfModule mod_actions.c>
          <IfModule mod_cgi.c>
            AddType application/x-httpd-php .php
            Action application/x-httpd-php /cgi-bin/php5
          </IfModule>
          <IfModule mod_cgid.c>
            AddType application/x-httpd-php .php
            Action application/x-httpd-php /cgi-bin/php5
           </IfModule>
        </IfModule>
      </IfModule>

    </IfModule>

</Directory>

Ce fichier est crée à l'emplacement /var/opt/phpLdapPasswd/conf.d/phpldappasswd.conf. Puis un lien symbolique est créé dans le répertoire /etc/apache2/conf.d

#sudo ln -s /var/opt/phpLdapPasswd/conf.d/phpldappasswd.conf /etc/apache2/conf.d/phpldappasswd.conf


Configuration-icon.png Apache 2.4.6

Lors d'une mise à jour du serveur Ubuntu, Apache a été mis à jour en version 2.4.6. Cependant, l'impact est assez conséquent, car il y a eu une refonte de la gestion des droits d'accès.

La première modification concerne l'emplacement de la déclaration de PhpLDAPAdmin. Le lien phpldapadmin ne devait plus être déposé dans conf.d mais dans conf-enabled, sous /etc/apache2, suite à la version 2.4.6. De plus, le nom du lien doit se terminer par .conf pour être pris en compte au démarrage de Apache. Les commandes suivantes ont été exécutées:

#sudo ln -s /var/opt/phpLdapPasswd/conf.d/phpldappasswd.conf /etc/apache2/conf-enabled/phpldappasswd.conf
#sudo rm /etc/apache2/conf.d/phpldapadmin

Cependant, cela ne suffit pas, la configuration des droits d'accès ayant été modifiée, les messages d'erreurs étant constatés dans les logs de Apache:

[Fri Dec 27 17:52:55.487033 2013] [authz_core:error] [pid 14318] [client 82.230.154.123:54262] AH01630: client denied by server configuration: /var/opt/piwik

La configuration a donc été modifiée afin d'être de nouveau opérationnelle:

<IfModule mod_alias.c>
    Alias /phpldappasswd /var/opt/phpLdapPasswd
</IfModule>

<Directory /var/opt/phpLdapPasswd/>

    DirectoryIndex index.php
    Options +FollowSymLinks
    AllowOverride None

    # Old configuration for APACHE 2.2
    # Order allow,deny
    # Allow from all
    Require all granted

    <IfModule mod_mime.c>

      <IfModule mod_php5.c>
        AddType application/x-httpd-php .php

        php_flag magic_quotes_gpc Off
        php_flag track_vars On
        php_flag register_globals Off
        php_value include_path .
        php_value memory_limit 32M
      </IfModule>

      <IfModule !mod_php5.c>
        <IfModule mod_actions.c>
          <IfModule mod_cgi.c>
            AddType application/x-httpd-php .php
            Action application/x-httpd-php /cgi-bin/php5
          </IfModule>
          <IfModule mod_cgid.c>
            AddType application/x-httpd-php .php
            Action application/x-httpd-php /cgi-bin/php5
           </IfModule>
        </IfModule>
      </IfModule>

    </IfModule>

</Directory>


Configuration-icon.png Configuration pour un domaine spécifique

Au fil du temps, le serveur Apache a été enrichi sur la machine, afin de servir différents domaine. La première configuration mise en place rendait l'application disponible sur l'ensemble des domaines, chose qui n'était pas souhaitée. Le lien mis en place sous /etc/apache2/conf-enabled a été "déplacé" sous /etc/apache2/conf-available, afin d'être dans la philosophie du paquet Ubuntu. Le contenu du ce répertoire est le suivant.

#sudo rm /etc/apache2/conf-enabled/phpldappasswd.conf
#sudo ln -s /var/opt/phpLdapPasswd/conf.d/phpldappasswd.conf /etc/apache2/conf-available/phpldappasswd.conf
#sudo ls -l /etc/apache2/conf-available
-rw-r--r-- 1 root root  315 juil. 20  2013 charset.conf
-rw-r--r-- 1 root root  465 août  15 23:34 httpd.conf
-rw-r--r-- 1 root root 3224 juil. 20  2013 localized-error-pages.conf
-rw-r--r-- 1 root root  189 juil. 20  2013 other-vhosts-access-log.conf
lrwxrwxrwx 1 root root   48 août  16 17:21 phpldappasswd.conf -> /var/opt/phpLdapPasswd/conf.d/phpldappasswd.conf
-rw-r--r-- 1 root root 2190 juil. 20  2013 security.conf
-rw-r--r-- 1 root root  455 janv.  7  2014 serve-cgi-bin.conf

A présent, la configuration Apache pour PhpLDAPPasswd est mise à disposition et il reste à la référencer à l'aide de l'instruction Include dans le fichier de configuration du domaine souhaité, à savoir /etc/apache2/sites-enabled/003-dev-dummy-ssl.conf, pour le domaine en https www.dev.dummy.net.

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin contact-email@dummy.net
        ServerName www.dev.dummy.net
        DirectoryIndex index.php

        DocumentRoot /var/www/dev
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/dev>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                # Old configuration for APACHE 2.2
                # Order allow,deny
                # Allow from all
                Require all granted
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                # Old configuration for APACHE 2.2
                # Order allow,deny
                # Allow from all
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/dev_ssl_error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/dev_ssl_access.log combined

        # Alias /doc/ "/usr/share/doc/"
        # <Directory "/usr/share/doc/">
        #       Options Indexes MultiViews FollowSymLinks
        #       AllowOverride None
        #       Order deny,allow
        #       Deny from all
        #       Allow from 127.0.0.0/255.0.0.0 ::1/128
        # </Directory>

        #   SSL Engine Switch:
        #   Enable/Disable SSL for this virtual host.
        SSLEngine on

        #   A self-signed (snakeoil) certificate can be created by installing
        #   the ssl-cert package. See
        #   /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
        #   If both key and certificate are stored in the same file, only the
        #   SSLCertificateFile directive is needed.
        SSLCertificateFile    /etc/ssl/certs/dev.dummy.pem
        SSLCertificateKeyFile /etc/ssl/private/dummy.key

        #   Server Certificate Chain:
        #   Point SSLCertificateChainFile at a file containing the
        #   concatenation of PEM encoded CA certificates which form the
        #   certificate chain for the server certificate. Alternatively
        #   the referenced file can be the same as SSLCertificateFile
        #   when the CA certificates are directly appended to the server
        #   certificate for convinience.
        #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt

        #   Certificate Authority (CA):
        #   Set the CA certificate verification path where to find CA
        #   certificates for client authentication or alternatively one
        #   huge file containing all of them (file must be PEM encoded)
        #   Note: Inside SSLCACertificatePath you need hash symlinks
        #         to point to the certificate files. Use the provided
        #         Makefile to update the hash symlinks after changes.
        #SSLCACertificatePath /etc/ssl/certs/
        #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt

        #   Certificate Revocation Lists (CRL):
        #   Set the CA revocation path where to find CA CRLs for client
        #   authentication or alternatively one huge file containing all
        #   of them (file must be PEM encoded)
        #   Note: Inside SSLCARevocationPath you need hash symlinks
        #         to point to the certificate files. Use the provided
        #         Makefile to update the hash symlinks after changes.
        #SSLCARevocationPath /etc/apache2/ssl.crl/
        #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl

        #   Client Authentication (Type):
        #   Client certificate verification type and depth.  Types are
        #   none, optional, require and optional_no_ca.  Depth is a
        #   number which specifies how deeply to verify the certificate
        #   issuer chain before deciding the certificate is not valid.
        #SSLVerifyClient require
        #SSLVerifyDepth  10

        #   Access Control:
        #   With SSLRequire you can do per-directory access control based
        #   on arbitrary complex boolean expressions containing server
        #   variable checks and other lookup directives.  The syntax is a
        #   mixture between C and Perl.  See the mod_ssl documentation
        #   for more details.
        #<Location />
        #SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
        #            and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
        #            and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
        #            and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
        #            and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20       ) \
        #           or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
        #</Location>

        #   SSL Engine Options:
        #   Set various options for the SSL engine.
        #   o FakeBasicAuth:
        #     Translate the client X.509 into a Basic Authorisation.  This means that
        #     the standard Auth/DBMAuth methods can be used for access control.  The
        #     user name is the `one line' version of the client's X.509 certificate.
        #     Note that no password is obtained from the user. Every entry in the user
        #     file needs this password: `xxj31ZMTZzkVA'.
        #   o ExportCertData:
        #     This exports two additional environment variables: SSL_CLIENT_CERT and
        #     SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
        #     server (always existing) and the client (only existing when client
        #     authentication is used). This can be used to import the certificates
        #     into CGI scripts.
        #   o StdEnvVars:
        #     This exports the standard SSL/TLS related `SSL_*' environment variables.
        #     Per default this exportation is switched off for performance reasons,
        #     because the extraction step is an expensive operation and is usually
        #     useless for serving static content. So one usually enables the
        #     exportation for CGI and SSI requests only.
        #   o StrictRequire:
        #     This denies access when "SSLRequireSSL" or "SSLRequire" applied even
        #     under a "Satisfy any" situation, i.e. when it applies access is denied
        #     and no other module can change it.
        #   o OptRenegotiate:
        #     This enables optimized SSL connection renegotiation handling when SSL
        #     directives are used in per-directory context.
        #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>

        #   SSL Protocol Adjustments:
        #   The safe and default but still SSL/TLS standard compliant shutdown
        #   approach is that mod_ssl sends the close notify alert but doesn't wait for
        #   the close notify alert from client. When you need a different shutdown
        #   approach you can use one of the following variables:
        #   o ssl-unclean-shutdown:
        #     This forces an unclean shutdown when the connection is closed, i.e. no
        #     SSL close notify alert is send or allowed to received.  This violates
        #     the SSL/TLS standard but is needed for some brain-dead browsers. Use
        #     this when you receive I/O errors because of the standard approach where
        #     mod_ssl sends the close notify alert.
        #   o ssl-accurate-shutdown:
        #     This forces an accurate shutdown when the connection is closed, i.e. a
        #     SSL close notify alert is send and mod_ssl waits for the close notify
        #     alert of the client. This is 100% SSL/TLS standard compliant, but in
        #     practice often causes hanging connections with brain-dead browsers. Use
        #     this only for browsers where you know that their SSL implementation
        #     works correctly.
        #   Notice: Most problems of broken clients are also related to the HTTP
        #   keep-alive facility, so you usually additionally want to disable
        #   keep-alive for those clients, too. Use variable "nokeepalive" for this.
        #   Similarly, one has to force some clients to use HTTP/1.0 to workaround
        #   their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
        #   "force-response-1.0" for this.
        BrowserMatch "MSIE [2-6]" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        # MSIE 7 and newer should be able to use keepalive
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

        Include /etc/apache2/conf-available/phpldappasswd.conf

</VirtualHost>
</IfModule>