Minimalistische Firewall-Regeln auf 1&1 Cloud Server

Beim Wechsel von meinem „alten“ 1&1 Dynamic Cloud Server auf einen neuen 1&1 Cloud Server (man beachte die Abwesenheit des Wortes „Dynamic“) habe ich mich gewundert, wieso Email-Versand und -Empfang nicht funktionieren wollte. Nach langer und vergeblicher Suche in Plesk fand ich die Ursache im 1&1 Cloud Panel.

Im Panel finden sich unter Netzwerk -> Firewall-Richtlinien zwei Default-Richtlinien. Die Richtlinie für Linux läßt gerade mal SSH (Port 22), HTTP(S) (Port 80 und 443) und Plesk (8443 und 8447) zu. Erst als ich hier noch SMTP (Port 25), Submission (Port 587) und IMAPS (Port 993) in die Richtlinie aufgenommen habe, funktionierten Emails wie gewohnt.

 

SSH-Agent für Authentizierung mit sudo verwenden

Pam-ssh-agent-auth ist ein PAM-Modul, um SSH-Schlüssel für die Authentizierung mit sudo zu verwenden. Das ständige eintippen des Passwortes kann auf die Dauer lästig werden, aber die authentizierung ganz abzuschalten fühlt sich auch irgendwie falsch an. Dieses Modul stellt einen guten Kompromiß dar.

Installation

Die Installation ist auf CentOS 7 (und CentOS 6) ist recht einfach, da das Modul einfach mit yum installiert werden kann:

yum install pam_ssh_agent_auth

Konfiguration

Nach der Installation sind noch ein paar Anpassungen notwendig, damit das Modul mit sudo verwendet wird. Die Umgebungsvariable SSH_AUTH_SOCK muß von sudo erhalten bleiben. Hierzu muß in der sudoers-Datei (mit visudo bearbeiten) folgende Zeile ergänzt werden: (Die Datei enthält bereits einige env_keep-Zeilen. Diese sollte einfach hinter die anderen env_keep-Zeilen angehängt werden.)

Defaults    env_keep += "SSH_AUTH_SOCK"

