Direkt zum Inhalt springen

FreeBSD Remote Installation

Markus Kohlmeyer arbeitet als System-Administrator in Hamburg (Germany). Er beschäftigt sich mit diversen Themen der IT, insbesondere der Administration und Security von Servern, pflegt mehrere HowTos zu FreeBSD und Linux und betreibt neben dem unter Anderem auch die , wo er unter seinem Pseudonym Joe User aktiv ist.

Author: Markus Kohlmeyer

Letzte Aktualisierung:

Veröffentlicht:

Lizenz: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)


Artikel empfehlen: Flattr Google+ XING LinkedIn


Einleitung

In diesem HowTo beschreibe ich step-by-step die Remote Installation von FreeBSD 9.0 64Bit mittels mfsBSD auf einem dedizierten Server, auch RootServer genannt. Weil sich meine Vorgehensweise oft nur geringfügig von einer normalen FreeBSD Remote Installation unterscheidet und um eine weitere Republikation der offiziellen FreeBSD Dokumentation zu vermeiden, werde ich in diesem HowTo nicht alle Punkte bis ins Detail erläutern.

Vielen Dank für Dein Vertändnis.


Folgende Punkte sind in diesem HowTo zu beachten.

  • Alle Dienste werden mit einem möglichst minimalen und bewährten Funktionsumfang installiert.
  • Alle Dienste werden mit einer möglichst sicheren und dennoch flexiblen Konfiguration versehen.
  • Alle Konfigurationen sind selbstständig auf notwendige individuelle Anpassungen zu kontrollieren.
  • Die Domain des Servers lautet example.org und ist selbstständig durch die eigene Domain zu ersetzen.
  • Der Hostname (FQDN) des Servers lautet srv.example.org und ist selbstständig durch den eigenen Hostnamen zu ersetzen.

Das Referenzsystem

Als Referenzsystem für dieses HowTo habe ich mich für eine virtuelle Maschine auf Basis von Oracle VM VirtualBox unter Microsoft Windows 7 SP1 Professional 64Bit entschieden. So lässt sich ohne grösseren Aufwand ein handelsüblicher dedizierter Server, auch RootServer genannt, simulieren und anschliessend kann diese virtuelle Maschine als kostengünstiges lokales Testsystem weiter genutzt werden.

Trotzdem habe ich dieses HowTo so ausgelegt, dass es sich nahezu unverändert auf dedizierter Server übertragen lässt und dieses auch auf mehreren RootServern getestet.

Leider bringt Microsoft Windows keinen eigenen SSH-Client mit, so dass ich auf das sehr empfehlenswerte PuTTY zurückgreife. Zur Simulation des bei nahezu allen Anbietern dedizierter Server (RootServer) vorhandene Rettungssystem, nachfolgend RescueSystem genannt, wird in diesem HowTo die auf Gentoo Linux basierende SystemRescueCD eingesetzt.

VirtualBox und PuTTY werden jeweils mit den jeweiligen Standardoptionen installiert und (sofern noch nicht geschehen) deren Installationspfade der Umgebungvariablen PATH des aktuelle angemeldeten Windows-Users hinzugefügt. Dazu öffnen wir die Eingabeaufforderung und setzen folgende drei Kommandozeilen-Befehle ab.

SET OLDPATH=%PATH%
SETX PATH "%OLDPATH%;%ProgramFiles(x86)%\PuTTY;%VBOX_INSTALL_PATH%"
SET OLDPATH=

Da neue beziehungsweise geänderte Umgebungvariablen in der jeweils aktuellen Eingabeaufforderung noch nicht gültig sind, wird die Eingabeaufforderung nun wieder geschlossen.

Anschliessend downloaden wir diese Windows Registrierungsdatei, speichern sie als putty_virtualbox.reg und importieren sie mittels Doppelklick in die Windowsregistrierung. Dadurch wird PuTTY das für unsere virtuelle Maschine vorkonfigurierte Profil VirtualBox hinzugefügt, welches wir für dieses HowTo verwenden werden.

Die Virtuelle Maschine

Als Erstes öffnen wir eine neue Eingabeaufforderung und legen manuell eine neue virtuelle Maschine an. Diese virtuelle Maschine bekommt den Namen FreeBSD und wird mit 1024MB RAM, zwei 32GB SATA-Festplatten, einem DVD-Player, sowie einer Intel-Netzwerkkarte ausgestattet. Zudem setzen wir die RTC (Real-Time Clock) der virtuellen Maschine auf UTC (Coordinated Universal Time) und legen die Bootreihenfolge fest.

VBoxManage createvm --name "FreeBSD" --ostype FreeBSD_64 --register

cd "%USERPROFILE%\VirtualBox VMs\FreeBSD"

VBoxManage createhd --filename "FreeBSD1.vdi" --size 32768
VBoxManage createhd --filename "FreeBSD2.vdi" --size 32768
VBoxManage modifyvm "FreeBSD" --memory 1024 --rtcuseutc on --boot1 dvd --boot2 disk --boot3 none --boot4 none
VBoxManage storagectl "FreeBSD" --name "IDE Controller" --add ide --controller ICH6
VBoxManage storagectl "FreeBSD" --name "SATA Controller" --add sata --controller IntelAHCI --sataportcount 4
VBoxManage storageattach "FreeBSD" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium "FreeBSD1.vdi"
VBoxManage storageattach "FreeBSD" --storagectl "SATA Controller" --port 1 --device 0 --type hdd --medium "FreeBSD2.vdi"

