Tutorial , How-To, HowTo ...

Ce tutorial vous indique comment installer un proxy transparent (tinyproxy) sur un routeur Linksys WRT54G utilisant le firmware openwrt. Le proxy transparent intercepte le traffic web HTTP (port 80) et garde une trace du traffic utilisateur ; ceci permet d’éviter les abus... ou plutôt de retrouver des traces en cas d’abus. En raison des faibles capacités de stockage sur le routeur WRT54G, les logs sont centralisés sur un serveur syslog distant (syslog-ng) couplé à une base MySQL (installés sur un serveur GNU/Linux tournant sous Debian). Enfin, une interface web (php-syslog-ng) permet de consulter et faire des requêtes sur les archives des logs.

Sur le WRT54G (version WhiteRussian >=RC3)

- Installer les packages nécessaires :


# ipkg install http://openwrt.alphacore.net/tinyproxy_1.6.3_mipsel.ipk

Si vous n’avez pas le module ipt_REDIRECT (vous pouvez tester en tapant la commande : # insmod ipt_REDIRECT), installez-le :


# ipkg update
# ipkg install iptables-mod-nat

- Modifier le fichier /etc/tinyproxy/tinyproxy.conf :


[...]
User root
Group root
[...]
Port 8888
[...]
#Listen 192.168.0.1
#Listen 127.0.0.1
[...]
#Logfile "/var/log/tinyproxy.log"
Syslog On
[...]
LogLevel Connect
[...]
#Allow 127.0.0.1
#Allow 192.168.0.0/25
[...]

- Modifier le fichier de règles iptables /etc/firewall.user ou /etc/init.d/S45firewall :


iptables -A INPUT -i $WIFIDEV -p tcp -m tcp --dport 8888 --syn -j ACCEPT
iptables -t nat -A PREROUTING -i $WIFIDEV -s $WIFINET/$WIFIPRE -p tcp -m tcp --dport 80 -j REDIRECT --to-port 8888

- Charger automatiquement le modules ipt_REDIRECT :

Créer un nouveau fichier /etc/modules.d/20-iptables-redirect contenant la ligne suivante :


ipt_REDIRECT

Rq1 : pour créer rapidement le fichier suivante, vous pouvez taper la commande :


# echo "ipt_REDIRECT" > /etc/modules.d/20-iptables-redirect

Rq2 : si vous n’avez pas de répertoire /etc/modules.d/, il vous faudra créer un script de démarrage pour charger le module ipt_REDIRECT, par exemple dans /etc/init.d/S45firewall ou /etc/init.d/S51tinyproxy, et rajouter la ligne :


insmod ipt_REDIRECT

- Indiquer l’adresse du serveur syslog distant (par exemple 192.168.0.100) :


# nvram set log_ipaddr=192.168.0.100
# nvram commit
# reboot

Rq1 : la variable nvram log_ipaddr est utilisée par le script de démarrage /etc/init.d/rc à partir de WhiteRussian RC3

Rq2 : le traffic syslog est en UDP sur le port 514 : mettez à jour vos règles de firewall au besoin.

Rq3 : sur le firmware freifunk ne prenant pas en charge la variable log_ipaddr (à la date de cet article), il faut modifier le script /etc/init.d/S10boot :


# rm /etc/init.d/S10boot
# cp /rom/etc/init.d/S10boot /etc/init.d/S10boot

Modifier le fichier :


 test -e /sbin/syslogd && syslogd -C 16 -R $(nvram get log_ipaddr)

- Démarrer tinyproxy (en mode transparent) :

Après le reboot précédent, si tinyproxy n’a pas démarré automatiquement, lancez-le manuellement :


# /etc/init.d/S51tinyproxy start

Sur le serveur central GNU/Linux

- Installer le serveur syslog-ng et la base de données MySQL :


# apt-get install syslog-ng
# apt-get install mysql-server mysql-client

- Configurer MySQL


$ echo "create database syslog;" | mysql -u root -p
$ echo "grant all on syslog.* to syslog_user@'localhost' identified by 'motdepasse_syslog'; flush privileges;" | mysql -u root -p
$ echo "create table logs (
 host varchar(32) default NULL,
 facility varchar(10) default NULL,
 priority varchar(10) default NULL,
 level varchar(10) default NULL,
 tag varchar(10) default NULL,
 date date default NULL,
 time time default NULL,
 program varchar(15) default NULL,
 msg text,
 seq int(10) unsigned NOT NULL auto_increment,
 PRIMARY KEY (seq),
 KEY host (host),
 KEY seq (seq),
 KEY program (program),
 KEY time (time),
 KEY date (date),
 KEY priority (priority),
 KEY facility (facility)
) TYPE=MyISAM;" | mysql -u root -p syslog

- Configurer syslog-ng :

Rajouter les lignes suivantes dans le fichier /etc/syslog-ng/syslog-ng.conf :



source s_network {
 udp();
};

