Protection d'URL avec Basic Auth, avec filtrage IP

Objet de la manipulation : protéger certaines URL par une authentification basique http, sauf pour certaines adresses IP.

Ceci peut être intéressant dans plusieurs cas :

  • Sécuriser l'accès à des pages d'administration
  • Limiter les accès à un site en construction (ou une partie de site)
  • Réduire les tentatives de piratage par attaque en force, par exemple sur la page de login d'un CMS

Je présente ici le paramétrage pour Apache (version 2.2 et 2.4) ainsi que pour Nginx.

Avec Apache 2.2

Tout se passe dans le fichier de déclaration du VirtualHost, ou dans le fichier .htaccess si vous autorisez leur utilisation.

La syntaxe est la suivante :

<Directory /var/www/monsite/repertoire > 

  Order deny,allow
# acces interdit par défaut
  Deny from all
# Fichier d'autorisation
  AuthName "Protected Area"
  AuthType Basic
  AuthUserFile /var/www/monsite.htpasswd
# Permet l'accès si l'un des critères est OK : utilisateur ou adresse IP
  Satisfy Any

  require valid-user 

# Adresses IP Authorisées
  Allow from 1.2.3.4 11.22.33.44
</Directory>

La création du fichier htpasswd s'effectue avec la commande htpasswd, de la manière suivante :

cd /var/www
htpasswd -c monsite.htpasswd monuser

Pour ajouter un utilisateur ou modifier le mot de passe on utilise la commande sans l'option '-c' :

htpasswd monsite.htpasswd newuser

Exemple : protection du back-office Wordpress

L'accès à l'administration de Wordpress s'effectue via le script wp-login.php, puis via les scripts php présents dans le répertoire wp-admin. Dans ce cas on peut protéger un fichier :

<Files wp-login.php>
AuthType Basic
AuthName "WP-ADMIN is Restricted"
AuthUserFile "/home/hostinguser/passwd"
Require valid-user
# If you have a fixed IP address, you can add the following
# three lines replacing x.x.x.x with your fixed IP address
Order allow,deny
Allow from x.x.x.x
Satisfy any
</Files>

# Protection du repetoire d'admin
<Directory /var/www/wordpress/monsite/wp-admin > 
    AuthName "Admins Only"
    AuthUserFile /etc/www/monsite.htpasswd
    AuthGroupFile /dev/null
    AuthType basic
    require user monSiteAdmin
    Allow from 1.2.3.4 11.22.33.44
    Satisfy Any
</Directory> 

Avec Apache 2.4

La version 2.4 du serveur a modifié pas mal de paramètres (Allow et Satisfy ne sont plus supportés, par exemple). La syntaxe correcte est maintenant la suivante :

<Directory /var/www/monsite/repertoire > 
AuthType Basic
AuthUserFile /www/.site_htpasswd
AuthName "Protected Area"

<RequireAny>
# Adresses IP Authorisées
    Require ip 1.2.3.4 11.22.33.44
    Require valid-user
</RequireAny>
</Directory> 

Avec Nginx

La syntaxe pour Nginx est assez proche de celle utilisée pour Apache (syntaxe 2.2).
A noter qu'on utilise plutôt location qui cible une URL

 location /wp-admin {
    satisfy any ;
# Adresses IP Authorisées
    allow 1.2.3.4 ;
    allow 11.22.33.44 ;
    deny all;

    auth_basic "Restricted access";
    auth_basic_user_file conf.d/basicauthpasswd;
    .../...
    try_files $uri @gitlist;
  }

A la différence de Apache, le mot de passe présent dans le fichier utilisé est généré de la manière suivant :

openssl passwd
Password: 
Verifying - Password: 
Fipx.a4Q5fjjw

Il faut ensuite mettre à jour le fichier avec le nom et le mot de passe de l'utilisateur, séparés par ':'. Par exemple :

cat /etc/nginx/conf.d/basicauthpasswd
httpadmin:Fipx.a4Q5fjjw
Catégorie