Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

syslog-ng et log apache

10 réponses
Avatar
Christophe PEREZ
Bonsoir,

Quelqu'un saurait-il s'il est possible de logger, par syslog-ng, les
tentatives avortées d'accès à un site apache protégé par mot de passe
apache ?

Dans syslog-ng, il y a bien une possibilité de mettre un fichier en
source :
source s_apache { file("/var/log/httpd/stats/error.log"); };

de faire un filtre sur 'authentication failure' qui se trouve dans le log
lors de ces accès avortés, et d'utiliser ça pour logger, mais pour moi,
ça ne fonctionne pas.

Faut-il que le fichier ait un format spécial (façon syslog) pour être
traité ?
Et pour info, comment le traitement se fait-il ? à l'inscription dans le
fichier ? C'est une interception de l'écriture ?

Si quelqu'un sait, merci à lui.

--
Christophe PEREZ
Écrivez moi sans _faute !

10 réponses

Avatar
TiChou
Dans le message <news:,
*Christophe PEREZ* tapota sur f.c.o.l.configuration :

Bonsoir,


Salut Christophe, :)

Quelqu'un saurait-il s'il est possible de logger, par syslog-ng, les
tentatives avortées d'accès à un site apache protégé par mot de passe
apache ?


Oui, c'est possible.

Dans syslog-ng, il y a bien une possibilité de mettre un fichier en
source :
source s_apache { file("/var/log/httpd/stats/error.log"); };

de faire un filtre sur 'authentication failure' qui se trouve dans le log
lors de ces accès avortés, et d'utiliser ça pour logger, mais pour moi,
ça ne fonctionne pas.

Faut-il que le fichier ait un format spécial (façon syslog) pour être
traité ?
Et pour info, comment le traitement se fait-il ? à l'inscription dans le
fichier ? C'est une interception de l'écriture ?


Beaucoup de questions, je ne vais pas y répondre à toutes directement. Je
préfère te renvoyer à la documentation en ligne de syslog-ng.conf :

http://www.balabit.com/products/syslog_ng/reference-1.6/syslog-ng.html/reference.html#AEN286

Je pense que ça répond à ta demande. :)

Mais, à mon avis, il y a plus simple. En effet, les messages d'erreurs de
Apache peuvent être directement envoyés au daemon syslog en lieu et place du
fichier error(_|.)log. Pour cela, il suffit d'utiliser la directive ErrorLog
dans le fichier de configuration de Apache.

$ grep -A1 ^Error /etc/apache/conf/apache.conf
ErrorLog syslog
LogLevel info

Après reste à configurer syslog-ng, par exemple comme suit :

/etc/syslog-ng/syslog-ng.conf

filter f_apache {
program("apache");
};
filter f_apache_auth {
program("apache") and
match("user .* (authentication failure|not found)");
};

filter f_messages {
level(info..emerg) and
not facility(auth, authpriv, mail, cron, user, kern) and
not program("prog1|prog2|...|apache");
};

destination d_apache {
file("/var/log/apache/error_log");
};
destination d_apache_auth {
file("/var/log/apache/auth_error_log");
};

log {
source(local);
filter(f_apache);
destination(d_apache);
};
log {
source(local);
filter(f_apache_auth);
destination(d_apache_auth);
};

Si quelqu'un sait, merci à lui.


De rien.

--
TiChou

Avatar
Christophe PEREZ
Le Sun, 17 Apr 2005 15:29:55 +0200, TiChou a écrit:

Beaucoup de questions, je ne vais pas y répondre à toutes directement. Je
préfère te renvoyer à la documentation en ligne de syslog-ng.conf :


Que j'ai quand même déjà lue, mais je ne suis pas tombé la dessus.

http://www.balabit.com/products/syslog_ng/reference-1.6/syslog-ng.html/reference.html#AEN286


Cela veut-il bien dire que je doive lancer de script (tail -f ...) pour
chacun de mes logs error de virtual host ??
Je ne sais pas pourquoi mais ça ne me plaît pas beaucoup ;-)

Je pense que ça répond à ta demande. :)


Presque ;-)

Mais, à mon avis, il y a plus simple. En effet, les messages d'erreurs de
Apache peuvent être directement envoyés au daemon syslog en lieu et place du
fichier error(_|.)log. Pour cela, il suffit d'utiliser la directive ErrorLog
dans le fichier de configuration de Apache.


J'utilise ErrorLog

$ grep -A1 ^Error /etc/apache/conf/apache.conf
ErrorLog syslog


