Posts tagged apache

Faille Drown et configuration Apache 2.4/TLS

0

Un petit mémo technique pour sécuriser une configuration de site sous Apache 2.4 en TLS, basé notamment sur des recommandations issues de l’article Strong SSL Security on Apache2.

SSLEngine on
SSLCompression off
SSLProtocol TLSv1.2
SSLHonorCipherOrder on
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
# recommended cipher suite for backwards compatibility (IE6/WinXP):
# SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4

SSLCertificateFile /etc/pki/localcerts/myCert.crt
SSLCertificateKeyFile /etc/pki/localcerts/myCert.key
Strong SSL Configuration

A cela, on peut ajouter le code suivant pour empêcher l’utilisation abusive des méthodes TRACK et TRACE de votre serveur web.

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
Disable TRACE/TRACK methods

Exception à une authentification Apache

0

Comment réaliser une exception pour une URL précise lorsqu’un site présente une demande d’authentification Apache ?

C’est la question que je me suis posé lorsqu’on m’a demandé de permettre à des utilisateurs d’accéder à une ressource particulière sans les obliger à s’authentifier. Tout le reste du site devait, quant à lui, être soumis à une authentification réalisée au travers d’un reverse-proxy Apache avec les modules mod_auth*…

A l’origine, le virtual-host Apache se présente de la manière la plus simple qui soit :

<VirtualHost *:80>
    ServerName vhost.domain.tld
    DocumentRoot /var/www/vhost
    ErrorLog /var/log/apache2/vhost_error.log
    CustomLog /var/log/apache2/vhost_access.log combined
</VirtualHost>

A cette déclaration simple, on ajoute une notion d’authentification, soit dans un fichier .htaccess, soit directement dans le fichier de configuration du virtual-host :

<VirtualHost *:80>
    ServerName vhost.domain.tld
    DocumentRoot /var/www/vhost
    ErrorLog /var/log/apache2/vhost_error.log
    CustomLog /var/log/apache2/vhost_access.log combined

    AuthType Basic
    AuthName "Ce site demande une authentification"
    # (La ligne suivante est facultative)
    AuthBasicProvider file
    AuthUserFile /etc/apache2/passwd/vhost.passwords
    Require valid user
</VirtualHost>

Ainsi le serveur web demande une authentification à toute personne souhaitant accéder au site.
On cherche maintenant à laisser l’accès à une URL (URI + Query String) bien précise du site. Si le site était divisé en un répertoire protégé et l’autre non, cela serait trivial, mais ce n’est pas notre cas.
Il nous faut gérer une véritable exception.

En fouillant dans la documentation du projet Apache, on trouve la directive Satisfy (All / Any). Si cette directive est positionnée à ‘All’, toutes les conditions doivent être respectées, si elle est positionnée à ‘Any’, seule l’une des conditions nécessite d’être respectée. C’est le début de notre solution.
Cette directive permet de combiner une authentification avec une directive Order.

...
    Order Allow,Deny
    Allow from .domain.tld
    Deny from all
...

Le plus souvent, on autorise des IPs, voire des plages d’IPs, ou des domaines. Sauf que dans le cas qui nous intéresse, on ne connaît la liste exhaustive des réseaux de provenance de la requête à autoriser sans authentification.

Bloqué ?

Et bien non ! En fouillant encore un peu, on découvre que Allow accepte aussi comme condition une variable d’environnement.

...
    Order allow,deny
    #Deny from all
    Allow from env=let_me_in
 ...

Reste donc maintenant à trouver comment positionner cette variable pour une URL donnée.
mod_rewrite est notre ami dans ce cas précis !

...
    RewriteEngine On
    # la QUERY_STRING correspond à la partie après le ?
    # http://vhost.domain.tld/index.php?myKey1=myVal1&myKey2=...
    RewriteCond %{QUERY_STRING} myKey1=myVal1&myKey2=.*
    RewriteRule (.*) - [env=let_me_in:%1]
 ...

En combinant tout cela, on obtient la configuration suivante :

<VirtualHost *:80>
    ServerName vhost.domain.tld
    DocumentRoot /var/www/vhost
    ErrorLog /var/log/apache2/vhost_error.log
    CustomLog /var/log/apache2/vhost_access.log combined

    RewriteEngine On
    # la QUERY_STRING correspond à la partie après le ?
    # ici, on aurait une URL du type :
    # http://vhost.domain.tld/index.php?myKey1=myVal1&myKey2=...
    RewriteCond %{QUERY_STRING} myKey1=myVal1&myKey2=.*
    RewriteRule (.*) - [env=let_me_in:%1]

    Order allow,deny
    #Deny from all
    Allow from env=let_me_in

    AuthType Basic
    AuthName "Ce site demande une authentification"
    # (La ligne suivante est facultative)
    AuthBasicProvider file
    AuthUserFile /etc/apache2/passwd/vhost.passwords
    Require valid user

    Satisfy Any
</VirtualHost>

Ainsi, lorsqu’on accédera au site par toute URL autre qu’une QUERY_STRING contenant myKey1=myVal1&myKey2=.*, on devra s’authentifier.

Go to Top