Die virtuelle Maschine, genauer die virtuelle Netzwerkkarte, kann dank NAT zwar problemlos mit der Aussenwelt, aber leider nicht direkt mit dem Hostsystem kommunizieren. Aus diesem Grund richten wir nun für den SSH-Zugang noch ein Portforwarding ein, welches den Port 2222 des Hostsystems auf den Port 22 der virtuellen Maschine weiterleitet.

VBoxManage modifyvm "FreeBSD" --natpf1 SSH,tcp,,2222,,22

Nachdem die virtuelle Maschine nun konfiguriert ist, wird es Zeit diese zu booten.

RescueSystem booten

Um unser mfsBSD Image installieren zu können, müssen wir unsere virtuelle Maschine mit einem RescueSystem booten. Hierfür eignet sich die auf Gentoo Linux basierende SystemRescueCD am Besten, welche wir mittels des mit Windows mitgelieferten FTP-Client herunterladen und unserer virtuellen Maschine als Bootmedium zuweisen.

cd "%USERPROFILE%\VirtualBox VMs\FreeBSD"

ftp -A ftp.mirrorservice.org
cd sites/download.sourceforge.net/pub/sourceforge/s/project/sy/systemrescuecd/sysresccd-x86/2.7.0
get systemrescuecd-x86-2.7.0.iso
quit

VBoxManage storageattach "FreeBSD" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium "%USERPROFILE%\VirtualBox VMs\FreeBSD\systemrescuecd-x86-2.7.0.iso"

Wir können das RescueSystem jetzt booten.

VBoxManage startvm "FreeBSD"

Im Bootmenü wählen wir die Option "64Bit Kernel with default options" aus.

Wer mit dem amerikanischen Tastaturlayout nicht zurechtkommt, sollte während des Bootens die Frage nach der Keymap mit de beantworten.

Ist der Bootvorgang abgeschlossen, wird als Erstes das root-Passwort für das RescueSystem gesetzt.

passwd root

Jetzt sollten wir uns mittels PuTTY als root in das RescueSystem einloggen und mit der Installation unseres mfsBSD Image fortfahren können.

putty -load VirtualBox

mfsBSD installieren

Um unsere umfangreichen Vorbereitungen nun abzuschliessen, müssen wir nur noch unser mfsBSD Image installieren und booten.

Als Erstes kopieren wir mittels PuTTYs SCP-Client (pscp) das mfsBSD Image in das RescueSystem.

pscp -P 2222 "%USERPROFILE%\VirtualBox VMs\mfsBSD\mfsboot.img" root@127.0.0.1:/tmp/mfsboot.img

Jetzt können wir das mfsBSD Image mittels dd auf der ersten Festplatte (/dev/sda) unserer virtuellen Maschine installieren und uns anschliessend wieder aus dem RescueSystem ausloggen.

dd if=/dev/zero of=/dev/sda count=100 bs=1M
dd if=/tmp/mfsboot.img of=/dev/sda bs=1M

exit

Abschliessend stoppen wir die virtuelle Maschine vorübergehend und entfernen die SystemRescueCD aus dem virtuellen DVD-Laufwerk.

VBoxManage controlvm "FreeBSD" poweroff
VBoxManage storageattach "FreeBSD" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium emptydrive

FreeBSD installieren

Nachdem nun alle Vorbereitungen abgeschlossen sind, können wir endlich mit der eigentlichen FreeBSD Remote Installation beginnen, indem wir die virtuelle Maschine wieder booten.

VBoxManage startvm "FreeBSD"

Jetzt sollten wir uns mittels PuTTY als root mit dem Passwort mfsroot in das mfsBSD Image einloggen und mit der Installation von FreeBSD beginnen können.

putty -load VirtualBox

Partitionieren der Festplatte

Bevor wir anfangen, bereinigen wir die Festplatten von jeglichen Datenrückständen, indem wir sie mit Nullen überschreiben. Je nach Festplattengrösse kann dies einige Stunden bis Tage in Anspruch nehmen. Wer gerne mit dem Feuer spielt, der kann diesen Vorgang auch auf mindestens die ersten 100MB beschränken, indem er die folgenden beiden Befehle jeweils um count=200000 erweitert.

dd if=/dev/zero of=/dev/ada0
dd if=/dev/zero of=/dev/ada1

Da jeder Administrator andere Präferenzen an sein Partitionslayout stellt und wir andernfalls mit diesem HowTo nicht weiterkommen, verwenden wir im Folgenden ein Standard-Partitionslayout. Fortgeschrittenere FreeBSD-Administratoren können dieses Partitionslayout selbstverständlich an ihre eigenen Bedürfnisse anpassen.

