High Availability Storage GlusterFS

Mit GlusterFS kann man einen Hochverfügbaren Speicher aufbauen. Für den Versuch brauchen wir drei Server mit Ubuntu 18.04 (bionic). Ubuntu ist auf Laufwerk /dev/sda1 installiert und eine Datenpartition /dev/sdb1.

Wir erstellen eine GPT Partitionstabelle.

sudo parted /dev/sdb mklabel gpt

Legen ein Primäre Patition an.

sudo parted -a opt /dev/sdb mkpart primary ext4 0% 100%

Formatieren diese mit dem Dateisystem Ext4.

sudo mkfs.ext4 /dev/sdb1

Legen zwei Verzeichnisse an.

sudo mkdir /mnt/{data,gluster}

Fügen den Mount hinzu.

echo "/dev/sdb1 /mnt/data ext4 defaults 0 0" | sudo tee -a /etc/fstab

Unsere drei Server können wir in der Hosts Datei hinterlegen.

sudoedit /etc/hosts

192.168.56.101	hostA
192.168.56.102	hostB
192.168.56.103	hostC

Weiterlesen

DRBD – Distributed Replicated Block Device

Das Distributed Replicated Block Device (DRBD) ist ein verteiltes Blockdevice mit Spiegelung (RAID1) auf zwei unterschiedliche Server. Für die Installation verwenden wir zwei Server (hostA,hostB) mit Ubuntu 18.04 (bionic) auf Laufwerk (/dev/sda1) und einer Datenplatte (/dev/sdb1).

Wir setzten jeweil den Hostnamen auf hostA und hostB.

echo 'hostA' |sudo tee /etc/hostname

Wir können die Hostnamen auf beiden Servern hinterlegen.

sudo vim /etc/hosts

192.168.56.104 hostA
192.168.56.109 hostB

Die Installation von DRBD ist einfach.

sudo apt-get install drbd-utils

Jetzt sollen wir das Kernel Modul laden.

sudo modprobe drbd

Das DRBD Modul sollte erfolgreich geladen sein.

lsmod |grep drbd

Nach einem Neustart soll das Modul automatisch geladen werden.

echo 'drbd' | sudo tee -a /etc/modules

Beispiele für die Konfiguration liegen hier:

– /etc/drbd.d/global_common.conf
– /usr/share/doc/drbd-utils/examples/drbd.conf.example.gz

Wir legen uns eine neue Konfiguration auf beiden Servern an.

sudo vim /etc/drbd.d/sdb.res

resource r0 {
 
	protocol C;
 
        startup {
                wfc-timeout  15;
                degr-wfc-timeout 60;
        }
 
	on hostA {
		device /dev/drbd0;
		disk /dev/sdb1;
		address 192.168.56.104:7788;
		meta-disk internal;
	}
	on hostB {
		device /dev/drbd0;
		disk /dev/sdb1;
		address 192.168.56.109:7788;
		meta-disk internal;
	}
}

Wir erzeugen auf beiden Servern ein Meta-Device.

sudo drbdadm create-md r0

Und starten den Service auf beiden Servern.

sudo systemctl start drbd.service

Bis jetzt sieht alles gleich aus, ab jetzt arbeiten wir nur auf Host A.

cat /proc/drbd

Wir machen Server (hostA) zum Primary.

hostA$ sudo drbdadm -- --overwrite-data-of-peer primary all

Jetzt werden die Daten von hostA zu hostB übertragen.

hostA$ watch -n1 cat /proc/drbd

Wir erzeugen das Filesystem.

hostA$ sudo mkfs.ext4 /dev/drbd0

Und mounten das DRBD Device in unsere Filesystem.

hostA$ sudo mkdir /mnt/data
hostA$ sudo mount -t ext4 /dev/drbd0 /mnt/data/

sudo drbd-overview

Damit ist die Installation beendet.

Weiterlesen

Docker mit Cockpit steuern

Mit dem Cockpit hat man die Möglichkeit, die Auslastung eines Server zu prüfen. Über zusätzliche Module kann man auch Docker steuern.

Der Cockpit ist Teil von Ubuntu 18.04 (bionic).

