christianbaer.me

FreeBSD-Server mit Jails: Host-System vorbereiten

Da bei mir mal wieder das Neuaufsetzen eines Servers ansteht, dachte ich, ich dokumentiere das ganze mal. Als Betriebssystem kommt FreeBSD zum Einsatz. Das Basissystem soll möglichst schlank gehalten werden. Die einzelnen Dienste werden jeweils in eigenen Jails separiert. Beim Management der Jails kommt iocage zum Einsatz.

Zuerst installieren wir die aktuellste FreeBSD-Version. Bei mir ist das aktuell Version 12.0-RELEASE. Für die Installation habe ich das Memstick-Image benutzt. Der installer ist relativ selbst erklärend. Wichtig ist nur, dass wir für die Installation die Option ZFS im Partionierungsmenü nutzen.

System updaten #

Nach der Installation booten wir in unser jungfräuliches System und updaten erst ein mal die Installation und die Ports auf das aktuellste Patchlevel.

freebsd-update fetch install
portsnap auto

Anschließend nehmen wir noch ein paar kleine Anpassungen vor.

Zeitsynchronisation aktivieren #

Der Server synchronisiert beim Booten die Zeit mit deutschen Zeitservern.

sysrc ntpdate_enable="YES"
sysrc ntpdate_hosts="de.pool.ntp.org"

Bootdelay reduzieren #

Die Wartezeit beim Booten wird auf drei Sekunden reduziert.

echo "autoboot_delay=3" >> /boot/loader.conf

System bleibt bei Shutwdown hängen, wenn root auf einem USB-Device liegt #

Falls FreeBSD auf einem USB-Device installiert wurde, kann es sein, dass das System nach dem Shutdown hängen bleibt. Ein Reboot ist nur per Hardware-Taste möglich. Folgender Befehl fixt das.

echo "hw.usb.no_shutdown_wait=1" >> /etc/sysctl.conf
sysctl hw.usb.no_shutdown_wait=1

Anschließend starten wir das System noch mal neu.

User hinzufügen #

Per default ist das Login mit root über SSH deaktiviert. Das ist auch sinnvoll. Wir werden uns also einen User zum Arbeiten erstellen und diesen in die Lage versetzen, root-Rechte zu erlangen.

Über adduser legen wir uns als erstes einen User an, mit welchem wir uns per SSH einloggen können.

adduser

Wir beantworten einfach die Fragen. Die angebotenen Standard-Optionen passen soweit. Hier muss nichts geändert werden. Wenn die Frage “Invite $USER into other groups?” kommt, geben wir zusätzlich noch die Gruppe wheel an. So gehört unser User zu den Administratoren. In einem weiteren Schritt werden wir doas installieren, damit wir dann auch root-Rechte erlangen können.

doas installieren #

pkg install doas
echo "permit keepenv :wheel" > /usr/local/etc/doas.conf

Die Zeile permit keepenv :wheel sagt doas, dass alle Benutzer, welche der Gruppe wheel angehören, durch Eingabe ihres Passworts root werden können.

Jetzt sind wir in der Lage, uns per SSH mit dem Server zu verbinden und dann auch Dinge wie Copy und Paste zu nutzen, um die Configs zu erstellen.

Mit einem behrtzten doas -s gelangen wir nach Eingabe unseres Passworts in eine root-Shell.

Build-System einrichten #

Ich bin ein großer Fan davon, die Programme nicht als Binärpakete zu installieren, sondern selbst aus den Ports zu bauen. So kann ich unnötige Funktionen deaktivieren und das Host-System schön schlank halten, da ich versuche, überflüssige Abhängigkeiten weitestgehend zu vermeiden.

