Apache : authentification intégrée sauf pour certains clients dont on ne connait pas la provenance réseau
Par NiCoS le jeudi 21 août 2008, 13:01 - Trucs de geek - Lien permanent
Cas d'étude : une application auxquels les collaborateurs d'une entreprise accèdent via une authentification intégrée. Pour les filliales ne disposant pas du SSO ou pour permettre à des utilisateurs extérieurs de se connecter à l'application, une connexion anonyme doit être mise en place.
Solution retenue :
- Apache 2.2
- mod_auth_ntlm_winbind pour l'authentification sur Active Directory via Samba / Kerberos
- mod_setenvif
Principe : par défaut, le serveur va chercher à authentifier l'utilisateur par authentification intégrée.
Exception : pour l'indexation de l'application, il faut autoriser l'accès anonyme au serveur
Problématique : seuls les plages IP des pays utilisant l'authentification intégrée est connue. Il faut donc permettre l'accès en anonyme à tout le monde sauf ces IP là.
L'importance ici tient dans la directive Order, Allow , Deny, Satisfy et SetEnvIf.
LoadModule auth_ntlm_winbind_module modules/mod_auth_ntlm_winbind.so
LoadModule setenvif_module modules/mod_setenvif.so
<Location />
Order Deny,Allow
Deny From All
<IfModule mod_auth_ntlm_winbind.c>
AuthName "NTLM Authentification"
NTLMAuth on
NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp"
NTLMBasicAuthoritative on
AuthType NTLM
</IfModule>
Require valid-user
<fModule mod_setenvif.c>
# Declaration des clients utilisant l'authentification intégrée
SetEnvIf Remote_Addr "10\.(10|13|14|19|20|44|45|49)\.[0-9]{1,3}\.[0-9]{1,3}" pays # Pays 1
SetEnvIf Remote_Addr "10\.(70|18|48)\[0-9]{1,3}\.[0-9]{1,3}" pays # Pays 2
# Declaration de l'IP du robot indexant le site
SetEnvIf Remote_Addr "10\.135\.255\.(1|44|35|244)" indexation
# Declaration de la machine pour generation du cache statique
SetEnvIf Remote_Addr "(127\.0\.0\.1|10\.135\.255\.45)" local
# Sont autorises en anonyme "tout le monde" sauf les pays avec authentification intégrée.
Allow from env=local env=indexation !env=pays
</IfModule>
Satisfy any
</Location>