search
top

Sécuriser la configuration Nginx pour WordPress

Configuration de base pour le CMS WordPress

server {
    listen      192.168.1.1:80 default_server;
    server_name  _;
  • listen: Configuration pour le vhost par defaut (les acces a des server_name inconu par Nginx arriveront dans ce vhost)
  • server_name: _ indique le vhost par defaut, mettez vos ou votre server_name si vous voulez pas faire un vhost par defaut.
    root        /var/www/domaine.ltd/www;
    index       index.php;

N’oublier pas de modifier le « root »

    location = /favicon.ico     {   allow all;  log_not_found off;  access_log off; }
    location = /robots.txt      {   allow all;  log_not_found off;  access_log off; }

On desactive les log et on ne log pas les not found pour ces deux fichiers

    location ~ /\.              {   deny all;   log_not_found off;  access_log off; }
    location ~ wp-config.php    {   deny all;   log_not_found off;  access_log off; }

bloque l’acces aux fichiers commencant par un point et au fichier de conf (non negociable ! :) )

    location ~ ^/wp-content {
        deny all;
        location ~ .(xml|css|jpe?g|png|gif|js)$ {
            allow all;
        }
    }

Autorise l’acces uniquement aux extensions correspondant a la regex dans l’integralitée du dossier wp-content, si vous voulez laisser vos psd et autre fichiers source, ils sont protegé.

    location / {
        if (!-e $request_filename) {
            rewrite ^(.+)$ /index.php?q=$1 last;
        }
    }

Renvoie tous sur l’index, cela permet d’utiliser le format d’url de votre choix.

    location ~ \.php$ {
        fastcgi_pass   php5;
        fastcgi_index  index.php;
        include fastcgi_params;
        fastcgi_ignore_client_abort     off;
    }

cette partie permet d’executer le php, a adapter suivant votre configuration

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
    }

Cela permet de mettre en caches les fichiers static.

}

Sécuriser vos Vhosts

Uniquement les requêtes GET HEAD et POST sont autorisé

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 444;
}

Pour ne pas loger les accès aux fichiers favicon.ico et robots.txt

location = /favicon.ico {
    log_not_found off;
    access_log off;
}
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

L’acces aux fichiers caché peuvent être dangereux tel qu’un .bash_history contant un mot de passe tapé par erreur ou un .my.cnf avec un compte MySQL, l’accès a tous les fichiers caché est donc interdit :

location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}

Quelque limite pour éviter les Buffer Overflows

client_body_buffer_size  1K;
client_header_buffer_size 1k;
client_max_body_size 1m;
large_client_header_buffers 2 1k;

Dans le cas ou un petit malin essaye de vous faire un référencement douteux

if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )
{
    return 403;
}

Masquer la version d’apache

Dans la configuration, passer les paramètres suivant :

ServerTokens Prod
ServerSignature Off

Masquer la version de PHP dans les entête HTTP

Avec la configuration par defaut, PHP indique ca version dans les entete HTTP :

# curl -I notes.depad.fr
HTTP/1.1 200 OK
Date: Fri, 12 Oct 2007 22:36:42 GMT
Server: Apache
X-Powered-By: PHP/5.2.4
Vary: Host
Content-Type: text/html

Pour masquer cela, il suffi d’indiquer cela dans le fichier de configuration php.ini :

expose_php = Off

Et cela nous donne :

# curl -I notes.depad.fr
HTTP/1.1 200 OK
Date: Fri, 12 Oct 2007 22:36:42 GMT
Server: Apache
Vary: Host
Content-Type: text/html

top