Ah ça, je ne connaissais pas.
Jusque là, j'utilisais un ErrorLog logs/fichier
Par contre, à force de recherches, j'étais tombé sur quelque chose qui
est entre les 2 solutions :
ErrorLog "|/usr/bin/logger -p local3.info -t 'httpd_access'"
Le ErrorLog syslog reviendrait à la même chose ?

Le problème que j'avais avec ça (et non résolu) c'est que du coup, je
n'ai plus rien de loggé dans mon error.log.
Or, j'aurais voulu les 2 : redirection vers logger ET écriture fichier
log.
J'ai donc tenté de tâter du 'tee', mais bizarrement, ça ne fonctionne
pas.
ErrorLog "|bin/tee -a /var/log/httpd/error.log |/usr/bin/logger -p
local3.info -t 'httpd_access'"
si je fais ça, je n'ai les logs dans aucun !
Par contre, si je fais :
ErrorLog "|bin/tee -a /var/log/httpd/error.log > /tmp/test.log"
J'ai bien le log dans les 2 fichiers...
Bizarre.

LogLevel info


Faut que je vois à quoi ça correspond, et surtout ce que apache sort
comme autre erreur par ErrorLog qui n'est pas une erreur d'identification,
et dont j'ai besoin dans le fichier. Si ça se trouve, je m'embête pour
rien.

Après reste à configurer syslog-ng, par exemple comme suit :
[...]

destination d_apache {
file("/var/log/apache/error_log");
};
destination d_apache_auth {
file("/var/log/apache/auth_error_log");
};


Oui, mais dans ce cas là, je récupère bien toutes mes erreurs, mais
toutes centralisées dans un même fichier pour tous les virtualhosts
apache. C'est ce qui me dérange.

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
TiChou
Dans le message <news:,
*Christophe PEREZ* tapota sur f.c.o.l.configuration :

http://www.balabit.com/products/syslog_ng/reference-1.6/syslog-ng.html/reference.html#AEN286


Cela veut-il bien dire que je doive lancer de script (tail -f ...) pour
chacun de mes logs error de virtual host ??


Oui.

Je ne sais pas pourquoi mais ça ne me plaît pas beaucoup ;-)


À toi de voir.

$ grep -A1 ^Error /etc/apache/conf/apache.conf
ErrorLog syslog


Ah ça, je ne connaissais pas.
Jusque là, j'utilisais un ErrorLog logs/fichier
Par contre, à force de recherches, j'étais tombé sur quelque chose qui
est entre les 2 solutions :
ErrorLog "|/usr/bin/logger -p local3.info -t 'httpd_access'"
Le ErrorLog syslog reviendrait à la même chose ?


Oui, mais en plus propre/direct/sûre.

Le problème que j'avais avec ça (et non résolu) c'est que du coup, je
n'ai plus rien de loggé dans mon error.log.


Je ne comprends pas ? C'est le daemon syslog qui va enregistrer les log là
où tu lui dis, donc pourquoi pas dans error.log ?

Or, j'aurais voulu les 2 : redirection vers logger ET écriture fichier
log.


Quel intérêt ? Je me répète, si tu utilises logger, c'est au daemon syslog
de lui dire dans quel(s) fichier(s) enregistrer les logs et c'est d'autant
plus facile à faire avec syslog-ng.

J'ai donc tenté de tâter du 'tee', mais bizarrement, ça ne fonctionne
pas.
ErrorLog "|bin/tee -a /var/log/httpd/error.log |/usr/bin/logger -p
local3.info -t 'httpd_access'"
si je fais ça, je n'ai les logs dans aucun !


Sur un serveur Apache de test, la ligne suivante dans le fichier de
configuration de Apache :

ErrorLog "| /bin/tee -a /var/log/apache/error_log | /usr/bin/logger -p
daemon.err -t 'apache_test'"

donne le résultat voulu, à savoir enregistrement des messages d'erreur dans
le fichier /var/log/apache/error_log et envoi des messages d'erreur au
daemon syslog qui lui les enregistre dans un autre fichier.

Par contre, si je fais :
ErrorLog "|bin/tee -a /var/log/httpd/error.log > /tmp/test.log"
J'ai bien le log dans les 2 fichiers...
Bizarre.


Peut-être une erreur de syntaxe ?

Après reste à configurer syslog-ng, par exemple comme suit :
[...]

destination d_apache {
file("/var/log/apache/error_log");
};
destination d_apache_auth {
file("/var/log/apache/auth_error_log");
};


