FreeBSD Remote Installation
From RootForum Community » Wiki
Einleitung
In diesem HowTo beschreibe ich "step-by-step" die Remote-Installation von FreeBSD in der 64Bit Variante mittels mfsBSD auf einem handelsüblichen dedizierten Mietserver. Weil sich meine Vorgehensweise oft nur geringfügig von einer normalen FreeBSD Remote-Installation unterscheidet und um eine weitere Republikation der offiziellen FreeBSD Dokumentationen 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.
- Alle Passworte werden als
!!!SECRET!!!dargestellt und sind selbstständig durch sichere Passworte zu ersetzen. - Die Domain der virtuellen Maschine lautet
example.orgund ist selbstständig durch die eigene Domain zu ersetzen. - Der Hostname (FQDN) des Servers lautet
devnull.example.orgund ist selbstständig durch den eigenen Hostnamen zu ersetzen. - Die IP-Adresse der virtuellen Maschine lautet
10.0.2.15und ist selbstständig durch die eigene IP-Adresse zu ersetzen. - Das Default-Gateway der virtuellen Maschine lautet
10.0.2.2und ist selbstständig durch das eigene Gateway zu ersetzen. - Der Nameserver der virtuellen Maschine lautet
10.0.2.2und ist selbstständig durch den eigenen Nameserver zu ersetzen.
Das Referenzsystem
Als Referenzsystem habe ich mich für eine virtuelle Maschine auf Basis von Oracle VM VirtualBox unter Microsoft Windows 7 Professional in der 64Bit Variante entschieden, da sich so ohne grösseren Aufwand ein handelsüblicher dedizierter Mietserver simulieren lässt. Zudem kann diese virtuelle Maschine später noch als kostengünstiges lokales Testsystem weiter genutzt werden. 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 Mietserver vorhandene RescueSystem wird in diesem HowTo die auf Gentoo Linux basierende SystemRescueCD eingesetzt.
VirtualBox und PuTTY werden jeweils mit den Standardoptionen installiert und sofern noch nicht geschehen, werden ihre Installationspfade der Umgebungvariablen PATH des aktuellen Windows-Users hinzugefügt. Dazu öffnen wir die Eingabeaufforderung und setzen folgende drei Befehle ab:
SET OLDPATH=%PATH% SETX PATH "%OLDPATH%;%ProgramFiles(x86)%\PuTTY;%VBOX_INSTALL_PATH%" SET OLDPATH=
Da neue und geänderte Umgebungvariablen in der jeweils aktuellen Eingabeaufforderung noch nicht gültig sind, wird die Eingabeaufforderung nun wieder geschlossen.
Die folgende Registrierungsdatei bitte als putty_virtualbox.reg abspeichern und mittels Doppelklick in die Windowsregistrierung importieren. Dadurch wird PuTTY das vorkonfigurierte Profil Virtualbox hinzugefügt, welches wir für dieses HowTo verwenden werden.
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Virtualbox] "Present"=dword:00000001 "HostName"="127.0.0.1" "LogFileName"="putty.log" "LogType"=dword:00000000 "LogFileClash"=dword:ffffffff "LogFlush"=dword:00000001 "SSHLogOmitPasswords"=dword:00000001 "SSHLogOmitData"=dword:00000000 "Protocol"="ssh" "PortNumber"=dword:000008ae "CloseOnExit"=dword:00000001 "WarnOnClose"=dword:00000001 "PingInterval"=dword:00000000 "PingIntervalSecs"=dword:00000005 "TCPNoDelay"=dword:00000001 "TCPKeepalives"=dword:00000001 "TerminalType"="xterm" "TerminalSpeed"="38400,38400" "TerminalModes"="INTR=A,QUIT=A,ERASE=A,KILL=A,EOF=A,EOL=A,EOL2=A,START=A,STOP=A,SUSP=A,DSUSP=A,REPRINT=A,WERASE=A,LNEXT=A,FLUSH=A,SWTCH=A,STATUS=A,DISCARD=A,IGNPAR=A,PARMRK=A,INPCK=A,ISTRIP=A,INLCR=A,IGNCR=A,ICRNL=A,IUCLC=A,IXON=A,IXANY=A,IXOFF=A,IMAXBEL=A,ISIG=A,ICANON=A,XCASE=A,ECHO=A,ECHOE=A,ECHOK=A,ECHONL=A,NOFLSH=A,TOSTOP=A,IEXTEN=A,ECHOCTL=A,ECHOKE=A,PENDIN=A,OPOST=A,OLCUC=A,ONLCR=A,OCRNL=A,ONOCR=A,ONLRET=A,CS7=A,CS8=A,PARENB=A,PARODD=A," "AddressFamily"=dword:00000000 "ProxyExcludeList"="" "ProxyDNS"=dword:00000001 "ProxyLocalhost"=dword:00000000 "ProxyMethod"=dword:00000000 "ProxyHost"="proxy" "ProxyPort"=dword:00000050 "ProxyUsername"="" "ProxyPassword"="" "ProxyTelnetCommand"="connect %host %port\\n" "Environment"="" "UserName"="" "LocalUserName"="" "NoPTY"=dword:00000000 "Compression"=dword:00000001 "TryAgent"=dword:00000001 "AgentFwd"=dword:00000001 "ChangeUsername"=dword:00000001 "Cipher"="aes,blowfish,3des,WARN,arcfour,des" "KEX"="dh-gex-sha1,dh-group14-sha1,dh-group1-sha1,WARN" "RekeyTime"=dword:0000003c "RekeyBytes"="1G" "SshNoAuth"=dword:00000000 "AuthTIS"=dword:00000000 "AuthKI"=dword:00000001 "SshNoShell"=dword:00000000 "SshProt"=dword:00000003 "SSH2DES"=dword:00000000 "PublicKeyFile"="" "RemoteCommand"="" "RFCEnviron"=dword:00000000 "PassiveTelnet"=dword:00000000 "BackspaceIsDelete"=dword:00000001 "RXVTHomeEnd"=dword:00000000 "LinuxFunctionKeys"=dword:00000000 "NoApplicationKeys"=dword:00000000 "NoApplicationCursors"=dword:00000000 "NoMouseReporting"=dword:00000000 "NoRemoteResize"=dword:00000000 "NoAltScreen"=dword:00000000 "NoRemoteWinTitle"=dword:00000000 "RemoteQTitleAction"=dword:00000001 "NoDBackspace"=dword:00000000 "NoRemoteCharset"=dword:00000000 "ApplicationCursorKeys"=dword:00000000 "ApplicationKeypad"=dword:00000000 "NetHackKeypad"=dword:00000000 "AltF4"=dword:00000001 "AltSpace"=dword:00000000 "AltOnly"=dword:00000000 "ComposeKey"=dword:00000000 "CtrlAltKeys"=dword:00000001 "TelnetKey"=dword:00000000 "TelnetRet"=dword:00000001 "LocalEcho"=dword:00000002 "LocalEdit"=dword:00000002 "Answerback"="PuTTY" "AlwaysOnTop"=dword:00000000 "FullScreenOnAltEnter"=dword:00000000 "HideMousePtr"=dword:00000000 "SunkenEdge"=dword:00000000 "WindowBorder"=dword:00000001 "CurType"=dword:00000000 "BlinkCur"=dword:00000000 "Beep"=dword:00000001 "BeepInd"=dword:00000000 "BellWaveFile"="" "BellOverload"=dword:00000001 "BellOverloadN"=dword:00000005 "BellOverloadT"=dword:000007d0 "BellOverloadS"=dword:00001388 "ScrollbackLines"=dword:00001388 "DECOriginMode"=dword:00000000 "AutoWrapMode"=dword:00000001 "LFImpliesCR"=dword:00000000 "DisableArabicShaping"=dword:00000000 "DisableBidi"=dword:00000000 "WinNameAlways"=dword:00000001 "WinTitle"="" "TermWidth"=dword:00000078 "TermHeight"=dword:00000028 "Font"="Courier New" "FontIsBold"=dword:00000000 "FontCharSet"=dword:00000000 "FontHeight"=dword:0000000a "FontQuality"=dword:00000000 "FontVTMode"=dword:00000004 "UseSystemColours"=dword:00000000 "TryPalette"=dword:00000000 "ANSIColour"=dword:00000001 "Xterm256Colour"=dword:00000001 "BoldAsColour"=dword:00000001 "Colour0"="187,187,187" "Colour1"="255,255,255" "Colour2"="0,0,0" "Colour3"="85,85,85" "Colour4"="0,0,0" "Colour5"="0,255,0" "Colour6"="0,0,0" "Colour7"="85,85,85" "Colour8"="187,0,0" "Colour9"="255,85,85" "Colour10"="0,187,0" "Colour11"="85,255,85" "Colour12"="187,187,0" "Colour13"="255,255,85" "Colour14"="0,0,187" "Colour15"="85,85,255" "Colour16"="187,0,187" "Colour17"="255,85,255" "Colour18"="0,187,187" "Colour19"="85,255,255" "Colour20"="187,187,187" "Colour21"="255,255,255" "RawCNP"=dword:00000000 "PasteRTF"=dword:00000000 "MouseIsXterm"=dword:00000000 "RectSelect"=dword:00000000 "MouseOverride"=dword:00000001 "Wordness0"="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" "Wordness32"="0,1,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1" "Wordness64"="1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2" "Wordness96"="1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1" "Wordness128"="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" "Wordness160"="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" "Wordness192"="2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2" "Wordness224"="2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2" "LineCodePage"="UTF-8" "CJKAmbigWide"=dword:00000000 "UTF8Override"=dword:00000001 "Printer"="" "CapsLockCyr"=dword:00000000 "ScrollBar"=dword:00000001 "ScrollBarFullScreen"=dword:00000000 "ScrollOnKey"=dword:00000001 "ScrollOnDisp"=dword:00000000 "EraseToScrollback"=dword:00000001 "LockSize"=dword:00000000 "BCE"=dword:00000001 "BlinkText"=dword:00000000 "X11Forward"=dword:00000000 "X11Display"="" "X11AuthType"=dword:00000001 "LocalPortAcceptAll"=dword:00000000 "RemotePortAcceptAll"=dword:00000000 "PortForwardings"="" "BugIgnore1"=dword:00000000 "BugPlainPW1"=dword:00000000 "BugRSA1"=dword:00000000 "BugHMAC2"=dword:00000000 "BugDeriveKey2"=dword:00000000 "BugRSAPad2"=dword:00000000 "BugPKSessID2"=dword:00000000 "BugRekey2"=dword:00000000 "StampUtmp"=dword:00000001 "LoginShell"=dword:00000001 "ScrollbarOnLeft"=dword:00000000 "BoldFont"="" "BoldFontIsBold"=dword:00000001 "BoldFontCharSet"=dword:771f2926 "BoldFontHeight"=dword:0017ff78 "WideFont"="" "WideFontIsBold"=dword:01000106 "WideFontCharSet"=dword:00000001 "WideFontHeight"=dword:0017fb04 "WideBoldFont"="" "WideBoldFontIsBold"=dword:026f0770 "WideBoldFontCharSet"=dword:01000106 "WideBoldFontHeight"=dword:000003f8 "ShadowBold"=dword:00000000 "ShadowBoldOffset"=dword:00000001 "SerialLine"="COM1" "SerialSpeed"=dword:00002580 "SerialDataBits"=dword:00000008 "SerialStopHalfbits"=dword:00000002 "SerialParity"=dword:00000000 "SerialFlowControl"=dword:00000001
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), schalten den HPET (High Precision Event Timer) ein und die PAE (Physical Address Extension) aus:
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" --chipset ich9 --memory 1024 --rtcuseutc on --pae off --hpet on VBoxManage modifyvm "FreeBSD" --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,127.0.0.1,2222,10.0.2.15,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. Hierzu eignet sich die auf Gentoo Linux basierende SystemRescueCD am Besten. Wir laden uns die SystemRescueCD nun mit Windows-Bordmitteln per FTP auf unseren Windows Host herunter und weisen sie unserer virtuellen Maschine als Bootmedium zu:
cd "%USERPROFILE%\VirtualBox VMs\FreeBSD" ftp -A ftp.mirrorservice.org cd sites/download.sourceforge.net/pub/sourceforge/s/project/sy/systemrescuecd/sysresccd-x86/2.0.1 get systemrescuecd-x86-2.0.1.iso quit VBoxManage storageattach "FreeBSD" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium "%USERPROFILE%\VirtualBox VMs\FreeBSD\systemrescuecd-x86-2.0.1.iso"
Wir booten das RescueSystem jetzt:
VBoxManage startvm "FreeBSD"
Im Bootscreen wählen wir die Option "64Bit Kernel with default options"
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 beginnen können.
putty -load Virtualbox -l root
mfsBSD installieren
Um unsere umfangreichen Vorbereitungen nun abzuschliessen, müssen wir nur noch unser mfsBSD-Image installieren und booten.
Als Erstes kopieren wir nun das mfsBSD-Image in das RescueSystem:
pscp -load Virtualbox "%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 Festplatte installieren und uns anschliessend wieder ausloggen:
dd if=/dev/zero of=/dev/sda count=50 bs=1M dd if=/tmp/mfsboot.img of=/dev/sda bs=1M exit
Abschliessend stoppen wir die virtuelle Maschine wieder 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-Installation beginnen.
VBoxManage startvm "FreeBSD"
Jetzt sollten wir uns mittels PuTTY als root mit dem Passwort mfsbsd in das mfsBSD-Image einloggen und mit der Installation von FreeBSD beginnen können:
putty -load Virtualbox -l root
Partitionieren der Festplatte
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/gm0s1a | / | UFS2 | 2048 MB |
| /dev/mirror/gm0s1b | none | swap | 2048 MB |
| /dev/mirror/gm0s1d | /usr | UFS2 | 16384 MB |
| /dev/mirror/gm0s1e | /var | UFS2 | 8192 MB |
| /dev/mirror/gm0s1f | /tmp | UFS2 | ~4096 MB |
Die Partitionen legen wir nun mittels fdisk und bsdlabel an:
fdisk -p /dev/ad4 > /tmp/fdisk_ad4.txt fdisk -p /dev/ad6 > /tmp/fdisk_ad6.txt cat > /tmp/bsdlabel.txt <<"EOF" 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 2048M 16 4.2BSD 2048 16384 8 b: 2048M * swap c: * 0 unused 0 0 # "raw" part, don't edit d: 16384M * 4.2BSD 2048 16384 28528 e: 8192M * 4.2BSD 2048 16384 28528 f: * * 4.2BSD 2048 16384 28528 "EOF" dd if=/dev/zero of=/dev/ad4 count=2 fdisk -BI /dev/ad4 fdisk -f /tmp/fdisk_ad4.txt /dev/ad4 bsdlabel -wB /dev/ad4s1 bsdlabel -R /dev/ad4s1 /tmp/bsdlabel.txt dd if=/dev/zero of=/dev/ad6 count=2 fdisk -BI /dev/ad6 fdisk -f /tmp/fdisk_ad6.txt /dev/ad6 bsdlabel -wB /dev/ad6s1 bsdlabel -R /dev/ad6s1 /tmp/bsdlabel.txt
Für eine leicht erhöhte Datensicherheit legen wir nun noch mittels gmirror ein Software-RAID1 an:
gmirror load gmirror label -v -b round-robin gm0 ad4 ad6
Formatieren der Partitionen
Als Nächstes formatieren wir die frisch angelegten Partitionen mit dem UFS2 Filesystem:
newfs -O2 /dev/mirror/gm0s1a newfs -O2 -U /dev/mirror/gm0s1d newfs -O2 -U /dev/mirror/gm0s1e newfs -O2 -U /dev/mirror/gm0s1f
Mounten der Partitionen
Mounten der Partitionen:
mkdir /mnt/inst mount /dev/mirror/gm0s1a /mnt/inst mkdir /mnt/inst/usr /mnt/inst/var /mnt/inst/tmp chmod 1777 /mnt/inst/tmp mount /dev/mirror/gm0s1d /mnt/inst/usr mount /dev/mirror/gm0s1e /mnt/inst/var mount /dev/mirror/gm0s1f /mnt/inst/tmp
Installation der Chroot-Umgebung
Wir benötigen nun das Image der Installations-CD im virtuellen System, also kopieren wir dieses per PuTTY vom Windows Host in den FreeBSD Guest:
pscp -load Virtualbox "%USERPROFILE%\VirtualBox VMs\mfsBSD\FreeBSD-8.2-RELEASE-amd64-disc1.iso" root@127.0.0.1:/mnt/inst/tmp/FreeBSD-8.2-RELEASE-amd64-disc1.iso
Mounten der Installations-CD:
mkdir /mnt/disc mdconfig -a -t vnode -u 5 -f /mnt/inst/tmp/FreeBSD-8.2-RELEASE-amd64-disc1.iso mount_cd9660 /dev/md5 /mnt/disc
Installieren des FreeBSD-Basissystems als Chroot-Umgebung:
setenv DESTDIR /mnt/inst cd /mnt/disc/8.2-RELEASE/base ./install.sh cd /mnt/disc/8.2-RELEASE/kernels ./install.sh GENERIC cd /mnt/disc/8.2-RELEASE/src ./install.sh all cd / umount /mnt/disc mdconfig -d -u 5 rm /mnt/inst/tmp/FreeBSD-8.2-RELEASE-amd64-disc1.iso
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 für eine erfolgreiche Installation noch fehlenden Devie-Filesysteme mounten:
cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf mount -t devfs devfs /mnt/inst/dev
Betreten der Chroot-Umgebung
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/inst /usr/bin/env -i HOME=/root TERM=$TERM /bin/tcsh
Zeitzone und NTP-Synchronisierung einrichten
Dies ist eine der leichtesten Übungen, aber Voraussetzung dafür, dass alle im weiteren Verlauf erläuterten Schritte auch korrekte Ergebnisse liefern:
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 ptbtime1.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 folgende Zeilen 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-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 auch gegen eine andere Shell austauschen (im Basis-System ist neben der TCSH auch eine ASH enthalten). Skripte würde ich für die TCSH nicht schreiben, aber für die tägliche Administrationsarbeit ist die TCSH ein sehr brauchbares Werkzeug – wenn man sie erst mal vernünftig konfiguriert hat. Dies tun wir jetzt:
cat > /root/.cshrc <<"EOF"
# $FreeBSD: src/etc/root/dot.cshrc,v 1.30.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $
#
# .cshrc - csh resource script, read at beginning of execution by each shell
#
# see also csh(1), environ(7).
#
# 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"
cat >> /etc/csh.cshrc <<"EOF"
setenv LSCOLORS "Dxfxcxdxbxegedabagacad"
alias h history 25
alias j jobs -l
alias l ls -lha
alias la ls -a
alias lf ls -FA
alias ll ls -lA
alias ls ls -GF
"EOF"
Systemsicherheit verstärken
Die hier vorgestellten Massnahmen sind äusserst simple Basis-Massnahmen, die auf jedem System aus Hygienegründen selbstverständlich sein sollten. Um ein FreeBSD-System richtig zu härten, 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 die Lektüre von Kapitel 14, für die weiterführenden Themen die Kapitel 16 (Mandatory Access Control) und Kapitel 17 (Security Event Auditing).
/etc/sysctl.conf anpassen
cat >> /etc/sysctl.conf <<"EOF" security.bsd.see_other_uids=0 security.bsd.see_other_gids=0 net.inet.ip.random_id=1 net.inet.tcp.icmp_may_rst=0 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1 "EOF"
Stärkere Passwort-Hashes verwenden
Wir bearbeiten hierzu in der Datei /etc/login.conf die Klasse default:
default:\
:passwd_format=blf:\
:copyright=/etc/COPYRIGHT:\
...
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:
cat >> /etc/auth.conf <<"EOF" crypt_default = blf "EOF"
OpenSSL konfigurieren
Folgende Optionen müssen in der /etc/ssl/openssl.cnf im Abschnitt [ req_distinguished_name ] angepasst beziehungsweise ergänzt werden:
[ req_distinguished_name ] countryName_default = DE stateOrProvinceName_default = Bundesland localityName_default = Stadt 0.organizationName_default = Example Organization organizationalUnitName_default = Administration commonName_default = devnull.example.org emailAddress_default = admin@example.org
OpenSSL CA
Als nächstes wird ein eigenes CA Zertifikat erstellt und selbst signiert. Dabei verwenden wir devnull.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 devnull.example.org_key.pem -out devnull.example.org_req.pem openssl ca -policy policy_anything -out devnull.example.org_cert.pem -infiles devnull.example.org_req.pem openssl rsa -in devnull.example.org_key.pem -out devnull.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 die network-Terminals 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:\
:ht:np:sp#115200:
wie folgt ab:
P|Pc|Pc console:\
:ht:np:sp#115200:\
:cl=\E[H\E[2J:
System konfigurieren
fstab einrichten:
cat > /etc/fstab <<"EOF" /dev/mirror/gm0s1b none swap sw 0 0 /dev/mirror/gm0s1a / ufs rw 1 1 /dev/mirror/gm0s1d /usr ufs rw 2 2 /dev/mirror/gm0s1e /var ufs rw 2 2 /dev/mirror/gm0s1f /tmp ufs rw 2 2 proc /proc procfs rw 0 0 "EOF"
rc.conf einrichten:
cat > /etc/rc.conf <<"EOF"
##############################################################
### Important initial Boot-time options ####################
##############################################################
fsck_y_enable="YES"
##############################################################
### Network configuration sub-section ######################
##############################################################
hostname="devnull.example.org"
defaultrouter="10.0.2.2"
"EOF"
for interface in `ifconfig -l`; do
if [ "$interface" = "lo0" ]; then
continue
fi
cat >> /etc/rc.conf <<"EOF"
ifconfig_$interface="DHCP"
"EOF"
done
cat >> /etc/rc.conf <<"EOF"
tcp_extensions="YES"
tcp_drop_synfin="YES"
icmp_drop_redirect="YES"
gateway_enable="NO"
rpcbind_enable="NO"
pflog_enable="NO"
pf_enable="NO"
sshd_enable="YES"
ntpdate_enable="YES"
ntpdate_flags="-b -s -p 4 -t 0.1"
ntpdate_hosts="ptbtime1.ptb.de"
##############################################################
### System console options #################################
##############################################################
keymap="german.iso"
font8x16="iso-8x16"
font8x14="iso-8x14"
font8x8="iso-8x8"
##############################################################
### 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_enable="YES"
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"
sshd_config einrichten:
cat >> /etc/ssh/sshd_config <<"EOF" AllowGroups wheel "EOF"
Arbeitsuser anlegen:
pw groupadd users -g 1000
pw groupadd admin -g 1001
pw useradd admin -u 1001 -g admin -G wheel,operator -m -s /bin/tcsh
pw usermod admin -L unicode
chmod 0700 /usr/home/admin
passwd admin
su - admin
umask 0077
cat > .cshrc <<"EOF"
# $FreeBSD: src/share/skel/dot.cshrc,v 1.14.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $
#
# .cshrc - csh resource script, read at beginning of execution by each shell
#
# see also csh(1), environ(7).
#
# 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=3000 SUP_UPDATE= SUP=/usr/bin/csup SUPFLAGS= -g -L 2 SUPHOST=cvsup.de.FreeBSD.org SUPFILE=/usr/share/examples/cvsup/standard-supfile PORTSSUPFILE=/usr/share/examples/cvsup/ports-supfile DOCSUPFILE=/usr/share/examples/cvsup/doc-supfile DOC_LANG=en_US.ISO8859-1 de_DE.ISO8859-1 WITHOUT_X11=YES "EOF" cat > /etc/src.conf <<"EOF" WITHOUT_GAMES=YES WITHOUT_GDB=YES WITHOUT_GPIB=YES WITHOUT_GSSAPI=YES WITHOUT_HTML=YES WITHOUT_I4B=YES WITHOUT_IPX=YES WITHOUT_KERBEROS=YES WITHOUT_LPR=YES WITHOUT_NETGRAPH=YES WITHOUT_PPP=YES WITHOUT_PROFILE=YES WITHOUT_SHAREDOCS=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 ~ cat > /root/kernels/DEVNULL <<"EOF" cpu HAMMER ident DEVNULL options SCHED_ULE # ULE scheduler options PREEMPTION # Enable kernel thread preemption options INET # InterNETworking options INET6 # IPv6 communications protocols options SCTP # Stream Control Transmission Protocol options FFS # Berkeley Fast Filesystem options SOFTUPDATES # Enable FFS soft updates support options UFS_ACL # Support for access control lists options UFS_DIRHASH # Improve performance on big directories options UFS_GJOURNAL # Enable gjournal-based UFS journaling options MD_ROOT # MD is a potential root device options NFSCLIENT # Network Filesystem Client options NFSSERVER # Network Filesystem Server options NFSLOCKD # Network Lock Manager options NFS_ROOT # NFS usable as /, requires NFSCLIENT options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) options PSEUDOFS # Pseudo-filesystem framework options GEOM_PART_GPT # GUID Partition Tables. options GEOM_LABEL # Provides labelization options GEOM_MIRROR # Disk mirroring. options GEOM_ELI options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty) options COMPAT_FREEBSD32 # Compatible with i386 binaries options COMPAT_FREEBSD4 # Compatible with FreeBSD4 options COMPAT_FREEBSD5 # Compatible with FreeBSD5 options COMPAT_FREEBSD6 # Compatible with FreeBSD6 options COMPAT_FREEBSD7 # Compatible with FreeBSD7 options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI options KTRACE # ktrace(1) support options STACK # stack(9) support options SYSVSHM # SYSV-style shared memory options SYSVMSG # SYSV-style message queues options SYSVSEM # SYSV-style semaphores options P1003_1B_SEMAPHORES # POSIX-style semaphores options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed. options KBD_INSTALL_CDEV # install a CDEV entry in /dev options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) options AUDIT # Security event auditing options MAC # TrustedBSD MAC Framework options FLOWTABLE # per-cpu routing cache #options KDTRACE_FRAME # Ensure frames are compiled in #options KDTRACE_HOOKS # Kernel DTrace hooks options INCLUDE_CONFIG_FILE # Include this file in kernel options SMP # Symmetric MultiProcessor Kernel device crypto device cpufreq device acpi device pci device ata device atadisk # ATA disk drives device ataraid # ATA RAID drives options ATA_STATIC_ID # Static device numbering device scbus # SCSI bus (required for SCSI) device da # Direct Access (disks) device iir # Intel Integrated RAID device twa # 3ware 9000 series PATA/SATA RAID device twe # 3ware ATA RAID device atkbdc # AT keyboard controller device atkbd # AT keyboard device psm # PS/2 mouse device kbdmux # keyboard multiplexer device vga # VGA video card driver device sc device agp # support several AGP chipsets device em # Intel PRO/1000 Gigabit Ethernet Family device igb # Intel PRO/1000 PCIE Server Gigabit Family device ixgbe # Intel PRO/10GbE PCIE Ethernet Family device miibus # MII bus support device fxp # Intel EtherExpress PRO/100B (82557, 82558) device re # RealTek 8139C+/8169/8169S/8110S device rl # RealTek 8129/8139 device vr # VIA Rhine, Rhine II device loop # Network loopback device random # Entropy device device ether # Ethernet support device vlan # 802.1Q VLAN support device tun # Packet tunnel. device pty # BSD-style compatibility pseudo ttys device md # Memory "disks" device gif # IPv6 and IPv4 tunneling device faith # IPv6-to-IPv4 relaying (translation) device firmware # firmware assist module device bpf # Berkeley packet filter device uhci # UHCI PCI->USB interface device ohci # OHCI PCI->USB interface device ehci # EHCI PCI->USB interface (USB 2.0) device usb # USB Bus (required) #device udbp # USB Double Bulk Pipe devices device uhid # "Human Interface Devices" device ukbd # Keyboard device umass # Disks/Mass storage - Requires scbus and da device ipmi device smbios device ichwd device coretemp device cpuctl options ENABLE_ALART # Control alarm on Intel intpm driver options LIBALIAS options ALTQ options ALTQ_CBQ # Class Based Queueing options ALTQ_RED # Random Early Detection options ALTQ_RIO # RED In/Out options ALTQ_HFSC # Hierarchical Packet Scheduler options ALTQ_CDNR # Traffic conditioner options ALTQ_PRIQ # Priority Queueing options ALTQ_NOPCC # Required if the TSC is unusable options ALTQ_DEBUG device tap # Virtual Ethernet driver device pf # PF OpenBSD packet-filter firewall device pflog # logging support interface for PF device pfsync # synchronization interface for PF options NULLFS # NULL filesystem options UFS_EXTATTR options UFS_EXTATTR_AUTOSTART device smbus # Bus support, required for smb below. device ichsmb device smb options DIRECTIO options ACCEPT_FILTER_DATA options ACCEPT_FILTER_DNS options ACCEPT_FILTER_HTTP "EOF"
Kernel installieren
cp -a /boot/GENERIC/* /boot/kernel/ cat >> /boot/loader.conf <<"EOF" geom_mirror_load="YES" "EOF"
Abschluss der Installation
pscp -load Virtualbox -r root@127.0.0.1:/mnt/inst/home/admin/.ssh "%USERPROFILE%\ssh"
exit umount /mnt/inst/dev umount /mnt/inst/tmp umount /mnt/inst/var umount /mnt/inst/usr umount /mnt/inst shutdown -r now
System aktualisieren
Nach dem Reboot aktualisieren 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 Quellenverzeichnis von FreeBSD benötigt. Glücklicherweise liefert FreeBSD hierzu das Tool csup mit, das diesen Arbeitsschritt stark vereinfacht.
csup -g -L 2 -h cvsup.de.freebsd.org /usr/share/examples/cvsup/standard-supfile
Konfiguration anpassen
In #Buildsystem konfigurieren und #Kernel konfigurieren haben wir uns bereits eine geeignete make.conf und 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 ans Herz gelegt.
Ausserdem empfiehlt es sich /usr/src/UPDATING zu lesen. Alle Angaben und Hinweise in dieser Datei sind aktueller und zutreffender als das Handbuch oder gar etwaige Wiki-Artikel und sollten unbedingt befolgt werden.
Vorbereitende Arbeiten
Zunächst müssen eventuell noch vorhandene Object-Dateien 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 Basissystems darf /tmp nicht mit der Option noexec gemounted sein. Da zwischendrin noch mal ein Reboot erfolgt, können wir aber jetzt schon mal die entsprechende Zeile in der fstab anpassen:
#/dev/mirror/gm0s1f /tmp ufs rw,noexec,nosuid 2 2 /dev/mirror/gm0s1f /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
Dies 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 make.conf eingetragen ist, wird sie automatisch verwendet (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 neu zu starten.
shutdown -r now
Wenn wir unser System zu einem späteren Zeitpunkt nochmals aktualisieren, sollten wir stattdessen 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
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 einige häufig benötigte Anwendungen installiert.
Perl, portaudit und portmaster werden mit den Default-Optionen installiert:
cd /usr/ports/lang/perl5.12 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 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 ports-mgmt/pkg_cutleaves portmaster --force-config -dB ports-mgmt/portupgrade portmaster --force-config -dB sysutils/most portmaster --force-config -dB sysutils/cpdup portmaster --force-config -dB sysutils/pwgen2 portmaster --force-config -dB sysutils/smartmontools portmaster --force-config -dB sysutils/tmux
Für sysinfo aktivieren den dmidecode Support:
portmaster --force-config -dB sysutils/sysinfo
Ein paar Ports müssen wir nun noch konfigurieren:
rehash echo 'set nomodeline' >> ~/.vimrc echo 'set nomodeline' >> /home/admin/.vimrc chown admin:admin /home/admin/.vimrc sed 's/^DEVICESCAN/#DEVICESCAN/' /usr/local/etc/smartd.conf.sample > /usr/local/etc/smartd.conf echo '/dev/ad4 -a -o on -S on -s (S/../.././02|L/../../6/03)' >> /usr/local/etc/smartd.conf echo '/dev/ad6 -a -o on -S on -s (S/../.././02|L/../../6/03)' >> /usr/local/etc/smartd.conf echo 'daily_status_smart_devices="/dev/ad4 /dev/ad6"' >> /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 tmux zum Beispiel würden wir die Beschreibung unter /usr/ports/misc/tmux/pkg-descr finden.
Wie geht es weiter?
Natürlich mit den FreeBSD Tips und Tricks und/oder mit dem FreeBSD Hosting System.
Viel Spass mit dem neuen FreeBSD Basissystem.