Merker: acme.sh

Um Zertifikate für Dienste zu erstellen, die keinen Webserver mitbringen, kann man auch wie folgt erstellen. Dazu ist es nötig, dass der Domainprovider bzw. DNS Anbieter eine Schnittstelle für die DNS-Challenge mitbringt. INWX tut dies :-)

Die unterstützten Provider kann man auf Github nachlesen: https://github.com/acmesh-official/acme.sh/tree/master/dnsapi

Erstellen kann man dann ein Zertifikat wie folgt:
(Pfade sollten natürlich vorhanden sein)

acme.sh \
  --issue \
  --cert-home /Users/knut/Downloads/SSL \
  --dns dns_inwx \
  -d amsel.systemtechnics.de \
  -d drossel.systemtechnics.de

Erneuern mit folgendem Befehl:

acme.sh \
  --renew \
  --cert-home /Users/knut/Downloads/SSL \
  --dns dns_inwx \
  -d amsel.systemtechnics.de \
  -d drossel.systemtechnics.de

Alle bestehenden Zertifikate (die unter /Users/knut/Downloads/SSL existieren ) erneuern:

acme.sh \
  --renew-all \
  --cert-home /Users/knut/Downloads/SSL \
  --dns dns_inwx 

Linux – Meldung vor Passwort Prompt ausgeben

Man kann unter Linux die Datei /etc/issue.net dazu verwenden, vor dem eigentlichen Passwort Prompt, eine Meldung auszugeben. Diese kann z.B. Nutzer warnen ein Login durchzuführen sofern sie nicht dazu berechtigt sind.

Die Umsetzung ist denkbar einfach. Zuerst müssen wir uns natürlich korrekt auf dem System anmelden und im Anschluss die Datei /etc/issue.net editieren.

pico /etc/issue.net

Dort kann man die gewünschte Meldung eingeben und entsprechend speichern. Im Anschluss müssen die den SSH-Daemon dazu bringen diese auch zu verwenden. Dazu editieren wie die Datei /etc/ssh/sshd_config und suchen nach der Zeile Banner

pico /etc/ssh/sshd_config

Diese dann wie folgt einstellen. (In der Regel ist die Zeile auskommentiert)

# no default banner path

Banner /etc/issue.net

Nach dem Neustart des SSH-Daemon wird bei der Anmeldung vor dem Passwort Prompt die Meldung ausgegeben. (Siehe Bild oben)

service ssh restart

Bei der Authentifizierung mittels SSH-Keys (welches ich empfehle und bevorzuge), gibt es natürlich kein Passwort Prompt. Die Meldung wird dann aber trotzdem ausgegeben.

PGP Alternative age

Bei Twitter bin ich auf ein Verschlüsselungsprogramm (age) aufmerksam geworden. Verschlüsselt wird wie bei PGP auch über ein Public-/Secret- Key Verfahren.

Die Installation und Handhabung ist recht einfach. Ich möchte hier ein paar davon (für OSX) beschreiben. Wer es genauer nachlesen möchte kann dies gerne unter https://github.com/FiloSottile/age tun.

Die Installation mittels brew ist denkbar einfach. Mit folgendem Befehl wird age und age-keygen installiert.

brew install age

Zuerst muss ein geheimer und öffentlicher Schlüssel generiert werden. Dies funktioniert wie folgt:

age-keygen > key.txt

Wer seinen privaten Schlüssel mit einem Passwort versehen möchte kann dies mit folgenden Befehl tun. Der öffentliche Schlüssel der dabei angezeigt wird sollte man sich anschließend in einer Datei merken!

age-keygen | age -p > key.age

Nun hat man eigentlich schon alles was man benötigt, dass einem eine Verschlüsselte Datei zugesendet werden kann. Das Public-Key-Verfahren beruht ja darauf, dass jemand mit meinem öffentlichen Schlüssel für mich etwas verschlüsselt, was nur ich mit meinem privaten Schlüssel wieder entschlüsseln kann.

Wer selbst eine Domain betreibt und die dort Möglichkeit besitzt einen TXT Eintrag zu erstellen, der kann seinen öffentlichen Schlüssel auch dort ablegen. Mein aktueller Schlüssel liegt im TXT Eintrag zu knut.systemtechnics.de .