Oui, mais dans ce cas là, je récupère bien toutes mes erreurs, mais
toutes centralisées dans un même fichier pour tous les virtualhosts
apache. C'est ce qui me dérange.


Dans ce cas, dans la directive ErrorLog de ton vhost, utilise logger en
tagant tes messages avec le nom du vhost, dans syslog-ng crée un filtre qui
va matcher selon le nom du vhost et crée une destination différente pour
chaque vhost.

apache.conf :

<VirtualHost site1.domain.tld>
...
ErrorLog "| /usr/bin/logger -p daemon.err -t 'apache[site1]'"
</VirtualHost>

<VirtualHost site2.domain.tld>
...
ErrorLog "| /usr/bin/logger -p daemon.err -t 'apache[site2]'"
</VirtualHost>

syslog-ng.conf :

filter f_apache1 {
program("apache[site1]");
};
filter f_apache1_auth {
program("apache[site1]") and
match("user .* (authentication failure|not found)");
};
filter f_apache2 {
program("apache[site2]");
};
filter f_apache1_auth {
program("apache[site2]") and
match("user .* (authentication failure|not found)");
};

destination d_apache1 {
file("/var/log/apache/vhosts/site1/error_log");
};
destination d_apache1_auth {
file("/var/log/apache/vhosts/site1/auth_error_log");
};
destination d_apache2 {
file("/var/log/apache/vhosts/site2/error_log");
};
destination d_apache2_auth {
file("/var/log/apache/vhosts/site2/auth_error_log");
};

--
TiChou


Avatar
Christophe PEREZ
Le Sun, 17 Apr 2005 18:23:36 +0200, TiChou a écrit:

Le ErrorLog syslog reviendrait à la même chose ?


Oui, mais en plus propre/direct/sûre.


bien sûr.

Le problème que j'avais avec ça (et non résolu) c'est que du coup, je
n'ai plus rien de loggé dans mon error.log.


Je ne comprends pas ? C'est le daemon syslog qui va enregistrer les log là
où tu lui dis, donc pourquoi pas dans error.log ?


Parce que, je m'exprime mal, mais quand je parle de error.log, c'est le
error.log de mon virtualhost.

Or, j'aurais voulu les 2 : redirection vers logger ET écriture fichier
log.


Quel intérêt ? Je me répète, si tu utilises logger, c'est au daemon syslog
de lui dire dans quel(s) fichier(s) enregistrer les logs et c'est d'autant
plus facile à faire avec syslog-ng.


Oui, certes, à condition de différencier les logs par virtualhost,
sinon, c'est illisible :
Apr 17 12:07:16 se100 apache2[15645]: [error] [client xxx.xxx.xxx.xxx]
user chris: authentication failure for "/": Password Mismatch

Sur quel virtualhost 'chris' n'a t'il pas le bon mot de passe ?

Sur un serveur Apache de test, la ligne suivante dans le fichier de
configuration de Apache :

ErrorLog "| /bin/tee -a /var/log/apache/error_log | /usr/bin/logger -p
daemon.err -t 'apache_test'"

donne le résultat voulu, à savoir enregistrement des messages d'erreur dans
le fichier /var/log/apache/error_log et envoi des messages d'erreur au
daemon syslog qui lui les enregistre dans un autre fichier.



Ah ! Je me demande si ça pourrait venir d'un problème de droits sur
/dev/console ou un truc comme ça, car en effet, en ligne de commande, en
root, j'ai le bon fonctionnement, mais pas par apache qui tourne sous user
apache.

Peut-être une erreur de syntaxe ?


malheureusement, je ne pense pas, j'ai contrôlé plusieurs fois, fait des
copier/coller pour les autres tests qui eux fonctionnaient.

[...
Dans ce cas, dans la directive ErrorLog de ton vhost, utilise logger en
tagant tes messages avec le nom du vhost, dans syslog-ng crée un filtre
qui va matcher selon le nom du vhost et crée une destination
différente pour chaque vhost.


J'avais effectivement pensé à ça, mais ça fait lourd.
A chaque virtualhost, il faut ajouter un filtre à syslog-ng, ça va vite
devenir une usine à gaz.
Et je pense qu'il n'y a pas de possibilité de lier le destination à une
regexp du filtre !??

L'autre solution, puisque mon besoin est plus la traçabilité que les
logs séparés, serait de modifier le format de sortie des Erreurs apache
afin d'y faire inclure le host concerné, mais 1) il ne faudrait pas que
ce format affecte mon CustomLog combined 2) il faut que je me penche sur
les histoires de FormatLog pour vérifier si c'est possible.

