Check_MK Agent über SSH Verbindung

Wenn man das Check_MK Monitoring nicht über den Standardport (xinet) laufen lassen möchte / kann besteht dich Möglichkeit dies über eine SSH Verbindung zu realisieren. Hierfür muss nur einiges an Vorarbeit erledigt werden.

Auf jedem Host der zu monitoren ist legt man einen User für den Check_Mk Agents an.
useradd -d /home/monitor -c 'CHECK_MK User' -g monitor -m -s /bin/bash monitor
Auf dem Monitoring-Server einen SSH Key für das monitoring erstellen. Dazu logt ihr euch über ssh auf dem Server ein und wechselt mit su - sitename auf die Check_MK Site (User). Dort legt ihr ein SSH-Keypair an.
ssh-keygen -t monitor
dann zeigt ihr euch den schlüssel über cat an und pflegt diesen auf den zu monitorenden Hostsystemen unter dem User monitor ein ( /home/monitor/.ssh/authorized_keys )
cat ~/.ssh/id_monitor.pub
Eintrag auf den Hostsystemen :
command="sudo /usr/bin/check_mk_agent" ssh-rsa [SSH KEY DES SERVERS]
Jetzt muss noch die sudoers Config angepasst werden.
vi /etc/sudoers
Dort fügt man die folgenden Zeilen ein, trägt man den User monitor ein
# Allow User monitor to run check_mk_agent
monitor ALL=NOPASSWD: /usr/bin/check_mk_agent
Jetzt kann man das bis jetzt mal testen.Wenn ihr euch über ssh auf dem Host als User monitor anmeldet, oder den check_mk_agent lokal auf dem Host als User monitor ausführt, muss der selbe output zu sehen sein.

Ist das der Fall muss jetzt noch in der WATO eine Regel erstellt werden.
Unter Host & Service ParametersDatasource ProgramsIndividual program call instead of agent access eine Regel für die Umgebung erstellen
	ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no monitor@$HOSTADDRESS$
dann sollten nach einem TabulaRasa alle Services zu sehen sein.
check_mk_agent über ssh
check_mk_agent über ssh


Mehr Info : Check_MK - Anleitung zu diesem Thema

InfluxDB - Aufbewahrung der Daten managen

Wenn eine Datenbank in Influx erstellt wird gibt es eine default RETENTION POLICY (Aufbewahrungsrichtlinie) mit den Namen "autogen" die DURATION ist dort auf Unendlich und die shardGroupDuration auf 7 Tage konfiguriert . Dies kann man auch bei der Erstellung einer Datenbank mitgeben (allerdings darf man das nicht vergessen ;-)) DATABASE MANAGMENT
>SHOW RETENTION POLICIES
name              duration  shardGroupDuration replicaN default
----              --------  ------------------ -------- -------
autogen           0s        168h0m0s           1        true
lässt man eine größere Umgebung mit diesen default Werten monitoren ist die Datenbank recht schnell voll und wächst und wächst .......

Um realistische Aufbewahrungsfristen zu realisieren kann man eine neue Policy schreiben, es kommt natürlich immer auf den jeweiligen Anwendungsfall an !
CREATE RETENTION POLICY "twelve_weeks_only" ON "collectd" DURATION 12w SHARD DURATION 1d DEFAULT
nun sieht die Retention Policy schon anders aus
>SHOW RETENTION POLICIES
name              duration  shardGroupDuration replicaN default
----              --------  ------------------ -------- -------
autogen           0s        168h0m0s           1        false
twelve_weeks_only 2016h0m0s 24h0m0s            2        true
die Werte müssen natürlich je nach Anwendungsfall angepasst werden.

Zur Erklärung :

Erstellt eine neue RETENTION POLICY in der Datenbank collectd mit den Namen twelve_weeks_only
CREATE RETENTION POLICY "twelve_weeks_only" ON "collectd"
Die Aufbewahrungsfrist der Daten beträgt hier 12 Wochen -> Duration units
DURATION 12w
In einer einzelnen Shard-Group können mehrere Shards vorhanden sein. Jeder Shard enthält eine bestimmte Reihe von Serien. Alle Punkte, die auf eine bestimmte Serie in einer bestimmten Shard-Gruppe fallen, werden im selben Shard (TSM-Datei) auf der Festplatte gespeichert.(auszug InfluxDB Doku)
SHARD / SHARD Groups / SHARD Duration
SHARD DURATION 1d
Setzt die neue Policy als DEFAULT für die Datenbank collectd
DEFAULT
Um mir wieder Platz zu schaffen habe ich danach die Policy "autogen" aus der InfluxDB gelöscht
DROP RETENTION POLICY "autogen" ON "collectd"

Nach der Erstellung der neuen RETENTION POLICY begann die Aufzeichnung der Messwerte wieder bei Null, sollte das nicht gewünscht werden kann man auch die RETENTION POLICY ändern. Der Weg ist aber ungetestet !!
ALTER RETENTION POLICY "autogen" ON "collectd" DURATION 12w SHARD DURATION 7d DEFAULT

mosquitto absichern & Standardbefehle

erstmal für alle die mosquitto nicht kennen das ist es : mosquitto.org