Partition Mountpunkt Filesystem Grösse
/dev/mirror/swap none SWAP 2 GB
/dev/mirror/root / UFS2 12 GB
/dev/mirror/home /usr/home UFS2 4 GB
/dev/mirror/data /data UFS2 12 GB

Als Erstes müssen wir die Festplatte partitionieren, was wir mittels gpart erledigen werden. Zuvor müssen wir dies aber dem Kernel mittels sysctl mitteilen, da er uns andernfalls dazwischenfunken würde.

Wir werden auf beiden Festplatten jeweils fünf Partitionen anlegen, die Erste für den Bootcode, die Zweite als Swap, die Dritte als Systempartition, die Vierte für die Home-Verzeichnisse der User und die Fünfte für unsere Nutzdaten. Dabei werden wir die Partitionen auch gleich für modernere Festplatten mit 4K-Sektoren optimieren und statt den veralteten "MBR Partition Tables" die aktuelleren "GUID Partition Tables (GPT)" verwenden.

sysctl kern.geom.debugflags=0x10

gpart create -s gpt ada0
gpart add -t freebsd-boot -b   64 -s 128 -l boot0 ada0
gpart add -t freebsd-swap -b 2048 -s  2G -l swap0 ada0
gpart add -t freebsd-ufs          -s 12G -l root0 ada0
gpart add -t freebsd-ufs          -s  4G -l home0 ada0
gpart add -t freebsd-ufs          -s 12G -l data0 ada0

gpart create -s gpt ada1
gpart add -t freebsd-boot -b   64 -s 128 -l boot1 ada1
gpart add -t freebsd-swap -b 2048 -s  2G -l swap1 ada1
gpart add -t freebsd-ufs          -s 12G -l root1 ada1
gpart add -t freebsd-ufs          -s  4G -l home1 ada1
gpart add -t freebsd-ufs          -s 12G -l data1 ada1

Für eine leicht erhöhte Datensicherheit legen wir mittels gmirror ein Software-RAID1 an.

gmirror load
gmirror label -b prefer -F swap ada0p2 ada1p2
gmirror label -b round-robin root ada0p3 ada1p3
gmirror label -b round-robin home ada0p4 ada1p4
gmirror label -b round-robin data ada0p5 ada1p5

Formatieren der Partitionen

Nun müssen wir noch die Systempartition und die Partitionen für die Home-Verzeichnisse und die Nutzdaten mit "UFS2" und einer 4K-Blockgrösse formatieren und aktivieren auch gleich die "journaled soft-updates".

newfs -O2 -U -f 4096 /dev/mirror/root
newfs -O2 -U -f 4096 /dev/mirror/home
newfs -O2 -U -f 4096 /dev/mirror/data

Mounten der Partitionen

Die Partitionen mounten wir unterhalb von /mnt.

mount -t ufs /dev/mirror/root /mnt
mkdir -p /mnt/usr/home /mnt/data
mount -t ufs /dev/mirror/home /mnt/usr/home
mount -t ufs /dev/mirror/data /mnt/data

Installation der Chroot-Umgebung

Auf die gemounteten Partitionen entpacken wir ein FreeBSD-Minimalsystem mit dem wir problemlos weiterarbeiten können. Je nach Auslastung des FreeBSD FTP-Servers kann dies ein wenig dauern, bitte nicht ungeduldig werden.

fetch -q -o - ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.0-RELEASE/base.txz   | tar Jxpvf - -C /mnt/
fetch -q -o - ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.0-RELEASE/kernel.txz | tar Jxpvf - -C /mnt/
fetch -q -o - ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.0-RELEASE/lib32.txz  | tar Jxpvf - -C /mnt/
fetch -q -o - ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.0-RELEASE/src.txz    | tar Jxpvf - -C /mnt/

Unser System soll natürlich auch von den Festplatten booten können, weshalb wir jetzt den Bootcode und Bootloader in den Bootpartitionen installieren.

gpart bootcode -b /mnt/boot/pmbr -p /mnt/boot/gptboot -i 1 ada0
gpart bootcode -b /mnt/boot/pmbr -p /mnt/boot/gptboot -i 1 ada1

Vorbereiten der Chroot-Umgebung

Vor dem Wechsel in die Chroot-Umgebung müssen wir noch die resolv.conf in die Chroot-Umgebung kopieren und das Device-Filesysteme dorthin mounten.

cp -L /etc/resolv.conf /mnt/etc/resolv.conf

mount -t devfs devfs /mnt/dev

Betreten der Chroot-Umgebung

Das neu installierte System selbstverständlich noch konfiguriert werden, bevor wir es nutzen können. Dazu werden wir jetzt in das neue System chrooten und eine minimale Grundkonfiguration vornehmen.

Beim Betreten der Chroot-Umgebung setzen wir mittels /usr/bin/env -i erstmal alle Environment-Variablen zurück. Andererseits benötigen wir aber die Environment-Variablen HOME und TERM, welche wir manuell auf sinnvolle Defaults setzen.

chroot /mnt /usr/bin/env -i HOME=/root TERM=$TERM /bin/tcsh

Das Home-Verzeichnis des Users root ist standardmässig leider nicht ausreichend restriktiv in seinen Zugriffsrechten, was wir mit einem entsprechenden Aufruf von chmod schnell ändern.

