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

Pfsense 2.2 mit Check_MK Agent

Seit Pfsense 2.2 funkioniert das Plugin für den Check_MK Agent nicht mehr, da bei FreeBSD die Bash entfernt wurde.

1. Inet Daemon erstellen

1.1. Datei /etc/rc.d/inetd erstellen

1.2. Quellecode einfügen

#!/bin/sh
#
# $FreeBSD$
#
 
# PROVIDE: inetd
# REQUIRE: DAEMON LOGIN cleanvar
# KEYWORD: shutdown
 
. /etc/rc.subr
 
name="inetd"
rcvar="inetd_enable"
command="/usr/sbin/${name}"
pidfile="/var/run/${name}.pid"
required_files="/etc/${name}.conf"
extra_commands="reload"
 
load_rc_config $name
run_rc_command "$1"

1.3. Ausführerechte ändern

chmod +x /etc/rc.d/inetd

1.4. Starten

/etc/rc.d/inetd start

2. Check_MK Agenten ersetzen

2.1 Quellcode ersetzen in Datei /usr/local/bin/check_mk_agent

2.2 Restart daemon

# service inetd restart

#!/bin/sh
# +------------------------------------------------------------------+
# |             ____ _               _        __  __ _  __           |
# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |
# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |
# |           | |___| | | |  __/ (__|   <    | |  | | . \            |
# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |
# |                                                                  |
# | Copyright Mathias Kettner 2014             mk@mathias-kettner.de |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk is free software;  you can redistribute it and/or modify it
# under the  terms of the  GNU General Public License  as published by
# the Free Software Foundation in version 2.  check_mk is  distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with-
# out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A
# PARTICULAR PURPOSE. See the  GNU General Public License for more de-
# ails.  You should have  received  a copy of the  GNU  General Public
# License along with GNU Make; see the file  COPYING.  If  not,  write
# to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,
# Boston, MA 02110-1301 USA.
 
# Author: Lars Michelsen <lm@mathias-kettner.de>
#         Florian Heigl <florian.heigl@gmail.com>
#           (Added sections: df mount mem netctr ipmitool)
 
# NOTE: This agent has beed adapted from the Check_MK linux agent.
#       The most sections are commented out at the moment because
#       they have not been ported yet. We will try to adapt most
#       sections to print out the same output as the linux agent so
#       that the current checks can be used.
 
# This might be a good source as description of sysctl output:
# http://people.freebsd.org/~hmp/utilities/satbl/_sysctl.html
 
# Remove locale settings to eliminate localized outputs where possible
export LC_ALL=C
unset LANG
 
export MK_LIBDIR="/usr/lib/check_mk_agent"
export MK_CONFDIR="/etc/check_mk"
export MK_TMPDIR="/var/run/check_mk"
 
 
# Make sure, locally installed binaries are found
PATH=$PATH:/usr/local/bin
 
# All executables in PLUGINSDIR will simply be executed and their
# ouput appended to the output of the agent. Plugins define their own
# sections and must output headers with '<<<' and '>>>'
PLUGINSDIR=$MK_LIBDIR/plugins
 
# All executables in LOCALDIR will by executabled and their
# output inserted into the section <<<local>>>. Please refer
# to online documentation for details.
LOCALDIR=$MK_LIBDIR/local
 
 
# close standard input (for security reasons) and stderr
#if [ "$1" = -d ]
#then
#    set -xv
#else
#    exec </dev/null 2>/dev/null
#fi
 
# Runs a command asynchronous by use of a cache file
 
echo '<<<check_mk>>>'
echo Version: 1.2.7i1
echo AgentOS: freebsd
 
 
 
osver="$(uname -r)"
is_jailed="$(sysctl -n security.jail.jailed)"
 
 
# Partitionen (-P verhindert Zeilenumbruch bei langen Mountpunkten)
# Achtung: NFS-Mounts werden grundsaetzlich ausgeblendet, um
# Haenger zu vermeiden. Diese sollten ohnehin besser auf dem
# Server, als auf dem Client ueberwacht werden.
 
echo '<<<df>>>'
# no special zfs handling so far, the ZFS.pools plugin has been tested to
# work on FreeBSD
if df -T > /dev/null ; then
    df -kTP -t ufs | egrep -v '(Filesystem|devfs|procfs|fdescfs|basejail)'
else
    df -kP -t ufs | egrep -v '(Filesystem|devfs|procfs|fdescfs|basejail)' | awk '{ print $1,"ufs",$2,$3,$4,$5,$6 }'
fi
 
