{"id":369,"date":"2009-03-18T09:38:06","date_gmt":"2009-03-18T08:38:06","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=369"},"modified":"2009-03-18T09:38:06","modified_gmt":"2009-03-18T08:38:06","slug":"interception-des-erreurs-applicatives-dans-nagios-avec-sec-et-prelude-lml","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/03\/18\/interception-des-erreurs-applicatives-dans-nagios-avec-sec-et-prelude-lml\/","title":{"rendered":"Interception des erreurs applicatives dans Nagios avec SEC et Prelude-lml"},"content":{"rendered":"<p>Ce billet est n\u00e9 d&rsquo;une demande de mon ami \u00ab\u00a0Poupinade\u00a0\u00bb qui connaissant mon go\u00fbt pour les challenges divers et vari\u00e9s, me demanda <span style=\"text-decoration: line-through;\">avec fourberie<\/span> innocemment comment je ferais, moi, pour intercepter des erreurs applicatives dans Nagios.<\/p>\n<p>Nagios est un outil de surveillance syst\u00e8me et r\u00e9seau. Largement \u00e9prouv\u00e9, il est d\u00e9ploy\u00e9 fr\u00e9quemment pour monitorer les \u00e9quipements, services etc&#8230;<\/p>\n<p>Pour moi, il reste un outil d&rsquo;alerte et doit \u00eatre utilis\u00e9 comme tel. Je ne pense pas que ce soit \u00e0 lui de remonter des informations d\u00e9taill\u00e9es sur un probl\u00e8me quelconque, mais de permettre au \u00ab\u00a0superviseur\u00a0\u00bb de d\u00e9brancher sur un autre outil s&rsquo;il veut peaufiner la cause de la panne\/alerte (ceux qui utilisent un Nagios avec plus de 1000 h\u00f4tes et une dizaine de services par machine me comprendront ais\u00e9ment  \ud83d\ude09 ).<\/p>\n<p>Je ne m&rsquo;\u00e9tendrais pas sur Nagios ici, encore moins sur son installation et son param\u00e9trage.<\/p>\n<p>Vous trouverez de nombreuses r\u00e9f\u00e9rences et <a title=\"Tuto nagios\" href=\"http:\/\/articles.mongueurs.net\/magazines\/linuxmag65-bis.html\" target=\"_blank\">tutos<\/a> sur le Nain Ternet pour vous aider \u00e0 sa mise en place.<\/p>\n<p>La probl\u00e9matique qui se pose ici est de permettre d&rsquo;\u00eatre informer rapidement en cas d&rsquo;erreur dans les logs d&rsquo;une application.<\/p>\n<p>Car oui on peut surveiller le bon fonctionnement du serveur httpd, de la Base de Donn\u00e9es, du lien r\u00e9seau etc&#8230; , mais il peut arriver qu&rsquo;un autre probl\u00e8me surgisse et que Nagios ne supervise pas.<\/p>\n<p>Je simplifie \u00e0 l&rsquo;extr\u00eame le concept \u00ab\u00a0application\u00a0\u00bb et prenant comme exemple une application \u00ab\u00a0web\u00a0\u00bb, libre \u00e0 vous d&rsquo;adapter ce billet \u00e0 autre chose.<\/p>\n<p>Dans les exemples qui suivront et pour la maquette d&rsquo;architecture choisie, j&rsquo;ai pris un simple site en php (en l&rsquo;occurrence un <a title=\"FlySpray\" href=\"http:\/\/flyspray.org\/\" target=\"_blank\">FlySpray<\/a> ) qui me sert au suivi de mes \u00ab\u00a0travaux\u00a0\u00bb (a la mani\u00e8re <a title=\"Travaux OVH\" href=\"http:\/\/travaux.ovh.net\/\" target=\"_blank\">d&rsquo;OVH<\/a>).<\/p>\n<p>Les erreurs rencontr\u00e9es par une \u00ab\u00a0application\u00a0\u00bb sont dans la majorit\u00e9 des cas lisibles dans un fichier de log d\u00e9di\u00e9.<\/p>\n<p>Premi\u00e8re chose, faire \u00ab\u00a0tomber\u00a0\u00bb les erreurs php dans le log d&rsquo;erreur du Vhost d&rsquo;apache :<\/p>\n<pre lang=\"text\">Edition du php.ini :\r\n\r\nerror_reporting  =  E_ALL &amp; ~E_NOTICE\r\ndisplay_errors = On\r\n\r\nConfiguration du vhost :\r\n\r\nServerName application.guiguiabloc.fr\r\nDocumentRoot \/var\/www\/application\r\nErrorLog \/var\/log\/apache2\/application-error.log\r\nLogLevel warn\r\nCustomLog \/var\/log\/apache2\/application-access.log combined<\/pre>\n<p>Toujours a des fins de test, je simule une erreur critique, la perte de liaison avec le serveur de base de donn\u00e9es.<br \/>\nEn l&rsquo;occurrence, j&rsquo;ajoute une entr\u00e9e dans le \/etc\/hosts du serveur httpd avec une fausse adresse IP vers le serveur Mysql, ce qui g\u00e9n\u00e8re l&rsquo;erreur suivante :<\/p>\n<pre lang=\"text\">[Sun Mar 15 17:27:09 2009] [error] [client 192.168.0.2] PHP Warning:  mysqli_real_connect():\r\n(HY000\/2003): Can't connect to MySQL server on 'mysql-serveur' (113) in \/var\/www\/application\/adodb\/drivers\/adodb-mysqli.inc.php on line 108<\/pre>\n<p>Erreur je l&rsquo;avoue tr\u00e8s sournoise, Nagios me disant que mon serveur Mysql r\u00e9pond tr\u00e8s bien et que le r\u00e9seau entre le serveur applicatif et le serveur de base de donn\u00e9es est op\u00e9rationnel.<\/p>\n<p>Comment surveiller ce genre de fichier et alerter Nagios quand quelque chose se produit ?<\/p>\n<ul>\n<li><strong>SEC Simple Event Correlator<\/strong><\/li>\n<\/ul>\n<p>SEC est un programme \u00e9crit en Perl, extr\u00eamement puissant et configurable \u00e0 souhait, qui permet de scruter des fichiers de logs et d&rsquo;y d\u00e9tecter des \u00e9v\u00e9nements divers et vari\u00e9s.<\/p>\n<p>Le site est <a title=\"SEC\" href=\"http:\/\/www.estpak.ee\/~risto\/sec\/\" target=\"_blank\">ICI<\/a><\/p>\n<p>C\u00f4t\u00e9 installation sur le serveur applicatif, pas de soucis :<\/p>\n<pre lang=\"text\">srv-appli:\/usr\/local\/src# wget http:\/\/prdownloads.sourceforge.net\/simple-evcorr\/sec-2.5.1.tar.gz\r\nsrv-appli:\/usr\/local\/src# tar xzvf sec-2.5.1.tar.gz\r\nsrv-appli:\/usr\/local\/src# cd sec-2.5.1\r\nsrv-appli:\/usr\/local\/src\/sec-2.5.1# mkdir \/usr\/local\/bin\/sec\r\nsrv-appli:\/usr\/local\/src\/sec-2.5.1# mkdir \/usr\/local\/bin\/sec\/etc\r\nsrv-appli:\/usr\/local\/src\/sec-2.5.1# cp sec.pl \/usr\/local\/bin\/sec\/<\/pre>\n<p>Une configuration toute simple :<\/p>\n<pre lang=\"text\">srv-appli:\/usr\/local\/bin\/sec\/etc# cat sec.conf\r\ntype=Single\r\nptype=RegExp\r\npattern=error\r\ndesc=$0\r\naction=shellcmd  \/opt\/nagios\/libexec\/eventhandlers\/submit_check_result_via_nsca srv-appli  'Application' 2 \"$0\"<\/pre>\n<p>Ici, nous demandons \u00e0 SEC de r\u00e9agir sur la cha\u00eene \u00ab\u00a0error\u00a0\u00bb (bien \u00e9videmment, vous pouvez affiner vos expression r\u00e9guli\u00e8res&#8230;) et en cas de d\u00e9tection, d&rsquo;ex\u00e9cuter la commande \u00ab\u00a0\/opt\/nagios\/libexec\/eventhandlers\/submit_check_result_via_nsca \u00a0\u00bb avec en param\u00e8tre, le nom du host dans Nagios, le nom du service, le code retour Nagios et le message d&rsquo;erreur.<\/p>\n<p>Auparavant, vous avez ajout\u00e9 une entr\u00e9e de type \u00ab\u00a0Passive\u00a0\u00bb dans Nagios :<\/p>\n<pre lang=\"text\"># NSCA\r\ndefine service{\r\n        use         passive_checkservice\r\n        host_name    srv-appli\r\n        service_description    Application\r\n        # ici la commande check_smtp n'a aucune signification particuliere\r\n        # c'est simplement que sans check_command cela ne marche pas !\r\n        check_command                check_smtp\r\n      }<\/pre>\n<p>Et oui, ce type de fonctionnement implique que vous utilisez NSCA sur le serveur d&rsquo;application (surveillance passive de Nagios, c&rsquo;est le serveur d&rsquo;appli qui envoie l&rsquo;alerte)<\/p>\n<p>Vous devez sur votre Nagios, avoir une entr\u00e9e de ce genre<\/p>\n<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/03\/nagios-appli.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-380\" title=\"nagios-appli\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/03\/nagios-appli-300x25.png\" alt=\"\" width=\"300\" height=\"25\" \/><\/a><\/p>\n<p>Ne reste plus qu&rsquo;\u00e0 lancer le script SEC :<\/p>\n<pre lang=\"text\">srv-appli:\/# perl -w \/usr\/local\/bin\/sec\/sec.pl -conf=\/usr\/local\/bin\/sec\/etc\/sec.conf -input=\/var\/log\/apache2\/application-error.log -log \/var\/log\/sec.log\r\nSEC (Simple Event Correlator) 2.5.1\r\nReading configuration from \/usr\/local\/bin\/sec\/etc\/sec.conf\r\n1 rules loaded from \/usr\/local\/bin\/sec\/etc\/sec.conf\r\nStdin connected to terminal, SIGINT can't be used for changing the logging level<\/pre>\n<p>On provoque l&rsquo;erreur<\/p>\n<pre lang=\"text\">Executing shell command '\/opt\/nagios\/libexec\/eventhandlers\/submit_check_result_via_nsca srv-appli  'Application' 2 \"[Tue Mar 17 11:13:34 2009] [error] [client 192.168.99.14] PHP Warning:  mysqli_real_connect(): (HY000\/2003): Can't connect to MySQL server on 'mysql-serveur' (113) in \/var\/www\/application\/adodb\/drivers\/adodb-mysqli.inc.php on line 108\"'\r\nChild 10131 created for command '\/opt\/nagios\/libexec\/eventhandlers\/submit_check_result_via_nsca srv-appli  'Application' 2 \"[Tue Mar 17 11:13:34 2009] [error] [client 192.168.99.14] PHP Warning:  mysqli_real_connect(): (HY000\/2003): Can't connect to MySQL server on 'mysql-serveur' (113) in \/var\/www\/application\/adodb\/drivers\/adodb-mysqli.inc.php on line 108\"'\r\n1 data packet(s) sent to host successfully.<\/pre>\n<p>Et l&rsquo;alerte remonte dans Nagios :<\/p>\n<div id=\"attachment_381\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/03\/nagios-error.png\"><img aria-describedby=\"caption-attachment-381\" loading=\"lazy\" class=\"size-medium wp-image-381\" title=\"nagios-error\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/03\/nagios-error-300x16.png\" alt=\"Alerte Nagios\" width=\"300\" height=\"16\" \/><\/a><p id=\"caption-attachment-381\" class=\"wp-caption-text\">Alerte Nagios<\/p><\/div>\n<p>Cela fonctionne mais bon&#8230;<\/p>\n<p>Premier point bloquant, cela signifie que l&rsquo;on utilise la surveillance Passive de Nagios (NSCA) sur le srv-appli, ce qui n&rsquo;est pas forc\u00e9ment le cas.<\/p>\n<p>Deuxi\u00e8me point bloquant, si une deuxi\u00e8me erreur surgit \u00e0 la suite (pas de chance hein :-p), c&rsquo;est celle ci qui sera affich\u00e9e dans Nagios.<br \/>\nJe peux tr\u00e8s bien acquitter l&rsquo;alarme et passer \u00e0 c\u00f4t\u00e9 d&rsquo;un probl\u00e8me plus crucial&#8230;<\/p>\n<p>Pour le test :<\/p>\n<p>srv-appli:\/# echo \u00ab\u00a0[Mon Mar 17  14:25:42 2009] [error] Une autre erreur\u00a0\u00bb >> \/var\/log\/apache2\/application-error.log<\/p>\n<p>Donc, obligation d&rsquo;aller sur le serveur, de v\u00e9rifier le \/var\/log\/Sec.log&#8230;. <\/p>\n<p>Autre solution \ud83d\ude09<\/p>\n<ul>\n<li><strong>PRELUDE IDS<\/strong><\/li>\n<\/ul>\n<p>Prelude est un \u00ab\u00a0Security Information Management\u00a0\u00bb (SIM) Universel. Prelude collecte, normalise, cat\u00e9gorise, agr\u00e8ge, corr\u00e8le et pr\u00e9sente tous les \u00e9v\u00e9nements s\u00e9curit\u00e9 ind\u00e9pendamment de la marque ou de la licence du produit dont ces \u00e9v\u00e9nements sont issus : il est \u00ab\u00a0Agentless\u00a0\u00bb.<\/p>\n<p>Cela tombe tr\u00e8s bien, j&rsquo;avais d\u00e9j\u00e0 \u00e9crit un billet sur Prelude l&rsquo;ann\u00e9e derni\u00e8re \ud83d\ude00<\/p>\n<p><a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/01\/27\/installer-et-configurer-prelude\/\" target=\"_blank\">http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/01\/27\/installer-et-configurer-prelude\/<\/a><\/p>\n<p>Vous ne serez pas pas d\u00e9pays\u00e9.<\/p>\n<p>Pour scruter nos logs, nous allons utiliser un des modules de Prelude : Prelude-lml<\/p>\n<p>Ce n&rsquo;est pas le r\u00f4le premier de ce logiciel (qui est surtout un centralisateur d&rsquo;alertes IDS\/NIDS), mais rien nous interdit de le d\u00e9tourner de sa voie.<\/p>\n<p>Je vous passe l&rsquo;installation du module sur le serveur d&rsquo;application ainsi que son enregistrement dans le Prelude Manager, tout est expliqu\u00e9 dans le billet pr\u00e9cit\u00e9.<\/p>\n<pre lang=\"text\">srv-appli:\/# prelude-adduser register prelude-lml \"idmef:w admin:r\" IP_Prelude_Manager --uid 1000 --gid 1000\r\nprelude-manager:\/:# prelude-adduser registration-server prelude-manager\r\n\r\n... - prelude-lml registration to IP_Prelude_Manager successful<\/pre>\n<p>Une configuration succincte pour nos tests :<\/p>\n<pre lang=\"text\">\r\nprelude-lml.conf :\r\n\r\nfile = \/var\/log\/apache2\/application-error.log\r\n\r\n\/etc\/prelude-lml\/ruleset\/pcre.rules :\r\n\r\nregex=(\\[error\\]);              include = appli.rules;\r\ninclude = single.rules;\r\n\r\n\/etc\/prelude-lml\/ruleset\/appli.rules :\r\n\r\n#LOG:[Sun Mar 15 17:27:09 2009] [error] [client 192.168.0.1] PHP Warning:  mysqli_real_connect(\r\n):\r\n\r\nregex=\\[error\\] \\[client ([\\d\\.]+)\\] ; \\\r\n classification.text=server error; \\\r\n id=44100; \\\r\n revision=1; \\\r\n analyzer(0).name=Appli; \\\r\n analyzer(0).manufacturer=blog.guiguiabloc.fr; \\\r\n analyzer(0).class=Service; \\\r\n assessment.impact.severity=high; \\\r\n assessment.impact.completion=failed; \\\r\n assessment.impact.type=other; \\\r\n assessment.impact.description=Erreur applicative; \\\r\n source(0).node.address(0).category=ipv4-addr; \\\r\n source(0).node.address(0).address=$1; \\\r\n source(0).service.iana_protocol_name=tcp; \\\r\n source(0).service.iana_protocol_number=6; \\\r\n target(0).service.iana_protocol_name=tcp; \\\r\n target(0).service.iana_protocol_number=6; \\\r\n last;<\/pre>\n<p>Je ne m&rsquo;\u00e9tendrais pas sur les expressions r\u00e9guli\u00e8res, ni sur les normes IDMEF utilis\u00e9es (cela prendrait un billet complet) et je vous invite \u00e0 consulter ses pages :<\/p>\n<p><a href=\"https:\/\/trac.prelude-ids.org\/wiki\/PreludeLml\" target=\"_blank\">https:\/\/trac.prelude-ids.org\/wiki\/PreludeLml<\/a><\/p>\n<p><a href=\"http:\/\/www.rfc-editor.org\/rfc\/rfc4765.txt\" target=\"_blank\">http:\/\/www.rfc-editor.org\/rfc\/rfc4765.txt<\/a><\/p>\n<p><a href=\"http:\/\/www.gscore.org\/blog\/index.php\/post\/2007\/08\/13\/IDMEF-for-dummies-part-1\" target=\"_blank\">http:\/\/www.gscore.org\/blog\/index.php\/post\/2007\/08\/13\/IDMEF-for-dummies-part-1<\/a><\/p>\n<p>On reproduit de nouveau l&rsquo;erreur qui maintenant est intercept\u00e9e par Prelude-lml et envoy\u00e9e au Manager<\/p>\n<div id=\"attachment_385\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/03\/prelude-report.png\"><img aria-describedby=\"caption-attachment-385\" loading=\"lazy\" class=\"size-medium wp-image-385\" title=\"prelude-report\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/03\/prelude-report-300x241.png\" alt=\"Report Prelude\" width=\"300\" height=\"241\" \/><\/a><p id=\"caption-attachment-385\" class=\"wp-caption-text\">Report Prelude<\/p><\/div>\n<p>D\u00e9j\u00e0 plus classieux comme syst\u00e8me de centralisations, non \ud83d\ude42<\/p>\n<p>Et l\u00e0 vous me dites \u00ab\u00a0Et comment je le sais tout cela dans Nagios ?????\u00a0\u00bb<\/p>\n<p>Gr\u00e2ce \u00e0 la communaut\u00e9 Nagios \ud83d\ude00<\/p>\n<p><a href=\"http:\/\/www.nagiosexchange.org\/cgi-bin\/page.cgi?g=Detailed%2F2287.html;d=1\" target=\"_blank\">http:\/\/www.nagiosexchange.org\/cgi-bin\/page.cgi?g=Detailed%2F2287.html;d=1<\/a><\/p>\n<p>Vous y trouverez le check_prelude.pl , fonctionnant en NRPE, qui vous permet d&rsquo;aller v\u00e9rifier le nombre d&rsquo;entr\u00e9es HIGH ou MEDIUM dans la base Mysql Prelude \ud83d\ude42<\/p>\n<p>Nagios remontera donc une alerte Critique ou Warning que vous acquitterez (ou pas :-p) avant d&rsquo;aller vous connecter sur le Prelude Manager et v\u00e9rifier la teneur exacte du message d&rsquo;erreur applicatif et de le supprimer d\u00e8s sa r\u00e9solution.<\/p>\n<p>Tout ceci est bien s\u00fbr un simple exercice de style, \u00e0 prendre comme une piste de travail.<br \/>\nJe suis certain que vous trouverez d&rsquo;autres solutions \u00e0 mettre en oeuvre.<\/p>\n<p>Amusez vous bien \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce billet est n\u00e9 d&rsquo;une demande de mon ami \u00ab\u00a0Poupinade\u00a0\u00bb qui connaissant mon go\u00fbt pour les challenges divers et vari\u00e9s, me demanda avec fourberie innocemment comment je ferais, moi, pour intercepter des erreurs applicatives dans Nagios. Nagios est un outil &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/03\/18\/interception-des-erreurs-applicatives-dans-nagios-avec-sec-et-prelude-lml\/\">Read More <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[27,7],"tags":[107,9,106],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/369"}],"collection":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=369"}],"version-history":[{"count":17,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/369\/revisions"}],"predecessor-version":[{"id":389,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/369\/revisions\/389"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=369"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}