chmod 0700 /root

Zeitzone und NTP-Synchronisierung einrichten

Zunächst setzen wir die Systemzeit (CMOS clock) mittels tzsetup auf "UTC", die "Region" auf Europe, das "Country" auf Germany und "CET" beziehungsweise "CEST" trifft ebenfalls zu.

tzsetup

Die NTP-Synchronisierung kann mit einem einfachen Eintrag in der Crontab bewerkstelligt werden.

echo '*/10  *  *  *  *  root  /usr/sbin/ntpdate -b -s -p 4 -t 0.1 ptbtime2.ptb.de' >> /etc/crontab

Locale einrichten

Auf Servern sollte eine englische locale mit Unicode (UTF-8) verwendet werden. Hierzu muss zunächst eine passende Login-Klasse erzeugt werden, in der die Verwendung einer Unicode-locale festgelegt wird. Wir fügen dazu einen entsprechenden Abschnitt in die Datei /etc/login.conf ein.

cat >> /etc/login.conf <<"EOF"
unicode|Unicode Users Accounts:\
        :charset=UTF-8:\
        :lang=en_US.UTF-8:\
        :tc=default:
"EOF"

Anschliessend muss die Datei in eine Systemdatenbank umgewandelt werden.

cap_mkdb /etc/login.conf

Um diese Login-Klasse für einen User zu aktivieren, können wir das pw usermod Kommando benutzen.

pw usermod root -L unicode

Nach dem nächsten Login mit diesem User sollte der Befehl locale die folgende Ausgabe liefern.

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=

Shell einrichten

Unter FreeBSD ist die Tenex C Shell (TCSH) die Standard-Shell. Für Bash-gewohnte Linux-User ist diese Shell etwas gewöhnungsbedürftig, und natürlich kann man sie später auch gegen eine andere Shell austauschen (im Basis-System ist neben der TCSH auch eine ASH enthalten). Skripte würde ich persönlich für die TCSH eher nicht schreiben, aber für die tägliche Administrationsarbeit ist die TCSH ein sehr brauchbares Werkzeug – wenn man sie erst mal etwas umkonfiguriert hat. Dies tun wir jetzt.

cat >> /etc/csh.cshrc <<"EOF"
setenv LSCOLORS "Dxfxcxdxbxegedabagacad"
alias l         ls -lha
alias ls        ls -GF
"EOF"

cat > /root/.cshrc <<"EOF"
# $FreeBSD: release/9.0.0/etc/root/dot.cshrc 170088 2007-05-29 06:37:58Z dougb $
#
# .cshrc - csh resource script, read at beginning of execution by each shell
#
# see also csh(1), environ(7).
#

alias h         history 25
alias j         jobs -l
alias la        ls -a
alias lf        ls -FA
alias ll        ls -lA

# A righteous umask
umask 22

set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin)

setenv  EDITOR  ee
setenv  PAGER   more
setenv  BLOCKSIZE       K

