Logrotate

Mit Hilfe von Logrotate werden die Log-Datien aus dem Verzeichnis /var/log/ gepackt.

Im Verzeichnis /etc/cron.daily/logrotate ist ein Script gespeichert, welches Logrotate jeden Tag startet. Die Einstellung für Logrotate liegen in der Konfiguration /etc/logrotate.conf gespeichert.

sudo vim /etc/logrotate.d/dpkg

/var/log/dpkg.log {
  monthly                   # Monatlich
  rotate 12                 # Behalte 12 Stück
  compress                  # Komprimiert
  delaycompress             # Komprimiert nach dem verschieben
  missingok                 # Es ist OK, wenn kein Log da ist.
  notifempty                # Leere Dateien werden nicht verschoben
  create 644 root root      # Rechte ändern
}

NetworkManager entfernen

Wenn man vom NetworkManager zurück zu Network wecheln will, sind drei Schritt aus zu führen.

sudo service NetworkManager stop
sudo service network start
sudo apt-get remove NetworkManager

Erstellen Sie auch die Konfiguration für Network.

sudo vim /etc/network/interfaces

auto lo
iface lo inet loopback
 
auto eth0
iface eth0 inet dhcp

NetworkManager ohne GUI verwalten

Wenn man den NetworkManager (NM) ohne eine GUI verwenden will, kann man das Programm nmcli verwenden.

nmcli device status
nmcli device show eth0
nmcli connection show
nmcli general

Es ist auch möglich die Verbindung zu trennen und zu ändern.

nmcli device [connect/disconnect] eth0

Die Einstellung werden gespeichert im Verzeichnis /etc/NetworkManager/system-connections/.

sudo vim /etc/NetworkManager/system-connections/Kabelnetzwerkverbindung

[connection]
id=Kabelnetzwerkverbindung
uuid=245e5-2e4f-25ef-4c55-56ede3
type=ethernet
permissions=
secondaries=
timestamp=1453713048
 
[ethernet]
duplex=full
mac-address=F0:DE:F1:XX:XX:XX
 
[ipv4]
method=auto
 
[ipv6]
ip6-privacy=0
method=auto

Ubuntu – Systemd Netzwerknamen

Seit der Umstellung auf Systemd haben sich die Namen der Netzwerk-Adapter geändert. Die Schnittstellt hatte früher den Namen „eth0“, „eth1“ und heißt jetzt zum Beispiel „enp0s5“. Der Aufbau der Namen folgt einem Standard.

Der Aufbau ist wie folgt:

Two character prefixes based on the type of interface:
en -- Ethernet
sl -- serial line IP (slip)
wl -- wlan
ww -- wwan
 
Type of names:
 
b<number>                          -- BCMA bus core number
c<bus_id>                          -- CCW bus group name
o<index>[d<dev_port>]              -- on-board device index number
s<slot>[f<function>][d<dev_port>]  -- hotplug slot index number
x<MAC>                             -- MAC address
 
p<bus>s<slot>[f<function>][d<dev_port>]  -- PCI geographical location
p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]  -- USB port number chain

Das Beispiel „enp0s5“ ist eine Ethernet Karte PCI am Bus 0 Slot 5.

Doch wie kann man diese Namen finden, wenn man eine Karte neu installiert hat?

Der Befehl ifconfig mit der Option -a zeigt all Netzwerk-Geräte an, auch wenn Sie noch nicht konfiguriert sind.

ifconfig -a
lshw -class network

Will man den Namen ändern in „eth0“ so muß mann eine UDev Regel hinzufügen. Ersetzen Sie die MAC Adresse und den Namen mit den Daten aus Ihrem System.

sudo vim /etc/udev/rules.d/10-network.rules

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="02:00:37:6f:ff:ff", KERNEL=="enp0s5", NAME="eth0"

Ändern Sie auch die Netzwerkeinstellungen und führen Sie einen Neustart durch.

sudo vim /etc/network/interfaces

auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
address 10.0.0.100
netmask 255.255.255.0
gateway 10.0.0.1

Syslog – Protokollierung in System Log

Wenn man in seinem Script eine Statusmeldung in System-Log schreiben will, geht das mit dem Befehl logger.

logger "Hello World"

Es wird automatisch das Datum, Uhrzeit, Hostname und Benutzer zu dem Text in das System-Log geschrieben.

grep "Hello" /var/log/syslog

Will man den Speicherort ändern, so fügt man eine weitere Zeile in die Konfiguration hinzu.

sudo vim /etc/rsyslog.d/50-default.conf

user.* /var/log/user.log

sudo truncate -s 0 /var/log/user.log
sudo chown syslog:adm /var/log/user.log
sudo service rsyslog restart

Um Logging von unterschiedlichen Server an einem System zu sammeln, muss man die Einstellungen von Rsyslog ändern.