--
Christophe PEREZ
Écrivez moi sans _faute !


Avatar
TiChou
Dans le message <news:,
*Christophe PEREZ* tapota sur f.c.o.l.configuration :

Or, j'aurais voulu les 2 : redirection vers logger ET écriture fichier
log.


Quel intérêt ? Je me répète, si tu utilises logger, c'est au daemon
syslog de lui dire dans quel(s) fichier(s) enregistrer les logs et c'est
d'autant plus facile à faire avec syslog-ng.


Oui, certes, à condition de différencier les logs par virtualhost,
sinon, c'est illisible :
Apr 17 12:07:16 se100 apache2[15645]: [error] [client xxx.xxx.xxx.xxx]
user chris: authentication failure for "/": Password Mismatch

Sur quel virtualhost 'chris' n'a t'il pas le bon mot de passe ?


Oui, c'est effectivement bien là le problème concernant le format des
messages d'erreurs de Apache.

Dans ce cas, dans la directive ErrorLog de ton vhost, utilise logger en
tagant tes messages avec le nom du vhost, dans syslog-ng crée un filtre
qui va matcher selon le nom du vhost et crée une destination
différente pour chaque vhost.


J'avais effectivement pensé à ça, mais ça fait lourd.
A chaque virtualhost, il faut ajouter un filtre à syslog-ng, ça va vite
devenir une usine à gaz.
Et je pense qu'il n'y a pas de possibilité de lier le destination à une
regexp du filtre !??


Malheureusement non.

L'autre solution, puisque mon besoin est plus la traçabilité que les
logs séparés, serait de modifier le format de sortie des Erreurs apache
afin d'y faire inclure le host concerné, mais 1) il ne faudrait pas que
ce format affecte mon CustomLog combined 2) il faut que je me penche sur
les histoires de FormatLog pour vérifier si c'est possible.


Malheureusement non, ça n'est pas possible de reformater les messages
d'erreurs de Apache via la directive FormatLog.

--
TiChou



Avatar
Christophe PEREZ
Le Sun, 17 Apr 2005 19:22:08 +0200, TiChou a écrit:

Oui, c'est effectivement bien là le problème concernant le format des
messages d'erreurs de Apache.


Ah...

Et je pense qu'il n'y a pas de possibilité de lier le destination à une
regexp du filtre !??


Malheureusement non.


Comme tu dis ;-)
Mais d'un certain côté heureusement, car je n'ose même pas imaginer la
tête du fichier de conf si c'était possible.

Malheureusement non, ça n'est pas possible de reformater les messages
d'erreurs de Apache via la directive FormatLog.


Ah !

Bon, ben ton post ne m'apporte pas de solution, mais malgré tout me fait
gagner du temps en m'évitant des recherches inutiles.

Mais du coup, je me sens un peu dans une impasse moi.
Je ne sais plus trop vers quelle solution opter puisque toutes sont des
compromis qui, par définition, ne remplissent pas complètement mon
besoin.

Maintenant que tu connais mieux ma problématique, tu me conseillerais
quoi toi ? Autrement dit, tu ferais quoi à ma place ? La conf syslog-ng
à multiples destinations/filtres/log par virtualhost ?

Tiens, une question sur syslog-ng dont je n'ai pas trouvé la réponse
dans mes lectures, l'ordre des consignes dans le fichier de conf a t'il
une importance ? à mon sens, non, mais j'aimerais une confirmation.
Et, comme ça, par chance, il ne serait pas possible de faire des includes
genre apache ou autre ?

--
Christophe PEREZ
Écrivez moi sans _faute !


Avatar
TiChou
Dans le message <news:,
*Christophe PEREZ* tapota sur f.c.o.l.configuration :

Maintenant que tu connais mieux ma problématique, tu me conseillerais
quoi toi ? Autrement dit, tu ferais quoi à ma place ?


Je ne sais pas. Si tu nous disais d'abord pourquoi tu veux logger séparément
les authentifications qui ont échoués ?

La conf syslog-ng à multiples destinations/filtres/log par virtualhost ?


Pour l'instant je ne vois pas trop d'autres solutions.

Tiens, une question sur syslog-ng dont je n'ai pas trouvé la réponse
dans mes lectures, l'ordre des consignes dans le fichier de conf a t'il
une importance ?


Non.

à mon sens, non, mais j'aimerais une confirmation.


Suffit de tester. ;-)

Et, comme ça, par chance, il ne serait pas possible de faire des includes
genre apache ou autre ?