if ($?prompt) then
        # An interactive shell -- set some stuff up
        set prompt = "[%B%n%b@%B%m%b:%B%~%b] %# "
        set filec
        set history = 1000
        set savehist = 1000
        set mail = (/var/mail/$USER)
        if ( $?tcsh ) then
                bindkey "^W" backward-delete-word
                bindkey -k up history-search-backward
                bindkey -k down history-search-forward
                bindkey ^[[3~ delete-char
        endif
endif
"EOF"

Systemsicherheit verstärken

Die hier vorgestellten Massnahmen sind äusserst simple Basics, die aus Hygienegründen auf jedem FreeBSD System selbstverständlich sein sollten. Um ein FreeBSD System richtig zu härten (Hardened), kommt man jedoch nicht an komplexeren Methoden wie Security Event Auditing und Mandatory Access Control vorbei. Diese Themen werden im FreeBSD Handbuch recht ausführlich besprochen; für den Einstieg empfehle ich hier die Lektüre von Kapitel 14 (Security), für die weiterführenden Themen die Kapitel 16 (Mandatory Access Control) und Kapitel 17 (Security Event Auditing).

OpenSSH konfigurieren

Da wir gerade ein Produktiv-System aufsetzen, werden wir den SSH-Dienst recht restriktiv konfigurieren, indem wir den Login per Passwort verbieten und nur per SSH-Key zulassen.

sed -e 's/#PermitRootLogin no/PermitRootLogin no/' -i '' /etc/ssh/sshd_config
sed -e 's/#PasswordAuthentication no/PasswordAuthentication no/' -i '' /etc/ssh/sshd_config
sed -e 's/#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/' -i '' /etc/ssh/sshd_config

/etc/sysctl.conf anpassen

In der sysctl.conf können die meisten Kernel-Parameter verändert werden. Wir wollen dies nutzen, um unser System etwas robuster und sicherer zu machen.

cat >> /etc/sysctl.conf <<"EOF"
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
security.bsd.hardlink_check_gid=1
security.bsd.hardlink_check_uid=1
security.bsd.unprivileged_read_msgbuf=0
security.bsd.stack_guard_page=1
kern.maxfiles=65536
kern.maxfilesperproc=32768
kern.ipc.nmbclusters=65536
kern.ipc.maxsockets=163840
kern.ipc.somaxconn=1024
net.inet.tcp.msl=7500
net.inet.tcp.syncookies=1
net.inet.tcp.syncookies_only=1
net.inet.tcp.drop_synfin=1
net.inet.tcp.icmp_may_rst=0
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
net.inet.icmp.drop_redirect=1
net.inet.ip.random_id=1
net.inet.ip.redirect=0
net.inet.ip.rtexpire=2
net.inet.ip.rtminexpire=2
net.inet.ip.rtmaxcache=256
net.inet6.ip6.redirect=0
net.inet6.ip6.rtexpire=2
net.inet6.ip6.rtminexpire=2
net.inet6.ip6.rtmaxcache=256
"EOF"

Stärkere Passwort-Hashes verwenden

Wir bearbeiten hierzu mit dem Editor ee (ee /etc/login.conf) in der Datei /etc/login.conf die Klasse default und setzen das passwd_format auf blf (Blowfish). Zusätzlich verlangen wir für Passworte eine Mindestlänge (minpasswordlen) von 8 Zeichen in einem Mix aus Gross- und Kleinschreibung (mixpasswordcase). Desweiteren lassen wir User nach 30 Minuten Inaktivität automatisch ausloggen (idletime).

default:\
        :passwd_format=blf:\
  ... weitere Optionen ...
        :minpasswordlen=8:\
        :mixpasswordcase=true:\
        :idletime=30:\
        :umask=022:

Anschliessend muss die Datei in eine Systemdatenbank umgewandelt werden.

cap_mkdb /etc/login.conf

Die neuen Einstellungen werden erst wirksam, wenn das Passwort eines Benutzers geändert wird. Deshalb sollten wir jetzt die Passwörter für root und alle anderen von uns angelegten User ändern.

passwd root

Dann bearbeiten wir noch die Datei /etc/auth.conf und setzen dort ebenfalls auf blf (Blowfish).

cat >> /etc/auth.conf <<"EOF"
crypt_default = blf
"EOF"

OpenSSL konfigurieren

Folgende Optionen müssen mit dem Editor ee (ee /etc/ssl/openssl.cnf) in der /etc/ssl/openssl.cnf im Abschnitt [ req_distinguished_name ] angepasst beziehungsweise ergänzt werden.

countryName_default             = DE
stateOrProvinceName_default     = Bundesland
localityName_default            = Stadt
0.organizationName_default      = Example Organization
organizationalUnitName_default  = Administration
commonName_default              = srv.example.org
emailAddress_default            = admin@example.org

OpenSSL CA

Als nächstes wird ein eigenes CA Zertifikat erstellt und selbst signiert. Dabei verwenden wir srv.example.org als Common Name und übernehmen ansonsten jeweils die Default-Werte und wählen selbstverständliche sehr sichere Passworte. Die Option A challenge password sollte jedoch leer gelassen werden, andernfalls kann es zu Problemen mit einigen Diensten kommen.

cd /etc/ssl
mkdir -p demoCA
mkdir -p demoCA/certs
mkdir -p demoCA/crl
mkdir -p demoCA/newcerts
mkdir -p demoCA/private
touch demoCA/index.txt

openssl req -new -keyout demoCA/private/cakey.pem -out demoCA/careq.pem
openssl ca -create_serial -out demoCA/cacert.pem -days 3650 -batch -keyfile demoCA/private/cakey.pem -selfsign -extensions v3_ca -infiles demoCA/careq.pem

openssl req -new -keyout srv.example.org_key.pem -out srv.example.org_req.pem
openssl ca -policy policy_anything -out srv.example.org_cert.pem -infiles srv.example.org_req.pem
openssl rsa -in srv.example.org_key.pem -out srv.example.org_keyrsa.pem

cd

Terminals absichern

Um zu verhindern, dass das System im Single User Mode ohne jeglichen Schutz benutzbar ist, ändern wir in der Datei /etc/ttys die Zeile console none... wie folgt ab.

console none                            unknown off insecure

Dadurch wird die Eingabe des root-Kennworts erforderlich, um das System im Single User Mode booten zu können.

Ausserdem können wir in derselben Datei alle auf Servern nicht benötigten Terminals deaktivieren. Dazu setzen wir die Terminals ttyv1 bis ttyv8 auf off. ttyv0 sowie den Rest sollten wir hingegen unverändert lassen.

Zusätzlich können wir veranlassen, dass die Konsole bei jedem Logout gelöscht wird, so dass nicht versehentlich vertrauliche Informationen auf dem Bildschirm sichtbar bleiben. Dazu ändern wir in der Datei /etc/gettytab den Eintrag P|Pc|Pc console wie folgt ab.

P|Pc|Pc console:\
        :ht:np:sp#115200:\
        :cl=\E[H\E[2J:

System konfigurieren

Die aliases-Datenbank für FreeBSDs Sendmail müssen wir mittels make anlegen, auch wenn wir später Sendmail gar nicht verwenden möchten.

cd /etc/mail ; make aliases ; cd

Die /etc/fstab legen wir entsprechend unserem Partitionslayout an.

cat > /etc/fstab <<"EOF"
# Device                       Mountpoint              FStype  Options         Dump    Pass
/dev/mirror/swap               none                    swap    sw              0       0
/dev/mirror/root               /                       ufs     rw              1       1
/dev/mirror/home               /usr/home               ufs     rw              2       2
/dev/mirror/data               /data                   ufs     rw              2       2
proc                           /proc                   procfs  rw              0       0
"EOF"

In der /etc/rc.conf werden diverse Grundeinstellungen für das System und die installierten Dienste vorgenommen.

cat > /etc/rc.conf <<"EOF"
##############################################################
###  Important initial Boot-time options  ####################
##############################################################
#kern_securelevel_enable="YES"
#kern_securelevel="1"
fsck_y_enable="YES"
dumpdev="AUTO"

##############################################################
###  Network configuration sub-section  ######################
##############################################################
hostname="srv.example.org"
### comment next line if you need the following complex config
ifconfig_IFACE="DHCP"
### the next 4 options may be needed on some isp-networks
### uncomment next 4 lines if you need the complex config
#ifconfig_IFACE="inet IP4ADDR/32"
#static_routes="gateway default"
#route_gateway="-host GATEWAY -interface IFACE"
#route_default="default GATEWAY"
tcp_drop_synfin="YES"
icmp_drop_redirect="YES"
ntpdate_enable="YES"
ntpdate_flags="-b -s -p 4 -t 0.1"
ntpdate_hosts="ptbtime2.ptb.de"
sshd_enable="YES"

##############################################################
###  System console options  #################################
##############################################################
keymap="german.iso.kbd"
font8x16="iso-8x16.fnt"
font8x14="iso-8x14.fnt"
font8x8="iso-8x8.fnt"

##############################################################
###  Mail Transfer Agent (MTA) options  ######################
##############################################################
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

##############################################################
###  Miscellaneous administrative options  ###################
##############################################################
syslogd_flags="-ss"
cron_flags="$cron_flags -J 15"
clear_tmp_enable="YES"

##############################################################
### Jail Configuration #######################################
##############################################################
#jail_enable="YES"
#jail_sysvipc_allow="NO"
#jail_set_hostname_allow="NO"
#jail_list=""

##############################################################
###  System services options  ################################
##############################################################
"EOF"

Es folgt ein wenig Voodoo, um die komplexere Netzwerkkonfiguration in der /etc/rc.conf zu vervollständigen.

sed -e "s/IFACE/"`route -n get 0.0.0.0 | grep interface: | awk '{print $2}'`"/g" -i "" /etc/rc.conf
sed -e "s/GATEWAY/"`route -n get 0.0.0.0 | grep gateway: | awk '{print $2}'`"/g" -i "" /etc/rc.conf
sed -e "s/IP4ADDR/"`ifconfig -a inet | grep -m 1 'inet ' | awk '{print $2}'`"/g" -i "" /etc/rc.conf

Um nicht ständig mit dem root-User arbeiten zu müssen, legen wir uns einen Administrations-User an, den wir praktischerweise "admin" nennen. Diesem User verpassen wir eine eigene Standard-Gruppe "admin" und nehmen ihn zusätzlich in die Gruppe "wheel" auf, damit dieser User später per su zum root-User wechseln kann. Das Home-Verzeichnis des admin-Users lassen wir ebenfalls restriktiv anlegen und setzen seine Standard-Shell auf /bin/tcsh. Ein sicheres Passwort bekommt er selbstverständlich auch noch.

pw groupadd -n admin -g 1000
pw useradd -n admin -u 1000 -g admin -G wheel -c Administrator -m -M 700 -s /bin/tcsh
pw usermod admin -L unicode
passwd admin

Wir richten unserem admin noch die Shell und die zum zukünftigen Einloggen zwingend nötigten SSH-Keys ein.

su - admin
umask 0077

cat > .cshrc <<"EOF"
# $FreeBSD: release/9.0.0/share/skel/dot.cshrc 170119 2007-05-29 22:07:57Z dougb $
#
# .cshrc - csh resource script, read at beginning of execution by each shell
#
# see also csh(1), environ(7).
#

alias h         history 25
alias j         jobs -l
alias la        ls -a
alias lf        ls -FA
alias ll        ls -lA

# A righteous umask
umask 22

set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin)

setenv  EDITOR  ee
setenv  PAGER   more
setenv  BLOCKSIZE       K

if ($?prompt) then
        # An interactive shell -- set some stuff up
        set prompt = "[%B%n%b@%B%m%b:%B%~%b] %# "
        set filec
        set history = 1000
        set savehist = 1000
        set mail = (/var/mail/$USER)
        if ( $?tcsh ) then
                bindkey "^W" backward-delete-word
                bindkey -k up history-search-backward
                bindkey -k down history-search-forward
                bindkey ^[[3~ delete-char
        endif
endif
"EOF"

mkdir .ssh
ssh-keygen -t rsa -b 2048
cp -a .ssh/id_rsa.pub .ssh/authorized_keys

exit

Buildsystem konfigurieren

cat > /etc/make.conf <<"EOF"
KERNCONF?=DEVNULL
CPUTYPE?=native
CFLAGS= -O2 -fno-strict-aliasing -pipe
CXXFLAGS+= -fconserve-space
MAKE_SHELL?=sh
COPTFLAGS= -O -pipe
INSTALL=install -C
PRINTERDEVICE=ascii
BOOTWAIT=0
SUP_UPDATE=
SUP=/usr/bin/csup
SUPFLAGS= -g -L 2
SUPHOST=cvsup.de.FreeBSD.org
SUPFILE=/usr/share/examples/cvsup/standard-supfile
WITHOUT_X11=YES
"EOF"

cat > /etc/src.conf <<"EOF"
WITH_BIND_SIGCHASE=YES
WITHOUT_BLUETOOTH=YES
WITHOUT_CALENDAR=YES
WITHOUT_FLOPPY=YES
WITHOUT_GAMES=YES
WITHOUT_GPIB=YES
WITHOUT_GSSAPI=YES
WITHOUT_HTML=YES
WITH_ICONV=YES
WITHOUT_I4B=YES
WITHOUT_IPX=YES
WITHOUT_KERBEROS=YES
WITHOUT_LPR=YES
WITHOUT_NDIS=YES
WITHOUT_NETGRAPH=YES
WITHOUT_PPP=YES
WITHOUT_PROFILE=YES
WITHOUT_RCMDS=YES
WITHOUT_RCS=YES
#WITHOUT_SENDMAIL=YES
WITHOUT_SHAREDOCS=YES
WITHOUT_USB=YES
WITHOUT_WIRELESS=YES
"EOF"

Kernel konfigurieren

mkdir -p /root/kernels
cp /usr/src/sys/amd64/conf/GENERIC /root/kernels/DEVNULL
cd /usr/src/sys/amd64/conf
ln -s /root/kernels/DEVNULL
cd ~

fetch http://www.rootservice.org/downloads/configs/freebsd/kernel_config.txt
mv kernel_config.txt /root/kernels/DEVNULL
sed -e 's/.$//g' -i '' /root/kernels/DEVNULL

cat >> /boot/loader.conf <<"EOF"
geom_mirror_load="YES"
"EOF"

Abschluss der Installation

Um uns künftig mit unserem Arbeitsuser einloggen zu können, müssen wir uns dessen SSH-Key auf unser lokales System kopieren und ihn dann mit Hilfe der PuTTYgen Dokumentation in einen für PuTTY lesbaren Key umwandeln.

pscp -P 2222 -r root@127.0.0.1:/mnt/usr/home/admin/.ssh "%USERPROFILE%\ssh"

Nun ist es endlich soweit: Wir verlassen das Chroot, unmounten die Partitionen und rebooten zum ersten Mal in unser neues FreeBSD Basis-System.

exit

umount /mnt/dev
umount /mnt/data
umount /mnt/usr/home
umount /mnt

shutdown -r now

System aktualisieren

Nach dem Reboot aktualisieren und entschlacken wir das System.

Source Tree auschecken

Am Besten funktioniert bei FreeBSD immer noch die Aktualisierung über die System-Sourcen. Auf diesem Wege kann man ein System über viele Release-Generationen hinweg aktuell halten, ohne eine Neuinstallation durchzuführen. Das Verfahren ist zwar etwas zeitaufwändig, aber erprobt und führt bei richtiger Anwendung zu einem sauberen, aktuellen System.

Zunächst wird hierzu das aktuelle Quellenverzeichnis von FreeBSD benötigt. Glücklicherweise liefert FreeBSD hierzu das Tool csup mit, das diesen Arbeitsschritt stark vereinfacht und durch den Aufruf von make update im Verzeichnis /usr/src ausgeführt wird.

cd /usr/src
make update

Konfiguration anpassen

In den Abschnitten Buildsystem konfigurieren und Kernel konfigurieren haben wir uns bereits eine geeignete make.conf und eine individuelle Kernel-Konfiguration erstellt beziehungsweise heruntergeladen. Dennoch sei an dieser Stelle nochmals auf das FreeBSD Handbuch verwiesen. Insbesondere Kapitel 8 (Kernel selbst erstellen) und Kapitel 24.6 (Basissystem komplett aktualisieren) seien Jedem FreeBSD Administratoren ans Herz gelegt.

Ausserdem empfiehlt es sich vor einem Update des Basissystems die Datei /usr/src/UPDATING zu lesen. Alle Angaben und Hinweise in dieser Datei sind aktueller und zutreffender als das Handbuch und sollten unbedingt befolgt werden.

Vorbereitende Arbeiten

Zunächst müssen eventuell vorhandene Object-Dateien im Verzeichnis /usr/obj gelöscht werden, damit make später wirklich das gesamte System neu erstellt.

cd /usr/obj
chflags -R noschg *
rm -rf *

Für die spätere Installation des neu kompilierten Basissystems darf /tmp nicht mit der Option noexec gemounted sein. Da zwischendrin noch mal ein Reboot erfolgt, können wir bei Bedarf bereits jetzt die entsprechende Zeile in der fstab anpassen.

#/dev/mirror/temp               /tmp                    ufs     rw,noexec,nosuid  2     2
/dev/mirror/temp               /tmp                    ufs     rw              2       2

Ausserdem sollte mergemaster im Pre-Build-Mode angeworfen werden, damit es während der Aktualisierung nicht zu Fehlern kommt, weil z. B. bestimmte User oder Gruppen noch nicht vorhanden sind.

cd /usr/src/usr.sbin/mergemaster
./mergemaster.sh -p

Basissystem rekompilieren

Das Kompilieren des Basissystems kann durchaus eine Stunde oder länger dauern.

cd /usr/src
make buildworld

Kernel rekompilieren und installieren

Wenn die eigene Kernel-Konfiguration wie bei uns bereits in der /etc/make.conf eingetragen ist, wird sie automatisch verwendet, andernfalls wird die Konfiguration des generischen FreeBSD-Kernels verwendet. Das Kompilieren des Kernels kann durchaus eine Stunde oder länger dauern.

cd /usr/src
make buildkernel
make installkernel

Normalerweise wäre nun ein Reboot in den Single User Mode an der Reihe. Da sich ein Remote-System in diesem Modus ohne KVM-Lösung aber nicht bedienen lässt, begnügen wir uns damit, das System regulär neu zu starten.

shutdown -r now

Wenn wir unser System zu einem späteren Zeitpunkt nochmals aktualisieren, sollten wir zuden zuvor alle Dienste ausser OpenSSH, sowie sämtliche Jails in der Datei /etc/rc.conf deaktivieren.

Basissystem installieren

Wir installieren das neue Basissystem und entsorgen veraltete und überflüssige Dateien.

cd /usr/src
make installworld
make delete-old -DBATCH_DELETE_OLD_FILES
make delete-old-libs -DBATCH_DELETE_OLD_FILES

Als letzten Schritt müssen nun noch die Neuerungen in den Konfigurationsdateien gemerged werden. Dabei unterstützt uns das Tool mergemaster.

/usr/sbin/mergemaster -i -F

Anschliessend müssen wir noch die für die Installation gegebenenfalls vorgenommenen Änderungen in der fstab sowie rc.conf rückgängig machen und das System nochmals durchstarten.

shutdown -r now

Portstree einrichten

Um unser Basissystem um sinnvolle Programme erweitern zu können, fehlt uns noch der sogenannte Portstree. Diesen laden wir uns nun mittels portsnap herunter (kann durchaus eine Stunde oder länger dauern).

portsnap fetch extract

Damit ist der Portstree einsatzbereit. Um den Tree künftig zu aktualisieren genügt der folgende Befehl.

portsnap fetch update

Software installieren

So ganz ohne komfortablere Tools ist das Basis-System etwas mühselig zu administrieren. Deshalb werden aus den Ports nun ein paar etwas häufiger benötigte Anwendungen installiert.

Perl, portaudit und portmaster werden jeweils mit den Default-Optionen installiert.

cd /usr/ports/lang/perl5.14
make config && make config-recursive
make install clean

cd /usr/ports/ports-mgmt/portaudit
make install clean

cd /usr/ports/ports-mgmt/portmaster
make install clean

cd; rehash; portaudit -Fda

Portmaster nimmt uns ab nun etwas Arbeit beim Installieren und später auch beim Updaten von Ports ab.

Auch die folgenden Ports und deren Dependicies werden mit den Default-Optionen installiert.

portmaster --force-config -dB editors/nano
portmaster --force-config -dB editors/vim-lite
portmaster --force-config -dB sysutils/smartmontools

Ein paar Ports müssen wir nun noch konfigurieren.

rehash

echo 'set nomodeline' >> /root/.vimrc
echo 'set nomodeline' >> /usr/home/admin/.vimrc
chown admin:admin /usr/home/admin/.vimrc

sed 's/^DEVICESCAN/#DEVICESCAN/' /usr/local/etc/smartd.conf.sample > /usr/local/etc/smartd.conf
echo '/dev/ada0 -a -o on -S on -s (S/../.././02|L/../../6/03)' >> /usr/local/etc/smartd.conf
echo '/dev/ada1 -a -o on -S on -s (S/../.././02|L/../../6/03)' >> /usr/local/etc/smartd.conf
echo 'daily_status_smart_devices="/dev/ada0 /dev/ada1"' >> /etc/periodic.conf
echo 'smartd_enable="YES"' >> /etc/rc.conf

Wenn wir ein Programm nicht kennen, dann finden wir zu jedem Port eine Datei pkg-descr, die eine kurze Beschreibung sowie (meistens) einen Link zur Projekt-Homepage der Software enthält. Für smartmontools zum Beispiel würden wir die Beschreibung unter /usr/ports/sysutils/smartmontools/pkg-descr finden.

Wie geht es weiter?

Natürlich mit den FreeBSD Tips und Tricks und/oder mit dem FreeBSD Web Hosting System.

Viel Spass mit dem neuen FreeBSD Basissystem.