# Check NFS mounts by accessing them with stat -f (System
# call statfs()). If this lasts more then 2 seconds we
# consider it as hanging. We need waitmax.
#if type waitmax >/dev/null
#then
#    STAT_VERSION=$(stat --version | head -1 | cut -d" " -f4)
#    STAT_BROKE="5.3.0"
#
#    echo '<<<nfsmounts>>>'
#    sed -n '/ nfs /s/[^ ]* \([^ ]*\) .*/\1/p' < /proc/mounts |
#        while read MP
#  do
#   if [ $STAT_VERSION != $STAT_BROKE ]; then
#      waitmax -s 9 2 stat -f -c "$MP ok %b %f %a %s" "$MP" || \
#    echo "$MP hanging 0 0 0 0"
#   else
#      waitmax -s 9 2 stat -f -c "$MP ok %b %f %a %s" "$MP" && \
#      printf '\n'|| echo "$MP hanging 0 0 0 0"
#   fi
#  done
#fi
 
# Check mount options.
# FreeBSD doesn't do remount-ro on errors, but the users might consider
# security related mount options more important.
echo '<<<mounts>>>'
mount -p -t ufs
 
# processes including username, without kernel processes
echo '<<<ps>>>'
COLUMNS=10000
if [ is_jailed = 0 ]; then
    ps ax -o state,user,vsz,rss,pcpu,command | sed -e 1d  -e '/\([^ ]*J\) */d' -e 's/*\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) */(\2,\3,\4,\5) /'
else
    ps ax -o user,vsz,rss,pcpu,command | sed -e 1d -e 's/ *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) */(\1,\2,\3,\4) /'
fi
 
 
# Produce compatible load/cpu output to linux agent. Not so easy here.
echo '<<<cpu>>>'
echo `sysctl -n vm.loadavg | tr -d '{}'` `top -b -n 1 | grep -E '^[0-9]+ processes' | awk '{print $3"/"$1}'` `sysctl -n kern.lastpid` `sysctl -n hw.ncpu`
 
# Calculate the uptime in seconds since epoch compatible to /proc/uptime in linux
echo '<<<uptime>>>'
  up_seconds=$(( `date +%s` - `sysctl -n kern.boottime  | cut -f1 -d\, | awk '{print $4}'`))
idle_seconds=$(ps axw | grep idle | grep -v grep | awk '{print $4}' | cut -f1 -d\: )
 
# second value can be grabbed from "idle" process cpu time / num_cores
echo "$idle_seconds $up_seconds"
 
 
# Platten- und RAID-Status von LSI-Controlleren, falls vorhanden
#if which cfggen > /dev/null ; then
#   echo '<<<lsi>>>'
#   cfggen 0 DISPLAY | egrep '(Target ID|State|Volume ID|Status of volume)[[:space:]]*:' | sed -e 's/ *//g' -e 's/:/ /'
#fi
 
 
# Multipathing is supported in FreeBSD by now
# http://www.mywushublog.com/2010/06/freebsd-and-multipath/
if kldstat -v | grep g_multipath > /dev/null ; then
    echo '<<<freebsd_multipath>>>'
    gmultipath status | grep -v ^Name
fi
 
 
# Soft-RAID
echo '<<<freebsd_geom_mirrors>>>'
gmirror status | grep -v ^Name
 
# Performancecounter Kernel
echo "<<<kernel>>>"
date +%s
forks=`sysctl -n vm.stats.vm.v_forks`
vforks=`sysctl -n vm.stats.vm.v_vforks`
rforks=`sysctl -n vm.stats.vm.v_rforks`
kthreads=`sysctl -n vm.stats.vm.v_kthreads`
echo "cpu" `sysctl -n kern.cp_time | awk ' { print $1" "$2" "$3" "$5" "$4 } '`
echo "ctxt" `sysctl -n vm.stats.sys.v_swtch`
echo "processes" `expr $forks + $vforks + $rforks + $kthreads`
 
# Network device statistics (Packets, Collisions, etc)
# only the "Link/Num" interface has all counters.
echo '<<<lnx_if:sep(58)>>>'
date +%s
if [ "$(echo $osver | cut -f1 -d\. )" -gt "8" ]; then
    netstat -inb | egrep -v '(^Name|plip|enc|pfsync|pflog|ovpns)' | grep Link | awk '{print"\t"$1":\t"$8"\t"$5"\t"$6"\t"$7"\t0\t0\t0\t0\t"$11"\t"$9"\t"$10"\t0\t0\t0\t0\t0"}'