destination dp_mysql {
 pipe("/tmp/mysql.pipe" template ("INSERT INTO \
   logs(host, facility, priority, level, tag, date, time, program, msg) \
   VALUES ('$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', \
   '$TAG', '$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', \
   '$PROGRAM', '$MSG');\n") template-escape(yes) );
 file("/var/log/hosts/$YEAR.$MONTH/$HOST/tinyproxy.log" owner(root) group(adm) \
   perm(0600) dir_perm(0700) create_dirs(yes));
};

filter f_tinyproxy { program(tinyproxy); };

filter f_messages {
 level(info, notice, warn)
   and not facility(auth,authpriv,cron,daemon,mail,news)
   and not program(tinyproxy);
};

log {
 source(s_network);
 filter(f_tinyproxy);
 destination(dp_mysql);
};

- Créer une fifo pour les communications entre syslog-ng et mysql :


# mkfifo /tmp/mysql.pipe

- Créer un script pour injecter les logs dans la base MySQL :

Créer le script /etc/syslog-ng/syslog-ng-mysql.sh :


#!/bin/bash
#
# script to pipe syslog-ng to mysql
#

if [ ! -e /tmp/mysql.pipe ]; then
 mkfifo /tmp/mysql.pipe
fi

while [ -e /tmp/mysql.pipe ]
do
 if [ ! -e /var/run/syslog-ng.pid ] ; then
   exit 1;
 fi

 mysql -u syslog_user --password=motdepasse_syslog syslog < /tmp/mysql.pipe
done

puis changer les droits d’execution


# chmod u+x /etc/syslog-ng/syslog-ng-mysql.sh

- Créer un script de démarrage pour lancer automatiquement le précédent script syslog-ng-mysql.sh :

Créer le fichier /etc/init.d/syslog-ng-mysql :


#! /bin/sh
#

PATH=/sbin:/bin:/usr/sbin:/usr/bin
test -f /etc/syslog-ng/syslog-ng-mysql.sh || exit 0
#we source /etc/default/syslog-ng if exists
[ -r /etc/default/syslog-ng ] && . /etc/default/syslog-ng

# stop syslog-ng-mysql.sh before changing its PID file!
PIDFILE="/var/run/syslog-ng-mysql.pid"

SYSLOGNGMYSQL="/etc/syslog-ng/syslog-ng-mysql.sh"
NAME="syslog-ng-mysql"

syslogngmysql_start() {
   echo -n "Starting system logging: $NAME"
   $SYSLOGNGMYSQL &
   PID=$!
   echo "."
   rm -f "$PIDFILE"
   echo $PID > $PIDFILE
   return 0
}

syslogngmysql_stop() {
   echo -n "Stopping system logging: $NAME"
   killall syslog-ng-mysql.sh
   echo "."
   rm -f "$PIDFILE"
   return 0
}

case "$1" in
 start)
   syslogngmysql_start || exit 1
   ;;
 stop)
   syslogngmysql_stop || exit 1
   ;;
 *)
   echo "Usage: /etc/init.d/$NAME {start|stop}" >&2
   exit 1
   ;;
esac

exit 0

puis changer les droits d’execution et rajouter le script au démarrage du système


# chmod u+x /etc/init.d/syslog-ng-mysql
# update-rc.d syslog-ng-mysql defaults

- Relancer le serveur syslog-ng et le script syslog-ng-mysql


# /etc/init.d/syslog-ng restart
# /etc/init.d/syslog-ng-mysql start

- Installer php-syslog-ng

... à compléter ...


# tar -xvzf php-syslog-ng-2.5.1.tar.gz -C /usr/local

Modifier le fichier /etc/apache2/sites-available/ssl.conf :


 Alias /php-syslog-ng/ "/usr/local/php-syslog-ng-2.5.1/web/"
 <Directory /usr/local/php-syslog-ng-2.5.1/web/>
   AllowOverride All
 </Directory>

et relancer apache2


# /etc/init.d/apache2 restart

Dans le répertoire /usr/local/php-syslog-ng-2.5.1/web/, modifier le fichier includes/db_fns.php :


$result = mysql_pconnect("localhost", "syslog_user", "motdepasse_syslog");

Dans le répertoire /usr/local/php-syslog-ng-2.5.1/web/, modifier les fichiers cache_index.php, index.php, results.php, includes/header_inc.php en remplaçant les lignes :


include $_SERVER['DOCUMENT_ROOT'].'/includes/XXX.php';

par :


include './includes/XXX.php';

De même, dans le fichier includes/header_inc.php, remplacer les chaines de caractères "/includes" par "./includes"

Utilisation

  • Les logs sont classés par année et mois dans le répertoire /var/log/hosts/$ANNEE.$MOIS/$HOST/tinyproxy.log
  • L’interface web pour consulter les logs est accessible à l’adresse : https://adresse_ip/php-syslog-ng/
JPG - 96.5 ko
php-syslog-ng

Documentation

- openwrt + tinyproxy :

- syslog-ng :

- php-syslog-ng

Logiciels utilisés

Textes réglementaires