Plugin SPIP de restriction d’accès par adresse IP à l’espace privé et, au choix, au site public.
Principe
Le blocage s’effectue en PHP au chargement de SPIP, avant tout rendu et avant toute lecture du cache, indépendamment de la configuration du serveur web.
Étendue du filtrage
La page Filtrage par IP propose deux étendues.
Espace privé seulement, le réglage par défaut. Le filtrage ne s’applique qu’aux requêtes pour lesquelles
_ESPACE_PRIVE est définie. Il ne couvre donc pas les points d’entrée publics de SPIP, qui restent
joignables avec la même session : spip.php?action=..., les formulaires CVT publics et les appels AJAX,
traités par ecrire/public.php. Un auteur bloqué sur /ecrire conserve ainsi l’accès aux actions qu’un
squelette public expose.
Tout le site, espace public compris. Les visiteurs dont l’adresse n’est pas autorisée reçoivent une
réponse 503 accompagnée d’un en-tête Retry-After, et non un 403 : un refus durable ferait sortir le
site de l’index des moteurs de recherche. Le message reste muet sur le motif du refus.
C’est le réglage d’un site de recette ou d’un intranet. Trois choses lui échappent, à connaître avant de l’activer.
Ce que le filtrage public ne couvre pas
Les fichiers servis directement par le serveur web. Documents joints (IMG/), CSS et JavaScript compilés
(local/), images des squelettes : Apache ou nginx les délivre sans passer par PHP, donc sans consulter
Portier. Sur un site de recette, les PDF déposés dans les articles restent téléchargeables par quiconque
connaît leur adresse.
Les fermer demande une règle au niveau du serveur. SPIP ne place pas de .htaccess dans ces répertoires,
créez-en un dans IMG/ et dans local/ :
<IfModule mod_authz_core.c>
Require ip 203.0.113.0/24
</IfModule>
Sous nginx, l’équivalent est un couple allow / deny dans le bloc location correspondant. Cette liste
d’adresses est distincte de celle du plugin et doit être tenue à jour en parallèle.
Un cache placé devant le site. Reverse proxy, Varnish, CDN : les réponses qu’ils servent depuis leur
propre cache n’atteignent jamais PHP, donc jamais Portier. Le filtrage y devient une protection de façade.
Portier envoie Cache-Control: no-store sur ses réponses de refus, ce qui empêche un intermédiaire de
mémoriser un blocage, mais ne l’empêche pas de servir une page mise en cache avant l’activation.
Le déclenchement des tâches périodiques. Le génie de SPIP est réveillé par les visites. Un site public fermé n’étant plus visité que par les adresses autorisées, le nettoyage automatique du bypass d’urgence, prévu toutes les dix minutes, s’espace d’autant. Sur un site peu fréquenté, préférez un cron système.
Avertissement
- Le filtrage par IP n’est pas un moyen de sécurisation infaillible, il complète les login / mot de passe sans s’y substituer.
- Le bypass d’urgence (voir plus bas) lève toute protection si on dispose d’un accès en écriture au système de fichiers.
Adresse IP retenue
Par défaut, l’adresse testée est REMOTE_ADDR, celle de la connexion elle-même : le client ne peut pas la
choisir.
$GLOBALS['ip'], que SPIP renseigne, n’est pas utilisée : le cœur la remplit depuis l’en-tête
X-Forwarded-For dès qu’il est présent, sans vérifier la provenance de la requête. N’importe quel visiteur
peut donc envoyer cet en-tête et se faire passer pour une adresse autorisée.
Beaucoup d’hébergements réécrivent déjà REMOTE_ADDR eux-mêmes à partir de X-Forwarded-For
(mod_remoteip sous Apache, set_real_ip_from sous nginx). Dans ce cas l’adresse est correcte
telle quelle et il n’y a rien à configurer.
Déclarer un proxy de confiance
C’est nécessaire seulement si REMOTE_ADDR est l’adresse d’un intermédiaire et non celle du visiteur.
La page Filtrage par IP vous le dit : tant qu’aucun proxy n’est déclaré, elle affiche un encart dès que
l’en-tête X-Forwarded-For annonce une adresse différente de celle retenue.
1. Repérer l’adresse du proxy. C’est l’adresse que cet encart présente comme retenue. Vous pouvez aussi la lire dans les journaux du serveur : c’est celle qui revient sur toutes les visites.
2. Créer ou compléter config/mes_options.php. Ce fichier n’existe pas dans une installation neuve ;
créez-le au besoin, il est chargé automatiquement par SPIP au démarrage.
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// Adresses depuis lesquelles Portier accepte de lire l'en-tête X-Forwarded-For :
// adresses IP ou plages CIDR, séparées par des espaces ou des virgules.
define('_PORTIER_PROXYS_DE_CONFIANCE', '10.0.0.7');
Plusieurs entrées, et des plages, sont acceptées :
define('_PORTIER_PROXYS_DE_CONFIANCE', '10.0.0.0/8, 192.168.1.5, 203.0.113.10');
3. Vérifier. Rechargez la page Filtrage par IP : l’encart disparaît et l’adresse affichée devient celle de votre poste, et non plus celle du proxy. Contrôlez-la avant d’activer le filtrage.
L’en-tête n’est lu que si la connexion provient de l’une des adresses déclarées ; ailleurs, REMOTE_ADDR
continue de faire foi.
Ne déclarez que des machines que vous maîtrisez. Une plage large,
0.0.0.0/0à l’extrême, revient à croire l’en-tête de n’importe qui, donc à rouvrir le contournement que ce réglage sert à fermer.
Diagnostic
Si le plugin DD est installé, Portier ajoute à sa barre de débogage l’adresse finalement retenue, sous la
forme IP : 203.0.113.42, dans l’espace privé comme sur le site public. Un clic ouvre le détail de ce que la
requête annonce :
REMOTE_ADDR, l’adresse de la connexion elle-même ;- les en-têtes par lesquels hébergeurs et CDN transportent l’adresse d’origine,
X-Forwarded-For,X-Real-IP,CF-Connecting-IPet quelques autres, chacun avec sa valeur ou la mention qu’il n’est pas transmis ; $GLOBALS['ip'], ce que SPIP en aurait déduit, à comparer avec l’adresse retenue par le plugin ;- les proxys déclarés, l’adresse retenue, l’état du filtrage pour cette page et l’étendue configurée.
C’est le moyen le plus court de comprendre un blocage inattendu, ou de savoir quelle adresse déclarer. Cette barre n’est visible que des webmestres.
Configuration
La page Filtrage par IP apparaît dans le menu Maintenance de l’espace privé. Elle permet de créer des groupes d’IP, d’y ajouter des adresses ou plages d’adresses, et d’activer ou désactiver chaque groupe.
L’accès à cette page, comme l’activation du filtrage, est réservé aux webmestres : la liste des adresses autorisées indique précisément quoi usurper pour franchir le filtrage.
Les groupes d’IP acceptent des adresses exactes (203.0.113.42) et des plages CIDR IPv4 (203.0.113.0/24),
avec un préfixe de 1 à 32. Les adresses IPv6 et le préfixe /0, qui couvrirait l’internet entier, sont
refusés à la saisie.
En plus du titre, personnalisable, vous pouvez ajouter des commentaires dans le bloc texte de chaque groupe d’IP, ce
champ texte est filtré pour n’en extraire que les IP valides.
Vous pouvez donc par exemple saisir quelque chose comme :
Accès par fournisseur 1 : 198.51.100.1, 198.51.100.27
Accès de secours : 203.0.113.1, 203.0.113.254
Le filtrage ne peut s’activer que si au moins un groupe d’IP est actif. Il se désactive automatiquement si tous les groupes actifs sont supprimés ou désactivés.
Bypass d’urgence
En cas de blocage accidentel (filtrage actif et IP personnelle absente des IP autorisées) :
- Créer un fichier ou un répertoire vide
tmp/portier_bypassvia FTP ou SSH. - Sa présence suspend le filtrage par IP.
- Mettre à jour la configuration dans l’interface du plugin (ajouter son IP).
- La modification de la configuration ou d’un groupe d’IP supprime le bypass.
Un cron efface le bypass toutes les 10 minutes, sous réserve que le site reçoive des visites : voir « Le déclenchement des tâches périodiques » plus haut si le filtrage couvre l’espace public.
No discussion
Add a comment
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Follow the comments:
|