else
    # pad output for freebsd 7 and before
    netstat -inb | egrep -v '(^Name|lo|plip)' | grep Link | awk '{print $1" "$7" "$5" "$6" 0 0 0 0 0 "$10" "$8" "$9" 0 0 "$11" 0 0"}'
fi
 
 
# State of LSI MegaRAID controller via MegaCli.
# To install: pkg install megacli
if which MegaCli >/dev/null ; then
    echo '<<<megaraid_pdisks>>>'
    MegaCli -PDList -aALL -NoLog < /dev/null | egrep 'Enclosure|Raw Size|Slot Number|Device Id|Firmware state|Inquiry'
    echo '<<<megaraid_ldisks>>>'
    MegaCli -LDInfo -Lall -aALL -NoLog < /dev/null | egrep 'Size|State|Number|Adapter|Virtual'
    echo '<<<megaraid_bbu>>>'
    MegaCli -AdpBbuCmd -GetBbuStatus -aALL -NoLog < /dev/null | grep -v Exit
fi
 
 
# OpenVPN Clients. 
# Correct log location unknown, sed call might also be broken
if [ -e /var/log/openvpn/openvpn-status.log ] ; then
    echo '<<<openvpn_clients:sep(44)>>>'
    sed -n -e '/CLIENT LIST/,/ROUTING TABLE/p' < /var/log/openvpn/openvpn-status.log  | sed -e 1,3d -e '$d' 
fi
 
 
if which ntpq > /dev/null 2>&1 ; then
   echo '<<<ntp>>>'
   # remote heading, make first column space separated
   ntpq -np | sed -e 1,2d -e 's/^\(.\)/\1 /' -e 's/^ /%/'
fi
 
 
# Checks for cups monitoring
#if which lpstat > /dev/null 2>&1; then
#  echo '<<<cups_queues>>>'
#  lpstat -p
#  echo '---'
#  for i in $(lpstat -p | grep -E "^(printer|Drucker)" | awk '{print $2}' | grep -v "@"); do
#    lpstat -o "$i"
#  done
#fi
 
# Heartbeat monitoring
#if which cl_status > /dev/null 2>&1; then
#  # Different handling for heartbeat clusters with and without CRM
#  # for the resource state
#  if [ -S /var/run/heartbeat/crm/cib_ro ]; then
#    echo '<<<heartbeat_crm>>>'
#    crm_mon -1 -r | grep -v ^$ | sed 's/^\s/_/g'
#  else
#    echo '<<<heartbeat_rscstatus>>>'
#    cl_status rscstatus
#  fi
#
#  echo '<<<heartbeat_nodes>>>'
#  for NODE in $(cl_status listnodes); do
#    if [ $NODE != $HOSTNAME ]; then
#      STATUS=$(cl_status nodestatus $NODE)
#      echo -n "$NODE $STATUS"
#      for LINK in $(cl_status listhblinks $NODE 2>/dev/null); do
#        echo -n " $LINK $(cl_status hblinkstatus $NODE $LINK)"
#      done
#      echo
#    fi
#  done
#fi
 
# Number of TCP connections in the various states
echo '<<<tcp_conn_stats>>>'
netstat -na | awk ' /^tcp/ { c[$6]++; } END { for (x in c) { print x, c[x]; } }'
 
 
# Postfix mailqueue monitoring
#
# Only handle mailq when postfix user is present. The mailq command is also
# available when postfix is not installed. But it produces different outputs
# which are not handled by the check at the moment. So try to filter out the
# systems not using postfix by searching for the postfix user.
#
# Cannot take the whole outout. This could produce several MB of agent output
# on blocking queues.
# Only handle the last 6 lines (includes the summary line at the bottom and
# the last message in the queue. The last message is not used at the moment
# but it could be used to get the timestamp of the last message.
#if which mailq >/dev/null 2>&1 && getent passwd postfix >/dev/null 2>&1; then
#  echo '<<<postfix_mailq>>>'
#  mailq | tail -n 6
#fi
 
#Check status of qmail mailqueue
#if type qmail-qstat >/dev/null
#then
#   echo "<<<qmail_stats>>>"
#   qmail-qstat
#fi
 
# check zpool status
#if [ -x /sbin/zpool ]; then
#   echo "<<<zpool_status>>>"
#   /sbin/zpool status -x | grep -v "errors: No known data errors"
#fi
 
# Memory Usage
# currently we'll need sysutils/muse for this.
if [ -x /usr/local/bin/muse ]
then
echo '<<<mem>>>'
# yes, i don't know sed well.
muse -k 2>/dev/null | sed 's/Total/MemTotal/' | sed 's/Free/MemFree/'
swapinfo -k 1K | tail -n 1 | awk '{ print "SwapTotal: "$2" kB\nSwapFree: "$4" kB" }'
fi
 
 
 
