FreeBSD Remote Installation
Verfasser: Markus Kohlmeyer
Beitragender: Jesco Freund
Beitragender: Eckhard Doll
Letzte Aktualisierung:
Veröffentlicht:
Lizenz: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
Artikel empfehlen: Flattr Twitter Facebook Google+ XING LinkedIn
Einleitung
In diesem HowTo beschreibe ich step-by-step die Remote Installation von FreeBSD 9.1 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.orgund ist selbstständig durch die eigene Domain zu ersetzen. - Der Hostname (FQDN) des Servers lautet
srv.example.orgund 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.
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.heanet.ie cd mirrors/download.sourceforge.net/pub/sourceforge/s/sy/systemrescuecd/sysresccd-x86/3.6.0 binary get systemrescuecd-x86-3.6.0.iso quit VBoxManage storageattach "FreeBSD" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium "systemrescuecd-x86-3.6.0.iso"
Wir können das RescueSystem jetzt booten.
VBoxManage startvm "FreeBSD"
Im Bootmenü wählen wir die erste Option "boot 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 -ssh -P 2222 root@127.0.0.1
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\mfsbsd-9.1-RELEASE-amd64.img" root@127.0.0.1:/tmp/mfsbsd-9.1-RELEASE-amd64.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/mfsbsd-9.1-RELEASE-amd64.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 -ssh -P 2222 root@127.0.0.1
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. Aus diesem Grund verlegen wir diese Jobs mittels nohup in den Hintergrund, so dass wir uns zwischenzeitlich ausloggen können ohne dass dabei die Jobs automatisch von der Shell abgebrochen werden. Ob die Jobs fertig sind, lässt dann mittels ps -auxfwww und top -Pa ermitteln.
Wer gerne mit dem Feuer spielt, der kann diesen Vorgang auch auf die ersten 100MB (Minimum) beschränken, indem er die dd Aufrufe jeweils um count=25000 erweitert.
nohup dd if=/dev/zero of=/dev/ada0 bs=4096 & nohup dd if=/dev/zero of=/dev/ada1 bs=4096 &
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/root |
/ |
UFS2 |
16 GB |
/dev/mirror/data |
/data |
UFS2 |
12 GB |
/dev/mirror/swap |
none |
SWAP |
2 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 vier Partitionen anlegen, die Erste für den Bootcode, die Zweite als Systempartition, die Dritte für unsere Nutzdaten und die Vierte als SWAP. 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 4096 -s 512 -a 4096 -l boot0 ada0 gpart add -t freebsd-ufs -b 8192 -s 16G -a 4096 -l root0 ada0 gpart add -t freebsd-ufs -s 12G -a 4096 -l data0 ada0 gpart add -t freebsd-swap -s 2G -a 4096 -l swap0 ada0 gpart create -s gpt ada1 gpart add -t freebsd-boot -b 4096 -s 512 -a 4096 -l boot1 ada1 gpart add -t freebsd-ufs -b 8192 -s 16G -a 4096 -l root1 ada1 gpart add -t freebsd-ufs -s 12G -a 4096 -l data1 ada1 gpart add -t freebsd-swap -s 2G -a 4096 -l swap1 ada1
Für eine leicht erhöhte Datensicherheit legen wir mittels gmirror ein Software-RAID1 an.
gmirror load gmirror label -b round-robin root ada0p2 ada1p2 gmirror label -b round-robin data ada0p3 ada1p3 gmirror label -b prefer -F swap ada0p4 ada1p4
Formatieren der Partitionen
Nun müssen wir noch die Systempartition und die Partition für 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/data tunefs -j enable /dev/mirror/root tunefs -j enable /dev/mirror/data
Mounten der Partitionen
Die Partitionen mounten wir unterhalb von /mnt.
mount -t ufs /dev/mirror/root /mnt mkdir -p /mnt/data 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.1-RELEASE/base.txz | tar Jxpvf - -C /mnt/ fetch -q -o - ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.1-RELEASE/kernel.txz | tar Jxpvf - -C /mnt/ fetch -q -o - ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.1-RELEASE/lib32.txz | tar Jxpvf - -C /mnt/ fetch -q -o - ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.1-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 '59 2 * * * root /usr/sbin/ntpdate -b -s -4 ptbtime2.ptb.de' >> /etc/crontab
Locale einrichten
Auf Servern sollte für Systemuser eine amerikanisch-englische Locale mit Unicode (UTF-8) verwendet werden. Wir bearbeiten hierzu mit dem Editor ee (ee /etc/login.conf) in der Datei /etc/login.conf die Login-Klasse default, indem wir vor der letzten Zeile folgende Zeilen hinzufügen.
:charset=UTF-8:\
:lang=en_US.UTF-8:\
Anschliessend muss die Datei in eine Systemdatenbank umgewandelt werden.
cap_mkdb /etc/login.conf
Nach dem nächsten Login 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.1.0/etc/root/dot.cshrc 242850 2012-11-10 06:05:04Z eadler $ # # .cshrc - csh resource script, read at beginning of execution by each shell # # see also csh(1), environ(7). # more examples available at /usr/share/examples/csh/ # alias h history 25 alias j jobs -l alias la ls -aF alias lf ls -FA alias ll ls -lAF # 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 less setenv BLOCKSIZE K if ($?prompt) then # An interactive shell -- set some stuff up if ($uid == 0) then set user = root endif set prompt = "[%B%n%b@%B%m%b:%B%~%b] %# " # set prompt = "%n@%m:%/ %# " set promptchars = "%#" set filec set history = 1000 set savehist = (1000 merge) set autolist = ambiguous # Use history to aid expansion set autoexpand set autorehash 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
Um Bruteforce-Attacken erheblich auszubremsen setzen wir für die Passworte der Systemuser eine Mindestlänge (minpasswordlen) von 12 Zeichen in einem Mix aus Gross- und Kleinschreibung (mixpasswordcase) fest. Desweiteren lassen wir User nach 30 Minuten Inaktivität automatisch ausloggen (idletime). Wir bearbeiten hierzu mit dem Editor ee (ee /etc/login.conf) in der Datei /etc/login.conf die Login-Klasse default, indem wir vor der letzten Zeile folgende Zeilen hinzufügen.
:mixpasswordcase=true:\
:minpasswordlen=12:\
:idletime=30:\
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 müssen wir jetzt die Passwörter für root und alle anderen bisher von uns angelegten User ändern.
passwd root
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 = Organization organizationalUnitName_default = Administration commonName_default = srv.example.org emailAddress_default = admin@example.org
Folgende Optionen müssen im Abschnitt [ CA_default ] angepasst werden.
default_days = 730 # how long to certify for default_md = sha256 # which md to use.
Folgende Optionen müssen im Abschnitt [ req ] angepasst werden.
default_bits = 4096 string_mask = utf8only
OpenSSL CA
Als nächstes wird ein eigenes CA Zertifikat erstellt und selbst signiert. Dabei verwenden wir Example CA 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 echo `openssl rand -hex 8 | tr "[:lower:]" "[:upper:]"` > demoCA/serial cp demoCA/serial demoCA/crlnumber openssl genrsa -aes256 -out demoCA/private/cakey.pem 4096 openssl req -new -x509 -sha256 -extensions v3_ca -key demoCA/private/cakey.pem -out demoCA/careq.pem -days 3650 openssl x509 -sha256 -trustout -signkey demoCA/private/cakey.pem -in demoCA/careq.pem -out demoCA/cacert.pem -days 3650 openssl ca -gencrl -crlexts crl_ext -keyfile demoCA/private/cakey.pem -cert demoCA/cacert.pem -out demoCA/crl.pem chmod 0600 demoCA/private/cakey.pem
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/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 2 lines if you need the more complex config defaultrouter="GATEWAY" 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 -4" 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 ####################################### ############################################################## ############################################################## ### 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 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.1.0/share/skel/dot.cshrc 242850 2012-11-10 06:05:04Z eadler $ # # .cshrc - csh resource script, read at beginning of execution by each shell # # see also csh(1), environ(7). # more examples available at /usr/share/examples/csh/ # alias h history 25 alias j jobs -l alias la ls -aF alias lf ls -FA alias ll ls -lAF # 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 less setenv BLOCKSIZE K if ($?prompt) then # An interactive shell -- set some stuff up if ($uid == 0) then set user = root endif set prompt = "[%B%n%b@%B%m%b:%B%~%b] %# " # set prompt = "%n@%m:%/ %# " set promptchars = "%#" set filec set history = 1000 set savehist = (1000 merge) set autolist = ambiguous # Use history to aid expansion set autoexpand set autorehash 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?=GENERIC CPUTYPE?=native CFLAGS= -O2 -fno-strict-aliasing -pipe CXXFLAGS+= -fconserve-space COPTFLAGS= -O -pipe PRINTERDEVICE=ascii SUP_UPDATE= SUP=/usr/bin/csup SUPFLAGS= -g -L 2 SUPHOST=cvsup.de.FreeBSD.org SUPFILE=/usr/share/examples/cvsup/standard-supfile NO_DOCUPDATE=YES NO_PORTSUPDATE=YES NO_WWWUPDATE=YES NO_GUI=YES WITHOUT_GUI=YES WITHOUT_X11=YES WITHOUT_XPM=YES WITH_INET6=YES WITH_IPV6=YES "EOF"
cat > /etc/src.conf << "EOF" WITH_BIND_SIGCHASE=YES WITH_ICONV=YES "EOF"
Kernel konfigurieren
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 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 gegebenenfalls auch eine individuelle Kernel-Konfiguration erstellt. 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 *
OPTIONAL: 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.
cd /usr/src make installworld
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
Wir entsorgen nun noch eventuell vorhandene veraltete und überflüssige Dateien.
cd /usr/src make delete-old -DBATCH_DELETE_OLD_FILES make delete-old-libs -DBATCH_DELETE_OLD_FILES
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.
Für Perl aktivieren zusätzlich GDBM und THREADS, für m4 aktivieren zusätzlich LIBSIGSEGV, der Rest wird jeweils mit den Default-Optionen installiert.
cd /usr/ports/lang/perl5.16 make config-recursive install && rehash cd /usr/ports/ports-mgmt/portupgrade make config-recursive install && rehash cd /usr/ports/ports-mgmt/portmaster make config-recursive install && rehash cd /usr/ports/ports-mgmt/portaudit make config-recursive install && rehash && portaudit -Fda cd /usr/ports/editors/nano make config-recursive install && rehash cd /usr/ports/editors/vim-lite make config-recursive install && rehash cd /usr/ports/sysutils/smartmontools make config-recursive install && rehash
VIM und die SMARTMonTools müssen wir nun noch konfigurieren.
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.