Diesen kann man mit dem Befehl dig auch ganz einfach aus der Konsole auslesen.

dig +short TXT knut.systemtechnics.de | tr -d \"

Kommen wir nun zum eigentlichen, dem verschlüsseln einer Datei. Die Einfachste Variante ist mit age eine Datei zu verschlüsseln und diese mit einem Passwort zu versehen. Dies funktioniert die folgt:

age -p meine-datei.txt > meine-datei.age

Nach der Eingabe des Passworts (zweimal) ist die Datei verschlüsselt.

Zum entschlüsselt (mit einem Passwort) kann folgender Befehl verwendet werden:

age -d meine-datei.age > neue-datei.txt

Nach Eingabe des Passwortes, welches beim Verschlüsseln verwendet wurde, ist die Datei wieder im Klartext. Im Beispiel auf dem Bild habe ich dieser einen anderen Dateinamen vergeben. (Ohne Umleitung in eine Datei wir der Standard Output verwendet)

Nun aber zum eigentlichen Public-Key Verfahren. Dazu muss derjenige meinen öffentlichen Schlüssel zum verschlüsseln verwenden. Entweder hat er diesen bei mir aus dem DNS ausgelesen (siehe oben dig) oder direkt übermittelt bekommen.

Verschlüsseln wir die Datei von oben nochmals mit meinem öffentlichen Schlüssel:

cat meine-datei.txt | age -a -e -r age1486ysemz2yg9zasd8wrdxz3kjpjv7jl7fdqpvgm3vag40jv0n5mskmcgwm > meine-datei.age 

Die Datei meine-datei.age ist nun verschlüsselt und kann mir gefahrlos übermittelt werden. Nur ich kann diese wieder entschlüsseln.

Das Entschlüsseln geht ebenfalls sehr einfach. Datei wird mein geheimer Schlüssel benötigt und funktioniert wie folgt:

age -i Keys/age-key.txt -d meine-datei.age > neue-datei.txt

Die Datei ist nun wieder entschlüsselt. Auf ein Passwort habe ich bei mir im geheimen Schlüssel verzichtet. Ich bin der Meinung, dass wenn jemand an diesem auf meinem verschlüsselten MacBook kommt, der kann auch jeweils die Originale auch direkt anschauen.

Wer mag kann öffentliche Schlüssel der „Verschlüsselungspartner“ natürlich auch in Umgebungsvariablen speichern um diese öfters zu verwenden.

echo "export Karsten_AGE_KEY=age1486ysemz2yg9zasd8wrdxz3kjpjv7jl7fdqpvgm3vag40jv0n5mskmcgwm" >> /Users/knut/.bashrc

Nutzen kann man dies dann z.B. wie folgt:

cat meine-datei.txt | age -a -e -r $Karsten_AGE_KEY > meine-datei.age 

Auch an mehrere „Verschlüsselungspartner“ gleichzeitig kann man Dateien verschlüsseln. In diesem Beispiel kann jeweils Karten, Martin und German mit den jeweiligen geheimen Schlüsseln diese entschlüsseln:

cat meine-datei.txt | age -a -e -r $Karsten_AGE_KEY -r $Martin_AGE_KEY -r $German_AGE_KEY > meine-datei.age 

Auch direkt meinen Key mittels dig auslesen und gleich verschlüsseln ist möglich:

cat meine-datei.txt | age -a -e -r $(dig +short TXT knut.systemtechnics.de | tr -d \") > meine-datei.age 

…und da ist sicherlich noch vieles mehr möglich.

OSX – Fingerabdruck im Terminal verwenden

Um den Fingerabdruck zur Authentifizierung im Terminal zu verwenden ist die Bearbeitung der Datei /etc/pam.d/sudo notwendig.

Am einfachsten ist es mit folgenden zwei Zeilen:

sudo su

Es wird nach nach dem Passwort des Administratornutzers gefragt. Nach Eingabe des Passwortes befindet sich das Terminal im „root“-Modus.

Mit dem zweiten Befehl wird in die Datei /etc/pam.d/sudo die Zeile auth sufficient pam_tid.so eingefügt. Evtl. muss der Zugriff in einem Sicherheitsfenter zusätzlich erlaubt werden.

cp /etc/pam.d/sudo /tmp/sudo.$(date +"%Y%m%d") && awk 'NR==2{print "auth       sufficient     pam_tid.so"}3' /tmp/sudo.$(date +"%Y%m%d") > /etc/pam.d/sudo && rm -f /tmp/sudo.$(date +"%Y%m%d") 

Anschließend werden wir, sofern wir im Terminal höhere Rechte (su / sudo) benötigen mit der klassischen Fingerabdruck-Abfrage begrüßt.

open DNS resolver

Durch schlecht konfigurierte Router/Firewalls ist es unter Umständen möglich, so genannte „DNS Amplification Attack“ durchzuführen. Dabei werden lokale DNS Server dazu verwendet einen  Denial-of-Service-Angriff (DOS) durchzuführen. (Genauer zum nachlesen KLICK)

Ob die eigene IP Adresse für solche Attacken „empfänglich“ ist, kann man unter Linux/OSX einfach mit dem Befehl DIG prüfen.

dig +short resolver.systemtechnics.de TXT @www.xxx.yyy.zzz

Die IP Adresse www.xxx.yyy.zzz ist natürlich durch die zu prüfende (eigene) IP-Adresse zu ersetzen. Ist ein offener DNS Vorhanden, dann wird der Text „open resolver detected“ ausgegeben. Wenn die Firewall korrekt arbeitet, dann erscheint eine Fehlermeldung (Siehe Bild)

Man kann natürlich auch Web-Dienste, wie etwa https://openresolver.com/ verwenden, um dies zu prüfen.

ESXI Lieblings CLI Befehle

Zuerst meinen öffentlich SSH-Key hinzufügen. Das macht den Zugriff auf die Root-Konsole wesentlich einfacher:

echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCw70ZfkRAD4/EWSt9pN2agjEnY6eO16+pP+jKhZCtI621D80zeQP3MYCC88HLmojEnGeZg1QO7XWeObpqoHsYnJYT6uoxszkzQCUXuMP1n2pPSMnqb4MBZQauSfk8pDVF/riA5YcTQ7b2oUSuSzHPmURqELdVSv5EFek9HT9TdZf1NhEr2R8Z4gO9tgWVBndbrtgirk0Tyj+k2ctyiyGwkYHIQKRITjW1tmGwrl/TQAj5s2431yN8eL4YNWlCbv7uoS3PlIb3d5qjEZ4WDU4Rxm8MF3L+20emZ55WXDSEGj8qaKATsoN7q9bubrK7aIXQZomei/XchtqCkwMFGG/Fl herter" >> /etc/ssh/keys-root/authorized_keys 

SSH einschalten. (Das geht natürlich nur von der Konsole oder mittels IPMI aus.

vim-cmd hostsvc/enable_ssh 

Alle virtuellen Maschinen auflisten

vim-cmd vmsvc/getallvms

Derzeit laufende virtuelle Maschinen kann man mit folgendem Befehl auflisten

esxcli vm process list

Virtuelle Maschine starten

vim-cmd vmsvc/power.on {VMID}

Virtuelle Maschine herunterfahren bzw. hart ausschalten

vim-cmd vmsvc/power.shutdown {VMID}
vim-cmd vmsvc/power.off {VMID}

Viele weitere Parameter von vim-cmd gibt es mit

vim-cmd help

Wartungsmodus einschalten bzw. ausschalten

vim-cmd hostsvc/maintenance_mode_enter
vim-cmd hostsvc/maintenance_mode_exit

Host herunterfahren

poweroff

Host neustarten

reboot

Duply ohne Verschlüsselung verwenden

In manchen Fällen macht es Sinn, das Backup mit „Duply“ unschlüsselt auf den Backupserver zu sichern.
Dazu muss in der entsprechenden Konfigurationsdatei folgendes vorgenommen werden:

GPG_KEY='disabled'

und (hinzufügen von –no-encryption) :

Anschließend werden die zukünftigen Backups unverschlüsselt abgelegt. Die Übertragung sollte natürlich weiterhin mit sftp durchgeführt werden.

DUPL_PARAMS="$DUPL_PARAMS --full-if-older-than $MAX_FULLBKP_AGE --no-encryption"

Python-Paramiko Versionsproblem

Mit dem Modul Python-Paramiko kann man via Python SSH Befehle auf einem anderen Host ausführen lassen.
Bei manchen Scripten, wie zum Beispiel Duply, werden neuere Versionen verlangt. Es kommt dann zu folgenden Fehlermeldungen:

/usr/lib/python2.7/dist-packages/paramiko/ecdsakey.py:164: CryptographyDeprecationWarning: Support for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_point
 self.ecdsa_curve.curve_class(), pointinfo
/usr/lib/python2.7/dist-packages/paramiko/kex_ecdh_nist.py:39: CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.

Abhilfe schafft das Python Modul aus den Buster Backports zu verwenden. Dazu muss entsprechend die sources.list bearbeitet werden.

pico /etc/apt/sources.list

Und eine weitere Zeile (sofern nicht schon vorhanden) hinzugefügt werden:

deb http://ftp.debian.org/debian buster-backports main

Wie immer müssen dann die Sourcen neu geladen werden und anschließend kann man von den Backports das aktuellere Modul installieren.

apt update && apt -t buster-backports install "python-paramiko"

openVPN Konfiguration inkl. CA, Cert und Key

Wenn ich von einer Securepoint UTM die SSL-VPN Konfiguration herunter lade, dann beinhaltet diese neben der VPN Konfigurationsdatei noch drei weitere Dateien. Diese sind das Zertfikat von der CA, das Zertifikat des Nutzers und der Schlüssel des Nutzers.

Manche Geräte können mit diesen unterschiedlichen Dateien nicht umgehen, weil z.B. kein richtiges Dateisystem vorhanden ist. Apple iPhone/iPad Apps wären z.B. so ein Fall.

Will man dort SSL-VPN (openVPN) verwenden, so muss die CA, Cert und Key direkt in der openVPN Konfigurationsdatei vorhanden sein.
Für diesen Fall habe ich ein kleines Script geschrieben. (Etwas abgewandelt welches ich im Securepoint Forum gefunden habe.

Dies Script geht davon aus, dass die Konfigurationsdaten entpackt in einem Verzeichnis liegen. Zu finden sind die Dateien in der Regel im „Data“ Verzeichnis wenn man das ZIP entpackt oder das TBLK-Verzeichnis umbenannt hat.

Hier nun aber erst mal das Script. Als ersten Parameter wird der Dateiname des openVPN-Files erwartet. Zweiter Parameter wie die neue Konfigurationsdatei benannt werden soll. Der dritte und letzte Parameter gibt an, ob die Originaldateien gelöscht oder behalten werden sollen.

Hier nun aber erst mal das Script:

#!/bin/sh
# Autor: Knut Herter
#
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] ; then
		echo "\nKeine Parameter angegeben!"
		echo ""
 		echo "Parameter 1: <Dateiname>(ohne .ovpn)"
 		echo "Parameter 2: <Neuer Dateiname>(ohne .ovpn)"
 		echo "Parameter 3: <0 oder 1> 1 = Origignaldateien löschen"
		echo "\n"
 		exit 1
fi

for dat in ".ovpn" "-ca.pem" "-cert.pem" "-cert.key"; do
	if [ ! -f "$1$dat" ]; then
	    echo "$1$dat nicht vorhanden"
	    fehler=1
	fi
done

if [ $fehler ]; then echo "\nFehler, breche die Verarbeitung ab." 
 exit 1  
fi

grep -F -v -e "ca" -e "cert" -e "key" "$1".ovpn > $2.ovpn
{
echo '<ca>'
cat "$1"-ca.pem 
echo '</ca>'
echo '<cert>'
cat "$1"-cert.pem 
echo '</cert>'
echo '<key>'
cat "$1"-cert.key 
echo '</key>'
} >> $2.ovpn

if [ "$3" = "1" ]; then
for dat in ".ovpn" "-ca.pem" "-cert.pem" "-cert.key"; do
	rm -f $1$dat
done
fi

Anschließend kann man die erzeuge .ovpn-Datei z.B. auf seinem iPhone/iPad nutzen um sich mit dem SSL-VPN Server zu verbinden. 

Auch in Tunnelblick oder dem originalen Securepoint VPN Client kann diese Datei verwendet werden.

PHP 7.x für ispconfig3

Hier eine kleine schnelle Roadmap für die Installation weiterer PHP Versionen unter ispConfig3

apt -y install build-essential nano net-tools autoconf
apt install libfcgi-dev libfcgi0ldbl libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev libxml2-dev libbz2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libfreetype6-dev libkrb5-dev libpq-dev libxml2-dev libxslt1-dev libzip-dev libsqlite3-dev libonig-dev
ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a
cd /usr/include
ln -s x86_64-linux-gnu/curl
cd /tmp
wget https://www.php.net/distributions/php-7.4.0.tar.gz
tar xfz php-7.4.0.tar.gz
cd php-7.4.0
./configure --prefix=/opt/php-7.4 --with-pdo-pgsql --with-zlib-dir --with-freetype --enable-mbstring --enable-soap --enable-calendar --with-curl --with-zlib --enable-gd --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --with-zip --with-pdo-mysql --with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-jpeg --with-openssl --with-fpm-user=www-data --with-fpm-group=www-data --with-libdir=/lib/x86_64-linux-gnu --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --with-xmlrpc --with-xsl --enable-opcache --enable-intl --with-pear --enable-fpm
make
make install
cp php.ini-production /opt/php-7.4/lib/php.ini
cp /opt/php-7.4/etc/php-fpm.conf.default /opt/php-7.4/etc/php-fpm.conf
cp /opt/php-7.4/etc/php-fpm.d/www.conf.default /opt/php-7.4/etc/php-fpm.d/www.conf
sed -i 's/;pid = run\/php-fpm.pid/pid = run\/php-fpm.pid/g' /opt/php-7.4/etc/php-fpm.conf
nano /lib/systemd/system/php-7.4-fpm.service

Und folgendes eintragen

[Unit]
	Description=The PHP 7.4 FastCGI Process Manager
	After=network.target

	[Service]
	Type=simple
	PIDFile=/opt/php-7.4/var/run/php-fpm.pid
	ExecStart=/opt/php-7.4/sbin/php-fpm --nodaemonize --fpm-config /opt/php-7.4/etc/php-fpm.conf
	ExecReload=/bin/kill -USR2 $MAINPID

	[Install]
	WantedBy=multi-user.target

Danach geht es wieder klassisch in der Shell weiter.

systemctl enable php-7.4-fpm.service
systemctl daemon-reload
systemctl start php-7.4-fpm.service
echo zend_extension=opcache.so >> /opt/php-7.4/lib/php.ini
cd /opt/php-7.4/etc
../bin/pecl -C ./pear.conf update-channels
../bin/pecl -C ./pear.conf install memcached
echo extension=memcached.so >> /opt/php-7.4/lib/php.ini
cd /opt/php-7.4/etc
../bin/pecl -C ./pear.conf update-channels
../bin/pecl -C ./pear.conf install apcu
echo extension=apcu.so >> /opt/php-7.4/lib/php.ini
service apache2 restart
systemctl start php-7.4-fpm.service

In iscConfig3 geht es dann unter „System“ -> „Additional PHP Versions“ weiter. Dort auf „Add…“ klicken und einen sinnvollen Namen, z.B. PHP 7.4, eingeben.

Im Registertab „FastCGI Settings“ kommt folgendes in die beiden Zeilen:

/opt/php-7.4/bin/php-cgi
/opt/php-7.4/lib

In die Registerkarte „PHP FPM Setting“ kommt dann:

php-7.4-fpm
/opt/php-7.4/lib
/opt/php-7.4/etc/php-fpm.d

Anschliessend kann man die PHP Version in der Site-Konfiguration des Kunden anpassen.