Script élémentaire

L’interface consiste en un service HTTPD Rest local à ce serveur dont l’URL va être interrogée régulièrement par PRTG au moyen du capteur (sensor) HTTP Data Advanced. PRTG attend donc une réponse dans un format XML très simple.
Ce script est une version minimaliste dont le but est de démontrer les mécanismes élémentaires de la communication entre Ossec et PRTG.

Les scripts se trouvent dans le répertoire /home/ossecdnc/public_html/ossec2prtg.

  1. <?php
  2. /*  prtg_demo_1
  3. 2017/11/08
  4.  
  5. Exemple d'interface simple Ossec vers PRTG
  6.  
  7. D'une façon générale, l’interface consiste en un service HTTPD Rest local à ce serveur (ce script)
  8. dont l’URL va être interrogée régulièrement par le capteur (sensor) HTTP Data Advanced.
  9.  
  10. La réponse est au format XML imposé par PRTG.
  11.  
  12. Dans cet exemple, nous utilisons les bibliothèques bas-niveau d'Ossec WUI (dossier /ossec-wui/lib)
  13.  
  14. Copyright (c) 2017 DnC
  15. auteur B.Degoy bertrand@degoy.com
  16. Tous droits réservés  
  17. */
  18.  
  19. /*  
  20. ***** L'objet Ossec_Alert représente une alerte, exemple :
  21.     $alert
  22.     : object(Ossec_Alert) =
  23.         time: string = "1510095600"
  24.         id: string = "5715"
  25.         level: string = "3"
  26.         user: string = "root"
  27.         srcip: string = "90.109.30.219"
  28.         description: string = "SSHD authentication success."
  29.         location: string = "vps365605->/var/log/secure\n"
  30.         msg: array =
  31.             0: string = "Nov  7 23:59:58 vps365605 sshd[26329]: Accepted password for root from 90.109.30.219 port 54025 ssh2"
  32.             1: undefined = NULL
  33.    
  34.  
  35. ***** A propos du nom de l'agent :
  36.  
  37. Dans le cas général, location commence par le nom de l'agent entre parenthèses, suivi de l'IP et du nom de fichier.
  38. Exemple : (agent-test) 78.228.135.29->WinEvtLog
  39.  
  40. S'il s'agit du serveur, c'est le nom d'hôte qui est mentionné dans le logs, sans les parenthèses.
  41. Exemple : vps365605->/var/log/maillog
  42. Notons que Ossec-WUI liste le serveur dans les agents sous le nom ossec-server.
  43.  
  44. ***** Exemple de retour :
  45.  
  46. <?xml version="1.0" encoding="UTF-8" ?>
  47.     <prtg>
  48.     <result>
  49.         <channel>ossec-server</channel>
  50.             <value>2</value>
  51.         </result><result>
  52.         <channel>agent-test</channel>
  53.             <value>0</value>
  54.         </result><result>
  55.         <channel>vps411862</channel>
  56.             <value>0</value>
  57.         </result>
  58.     </prtg>
  59.    
  60. */
  61.  
  62. define('SERVER_NAME', 'vps223233');   // Le nom du serveur dans les logs   //CONFIG
  63.  
  64. require_once '../ossec-wui/ossec_conf.php';    
  65. set_include_path('/home/ossecdnc/public_html/ossec-wui/lib'); //[a]
  66.  
  67. require_once 'os_lib_handle.php';
  68. $ossec_handle = os_handle_start($ossec_dir);
  69.  
  70. require_once 'os_lib_alerts.php';
  71. require_once 'Ossec/AlertList.php';
  72.  
  73. //$log_file = $ossec_handle{'dir'}.'/logs/alerts/alerts.log';
  74. $log_file = '../ossec/logs/alerts/alerts.log';
  75.  
  76. // Mémoriser l'instant de la mesure et calculer l'intervalle avec la précédente
  77. $lasttime = @file_get_contents('prtg_demo_1.txt');
  78. $thistime = time(0);
  79. file_put_contents("prtg_demo_1.txt",$thistime);
  80. $intervalle = min(300, $thistime - $lasttime);   // 5 minutes max.
  81.  
  82.  
  83. // Ouvrir le log
  84. $fp = fopen($log_file, 'r');
  85. if($fp === false) {
  86.     // ???
  87. } else {
  88.    
  89.     $alert_list = new Ossec_AlertList( );
  90.    
  91.     while( !is_null($lasttime) ) {   // Ne pas tenir compte de la première mesure
  92.         // Relever les alertes dans l'intervalle
  93.         $alert = __os_parsealert(      // objet Ossec_Alert
  94.             $fp, $thistime, $thistime-$intervalle, $thistime, 0, NULL, NULL,
  95.             NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  96.         );
  97.         if($alert == NULL) {
  98.             break;
  99.         }
  100.  
  101.         $alert_list->addAlert( $alert );
  102.  
  103.     }    
  104.     @fclose($fp);
  105.    
  106.     echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
  107.    <prtg>
  108.    ";
  109.    
  110.     // Lister les agents
  111.     require_once 'os_lib_agent.php';
  112.     if(($agent_list = os_getagents($ossec_handle)) !== NULL) {      
  113.        
  114.         // Distribuer les alertes parmi les agents
  115.         $alert_level_agent = array();
  116.         foreach ($agent_list as $agent ) {
  117.            
  118.             if ( $agent['name'] == "ossec-server" ) {
  119.                 // Ossec WUI nomme le serveur "ossec-server", mais ce n'est pas sous ce nom qu'il apparait dans les logs.
  120.                 $agent_name = SERVER_NAME;
  121.             } else {
  122.                 // Le nom qui nous intéresse est entre parenthèses.
  123.                 $agent_name = '(' . $agent['name'] . ')';
  124.             }
  125.            
  126.             $alert_level_agent[$agent['name']] = 0;
  127.             foreach($alert_list->_alerts as $alert) {
  128.                 if( strpos( $alert->location, $agent_name ) !== false  ) {
  129.                 // Retenir le niveau d'alerte le plus élevé  
  130.                    $alert_level_agent[$agent['name']] = max($alert_level_agent[$agent['name']], $alert->level );
  131.                 }    
  132.             }
  133.            
  134.             echo"<result>
  135.                <channel>" . $agent['name'] . "</channel>
  136.                <value>" . $alert_level_agent[$agent['name']] . "</value>
  137.            </result>";
  138.            
  139.         }
  140.     }      
  141.        
  142.     echo"
  143.    </prtg>";
  144. }

Télécharger