# Fileinfo-Check: put patterns for files into /etc/check_mk/fileinfo.cfg
if [ -r "$MK_CONFDIR/fileinfo.cfg" ] ; then
    echo '<<<fileinfo:sep(124)>>>'
    date +%s
    stat -f "%N|%z|%m" $(cat "$MK_CONFDIR/fileinfo.cfg")
fi

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

SSH Guard schütz vor Brute-Force Angriffen

Der SSH-Guard hilft Ihnen beim Schutz vor Brute-Force Angriffen auf den SSH Port. Dabei wird die Log-Datei „/var/log/auth.log“ überwacht und bei falschen Anmeldeversuchen wird die Remote IP-Adresse mit der Firewall (iptables) gesperrt.

Installation aus dem Ubuntu Repo.

sudo apt-get install sshguard

Nach der Installation werden folgende Einstellung in der Firewall iptables vorgenommen.

Erzeugen eines neuen Chain für SSH-Guard.

sudo iptables -N sshguard
sudo ip6tables -N sshguard

Jeder Netzwerkverkehr wird über diesen Chain geführt.

sudo iptables -A INPUT -j sshguard
sudo ip6tables -A INPUT -j sshguard

Der SSH-Guard wird als Dienst gestartet.

sudo service sshguard start

Ein Test mit falschen SSH Login solltem in der Firewall iptables einen neue Eintrag mit „DROP“ enthalten.

sudo ipconfig -L

Eine Whitelist wurde nach der Installation auch erstellt.

sudo vim /etc/sshguard/whitelist

10.0.0.0/8
192.168.178.0/24
office.example.de

Docker update Guacamole image

1. Update Guacamole images

sudo docker pull glyptodon/guacd:latest
sudo docker pull glyptodon/guacamole:latest

2. Remove old container

sudo docker rm some-guacd
sudo docker rm some-guacamole

3. Recreate new Guacamole container

sudo docker run --name some-guacd -d -p 4822:4822 glyptodon/guacd

sudo docker run --name some-guacamole --link some-guacd:guacd \
--link some-mysql:mysql \
-e MYSQL_DATABASE=guacamole_db \
-e MYSQL_USER=guacamole_user \
-e MYSQL_PASSWORD=some_password \
-d -p 8080:8080 glyptodon/guacamole

4. Copy the SQL update script from Guacamole container to host

docker cp some-guacamole:/opt/guacamole/mysql/schema/upgrade/upgrade-pre-0.9.8.sql .

5. Copy it into Docker MySQL container directory /tmp/

docker cp upgrade-pre-0.9.8.sql some-mysql:/tmp

6. Go into Docker MySQL container and import it into database

sudo docker exec -it some-mysql bash
mysql -u root -p guacamole_db < /tmp/upgrade-pre-0.9.8.sql

Weitere Informationen für die Installation: guac-dev.org/doc/

NTP Konfigurieren

Das Network Time Protocol (NTP) erlaubt es, das Datum und die Uhrzeit von dem System mit dem Internet zu synchronisieren. Für die Kommunikation wird UDP auf Port 123 verwendet. Der permanente Abgleich von Datum und Uhrzeit erfolgt mit einem NTP Dienst.

Die Installation erfolgt mit dem Befehl.

sudo apt-get install ntp

Der erste Abgleich kann mit dem Befehl ntpdate erfolgen. Eine Liste von NTP Servern findet man auf der Seite von www.pool.ntp.org.

ntpdate de.pool.ntp.org

Die Einstellungen für den NTP Dienst kann man so ändern.

sudo vim /etc/ntp.conf

server 0.de.pool.ntp.org
server 1.de.pool.ntp.org
server 2.de.pool.ntp.org
server 3.de.pool.ntp.org

Der NTP Dienst wird gestartet mit dem Befehl.

sudo service ntp start
sudo service ntp status

Die Serverliste kann man ausgeben mit dem Befehl.

ntpq -p

Systemd verwendet einen eigenen NTP Dienst.

timedatectl status

Sollte NTP nicht aktiviert sein, so kann man die Einstellung ändern.

sudo vim /etc/systemd/timesyncd.conf

[Time]
Servers=0.de.pool.ntp.org 1.de.pool.ntp.org

Nach der Aktivierung sollte NTP aktiv und synchronisiert sein.

sudo timedatectl set-ntp true
sudo timedatectl status