„Let’s Encrypt“ mit vsftpd und anderen

Ich habe einen vsftpd laufen und der sollte auch ein Let’s Encrypt Zertifikat für sicheres FTP bekommen.

Ich habe einen vhost im Apache für die Domain angelegt, unter der ich den vsftpd erreichbar mache und dann über den certbot das Zertifikat erstellen lassen. Das klappt auch alles gut, aber der Cronjob für das Renewal der Certifikate startet bei einer Aktualisierung nur den Apache neu und nicht den vsftpd. Und jedes Mal den vsftpd mitneustarten ist ja auch unschön. Daher habe ich einen eigenen Cronjob dafür gebaut.

Aber erst mal die vsftpd config:

rsa_cert_file=/etc/letsencrypt/live/[MYDOMAIN]/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/[MYDOMAIN]/privkey.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

Diese Zeilen einfach am Ende hinzufügen und den vsftpd neu starten.

Und das ist der dazugehörige Cronjob.

1 6,18 * * * /usr/local/sbin/certbot-auto certonly --webroot -n -d [MYDOMAIN] --post-hook "/etc/init.d/vsftpd restart" >/dev/null 2>/dev/null

Ich habe dafür gesorgt, dass er 5 Minuten vor dem regulären Cronjob läuft, damit dieses Zertifikat für [MYDOMAIN] auch tatsächlich von diesem Cron erneuert wird. Die Option -d kann auch mehrfach angegeben werden, falls das Zertifikat auf mehrere Domains lauten soll.
Das Plugin --webroot ist in meinem Fall ausreichend. Wenn man aber keinen eigenen Webserver betreibt, kann man auch mit --standalone einen temporären starten, der dann die Authentifizierungen gegenüber Let’s Encrypt übernimmt.

Ähnlich kann man das natürlich auch mit Zertifikaten für Mailserver und andere machen.

Advertisements
„Let’s Encrypt“ mit vsftpd und anderen

Let’s encrypt!

Ich habe meine Seiten auf meinem Debian/Apache Webserver mit SSL verschlüsselt und dabei auf die kostenlose CA Let’s Encrypt! zurückgegriffen.

Es gibt viele Wege, wie man diese CA benutzen kann, aber der certbot ist echt der Hammer. So einfach geht es:

cd /usr/local/sbin
wget https://dl.eff.org/certbot-auto
chmod 750 certbot-auto
certbot-auto --apache

Danach wird man durch alle Schritte geführt und kann inerhalb kürzester Zeit funktionierende SSL Zertifikate nutzen, die sich vollautomatisch installieren.

Die Zertifikate sind zwar nur drei Monate gültig, aber mit certbot installierte Zertifikate lassen sich über diesen automatisch aktualisieren, so dass man sich nie wieder drum kümmern muss. Ein Eintrag wie dieser im Crontab von root reicht:

1 6,18 * * * /usr/local/sbin/certbot-auto renew --post-hook "apache2ctl restart" &>/dev/null

Lasst uns gemeinsam das Internet sicherer machen und „Let’s encrypt!

letsencrypt
https://eliyah.co.il/ ist SSL gesichert!
Let’s encrypt!

Bandbreite anzeigen

Die aktuell genutzte Bandbreite eines Linux Systems wird ermittelt als übertragene Bytes pro Zeitabstand. Einen „aktuellen“ Wert zum Auslesen gibt es nicht, man muss also die Bandbreite aus zwei Deltawerten übertragener Bytes berechnen. Ich habe ein Script gefunden und etwas erweitert. Es zeigt die Bandbreite für alle Interfaces in Kbits und Mbits an. Das Script ist simpel gehalten und ohne Parameter, die irgend etwas steuern. Aber das kann man ja nachträglich einbauen. Wenn man will.

#!/bin/bash                                                                          

intervalo=2
info="/sys/class/net/"
cd $info
while true; do
for interface in eth*
do
  eval rx1$interface=`cat $info$interface/statistics/rx_bytes`
  eval tx1$interface=`cat $info$interface/statistics/tx_bytes`
done
  sleep $intervalo
for interface in eth*
do
  eval rx2$interface=`cat $info$interface/statistics/rx_bytes`
  eval tx2$interface=`cat $info$interface/statistics/tx_bytes`
done
clear
date
for interface in eth*             
do
  echo $interface
  echo ---- 
  rx1=$(eval echo \${rx1$interface})
  rx2=$(eval echo \${rx2$interface})
  tx1=$(eval echo \${tx1$interface})
  tx2=$(eval echo \${tx2$interface})
  echo RX: $((($rx2-$rx1)/($intervalo*1024))) Kbps
  echo RX: $((($rx2-$rx1)/($intervalo*1048576))) Mbps
  echo TX: $((($tx2-$tx1)/($intervalo*1024))) Kbps
  echo TX: $((($tx2-$tx1)/($intervalo*1048576))) Mbps