sudo apt install -t bionic-backports cockpit cockpit-docker

Damit der Benutzer „USER“ auch Zugriff auf Docker erhält, muss er in die Gruppe von Docker hinzugefügt werden.

sudo usermod -aG docker USER

Der Zugriff auf das Cockpit erfolgt per Internet unter Port 9090.

http://localhost:9090/

Quelle: UbuntuBackports

Docker mit Proxy

Kommt Docker in einer Umgebung mit HTTP Proxy Server zum Einsatz, so muss der Proxy vor dem Start von Docker in den Umgebungsvariablen gesetzt werden.

Dazu erweitern wir Systemd von Docker um ein Drop-In.

Wir legen ein Verzeichnis an in dem das Drop-In hinterlegt werden soll.

sudo mkdir /etc/systemd/system/docker.service.d

Wir erzeugen eine Drop-In für die Proxy Einstellungen.

sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://otto:pass123@proxy-server:8080/"

Der Aufbau von der Proxy URL lautet http://[user]:[password]@[hostname]:[port]/.

Diese Werte können gesetzt werden.

HTTP_PROXY „http://127.0.0.1:8080“
HTTPS_PROXY „https://127.0.0.1:8080“
NO_PROXY „*.test.example,*.example“

Festplatte kopieren

Aktuelle Festplatten haben einen Selbstmonitoring (S.M.A.R.T) eingebaut. Mit den SMART-Tools kann man die Informationen abfragen.

sudo apt install smartmontools

Nach der Installtion können wir die akutellen Werte von SMART abfragen.

sudo smartctl -A /dev/sda

Meine Festplatte zeigt an, das es zu einem Fehler kommen wird. So ein Hinweis sollte ein Weckruf sein. Es wird höchste Zeit, die Festplatte zu gegen ein neueres Modell zu tauschen.

Wenn man eine Festplatte kopieren möchte, kann man natürlich dd if=/dev/sda of=/dev/sdb verwenden. Besser geht es mit dem Programm ddrescue.

sudo apt install ddrescue

Wir kopieren von der Quelle /dev/sda auf das Ziel /dev/sdb.

sudo ddrescue /dev/sda /dev/sdb

Quellen: SMART Wiki, Wiki gddrescue

Ungenutzte Pakete entfernen

Über die Zeit können sich unter Ubuntu einige überflüssige Paket ansammeln. Mit dem Programm Deborphan kann man die verweisten Bibliotheken anzeigen.

Die Installation ist mit einem Kommando erledigt.

sudo apt install deborphan

Mit dem Aufruf werden alle Paket ohne Verwendung angezeigt.

deborphan

Es gibt auch ein Programm zu Löschung dieser Pakete.

sudo orphaner

Kernel Module entfernen und RAM sparen

Mit einer kleinen Änderung kann man „etwas“ Speicher einsparen. Wer einen Raspberry Pi mit dem Ubuntu Image betreibt, kann ein paar Megabyte RAM sparen. Im normalen Betrieb von Ubuntu spiel diese Änderung keine Rolle.

In der Datei initramfs.conf wird einen Wert geändert.

sudo vim /etc/initramfs-tools/initramfs.conf

Den Defaultwert wird von MODULES=most in MODULES=dep geändert.

Anschließend wird ein Update des initramfs-Image erstellt.

Wir können es für den aktuellen Kernel erstellen.

sudo update-initramfs -u

Oder für alle vorhandenen Kernel ein neues Image erstellen.

sudo update-initramfs -uk 'all'

Nach einem Neustart werden nur alle notwendigen Kernel Module geladen.

Ubuntu Mainline Kernel 5.0.4 installation

Für Ubuntu gibt es die aktuellen Kernel als Package. Wir wollen den aktuellen Kernel 5.0.4 auf einem Xenial Xerus (Ubuntu 16.04) mit 64 Bit CPU installieren. Im Verzeichnis von Ubuntu finden wir weitere Plattformen (AMD64, i386, armhf, arm64, usw).

Für die Installion brauchen wir die Pakete für den Kernel (linux-image-unsigned) und die Modulle (linux-modules).

Mit diesem Script installieren wir Kernel 5.0.4 auf einem Ubuntu mit 64Bit CPU.