erstmal installieren wir alles was wir benötigen
sudo apt install mosquitto mosquitto-clients
nach der Installation aus den Debian Paketen liegt ein funktionierendes mosquitto auf der Platte nur ist es nicht sicher konfiguriert. Um es noch ein bisschen mehr abzusichern sollte man an den Configfiles etwas schrauben.

Hier ist meine mosquitto.conf diese liegt unter /etc/mosquitto/
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
persistent_client_expiration 7d
connection_messages true
log_dest syslog
log_timestamp false
log_type error
log_type warning
log_type notice
log_type information
port 1883
max_connections -1
allow_anonymous false
use_identity_as_username false
password_file /etc/mosquitto/users
acl_file /etc/mosquitto/roles
include_dir /etc/mosquitto/conf.d

Als erstes legen wir einen Benutzer für mosquitto an.
touch /etc/mosquitto/users ; mosquitto_passwd /etc/mosquitto/users BENUTZERNAME

Jetzt brauchen wir die Rechte der User
touch /etc/mosquitto/roles ; vi /etc/mosquitto/roles

Hier ein Vorschlag für die roles, der Benutzer monitor hat alle rechte während der Benutzer clmon nur schreiben darf.
user monitor
topic write /mqtt/#
topic read /mqtt/#

user clmon
topic write /mqtt/#


Zum testen der konfig bieten sich die beiden tools mosquitto_sub und mosquitto_pub an.

Subscribe
mosquitto_sub -u USERNAME -P PASSWORD -t "/mqtt/#"
Publish
mosquitto_pub -h localhost -u USERNAME -P PASSWORD -t "/mqtt/test/" -m "TESTNACHRICHT"


Quelle : Mosquitto Dokumentation

InfluxDB absichern & Standardbefehle

erstmal was ist Influx db eigentlich : Influxdb

Um eine InfluxDB absichern zu können muss als erstes ein Benutzer mit Admin Rechten angelegt werden, BEVOR man Auth aktiviert.

Anlegen eines Admin Users :
CREATE USER admin WITH PASSWORD 'SECUREPASSWORD' WITH ALL PRIVILEGES
Überprüfen / Anzeigen der User geht mit dem Befehl :
SHOW USERS
bzw für die Rechte
SHOW GRANTS FOR admin

Jetzt muss die Authentifizierung aktiviert werden. Dazu muss die Konfiguration unter /etc/influx/influx.conf angepasst werden.
Hier mal der entscheidende Block (Ohne Kommentare)
[http]
   enabled = true
   bind-address = ":8086"
   auth-enabled = true
   access-log-path = "/var/log/influxdb/access.log"
   write-tracing = false
   pprof-enabled = false
   https-enabled = false
   https-certificate = "/etc/ssl/influxdb.pem"

Ab jetzt könnt ihr euch mit dem folgenden Befehl verbinden
influx -username admin -password SECUREPASSWORD -database DATABASENAME
was auch funktioniert ist mit dem Befehl
influx
die cli starten und dann mit dem Befehl
auth
die Authentifizierung einleiten.


Weitere Standardbefehle

InfluxDB Datenbanken anzeigen :
SHOW DATABASES
InfluxDB Datenbank anlegen :
CREATE DATABASE "DATABASENAME"
InfluxDB User anlegen :
CREATE USER dev WITH PASSWORD 'SECUREPASSWORD'
InfluxDB Rechte vergeben auf Datenbank :
GRANT (READ,WRITE,ALL) ON DATABASENAME TO dev

Quelle : InfluxDB 1.5 documentation


Amazon Linux AMI : Fehler beim Versuch "yum update"

Problem : beim Versuch ein Amazon Linux AMI erscheint diese Meldung
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   /usr/lib64/python2.7/dist-packages/pycurl.so: undefined symbol: CRYPTO_num_locks

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.12 (default, Nov  2 2017, 19:20:38) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

If you cannot solve this problem yourself, please go to 
the yum faq at:
  http://yum.baseurl.org/wiki/Faq

Lösung : Überprüfen auf welche libs curl verweist
ldconfig -p -N -X | grep curl
Output :
	libcurl.so.4 (libc6,x86-64) => /usr/lib64/libcurl.so.4
dann prüfen wir das selbe beim python modul
ldd /usr/lib64/python2.7/dist-packages/pycurl.so
	linux-vdso.so.1 =>  (0x00007ffe65d10000)
	libcurl.so.4 => /libs/test/libcurl.so.4 (0x00007f5edd1e7000) <----- GRUND !!
	libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007f5edce0b000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5edcbef000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f5edc82b000)
	libssl.so.1.1 => /libs/test/libssl.so.1.1 (0x00007f5edc5bd000)
	libcrypto.so.1.1 => /libs/test/libcrypto.so.1.1 (0x00007f5edc153000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f5edbf4f000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f5edbd39000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f5edbb31000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007f5edb92e000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f5edb62c000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f5edd65e000)
Die Pfade sind hier unterschiedlich, ich habe hier einfach die lib von dem Entwickler umbenannt und die andere rein gelinkt.
mv /libs/test/libcurl.so.4 /libs/test/libcurl.so.4.dev ; ln -s /usr/lib64/libcurl.so.4 /libs/test/libcurl.so.4
Dann ging YUM wieder durch.