done
done
Bandbreite anzeigen

Regex

Regex (regular expressions) machen furchtbare Kopfschmerzen. Aber da sie so mächtig sind, braucht man sie immer mal wieder. Und hier ist die Kopfschmerztablette:

http://www.regexr.com/ RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr
So sieht die Seite aus

Auf der Seite kann man per Mouse-over seine RegEx ausprobieren und bekommt jeden einzelnen Teil davon erklärt. Ausserdem gibt es ein „Cheatsheet“ mit gängigen Ausdrücken, Beispiele und vieles mehr. Super!

Regex

copy-paste mit base64

Ich arbeite oft auf Systemen, die ich nur über einen virtuellen Screen erreiche (Remote Desktop etwa) und zu dem ich zwar eine gemeinsame Zwischenablage habe (copy-paste), aber keine einfache Möglichkeit, Dateien zu kopieren.

Wenn ich etwa eine Logdatei kopieren will, die in den Scrollback-Buffer des Terminalfensters auf der remote Maschine nicht komplett reinpasst, dann muss ich stückeln und bereichsweise kopieren. Das nervt tierisch.

Oder ich nutze gzip und base64:

% cp grosselogdatei.log /tmp
% cd /tmp
% gzip grosselogdatei.log
% base64 grosselogdatei.log.gz
H4sICLiyGlkAA29wZW5maWxlcy5jc3YAbZ3dlsSoCkbvz7PUmVWg+DPv/2BTnZgIuG/3oo35AoiS
VMv3n6/9o1/p/5f+77d+mv5PApPvp1li+v30llj52fXE6o99E7Mfk8DGv98fG4md1x1/1z3+toDd
33VLYn/XjXOef9eVKgkKGO [...]
B5SBkg6GOjwNjG+maEv+4PabgVJ+aBgX7iekIn32poGSDg3zQ8O4aKhDR39wL8wFSutmRx06+oP7
CalAKT/0/YJUoKRDx7jo+8XBSEGzgevFQH8YmCfH/mnWQMkfBsbFQH8YGBf3frOle7v3m9drf4FS
XAz0h4k6TMwPE/3BNTACVbg39xNSgb7nUZGiLfnDxLi495tZHbff3FS+tF7I/sni/wA6SY/SD4IA
AA==

Diesen ASCII Output kann ich locker per copy-paste in einem Rutsch kopieren und in eine Datei lokal kopieren, etwa grosselogdatei.log.gz.b64, und wieder auspacken:

% base64 -d grosselogdatei.log.gz.b64 > grosselogdatei.log.gz
% gunzip grosselogdatei.log.gz
copy-paste mit base64

MySQL – das letzte

Ich nutze MySQL-Datenbanken um Testergebnisse von automatisierten Testläufen zu speichern. Es kommt dabei oft vor, dass ich von allen Ergebnissen zu einer Testreihe, in der einzelne Tests, die mit einer ID markiert sind und durchaus mehrfach (wiederholt) gemacht werden können, nur das letzte Ergebnis in einer Query haben will. Das geht so:

SELECT * FROM <table> WHERE <my-id-field> IN (SELECT MAX(<id>) FROM <table> GROUP BY <my-id-field>) ORDER BY <my-id-field>;

Wichtig ist, dass man zwei ID-Felder hat. Das erste <id> muss ein auto increment sein, also eine Zahl sein und mit jedem neuen Eintrag in die DB wachsen (das ist sowieso best practice, wenn man eine Tabelle anlegt). Das zweite Feld <my-id-field> ist eine ID einer Reihe von Tests oder Ergebnissen, von denen man nur das letzte Ergebnis haben will. Diese ID muss nicht zwangsläufig eine Zahl sein.

MySQL – das letzte

Filtern in Bash

Manchmal will man aus einer Variable oder einem Text alle Zahlen herausziehen oder verstecken. Das geht natürlich mit sed ganz gut, aber noch einfacher in der Bash selbst.

% VAR=1a2b3c4d
% echo "${VAR//[!0-9]/}"
1234
% echo "${VAR//[0-9]/}"
abcd

Man kann auch nur Buchstaben filtern, damit man Sonderzeichen mit herausfiltert. Oder oder…

% VAR="1a,2b.3c;4d"
% echo "${VAR//[!0-9]/}"
1234
% echo "${VAR//[!a-z]/}"
abcd
% echo "${VAR//[!a-z 0-9]/}"
1a2b3c4d
% echo "${VAR//[a-z 0-9]/}"
,.;
Filtern in Bash