#!/bin/sh
URL=https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.0.4/
KERNEL=linux-image-unsigned-5.0.4-050004-generic_5.0.4-050004.201903231634_amd64.deb
MODULES=linux-modules-5.0.4-050004-generic_5.0.4-050004.201903231634_amd64.deb
 
wget -P /tmp $URL/$MODULES
wget -P /tmp $URL/$KERNEL
 
sudo dpkg -i /tmp/$MODULES
sudo dpkg -i /tmp/$KERNEL

Nach dem Neustart wird der Kernel 5.0.4 verwendet, obwohl Ubuntu 16.04 (LTS) nur den Kernel 4.15 (linux-generic) enthält. Achtung, der Mainline Kernel 5.0.4 erhält keine Sicherheitspatches. Die Portierung von Sicherheitspatches in Xenial erfolgt nur im offiziellen Kernel mit Long Term Support (LTS).

Quelle: Kernel Wiki, Mainline Kernel, Changelog Kernel 5.0

Dateien verschlüsseln

Wenn man Dateien in die Cloud überträgt, sollte man die Daten verschlüsseln. Mit GoCryptFS werden die Inhalte und Dateinamen verschlüsselt.

Die Anwendung ist schnell installiert.

sudo apt install gocryptfs

Jetzt sollte GoCryptFS arbeiten.

gocryptfs -version

Wir legen zwei Verzeichnisse für die Daten an.

mkdir cipher plain

Zuerst müssen wir die Verschlüsslung initialisieren.

gocryptfs -init cipher

Jetzt kann man ein Mount im Verzeichnis ./plain/ durchführen.

gocryptfs cipher plain

Die verschlüsselten Daten liegen im ./cipher/ Verzeichnis und die entschlüsselten Daten im ./plain/ Verzeichnis.

Als Test können wir die Datei „text.txt“ mit dem Inhalt „Hallo“ erzeugen.

echo "Hallo" > ./plain/test.txt

Im ./cipher/ Verzeichnis liegen jetzt drei Dateien (gocryptfs.conf,
gocryptfs.diriv, 911XXX_XYZ).

ls -l ./cipher/

Mit Umount kann man das Dateisystem wieder trennen.

SSH mit Zwei Faktor Authentifizierung

Wir möchten unsere SSH Zugang mit einer Zwei Faktor Authentifizierung absichern.

Zur Erzeugung des zweiten Faktor verwenden wir ein Smartphone mit der App FreeOTP oder Google Authenticator. Diese Apps generieren ein Token, welcher nur für eine bestimmte Zeit gültig ist. Damit wir der SSH Zugang zusätzlich abgesichert.

Zuerst müssen wir das SSH Modul für Google Authenticator installieren.

sudo apt install libpam-google-authenticator

Jetzt müssen wir den Server mit der App verbinden. Dazu rufen wir die Anwendung als Benutzer auf.

google-authenticator

Den QS Code können wir mit dem Smartphone in der App Google Authenticator einlesen. Die Emergency Codes sollten wir uns an einem sicheren Ort speichern.

Die Frage können wir mit Yes, Yes, Yes, No, Yes beantworten.

Do you want authentication tokens to be time-based (y/n) y
Do you want me to update your "/home/user/.google_authenticator" file (y/n)? y
 
The app provides you with a secret key, verification code, and recovery codes. Keep these in a secure, safe location. The recovery codes are the only way to access your server if you lose your mobile phone.
 
Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y
By default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). 
Do you want to do so? (y/n) n
 
If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y

Das PAM Modul muss noch konfiguriert werden.

sudo vim /etc/pam.d/sshd

Ende der Datei fügen wir eine Zeile hinzu.

auth required pam_google_authenticator.so

In den Einstellungen vom SSH-Server müssen ggf. noch Einstellunge geändert werden.

sudo vim /etc/ssh/sshd_config

Prüfen Sie ob diese Werde gesetzt sind.

ChallengeResponseAuthentication yes
PasswordAuthentication no

Nach dem Neustart vom SSH-Server sollte die Zwei Faktor Authentifizierung arbeiten.

sudo systemctl restart sshd.service