Cette bidouille permet de faire une exclusion ProxyPass, mais aussi de contourner AuthType Basic sur un VirtualHost Apache, selon certaines conditions!
L’idée est d’exposer un caméra, au firmware douteux et pas à jour, à la DMZ.
Les Proxies ont été multipliés. Le flux passera:
- via HAProxy pour l’offloading SSL
- via Apache2 ProxyPass pour l’authentification
En travaillant sur le virtualhost Apache, il est possible de forcer l’authentification Basic pour tous les clients tout en aménageant une ou plusieurs exclusions. Après, c’est surement un peu overkill dans le sens où on peut faire de l’AuthBasic dans HAProxy… 😉
La caméra est configurée sur l’IP 192.168.0.52, port 80, et la passerelle HAProxy sur 192.168.0.254. L’exception se situe sur l’URI « /server-status », nécessaire aux statistiques munin.
Voici la config:
<VirtualHost *:85> ServerAdmin mail@mail.com ServerName robocam.domain.ltd ServerAlias www.robocam.domain.ltd LogLevel info ErrorLog ${APACHE_LOG_DIR}/error-82.log CustomLog ${APACHE_LOG_DIR}/access-82.log combined SetEnvIfNoCase User-Agent IPCamViewer get_in SetEnvIfNoCase User-Agent munin get_in_munin SetEnvIf Request_URI /server-status noauth=1 ProxyPassMatch /server-status ! ProxyPass / http://192.168.0.52/ ProxyPassReverse / http://192.168.0.52/ <Location /> Options -Indexes +FollowSymLinks +MultiViews AuthType Basic AuthName "Restricted Access" AuthUserFile /etc/apache2/auth/htpasswords <RequireAny> <RequireAll> Require env noauth Require local Require env get_in_munin </RequireAll> <RequireAll> <RequireNone> Require env noauth </RequireNone> Require user cam_admin Require env get_in Require ip 192.168.0.254 </RequireAll> </RequireAny> </Location> </VirtualHost>
Tous les flux vers « https://robocam.domain.ltd » nécessitent une authentification s’ils proviennent de la passerelle, sauf pour « /server-status » qui ne nécessite pas d’authentification mais qui impose une origine locale via la condition « Require local« :
- l’adresse IP du client correspond à 127.0.0.0/8
- l’adresse IP du client est ::1
- les adresses IP du client et du serveur sont identiques
L’exception se fait grâce aux conditions suivantes:
ProxyPassMatch /server-status ! SetEnvIf Request_URI /server-status noauth=1
En plus de l’authentification et du contrôle de l’origine des flux, les clients devront renvoyer un User-Agent bien précis via la condition « SetEnvIfNoCase« :
- « IPCamViewer » pour les flux en provenance du WAN (client Webcams pour Android)
- « munin » pour les flux locaux