Salut à tous.
Je viens vers vous pour vous demander un truc que tout le monde doit connaître :
Comment configurer les logs du serveur web Apache pour récupérer 3 types de requêtes « reqenv »
J’ai un site web configuré comme cela :
# host www.zw3b.fr
www.zw3b.fr has address 158.69.126.137
www.zw3b.fr has IPv6 address 2607:5300:60:9389::1
J’ai installé Apache reverse pour faire pointer sur différentes machines en « back end » par exemple celle-ci :
# host ww1.zw3b.fr
ww1.zw3b.fr has IPv6 address 2607:5300:60:9389:15:1:a:10
J’aimerais avoir dans les logs Apache, l’adresse IP de la machine « cliente » et cela que la demande vienne du proxy ou directement sur l’hôte (ww1).
En demandant « www », j’arrive bien à récupérer l’IPv4 et l’IPv6 en traversant le proxy reverse, jusque là c’est normal comme configuration.
Par contre si je « tape » sur la machine « backend ww1 » je ne vois aucune adresse IP dans les logs.
Sur « ww1 » j’ai configuré les logs d’Apache de cette manière " /etc/apache2/apache2.conf
" :
# Les logs par default d'une installe
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# default
J’ai ajouté le " X-Forwarded-For
" de cette manière :
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
Dans mes Virtual-Hosts la configuration des CustomLog est la suivante :
# exemple de CustomLog par default:
#CustomLog ${APACHE_LOG_DIR}/access.log combined
# req sur l'IPv4 du HOST -> IPv4 (after proxy)
CustomLog ${APACHE_LOG_DIR}/access.log proxy env=forwarded
# req sur l'IPv6 du HOST -> IPv6 (after proxy)
CustomLog ${APACHE_LOG_DIR}/access.log proxy env=!forwarded
Résumé de la configuration la proxy :
<IfModule mod_proxy.c>
# Show Proxy LoadBalancer status in mod_status
ProxyStatus On
ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
# SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
# On fait du proxy vers un autre serveur en https
SSLProxyEngine On
# Disable SSLProxyCheck
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
</IfModule>
Et enfin, les logs en demandant l’Apache proxy reverse « load balancer » " www.zw3b (dot) fr " :
root@client:~ # curl -4 -I -L https://www.zw3b.fr
root@ww1:~ # tail -f /var/pro/web_logs/zw3b_fr/www/logs/access.log
109.210.56.240 - - [23/Oct/2024:01:59:46 +0200] "HEAD / HTTP/1.1" 200 - "-" "curl/7.88.1"
root@client:~ # curl -6 -I -L https://www.zw3b.fr
root@ww1:~ # tail -f /var/pro/web_logs/zw3b_fr/www/logs/access.log
2a01:cb1d:12:1c00:beef::cafe - - [23/Oct/2024:02:03:19 +0200] "HEAD / HTTP/1.1" 200 - "-" "curl/7.88.1"
Par contre si je demande " ww1.zw3b (dot) fr " :
root@client:~ # curl -6 -I -L https://ww1.zw3b.fr
root@ww1:~ # tail -f /var/pro/web_logs/zw3b_fr/www/logs/access.log
- - - [23/Oct/2024:02:06:24 +0200] "HEAD / HTTP/1.1" 200 - "-" "curl/7.88.1"
Est-ce que quelqu’un a une configuration de LogFormat / CustomLog d’Apache2 de ce type ?
J’ai du faire une boulette quelques part, je n’y arrive plus
Merci.
@+
Romain.
Liens Annexes Apache2 Web Server :
- Reverse Proxy Guide - Apache HTTP Server Version 2.4
- mod_log_config - Serveur HTTP Apache Version 2.4
- Expressions in Apache HTTP Server - Apache HTTP Server Version 2.4
- Access Control - Apache HTTP Server Version 2.4
Contrôle d’accès Backend Allow from / Require ip from « Reverse proxy »
Je souhaitais autorisé seulement l’adresse IPv4 et IPv6 de chez moi, à l’interface PhpMyAdmin.
Mais j’ai un deuxième soucis avec le « back-end » d’Apache du « Contrôle d’accès » - C’est que je n’arrive pas à attraper l’adresse IP du client qui passe par le « proxy reverse » ;
Contrôle d'accès Backend Allow from / Require ip
Dans le " .htaccess
" (ou dans la config d’un « Virtual-Host » que ce soit avec " allow from
" ou que ce soit avec " require ip
" il croit que mon IP est celle du « proxy reverse ».
J’ai trouvé cette solution ; celle d’autoriser le " frontal " (l’apache « proxy reverse ») - C’est à dire que tout le monde peut rentrer (en quelque sorte) ; Et donc, j’ai fermé sur le « frontal ».
Sur le serveur « ww1 » (backend) :
<Directory /usr/share/phpmyadmin/>
Options MultiViews FollowSymLinks
AllowOverride All AuthConfig
# ---------------
# Old config
Order deny,allow
Deny from all
# Address normal
# Allow from 109.210.56.240
# Allow from 2a01:cb1d:0012:1c00:beef::cafe
# Allow from 172.16.0.142
# Allow from fc01::172:16:0:142
# Address proxy
Allow from 10.101.0.254
Allow from 2607:5300:60:9389:15:1:0:f
# ---------------
# Recent config
Require all denied
# Address normal
# Require ip 109.210.56.240
# Require ip 2a01:cb1d:0012:1c00:beef::cafe
# Require ip 172.16.0.142
# Require ip fc01::172:16:0:142
# Address proxy
Require ip 10.101.0.254
Require ip 2607:5300:60:9389:15:1:0:f
# Require %{HTTP:X-Forwarded-For} == "2a01:cb1d:0012:1c00:beef::cafe"
</Directory>
Sur le serveur Apache « reverse proxy » (frontal) :
<Proxy *>
Order deny,allow
Deny from all
Allow from 109.210.56.240
Allow from 2a01:cb1d:12:1c00:beef::cafe
Allow from fc01::172:16:0:142
</Proxy>
Mais, j’aimerai bien avoir une configuration « fermer » sur la machine elle-même, qu’Apache reconnaisse les IP clientes en utilisant " Allow from
" et/ou " Require ip
" .
Exemple de configuration d’un Load Balancer Apache Proxy Reverse :
- 2 serveurs cible en facteur 1 de charge par activité (une requête sur un, une sur l’autre).
- 1 serveur en Spar : Le serveur cible sert de remplaçant à chaud. Lorsqu’un serveur cible avec un lbset donné est inutilisable (maintenance, arrêt, en erreur, etc…), un serveur de remplacement à chaud libre de même lbset sera utilisé à sa place. Les remplaçants à chaud permettent de s’assurer qu’un nombre déterminé de serveurs cibles sera toujours disponible pour un répartiteur de charge.
- 1 serveur en Stby : Le serveur est en mode hot-standby et ne sera donc utilisé que si aucun autre serveur ou serveur de remplacement n’est disponible dans le jeu de serveurs du répartiteur de charge.
Apache !