sudo vim /etc/rsyslog.conf

module(load="imudp")
input(type="imudp" port="514")

sudo service rsyslog restart

Jetzt kann man von einem anderen Server eine Nachricht senden.

logger -n 10.0.0.1 "Hello Server!"

Check_MK Plugins erstellen mit Datenbank als Quelle

In diesem Beitrag will ich ein Check_MK Agent Plugin erstellen, welches Daten aus einer Datenbank aus liest und in Check_MK als Service mit Statistik integriert.

1. Installation

1.1. Java installieren

sudo apt-get install openjdk-8-jre

1.2. SQL-Workbench installieren

SQL-Workbench von der Seite laden.

wget http://www.sql-workbench.net/Workbench-Build119.zip

Die ZIP-Datei entpacken.

unzip Workbench-Build119.zip

2. Einrichtung

2.1. SQL-Workbench Profile

Starten Sie SQL-Workbench im Grafikmodus und legen ein Connection Profile an, mit dem Sie eine Verbindung zur Datenbank auf bauen können.

./Workbench-Build119/sqlworkbench.sh

2.2. Verzeichnisse anlegen

mkdir -p ./check-db-plugin/{lib,logs,result}/

Die Bibliothek in das Projektverzeichnis kopieren.

cp ./Workbench-Build119/sqlworkbench.jar ./check-db-plugin/lib/

2.3. Script erstellen

Dieses Script starte SQL-Workbench im Command-Modus und transformiert die Datenbankabfrage in eine OUT-Datei. Als „ProfileName“ verwenden Sie den Namen, welche Sie unter Punk 2.1. erstellt haben.

vim ./check-db-plugin/start.sh
chmod +x vim ./check-db-plugin/start.sh

#!/bin/sh
DIR=/home/user/check-db-plugin/
JAVA_HOME=/usr/lib/jvm/default-java/
JAR=lib/sqlworkbench.jar
CONFIG=/home/user/.sqlworkbench
SCRIPT=count.sql
LOG=logs/check.log
 
cd $DIR
 
$JAVA_HOME/bin/java \
  -jar $JAR \
  -profile='ProfileName' \
  -command='WBInclude count.sql;' \
  -configDir=$CONFIG \
  -logfile=$LOG \
  -readOnly \
  -displayResult=false; \
#  -script=$SCRIPT

In der Datei „count.sql“ erstellen Sie die Abfrage für die Datenbank und die anschließende XSLT Transformation.

vim ./check-db-plugin/count.sql

WbConnect ProfileName;
 
WbExport -type=xml -file='result/table.xml' -stylesheet='count.xslt' -xsltOutput='result/table.out';
SELECT count(*) as SUM, 50 as WARNING, 100 as CRITICAL FROM table WHERE status = 'closed';

Die XSLT Transformation wandelt das Ergebnis der Datenbank in eine einfache Textausgabe um.

vim ./check-db-plugin/count.xslt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
     version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
 
<xsl:output
  encoding="iso-8859-15"
  method="text"
  indent="no"
  standalone="no"
  omit-xml-declaration="no"
  doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
/>
 
<xsl:variable name="newline"><xsl:text>&#10;</xsl:text></xsl:variable>
<xsl:variable name="tab"><xsl:text>&#x09;</xsl:text></xsl:variable>
 
<xsl:template match="/">
        <!-- Write the data rows -->
        <xsl:for-each select="/wb-export/data/row-data">
                <xsl:for-each select="column-data">
                        <xsl:value-of select="."/>
                        <xsl:if test="position() &lt; last()"><xsl:value-of select="$tab"/>
                        </xsl:if>
                </xsl:for-each>
                <xsl:value-of select="$newline"/>
        </xsl:for-each>
</xsl:template>
 
</xsl:stylesheet>

3. Check_MK Agent

3.1. Verzeichnis erstellen

Der Check soll nur alle 120 Sekunden asynchron ausgeführt werden, deshalb wird ein Verzeichnis 120 angelegt.

sudo mkdir -p /usr/lib/check_mk_agent/local/120/

3.2. Check erstellen