Jetzt muß noch PAM auch das Modul für sudo verwenden. In der /etc/pam.d/sudo-Datei muß am Anfang (nach der Zeile mit #%PAM-1.0) folgende Zeile eingefügt werden:

auth       sufficient   pam_ssh_agent_auth.so file=%h/.ssh/authorized_keys

Damit ist die ganze Konfiguration abgeschlossen.

Test

Um zu Testen, ob das nun funktioniert, sollte man sich mit einem SSH-Schlüssel auf der Maschine anmelden und dann mit erst sudo -k möglicherweise noch gecachte Login-Daten aus sudo löschen und dann mit sudo -l schauen, was sudo einem erlaubt.

Sollte sudo unerwartet trotzdem nach dem Passwort fragen, kann man in der /var/log/secure nach Hinweisen für das Problem suchen. In meinem Fall hatte ich schlichtweg vergessen, den SSH-Agent beim SSH-Login weiterzuleiten (-A von der Kommandozeile oder ForwardAgent yes in der ~/.ssh/config.

YubiKey NEO mit Debian

Und wenn der YubiKey NEO unter Debian nicht als Kartenleser erkannt wird, fehlen in der /etc/libccid_Info.plist vermutlich ein paar Einträge. Das dazugehörige diff sieht so aus:

--- /etc/libccid_Info.plist.backup 2014-11-10 20:53:41.000000000 +0100
+++ /etc/libccid_Info.plist 2014-11-10 21:05:38.000000000 +0100
@@ -325,6 +325,8 @@
<string>0x08C3</string>
<string>0x08C3</string>
<string>0x15E1</string>
+ <string>0x1050</string>
+ <string>0x1050</string>
</array>

<key>ifdProductID</key>
@@ -550,6 +552,8 @@
<string>0x0401</string>
<string>0x0402</string>
<string>0x2007</string>
+ <string>0x0111</string>
+ <string>0x0112</string>
</array>

<key>ifdFriendlyName</key>
@@ -775,6 +779,8 @@
<string>Precise Biometrics Precise 250 MC</string>
<string>Precise Biometrics Precise 200 MC</string>
<string>RSA RSA SecurID (R) Authenticator</string>
+ <string>YubiKey NEO Composite</string>
+ <string>YubiKey NEO CCID</string>
</array>

<key>Copyright</key>

RFID-Reader mit Debian

Wenn der RFID-Reader (in meinem Fall der ACR122) unter Debian einfach nicht funktionieren will, obwohl der Kernel anzeigt, daß er das Gerät gefunden hat. Und der pcscd ähnliche Meldungen ausspuckt:

00410836 ccid_usb.c:645:OpenUSBByName() Can't claim interface 001/008: Device or resource busy

Dann nimmt vermutlich das falsche Kernel-Modul das Gerät unter beschlag. Folgendes half bei mir, den RFID-Reader endlich zum Leben zu erwecken. In /etc/modprobe.d/rfid-blacklist.conf (Datei anlegen, da sie standardmäßig nicht existiert) folgende Zeilen einfügen:

blacklist pn533
blacklist nfc

pfSense auf der Soekris net4801

Dies ist eigentlich nur eine Notiz an mich, für den Fall, daß ich es mal wieder brauchen sollte.

Wenn die pfSense nach der Installation auf der CF-Karte auf der Soekris nur noch Meldungen wie READ_DMA timed out ausspuckt, muß man DMA deaktivieren. Einfach in der /boot/loader.conf folgende Zeile einfügen:

hw.ata.ata_dma="0"

 


Danach bootet die pfSense auch wieder.

 

Must-have Webdienst


Ohne Dropbox könnte ich nicht mehr leben. Ich kann damit nicht nur einen Ordner zwischen verschiedenen meiner Rechner synchronisieren

sondern auch Ordner mit anderen Dropbox-Usern teilen. Und das ganze funktioniert sogar zwischen Windows, Mac und Linux.

Und dank des Public-Ordners kann ich auch mal eben eine Datei per http zugänglich machen, ohne diese mit (s)ftp/scp/… irgendwo heraufladen zu müssen. Auch von nicht-Nerds zu bewerkstelligen.

Wen ich jetzt von Dropbox überzeugen konnte, der möge sich über meinen Referral-Link anmelden. Für jeden User, der sich darüber anmeldet, bekomme ich zusätzlichen Speicherplatz.

Ein echtes ZFS-only FreeBSD-System

Als ich meinen neuen FreeBSD-Server installieren sollte, wollte ich ihn nun komplett mit ZFS einrichten. Im Internet existieren genügend Anleitungen, die beschreiben, wie man dies bewerkstelligt. Doch sie gingen alle nicht den allerletzten Schritt, um auch das Swap ins ZFS zu legen. Hier also die Anleitung, wie man ein echtes ZFS-only System einrichtet.

Zunächst einmal ein paar Daten. Ich habe 5 SATA-Festplatten im Rechner, die nach dem Booten von FreeBSD 8.1-RELEASE als ad4, ad6, ad8, ad10 und ad12 erkannt wurden. Die Installation ist nichts für schwache Nerven. Es gibt keine Menüs, alles wird von der Kommandozeile erledigt und Tippfehler werden mit einem kaputten System bestraft.

Ich habe den Rechner mit der Installations-DVD gestartet. Anstatt die übliche Installation zu starten, bin ich jedoch gleich in die Rettungskonsole (Fixit) gegangen. Hier habe ich nochmal mit dmesg nachgeprüft, daß auch wirklich alle Platten korrekt erkannt wurden und mir die Gerätenamen notiert.

Als erstes habe ich die Festplatten mit GPT partitioniert.

gpart create -s gpt ad4
gpart create -s gpt ad6
gpart create -s gpt ad8
gpart create -s gpt ad10
gpart create -s gpt ad12

So vorbereitet habe ich dann die Partitionen auf den Festplatten angelegt. Zuerst die Bootpartition.

gpart add -b 34 -s 128 -t freebsd-boot ad4
gpart add -b 34 -s 128 -t freebsd-boot ad6
gpart add -b 34 -s 128 -t freebsd-boot ad8
gpart add -b 34 -s 128 -t freebsd-boot ad10
gpart add -b 34 -s 128 -t freebsd-boot ad12

Anders als in den oben erwähnten Anleitungen, habe ich keine separate Swap-Partition angelegt. Den verbliebenen Platz auf den Platten habe ich vollständig für das ZFS verwendet.

gpart add -t freebsd-zfs -l disk0 ad4
gpart add -t freebsd-zfs -l disk1 ad6
gpart add -t freebsd-zfs -l disk2 ad8
gpart add -t freebsd-zfs -l disk3 ad10
gpart add -t freebsd-zfs -l disk4 ad12

Natürlich gehört der Boot-Code auf alle Festplatten. Man weiß ja nie, welche Festplatte ausfällt, in dem Fall möchte ich natürlich auch von den verbliebenen Platten booten können.

gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad4
gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad6
gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad8
gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad10
gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad12

Um das ZFS anzulegen, habe ich die ZFS-Kernelmodule geladen.

kldload /mnt2/boot/kernel/opensolaris.ko
kldload /mnt2/boot/kernel/zfs.ko

Das Dateisystem habe ich dann mit diesen Befehlen angelegt. (Die ersten beiden Zeilen gehören zusammen und sind hier nur wegen der Breite umgebrochen)

zpool create zroot raidz2 /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2 \
/dev/gpt/disk3 /dev/gpt/disk4
zpool set bootfs=zroot zroot

An dieser Stelle mußte ich dann nochmal von den Anleitungen abweichen, um Swap einzurichten. Die Idee dazu stammt von hier.

zfs create -V 2G zroot/swap
zfs set org.freebsd:swap=on zroot/swap
zfs set checksum=off zroot/swap

Hier kehrte ich dann zu den vorhandenen Anleitungen zurück. Es ist nicht zwingend notwendig, all diese Dateisysteme anzulegen, aber wenn man schon ein Dateisystem wie ZFS hat, sollte man seine Stärken richtig ausspielen.

zfs set checksum=fletcher4 zroot
zfs create -o compression=on -o exec=on -o setuid=on zroot/tmp
chmod 1777 /zroot/tmp
zfs create zroot/usr
zfs create zroot/usr/home
cd /zroot ; ln -s /usr/home home
zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
zfs create zroot/var
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/db
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
zfs create -o exec=off -o setuid=off zroot/var/empty
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
zfs create -o exec=off -o setuid=off zroot/var/run
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
chmod 1777 /zroot/var/tmp

Damit habe ich alle Dateisysteme angelegt und kann mit der eigentlichen Installation beginnen. Auch das muß von der Kommandozeile geschehen.

cd /dist/8.1-RELEASE
export DESTDIR=/zroot
for dir in base manpages ports ; do (cd $dir ; ./install.sh) ; done
cd src ; ./install.sh all
cd ../kernels ; ./install.sh generic
cd /zroot/boot ; cp -Rlp GENERIC/* /zroot/boot/kernel/

Nachdem alle Dateien installiert sind, kann /var/empty read-only geschaltet werden.

zfs set readonly=on zroot/var/empty

Nun konnte ich in das frisch installierte System chrooten, um noch wichtige Einstellungen am System vorzunehmen.

chroot /zroot

Damit alle ZFS-Dateisysteme beim booten gemountet werden.

echo 'zfs_enable="YES"' > /etc/rc.conf

Der Bootloader soll natürlich auch wissen, wovon er booten soll.

echo 'vfs.root.mountfrom="zfs:zroot"' > /boot/loader.conf
echo 'zfs_load="YES"' >> /boot/loader.conf

Folgende Zeile ist nur bei Systemen mit 1GB RAM oder weniger nötig.

echo 'vfs.zfs.prefetch_disable="1"' >> /boot/loader.conf

Sollte ich je auf die Idee kommen, mit make buildworld mein System upzudaten, will ich auch wieder einen Bootloader mit ZFS-Support haben. Dies ist nicht notwendig, um das System zum laufen zubekommen. Es verhindert nur, daß ich mir zukünftig ins Knie schieße.

echo 'LOADER_ZFS_SUPPORT=YES' > /etc/src.conf

Damit das System nach dem Booten auch lauffähig und benutzbar ist, fehlen noch einige Einstellungen wie root-Passwort, Zeitzone und Mail-Aliase für Sendmail.

passwd root
tzsetup
cd /etc/mail ; make aliases

Das System wird am Ende komplett aus dem ZFS laufen und benötigt eigentlich keine /etc/fstab mehr. Allerdings geht FreeBSD beim Booten davon aus, daß diese Datei existiert. Es fährt zwar auch ohne hoch, spuckt jedoch beim Hochfahren unschöne Fehlermeldungen aus. Um dem vorzubeugen, habe ich eine leere /etc/fstab angelegt.

touch /etc/fstab

Dies war nur das allernötigste. Die restlichen Einstellungen wie Netzwerk, Dienste, Tastaturlayout kann ich nach dem ersten Booten mit sysinstall vornehmen. Ich war an dieser Stelle fertig und konnte die chroot-Umgebung verlassen.

exit

Damit das System beim Booten die Dateisysteme wiederfindet, braucht es den zpool.cache. Dieser wird erst beim Exportieren des ZFS erzeugt. Ich habe also kurz das Dateisystem exportiert und gleich wieder importiert, um die Cache-Datei zu erzeugen und dann ins System zu kopieren.

mkdir /boot/zfs
cd /boot/zfs
zpool export zroot && zpool import zroot
cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache

Und zuletzt habe ich die Mountpunkte den einzelnen Dateisystemen zugewiesen.

export LD_LIBRARY_PATH=/mnt2/lib
zfs unmount -a
zfs set mountpoint=legacy zroot
zfs set mountpoint=/tmp zroot/tmp
zfs set mountpoint=/usr zroot/usr
zfs set mountpoint=/var zroot/var

Damit war die Installation abgeschlossen. Ich habe die Rettungskonsole verlassen. Der FreeBSD-Installer erschien wieder und ich wählte unten den Punkt zum Beenden des Installers. Der Rechner startete neu und startete danach das frisch installierte System vom ZFS.

Wie vorhin erwähnt mußte ich nach dem ersten Login noch das Netzwerk, SSH und Tastatur einrichten. Danach war das System voll betriebsbereit.

Plesk 10.0.1

Hmm, Update auf Plesk 10.0.1 von 9.5.3 ist durchgelaufen. Geriet ein wenig ins Stocken beim Spamassassin/spamd. Aber nachdem ich spamd manuell abgeschossen habe, lief der Rest durch. Die 25 sw-engine-cgi-Instanzen beunruhigen mich ein wenig, aber es scheint alles zu funktionieren. Falls nicht, ist Plesk schuld :)

Neue Array-Operatoren in PostgreSQL 8.2

Seit Version 8.2 verfügt PostgreSQL über einige neue Operatoren, die Arrays in SQL erst richtig nützlich machen. Konnte man bislang (bis Version 8.1) nur möglich die Arrays zu verketten, Elementweise zu vergleichen oder einzelne Elemente aus dem Array wieder herauszufischen, so kann man nun auch Testen, ob zwei Arrays über gemeinsame Elemente verfügen oder gar ein Array vollständig im anderen enthalten ist. Diese neuen Operatoren sind @>, <@ und &&.

Mit @> kann man prüfen, ob das Array links des Operators eine Obermenge des Arrays rechts des Operators ist. Das Gegenstück dazu ist <@. Es prüft, ob das Array links des Operators eine Untermenge des Arrays rechts des Operators ist. Zu guter Letzt kann man noch mit && überprüfen, ob die Arrays Elemente gemeinsam haben.

Hier ein paar Beispiele, wie sich die neuen Operatoren einsetzen lassen.

test=> SELECT ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9] @> ARRAY[2, 4, 6, 8];
 ?column?
----------
 t
(1 row)

Hier muß ich wohl nichts weiter dazu sagen. Alle Elemente des zweiten Arrays sind auch im ersten enthalten, also ist das Ergebnis true.

test=> SELECT ARRAY[2, 4, 6, 8, 10] <@ ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9];
 ?column?
----------
 f
(1 row)

Hier ist das Ergebnis false, da die 10 aus dem ersten Array nicht im zweiten enthalten ist. Somit ist das erste Array keine Untermenge des zweiten Arrays.

test=> SELECT ARRAY[2, 4, 6, 8, 10] && ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9];
 ?column?
----------
 t
(1 row)

Hier dagegen ist das Ergebnis true. Die beiden Arrays haben Elemente gemeinsam (wenn auch nicht alle).

Wer noch mehr über Arrays und die dazugehörigen Operatoren in PostgreSQL lesen möchte, kann dies in der Doku tun.

Zeig mir deinen Shell-Prompt

Wo ich gerade bei den Shells bin. Hier ein Stückchen Exhibitionismus. Mein Shell-Prompt sieht so aus:

fastjack@Aphrodite:~% 

Jepp, völlig langweilig. Keine Farben, keine Uhrzeit, keine Spielereien. Der Prompt-String sieht übrigens so aus:

PS1='%(?..<%?>)%n@%m:%3~%# '

Ich benutze übrigens die zsh. Ich will also keine Mails erhalten, weil der Prompt-String in der bash nicht funktioniert-