HOAB

History of a bug

Raspberry as network monitor

Rédigé par gorki Aucun commentaire

Problem :

I built a network monitoring solution following this guides :

Truly, a great job.

But I has build the solution at home for another network, I would like that my raspberry start and monitor at boot. And I missed in the comments or text a few thing.

Solution :

I created services as described in the comment for prometheus, add another for the tcpdump. Don't forget prometheus working directory in this configuration (no specific user for prometheus).
 

[Unit]
Description=Prometheus
After=tcpdump.service

[Service]
User=pi
Group=pi
Type=simple
WorkingDirectory=/home/pi/prometheus/prometheus-2.23.0.linux-armv7
ExecStart=/home/pi/prometheus/prometheus-2.23.0.linux-armv7/prometheus \
    --config.file /home/pi/prometheus/prometheus.yml

[Install]
WantedBy=multi-user.target
/etc/systemd/system/tcpdump.service

[Unit]
Description=TCPDump service for traffic monitoring
After=network-online.target
[Service]
Type=idle
ExecStart=python3 /home/pi/network-traffic-metrics/network-traffic-metrics.py "(src net 192.168.10.0/24 and not dst net 192.168.10.0/24) or (dst net 192.168.10.0/24 and not src net 192.168.10.0/24)"
[Install]
WantedBy=default.target

But I had some network issues :

First, disable dhcpcd and install isc-dhcp-server

In my case, I keep dhcpcd as it mount the network interfaces eth0 & eth1. I also put a no gateway on eth0 (my lan part)

My dhcpcd.conf configuration for interfaces :


interface eth1
static ip_address=192.168.1.10
static routers=192.168.1.1
static domain_name_servers=1.1.1.1
static domain_search=1.1.1.1

interface eth0
static ip_address=192.168.10.1
static routers=192.168.10.1
static domain_name_servers=1.1.1.1
static domain_search=1.1.1.1
nogateway

But with this configuration, at boot :

  • isc-dhcp-server and tcpdump

were not started because eth0 was not up or plugged. In my case, I could plug eth0 later.

So I took a while, but I found the network hook that works (forget all /etc/network thing, dhcpcd do not use it).

Create a file (not a directory...) called /etc/dhcpcd.exit-hook with

#!/bin/bash

if [ "$interface" = "eth0" & "$reason" = "STATIC" & "$if_up" = "true" ]
then
	systemctl start tcpdump
	systemctl start isc-dhcp-server.service
fi 

And all is starting when eth0 is going up.

Zabbix et monitoring - configurer le monitoring

Rédigé par gorki Aucun commentaire

Le problème :

La suite de cet article : http://hoab.fr/zabbix-et-monitoring-installation

Solution :

On a zabbix qui tourne et ensuite ?

Astuce générale : le bouton Refresh / Actualiser = Sauvegarder la configuration...

Plein de petites choses :

  • ajouter un agent sur une machine (la même ou une distante)
  • créer un serveur à monitorer : Configuration > Hôtes
  • lui ajouter des templates (des listes de choses à surveiller) Hôte > monHôteAMoi > Templates
  • pour mysql, vérifier que les métriques remontent bien depuis l'agent. Sur la machine qui héberge l'agent :
    • créer le user zabbix qui peut observer la base :