Der Check liest im Verzeichnis die Dateien mit der Endung /home/user/check-db-plugin/result/*.out aus und stellt das Ergebnis im Check_MK agent bereit.

sudo vim /usr/lib/check_mk_agent/local/120/check-db-plugin.sh
sudo chmod +x /usr/lib/check_mk_agent/local/120/check-db-plugin.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh
# Plugin Return Codes
# = 0   OK
# = 1   Warning
# = 2   Critical
# = 3   Unknown
#
DIR=/home/user/check-db-plugin/
FILTER=result/*.out
NAME="SQL-counter"
 
# Start SQL-Workbench into batch mode
$DIR/start.sh > /dev/null
 
 
for file in $DIR/$FILTER; do
 
  filename=$(basename "$file")
  date=$(date -r "$file" +"%Y-%m-%d %H:%M:%S")
 
  count=$(cut -f1 ${file})
  limit_warning=$(cut -f2 ${file})
  limit_critical=$(cut -f3 ${file})
 
  if [ -z $count ] ; then
    status=3
    statustext="UNKNOWN"
  elif [ $count -gt $limit_critical ] ; then
    status=2
    statustext="CRITICAL"
  elif [ $count -gt $limit_warning ] ; then
    status=1
    statustext="WARNING"
  else
    status=0
    statustext="OK"
  fi
 
  if [ $count -eq $limit_warning ] && [ $count -eq $limit_critical ] ; then
    unset limit_warning
    unset limit_critical
  fi
 
  echo "${status:-1} ${NAME}_${filename} count=${count};$limit_warning;$limit_critical; Check(${statustext}): ${count} - ${date}"
 
done
 
exit $status

Quelle: Check_MK
Download: SQL-Workbench Handbuch: Install, Scripting, Export

Systemd – Journal beschränken

Das Journal wurde mit Systemd neu eingeführt und soll die Log-Dateien /var/log/syslog ersetzen. Die Daten werden in Form von Binärdaten gespeichert und nicht in ASCII Format.

Um den Speicherplatz zu prüfen kann man das Journal Control journalctl verwenden.

journalctl --disk-usage

Will man den Speicherplatz reduzieren, kann man den Speicherplatz angeben oder die Zeit. Alte Einträge werden dann bereinigt.

journalctl --vacuum-size=128M
journalctl --vacuum-time=4weeks

Will man den Speicherplatz dauerhaft begrenzen, so kann einen Eintrag in der Kondiguration hinzu gefügen.

sudo vim /etc/systemd/journald.conf

Storage=auto
SystemMaxUse=128M

sudo systemctl restart systemd-journald

Der Speicherort von Journal liegt im Verzeichnis /run/log/journal/[UUID]/. Die Dateien werden im Binärformat gespeichert und können nicht mit einem Editor geöffnet werden. Mit dem Befehl „strings“ ist es möglich die Daten zu lesen.

sudo apt-get install binutils
strings /run/log/journal/[UUID]/system.journal

Nach jedem Neustart wird Journal gelöscht. Will man das Journal behalten, erstellt man eine Verzeichnis.

sudo mkdir -p /var/log/journal/

Nach einem Neustart wird das Journal im Verzeichnis /var/log/journal/ gespeichert. Wenn das Verzeichnis gelöscht wird, dann wird es wieder nach jedem Neustart gelöscht.

sudo rm -r /var/log/journal/

Die Anzahl der Neustart kann man sich anzeigen lassen.

journalctl --list-boots

Schutz vor Brute-Force Angriffen

Mit dem Tool „fail2ban“ kann man Brute-Force Angriffe abwähren. Dabei wird die IP Adresse der Angreifer aus den Log-Dateien ermittelt und in der Firewall (iptable) gesperrt.

Die Installation aus dem Ubuntu Repositories erfolgt mit.

sudo apt-get install fail2ban

Nach der Installation ist der Schutz von SSH automatisch aktiviert.

sudo vim /etc/fail2ban/jail.conf

[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1 192.168.178.0/24 office.example.de
bantime  = 1800
maxretry = 3
 
[ssh]
enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 3
 
[apache]
enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 6

Nach Änderungen muß der Dienst neu gestartet werden.

sudo service fail2ban restart

Eine Kontrolle der Firewall (iptables) erfolgt mit diesem Kommando. Einträge werden in dem Chain „fail2ban“ hinterlegt.

sudo iptables -L

Das Tool fail2ban-client zeigt die Jails an.

sudo fail2ban-client status
sudo fail2ban-client status apache

Sperre für eine IP Adresse wieder aufheben.

sudo fail2ban-client set apache unbanip 123.123.123.123

Netzwerkübersicht von offenen Ports

Wer wissen will, welche Netzwerkanfragen auf dem System lauschen, kann den Befehl lsof verwenden.

Das Kommando kann aus dem Ubuntu Repository installiert werden.

sudo apt-get install lsof

Mit dem Parameter -i kann man sich einen Port anzeigen lassen.

sudo lsof -i [udp|tcp]:[port]
sudo lsof -i tcp:80

Der Parameter +d liste die offenen Files aus dem Verzeichnis.

sudo lsof +d /var/log/

Der Parameter -c / -p liste die offenen Files von einem Prozess.

sudo lsof -c apache2
sudo lsof -p 1234

Der Parameter -u liste die offenen Files von einem Benutzer.

sudo lsof -u otto

Eine andere Alternative ist das Tool netstat. Der Parameter „-l“ zeigt die offenen Ports an und Parameter „-a“ alle Verbindungen.

netstat -nlp