Als erstes legen wir /etc/make.conf und /etc/src.conf an. In diesen Files habe ich ein paar Defaults konfiguriert, um z.B. immer die aktuelle OpenSSL-Version aus den Ports zu nehmen, X11-Funktionen zu deaktivieren, da wir ja auf einem Server sind usw.. /etc/src.conf kommt zum Einsatz, falls wir uns einen angepassten Kernel bauen wollen. Da VIMAGE mittlerweile im Standard-Kernel ist, besteht nicht mehr zwingend die Notwendigkeit dazu.

### /etc/make.conf

## Nearby mirror
MASTER_SITE_OVERRIDE="ftp://ftp.de.freebsd.org/pub/FreeBSD/ports/distfiles/"

## Build
MAKE_JOBS_NUMBER?=4
## Optimizations
CPUTYPE?=native
OPTIONS_SET=OPTIMIZED_CFLAGS CPUFLAGS

## Headless server options
WITHOUT_MODULES=sound ntfs linux

.if ${.CURDIR:M/usr/ports/*}
OPTIONS_SET+=CRYPTO GSSAPI_NONE IPV6 OPENSSL THREADS
OPTIONS_UNSET+=DEBUG DTRACE GSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT READLINE TEST TESTS X11 CUPS DOCS FONTCONFIG NLS X11 EXAMPLES
DEFAULT_VERSIONS+=ssl=openssl
.endif

## Disable sendmail!
NO_SENDMAIL=true

#ccache
WITH_CCACHE_BUILD=yes

CCACHE_UMASK=022
CCACHE_DIR=/var/cache/ccache
CCACHE_MAXSIZE=5G
### /etc/src.conf

WITH_CCACHE_BUILD=yes
WITHOUT_AMD=YES
WITHOUT_APM=YES
WITHOUT_ATF=YES
WITHOUT_ATM=YES
WITHOUT_AUTHPF=YES
WITHOUT_AUTOFS=YES
WITHOUT_BHYVE=YES
WITHOUT_BLUETOOTH=YES
WITHOUT_BOOTPARAMD=YES
WITHOUT_BOOTPD=YES
WITHOUT_BSNMP=YES
WITHOUT_CALENDAR=YES
WITH_CCACHE_BUILD=YES
WITHOUT_CCD=YES
WITH_CLANG_EXTRAS=YES
WITHOUT_CTM=YES
WITHOUT_CUSE=YES
WITHOUT_DEBUG_FILES=YES
WITHOUT_DMAGENT=YES
WITHOUT_FINGER=YES
WITHOUT_FLOPPY=YES
WITHOUT_GAMES=YES
WITHOUT_GPIB=YES
WITHOUT_GPIO=YES
WITH_GSSAPI=YES
WITHOUT_HTML=YES
WITHOUT_HYPERV=YES
WITHOUT_I4B=YES
WITHOUT_INETD=YES
WITHOUT_INFO=YES
WITHOUT_IPX=YES
WITHOUT_KERBEROS=YES
WITHOUT_KVM=YES
WITHOUT_LIB32=YES
WITHOUT_LPR=YES
WITHOUT_NCP=YES
WITHOUT_NDIS=YES
WITHOUT_NIS=YES
WITHOUT_PC_SYSINSTALL=YES
WITHOUT_PMC=YES
WITHOUT_PPP=YES
#WITHOUT_PROFILE=YES
WITHOUT_RADIUS_SUPPORT=YES
WITHOUT_RBOOTD=YES
WITHOUT_RCMDS=YES
WITHOUT_RCS=YES
WITHOUT_SENDMAIL=YES
WITHOUT_SHAREDOCS=YES
WITHOUT_SYSINSTALL=YES
WITHOUT_TALK=YES
WITHOUT_TCP_WRAPPERS=YES
WITHOUT_TESTS=YES
WITHOUT_TFTP=YES
WITHOUT_TIMED=YES
WITHOUT_WIRELESS=YES

ccache als Compiler-Cache #

Viele Pakete, die wir bauen, werden in mehreren Jails und auf dem Host-System benötigt. Es bietet sich also an, die Kompilate zu cachen, um beim erneuten Bauen Zeit zu sparen. Hier kommt ccache zum Einsatz.

Die grundlegende Konfiguration haben wir bereits in /etc/make.conf und /etc/src.conf getätigt. Unter anderem ist /var/cache/ccache als Ort des Caches festgelegt.

Wir erstellen uns also hierfür erst mal ein ZFS-Dataset

zfs create zroot/var/cache
zfs create zroot/var/cache/ccache

Anschließend installieren wir ccache und portmaster.

pkg install ccache portmaster

portmaster macht es uns sehr viel einfacher, mit den Ports zu hantieren. Statt cd /usr/ports/sysutils/ccache && make install clean reicht jetzt ein portmaster sysutils/ccache, um ccache zu installieren. Ein portmaster -Bad aktualisiert z.B alle installierten Ports und erstellt hierbei keine Backup-Packages. die Manpages zu portmaster nennen noch viele weitere Optionen. Durch ccache wird jeder Compile-Vorgang, der schon mal ausgeführt wurde, beim nächsten mal wesentlich schneller vonstatten gehen.

Weitere nützliche Programme installieren #

Wenn das alles geschafft ist, installiere ich immer noch ein paar weitere Programme, um mir die Arbeitsumgebung an meine Bedürfnisse anzupassen.

portmaster -Bd editors/vim-console net/mosh shells/zsh sysutils/tmux devel/git-lite net/rsync

Zu guter letzt setze ich mir dann noch ZSH als Shell, installiere meine dotfiles und alles ist so, wie ich es auf meinen Servern gerne habe.

Weitere sinnvolle Anpassungen #

ssmtp #

Ich finde es immer ganz praktisch, wenn mein Server mir Mails schicken kann, wenn irgend etwas nicht funktioniert. Hierfür nutze ich seit einiger Zeit ssmtp, ein Programm, welches Mails an einen externen Mailserver weiterreicht und von dort aus versendet.

portmaster -Bd mail/ssmtp

Konfiguriert wird ssmtp in /usr/local/etc/ssmtp/ssmtp.conf.

### /usr/local/etc/ssmtp/ssmtp.conf

root=admin@example.org
mailhub=mail.example.org:587
rewriteDomain=example.com
hostname=_HOSTNAME_
FromLineOverride=YES
UseTLS=YES
UseSTARTTLS=YES
AuthUser=ssmtp@example.org
AuthPass=SuperSecret-Passw0rd!
AuthMethod=LOGIN

Abschließend setzen wir ssmtp in der /etc/mail/mailer.conf als Standard und wir sind fertig.

### /etc/mail/mailer.conf

sendmail        /usr/local/sbin/ssmtp
send-mail       /usr/local/sbin/ssmtp
mailq           /usr/local/sbin/ssmtp
newaliases      /usr/local/sbin/ssmtp
hoststat        /usr/bin/true
purgestat       /usr/bin/true

Festplatten mit smartd überwachen #

Zum Auslesend des SMART-Status meiner Festplatten nutze ich smartd aus den smartmontools.

portmaster -Bd sysutils/smartmontools
echo "DEVICESCAN -a -o on -S on -n standby,q -s (S/../.././02|L/../../6/03) -W 4,55,65 -m admin@example.org -M test" > /usr/local/etc/smartd.conf
sysrc smartd_enable="YES"

smartd prüft beim Starten jetzt alle Platten, die er finden kann und sendet eine Testmail an die definierte Adresse. Nebenbei erfährt man so nach einem Reboot auch, wann die Kiste wieder oben ist.

Jetzt ist der Server soweit erst ein mal eingerichtet. Diese Basiskonfiguration nutze ich für alle Systeme. Egal, ob er später ein Webserver, ein NAS, ein E-Mail-Server oder sonstwas werden soll. Die Absicherung mittels der Firewall pf und die Einrichtung von iocage werde ich in späteren Beiträgen erläutern.