mysql -uroot -p -e"GRANT USAGE ON *.* TO 'zabbix'@'127.0.0.1' IDENTIFIED BY '123456'";
mysql -uroot -p -e"GRANT USAGE ON *.* TO 'zabbix'@'localhost' IDENTIFIED BY '123456'";
mysql -uroot -p -e"flush privileges"
mysql -uzabbix -p123456 -e"status"
  • continuer sur la machine qui héberge l'agent :
    • vérifier qu'il y a un fichier : /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
    • pour ajouter des choses spéciques à la connexion au serveur mysql, ce que j'ai trouvé le mieux c'est un script spécifique
    • dans le userparameter_mysql.conf
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | /home/admin/monitortools/zabbix/mysql_zabbix.sh -N | awk '{print $$2}'
  • toujours pour mysql, sur le serveur qui héberge l'agent
    • dans le fichier /home/admin/monitortools/zabbix/mysql_zabbix.sh
      #/bin/bash
      mysql --defaults-extra-file=/home/admin/monitortools/zabbix/.my1.cnf -S /var/run/mysqld/mysqld1.sock $*

       

  • cela peut se tester avec (http://hoab.fr/shaarli/?aPEmew) : zabbix_agentd -t mysql.status[Com_begin]
  • vérifier que les métriques remontent dans Monitoring > Latest Data
    • choisir le serveur configuré plus haut dans les filtres, appliquer
  • si les métriques remontent bien, vous pouvez créer des graphiques et des écrans Monitoring > Ecran
  • maintenant il reste à configurer les alertes
    • Administration > Type de Media : configurer comment vous voulez être notifié
      • pour les emails, cette page configure l'email émetteur ainsi que le serveur SMTP qui accepte d'émettre des emails pour cette adresse. Moi j'avais un serveur SMTP sur mon serveur, je me suis créé un compte et voilà. Sinon utiliser un email et un compte ailleurs. Attention pour les versions Zabbix 2.x c'est un peu galère, il n'y a pas beaucoup d'options
    • Administration > User > myUser > Media
      • c'est là où vous configurer le ou les adresses destinatrices qui vont recevoir les alertes
    • Configuration > Action : les actions à réaliser lorsque les triggers se déclenchent. L'action par défaut prévient l'administrateur de tout, après on peut réaliser des filtres assez avancé suivant les triggers
  • Ajouter des alertes personnalisées
    • Configuration > Template > leTemplateQuiContientLaMétrique > Triggers > Create Trigger (en haut à droite)
    • Les expressions de triggers ne sont pas simples, heureusement il y a un éditeur ! (qui s'ouvre d'une popup à côté)
    • Exemple : dans Configuration > Template > Template OS Linux > Triggers > Create Trigger
      • Déclenchement si CPU Idle < 20% pendant 5 secondes : {Template OS Linux:system.cpu.util[,idle].avg(5s)}<20
      • Qui peut se faire via le bouton "constructeur d'expression"

 

Voilà mes notes pour un début. Ca l'air bien complet avec des triggers de type "tendance" et c'est ce que je cherchais.

Pas très compliqué à mettre en place, j'ai un peu galéré pour les triggers mysql parce que j'ai deux instances de bases sur mon serveur, mais avec l'astuce du shell tout va bien. Et puis surtout ce p*#! de bouton "Actualiser" qui veut dire "Sauvegarder"....

 

Zabbix et monitoring - installation

Rédigé par gorki Aucun commentaire

Le problème :

Ne pas passer son temps à réagir au problème et être prévenu à l'arrache.

Solution :

Du monitoring évidemment. J'ai eu l'occasion de voir Zabbix, c'était l'occation de tester.

Installation presque simple (je suis sous une Debian Jessie) :

  1. Ajout du repository Zabbix dans APT
wget http://repo.zabbix.com/zabbix/3.2/debian/pool/main/z/zabbix-release/zabbix-release_3.2-1+<codename>_all.deb
dpkg -i zabbix-release_3.2-1+<codename>_all.deb
apt-get update
apt-get install zabbix-server-mysql
apt-get install zabbix-frontend-php

 

  1. Soit on a une base de données qu'on veut utiliser, dans ce cas, vérifier qu'on a bien mysql-client (ou mariadb-client) d'installé. cf ici : "zabbix-server-mysql packages has dependency "mysql-client" or "virtual-mysql-client"."
  2. Soit on en a pas et zabbix va installer un mysql... je vous laisse trouver la littérature sur le sujet si vous voulez mieux maitriser l'installation de la base. Sinon c'est debian, ça marche tout seul
  3. On créé l'utilisateur zabbix, la base et les tables pour la partie zabbix-server (là où seront stockés les métriques, les alertes etc...). Je ne sais pas trop quel place çà va prendre sur le disque. A surveiller (via zabbix ^^). Ca se passe par ici pour la base et l'utilisateur
  4. Création des tables, ça change pas mal suivant les versions, pour la 3.2 c'est :
zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -p<password> zabbix
  1. Normalement le apt ajoute la configuration pour Apache, sinon, le voilà :
# Define /zabbix alias, this is the default
<IfModule mod_alias.c>
    Alias /zabbix /usr/share/zabbix
</IfModule>

<Directory "/usr/share/zabbix">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all

    <IfModule mod_php5.c>
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value always_populate_raw_post_data -1
        # php_value date.timezone Europe/Riga
    </IfModule>
    <IfModule mod_php7.c>
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value always_populate_raw_post_data -1
        # php_value date.timezone Europe/Riga
    </IfModule>
</Directory>

<Directory "/usr/share/zabbix/conf">
    Order deny,allow
    Deny from all
    <files *.php>
        Order deny,allow
        Deny from all
    </files>
</Directory>

<Directory "/usr/share/zabbix/app">
    Order deny,allow
    Deny from all
    <files *.php>
        Order deny,allow
        Deny from all
    </files>
</Directory>

<Directory "/usr/share/zabbix/include">
    Order deny,allow
    Deny from all
    <files *.php>
        Order deny,allow
        Deny from all
    </files>
</Directory>

<Directory "/usr/share/zabbix/local">
    Order deny,allow
    Deny from all
    <files *.php>
        Order deny,allow
        Deny from all
    </files>
</Directory>
  1. Connexion sur http://<mon ip>/zabbix
  2. On suit l'assistant de connexion
  3. La suite plus tard

ELK - parsing des logs Apache

Rédigé par gorki Aucun commentaire

Le problème :

Analyser les logs Apache (entre autre) avec un système de requêtage.

Alors il y a bien l'outil fait à la main, ça marche toujours :) mais je voulais tenter une stack ELK (Elasticsearch Logstash Kibana)

Solution :

Tout d'abord l'installation :

- je suis parti du docker qnib/elk (https://hub.docker.com/r/qnib/elk/).

- auquel j'ajoute le plugin elasticsearch-head pour la visulation des données

- création du docker initial (commité depuis avec le plugin elasticsearch) :

. envir.sh

sudo docker run -t -i --rm -h elk --name sgl-elk --privileged \
    ${DNS_STUFF} ${DEV_MOUNTS} ${LINK} \
    ${HTTP_PORT} ${LS_CONF} ${AP_LOG} \
    -e HTUSER=${HTUSER} -e HTPASSWD=${HTPASSWD} \
    ${ES_PERSIST} qnib/elk:latest bash

- fichier d'environnement (envir.sh) :

# To get all the /dev/* devices needed for sshd and alike:
export DEV_MOUNTS="-v /dev/null:/dev/null -v /dev/urandom:/dev/urandom -v /dev/random:/dev/random"
export DEV_MOUNTS="${DEV_MOUNTS} -v /dev/full:/dev/full -v /dev/zero:/dev/zero"
### OPTIONAL -> if you want to store Elasticsearchs data outside 
export ES_PERSIST="-v ${HOME}/elk/elasticsearch:/data/"
### OPTIONAL -> To use a mapped in configuration directory
# if not used, the default will be used within the container
export LS_CONF="-v ${HOME}/elk/logstash.d/:/etc/logstash/conf.d/"
### OPTIONAL -> map apache2 config into container
export AP_LOG="-v ${HOME}/elk/var/log/apache2/:/var/log/apache2"
### OPTIONAL -> set the external port to something else then 80
export HTTP_PORT="-e HTTPPORT=8080 -p 8080:80 -p 9200:9200 -p 5601:5601"
### OPTIONAL -> To secure kibana and elasticsearch user/passwd could be set
# if a user is set and no passwd, the user will be set as password
export HTUSER=kibana
export HTPASSWD=kibana

 

Utilisation en oneshot :

- je fais du parsing à la demande plutôt que d'utiliser la stack en monitoring de log continu :

bin/logstash -f /etc/logstash/conf.d/10_apache.conf

- un exemple de fichier configuration logstash pour Apache :

input {
  file {
    path => "/var/log/apache2/test.log"
    start_position => "beginning"
    type => "apache"
  }
}

filter {
    if [type] == "apache" {
        grok {
            match => [ "message", "%{COMBINEDAPACHELOG}" ]
            add_tag => ["apachelog"]
        }
        if "apachelog" in [tags]  {
	    date {
    		match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  	    }
            geoip {
              source => "clientip"
              target => "geoip"
              add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
              add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
            }
            mutate {
              convert => [ "[geoip][coordinates]", "float" ]
            }
        }
    }
}

output {
    if [type] == "apache" {
        stdout { codec => rubydebug }
        elasticsearch {
            protocol => "http"
            cluster => "logstash"
        }
    }
}

- ensuite je me connecte sur elasticsearch pour vérifier que les données ont bien été insérées :

http://localhost:9200/_plugin/head/

- puis sur Kibana pour exploiter les logs :

http://localhost:8080 (kibana3)

http://localhost:5601 (kibana4)

 

Edit :

- Utilsation de grok : https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

- les patterns grok d'ELK : https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

Fil RSS des articles de cette catégorie