Non.

--
TiChou

Avatar
Christophe PEREZ
Le Sun, 17 Apr 2005 21:57:01 +0200, TiChou a écrit:

Je ne sais pas. Si tu nous disais d'abord pourquoi tu veux logger séparément
les authentifications qui ont échoués ?


Dans le but de n'avoir qu'un seul fichier log à surveiller pour
surveiller ça, quelque soit le soft sshd, login, apache et quelques
autres applis...

La conf syslog-ng à multiples destinations/filtres/log par virtualhost ?


Pour l'instant je ne vois pas trop d'autres solutions.


Mouais..
Ben pour l'instant, j'en suis à finalement logguer ces echecs dans un
log, avec tous les autres échec d'identification, et les autres erreurs
apaches toutes rassemblées en un log. Au moins, ça laisse syslog-ng un
peu plus clair. Je vais voir si ça reste exploitable comme ça ou pas.

Tiens, une question sur syslog-ng dont je n'ai pas trouvé la réponse
dans mes lectures, l'ordre des consignes dans le fichier de conf a t'il
une importance ?


Non.

à mon sens, non, mais j'aimerais une confirmation.


Suffit de tester. ;-)


Ben j'ai testé, mais bon, je peux être tombé sur des cas où ça
n'aurait pas eu d'influence.

Et, comme ça, par chance, il ne serait pas possible de faire des includes
genre apache ou autre ?


Non.


Bien dommage ça.

--
Christophe PEREZ
Écrivez moi sans _faute !


Avatar
TiChou
Dans le message <news:,
*Christophe PEREZ* tapota sur f.c.o.l.configuration :

Je ne sais pas. Si tu nous disais d'abord pourquoi tu veux logger
séparément les authentifications qui ont échoués ?


Dans le but de n'avoir qu'un seul fichier log à surveiller pour
surveiller ça, quelque soit le soft sshd, login, apache et quelques
autres applis...


On pourrait alor envisager la solution suivante :

<VirtualHost site1.domain.tld>
...
ErrorLog "| /bin/tee -a /var/log/apache/vhosts/site1/error_log | grep -E
'user .* (authentication failure|not found)' | /usr/bin/logger -p
authpriv.notice -t 'apache[site1]'"
</VirtualHost>

<VirtualHost site2.domain.tld>
...
ErrorLog "| /bin/tee -a /var/log/apache/vhosts/site2/error_log | grep -E
'user .* (authentication failure|not found)' | /usr/bin/logger -p
authpriv.notice -t 'apache[site2]'"
</VirtualHost>

ou mieux :

<VirtualHost site1.domain.tld>
...
ErrorLog "| /usr/local/bin/errorlog.sh site1"
</VirtualHost>

<VirtualHost site2.domain.tld>
...
ErrorLog "| /usr/local/bin/errorlog.sh site2"
</VirtualHost>

avec /usr/local/bin/errorlog.sh :

#!/bin/sh

/bin/tee -a /var/log/apache/vhosts/"$1"/error_log
| grep -E 'user .* (authentication failure|not found)'
| /usr/bin/logger -p authpriv.notice -t "apache[$1]"


Et dans syslong-ng.conf :

filter f_apache {
program("apache");
};

destination d_auth_error {
file("/var/log/auth_error_log");
};

log {
source(local);
filter(f_sshd);
filter(f_daemon1);
...
filter(f_apache);
destination(d_auth_error);
};

Qu'en penses-tu ?

--
TiChou


Avatar
Christophe PEREZ
Le Sun, 17 Apr 2005 23:33:26 +0200, TiChou a écrit:

[ snip exemples précieux ]
Qu'en penses-tu ?


Et bien j'en pense que si le rassemblement de tous les logs d'erreur, hors
identification, tel que je l'ai actuellement, ne convient finalement pas,
je serai obligé d'en passer par là.

Mais, déjà, encore faut-il que ce double pipe veuille bien fonctionner
ce qui n'était pas le cas lors de mes essais comme déjà dit.

Et aussi, je rechignais vraiment à faire passer tout ça par un filtre
pour en extraire les éléments de mon choix, je pensais vraiment pouvoir
y arriver avec les fonctionnalités de syslog-ng et de apache. Ceci
afin de rester un peu plus dans la 'norme'. Mais bon, manifestement, j'ai
encore été un doux rêveur.

En tout cas, merci pour tous ces éléments qui sans aucun doute m'auront
fait gagner du temps.

--
Christophe PEREZ
Écrivez moi sans _faute !