Quelle : https://access.redhat.com/solutions/641093

RaspberryPI : DHT22 Sensor - Temperatur & Luftfeuchtigkeit monitoren

Wenn man zuhause Temperatur & Luftfeuchtigkeit monitoren will bietet sich der DHT22 an. Ich habe mich für diesen hier entschieden.
Um den Sensor in Betreib zu nehmen benötigen wir erst noch einiges an Software auf dem kleinen.
Dazu werden wir erstmal Admin auf dem Raspberry
sudo -s
dann installieren wir die benötigten Packete mit
apt install build-essential python-dev python-openssl git-core vim
wir benötigen jetzt noch die python module für den sensor das können wir mit dem folgenden Befehl erledigen.
cd ~ && git clone https://github.com/adafruit/Adafruit_Python_DHT.git && cd Adafruit_Python_DHT && python setup.py install
jetzt sollte alles installiert sein was wir benötigen.

Jetzt schließen wir noch den Sensor nach dem unten aufgeführten Schema an.

DHT22 an Raspberry PI 3
DHT22 an Raspberry PI 3

DHT22 an Raspberry PI 3 Schema
Adafruit liefert hier ein kleines example mit zum testen.
~/Adafruit_Python_DHT/example/Adafruit.py 22 4
Wenn alles richtig gemacht wurde erhällt man jetzt einen Output der so oder so ähnlich aussieht.
~/Adafruit_Python_DHT/examples/AdafruitDHT.py 22 4
Temp=22.7*  Humidity=44.5%
22 = der Sensor DHT22
4 = der gpio Pin an dem die Sensor Leitung hängt

Jetzt bekommen wir Werte vom Sensor um diese aber zu Monitoren brauchen wir noch eine Software die das erledigt. Da ich hier bereits eine fertige Grafana Installation habe verwende ich natürlich diese. Die Werte erhält Grafana bereits über den collectd Agent, deswegen habe ich mich dazu entschieden auch die Temperaturen über diesen Weg zu reporten.

Ich habe bei meinem Skript schon darauf geachtet das der Sensor justiert werden kann (ADJUST SETTINGS DHT22)

Hier mein Skript für collectd, das legt ihr unter dem Namen dht22.py im Pfad /usr/lib/collectd/python ab
import collectd
import Adafruit_DHT
from decimal import Decimal

SENSOR = Adafruit_DHT.DHT22
PIN = 4

# ADJUST SETTINGS DHT22

# mögliche werte + / - / NULL
ADJ_TEMP_DO = "-"
ADJ_TEMP_VAR = "1.2"

# mögliche werte + / - / NULL
ADJ_HUM_DO = ""
ADJ_HUM_VAR = "0"

def config_func(config):
    pin_set = False
    for node in config.children:
        key = node.key.lower()
        val = node.values[0]
        if key == 'gpio_pin':
            global PIN
            PIN = val
            pin_set = True
        else:
            collectd.info('DHT22 Plugin: Unknown config key "%s"' % key)
    if pin_set:
        collectd.info('DHT22 Plugin : Using override PIN %s' % PIN)
    else:
        collectd.info('DHT22 Plugin : Using default PIN  %s' % PIN)
def read_measurements():
    humidity, temperature = Adafruit_DHT.read_retry(SENSOR, PIN)
    if humidity is not None and temperature is not None:
        if ADJ_TEMP_DO == "-":
            _temp = round(Decimal(temperature),2) - round(Decimal(ADJ_TEMP_VAR),2)
        elif ADJ_TEMP_DO == "+":
            _temp = round(Decimal(temperature),2) + round(Decimal(ADJ_TEMP_VAR),2)
        else:
            _temp = round(Decimal(temperature),2)
        if ADJ_HUM_DO == "-":
            _hum =  round(Decimal(humidity),2) - round(Decimal(ADJ_HUM_VAR),2)
        elif ADJ_HUM_DO == "+":
            _hum =  round(Decimal(humidity),2) + round(Decimal(ADJ_HUM_VAR),2)
        else:
            _hum =  round(Decimal(humidity),2)
    val = collectd.Values(type='temperature')
    val.plugin = 'DHT22_SENSOR'
    val.dispatch(values=[_temp])
    val = collectd.Values(type='humidity')
    val.plugin = 'DHT22_SENSOR'
    val.dispatch(values=[_hum])
collectd.register_config(config_func)
collectd.register_read(read_measurements)

Damit collectd das Skript auch verwendet muss es natürlich erstmal konfiguriert sein.
Auszug aus collectd.conf
.....
.....
LoadPlugin python
.....
.....
<Plugin python>
    ModulePath "/usr/lib/collectd/python"
    Import dht22
    <Module dht22>
        gpio_pin "4"
    </Module>
</python>
dann noch einen Restart von collectd
systemctl restart collectd
wenn ihr alles richtig gemacht habt könnt ihr jetzt dieses Panel in Grafana anlegen.

DHT22 in Grafana
DHT22 in Grafana

“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)