Gentoo Hardened Base System (de)
From RootForum Community » Wiki
Einleitung
In diesem HowTo beschreibe ich "step-by-step" die Remote-Installation von Gentoo Linux Hardened auf einem dedizierten Server. Weil sich meine Vorgehensweise meist nur geringfügig von einer normalen Gentoo Linux Installation unterscheidet und um eine weitere Republikation der offiziellen Gentoo Linux Dokumentationen zu vermeiden, werde ich in diesem HowTo nicht alle Punkte bis ins Detail erläutern.
Vielen Dank für Dein Vertändnis.
Das Referenzsystem
Als Referenzsystem habe ich mich für eine virtuelle Maschine auf Basis von VirtualBox unter Windows Vista(r) entschieden, da sich so ohne grossen Aufwand ein dedizierter Server simulieren lässt. Zudem kann diese virtuelle Maschine später auch noch als kostengünstiges Testsystem weiter genutzt werden. Leider bringt Windows Vista(r) keinen eigenen SSH-Clienten mit, so dass ich auf das sehr empfehlenswerte Putty zurückgreife. Für das bei den meisten Anbietern dedizierter Server vorhandene RescueSystem wird in diesem HowTo die auf Gentoo Linux basierende SystemRescueCD eingesetzt.
VirtualBox und Putty werden jeweils mit den Standardoptionen installiert. Anschliessend werden ihre Installationspfade der Umgebungvariablen PATH per Eingabeaufforderung (cmd.exe) hinzugefügt:
SETX PATH "%ProgramFiles%\Putty;%ProgramFiles%\Sun\xVM VirtualBox"
Da neue und geänderte Umgebungvariablen in der jeweils aktuellen Eingabeaufforderung noch nicht gültig sind, wird die Eingabeaufforderung nun geschlossen.
Die Virtuelle Maschine
Als erstes wird eine neue Eingabeaufforderung geöffnet und eine neue virtuelle Maschine für VirtualBox angelegt. Diese virtuelle Maschine bekommt den Namen GentooHardened und wird mit 512MB RAM, einer 8GB IDE-Festplatte, sowie einer Netzwerkkarte ausgestattet:
VBoxManage createvdi -filename "GentooHardened.vdi" -size 8192 -register VBoxManage createvm -name "GentooHardened" -register VBoxManage modifyvm "GentooHardened" -ostype gentoo -memory 512 -nic1 nat -hda "GentooHardened.vdi"
Als nächstes wird die SystemRescueCD heruntergeladen und dieser virtuellen Maschine als Bootmedium zugewiesen:
cd "%USERPROFILE%\.VirtualBox" ftp -A ftp.mirrorservice.org cd sites/download.sourceforge.net/pub/sourceforge/s/sy/systemrescuecd get systemrescuecd-x86-1.2.2.iso quit VBoxManage modifyvm "GentooHardened" -dvd "%USERPROFILE%\.VirtualBox\systemrescuecd-x86-1.2.2.iso"
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 wird für den SSH-Zugang noch ein Portforwarding eingerichtet, welches den lokalen Port 2222 auf den Port 22 der virtuellen Maschine weiterleitet:
VBoxManage setextradata "GentooHardened" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP VBoxManage setextradata "GentooHardened" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22 VBoxManage setextradata "GentooHardened" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 2222
Nachdem die virtuelle Maschine nun konfiguriert ist, wird es Zeit das RescueSystem zu booten:
VBoxManage startvm "GentooHardened"
Um das Netzwerksetup des RescueSystems bereits während des Bootens automatisch zu konfigurieren, werden folgende Boot-Optionen übergeben:
rescuecd dodhcp
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
Einloggen ins RescueSystem
Jetzt solltest Du Dich mittels Putty als root in das RescueSystem einloggen und mit der eigentlichen Installation beginnen können:
putty -ssh -P 2222 -l root -t localhost
Partitionieren der Festplatte
Da jeder Administrator andere Präferenzen an sein Partitionslayout stellt, beschränke ich mich an diesem Punkt auf ein Minimum:
| Partition | Mountpunkt | Filesystem | Grösse | |-------------+--------------+--------------+----------| | /dev/sda1 | /boot | ext2 | 128 MB | | /dev/sda2 | none | swap | 1024 MB | | /dev/sda3 | / | ext3 | ~7040 MB |
Die Partitionen lege ich üblicherweise mittels sfdisk an:
dd if=/dev/zero of=/dev/sda count=1 bs=512 sfdisk -uM /dev/sda <<"EOF" 0,128,L,* ,1024,S ,,L EOF
Formatieren der Partitionen
Die frisch angelegten Partitionen müssen selbstverständlich noch formatiert werden. Normalerweise formatiere ich die Rootpartition mit XFS, da allerdings nicht jeder Administrator XFS für seine Rootpartition verwenden möchte, zeige ich hier den manuellen Weg zum optimierten EXT3. Dieses ist nötig, da die e2fsprogs bei einigen Distributionen und somit Rescuesystemen oft veraltet sind und daher unter Umständen ein nicht nur für Server unoptimiertes EXT3 erzeugen. Die Bootpartition sollte grundsätzlich mit EXT2 formatiert sein, da dieses Filesystem als Einziges von allen Bootloadern fehlerfrei unterstützt wird:
mke2fs -c -c /dev/sda1 tune2fs -c 0 -i 0 /dev/sda1 mke2fs -c -c -j /dev/sda3 tune2fs -c 0 -i 0 /dev/sda3 tune2fs -O dir_index /dev/sda3 tune2fs -o journal_data /dev/sda3 e2fsck -D /dev/sda3 mkswap /dev/sda2
Mounten der Partitionen
Nun werden die Partitionen für unsere zur Installation benötigte Chroot-Umgebung gemountet:
swapon /dev/sda2 mkdir -p /mnt/gentoo mount -t ext3 -o noatime,nodiratime /dev/sda3 /mnt/gentoo mkdir -p /mnt/gentoo/boot mount -t ext2 -o noatime,nodiratime /dev/sda1 /mnt/gentoo/boot
Entpacken des Stage-Tarballs
Der Stage-Tarball enthält ein minimalistisches Gentoo Linux, welches alle zur Installation notwendigen Tools enthält und als Chroot-Umgebung genutzt werden kann. Der Stage-Tarball wird nach dem Download nach /mnt/gentoo entpackt:
wget -q -O - http://gentoo.osuosl.org/releases/x86/2008.0/stages/hardened/stage3-i686-hardened-2008.0.tar.bz2 | tar xpjvf - -C /mnt/gentoo/
Vorbereiten der Chroot-Umgebung
Vor dem Wechsel in die Chroot-Umgebung müssen noch die resolv.conf in die Chroot-Umgebung kopiert und die für eine erfolgreiche Installation noch fehlenden Filesysteme gemountet werden:
cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf mount -t proc none /mnt/gentoo/proc mount -o bind /dev /mnt/gentoo/dev
Betreten der Chroot-Umgebung
[[ -e /proc/sys/kernel/grsecurity ]] && for i in /proc/sys/kernel/grsecurity/chroot_deny_* ; do echo 0 > ${i} ; done chroot /mnt/gentoo /bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' PATH=/sbin:/bin:/usr/sbin:/usr/bin /bin/bash +h
Setup der Chroot-Umgebung
cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime grep -v rootfs /proc/mounts > /etc/mtab mkdir -p /etc/portage env-update source /etc/profile
Portage konfigurieren
Als Erstes muss der Portage-Tree angelegt werden:
wget -q -O - http://gentoo.osuosl.org/snapshots/portage-latest.tar.bz2 | tar xvjpf - -C /usr/ emerge --sync
Mittels /etc/make.conf werden einzelne Default-Optionen von Portage (neu) gesetzt:
cat > /etc/make.conf <<"EOF" ACCEPT_KEYWORDS="x86" CHOST="i686-pc-linux-gnu" CFLAGS="-O2 -pipe -mtune=i686 -fomit-frame-pointer -fforce-addr" CXXFLAGS="-O2 -pipe -mtune=i686 -fomit-frame-pointer -fforce-addr" GENTOO_MIRRORS="http://de-mirror.org/distro/gentoo http://distfiles.gentoo.org" USE="-* acl bcmath bzip2 caps cgi crypt exif expat fam fastcgi ftp \ gd gdbm gmp graphviz hardened iconv idn imap jpeg libwww mime \ mysql mysqli nocxx nptl pcre perl pic png posix python readline \ session sharedmem sockets spl sse ssl symlink tcl tcpd threads \ tiff tokenizer truetype unicode xattr xml xmlrpc xsl zlib" PORTAGE_ELOG_SYSTEM="echo save" PORT_LOGDIR="/var/log/portage" LINGUAS="en" EOF
Mittels /etc/portage/package.use werden einzelnen Paketen von der /etc/make.conf abweichende USE-Flags zugewiesen:
cat > /etc/portage/package.use <<"EOF" app-arch/lzma-utils -nocxx dev-lang/perl ithreads sys-apps/pciutils -zlib sys-devel/gcc mudflap openmp -nocxx sys-devel/gettext openmp sys-devel/libperl ithreads sys-libs/glibc glibc-omitfp nptlonly EOF
Locales setzen
Da das System später weltweit erreichbar sein wird und die Standardsystemsprache amerikanisch ist, werden die Locales auf en_US.utf8 gesetzt und neu erzeugt:
cat > /etc/env.d/02locale <<"EOF" LC_ALL="en_US.utf8" LANG="en_US.utf8" EOF cat > /etc/locale.gen <<"EOF" en_US ISO-8859-1 en_US.UTF-8 UTF-8 de_DE ISO-8859-1 de_DE@euro ISO-8859-15 de_DE.UTF-8 UTF-8 EOF locale-gen -c /etc/locale.gen env-update source /etc/profile
Basissystem kompilieren
Nun muss das komplette Basissystem (re)kompiliert werden. Dieser Vorgang ist zwar zeitaufwendig, aber für diese Installationsvariante zwingend notwendig. Auch die Reihenfolge ist sehr wichtig, da das System ansonsten unbrauchbar beziehungsweise instabil wird. Während des Rekompilierens werden nur wenige Konfigurationsdateien automatisch aktualisiert, alle anderen müssen manuell mittels etc-update aktualisiert werden.
Hinweis: Die folgenden Schritte sind nötig, da dieses HowTo eine angepasste Portage-Konfiguration verwendet und zudem seit dem Release des Stage-Tarballs einige für diese Installation wichtige Basispakete im Portage-Tree aktualisiert wurden:
emerge -C mktemp emerge -1 portage baselayout emerge -C com_err ss e2fsprogs emerge -1 e2fsprogs emerge -C cracklib pam rm /usr/lib/cracklib_dict* emerge -1 shadow openssh busybox emerge -1 linux-headers glibc etc-update cat > /etc/env.d/02locale <<"EOF" LC_ALL="en_US.utf8" LANG="en_US.utf8" EOF cat > /etc/locale.gen <<"EOF" en_US ISO-8859-1 en_US.UTF-8 UTF-8 de_DE ISO-8859-1 de_DE@euro ISO-8859-15 de_DE.UTF-8 UTF-8 EOF locale-gen -c /etc/locale.gen emerge -1 binutils gcc rm /etc/env.d{,/*}/*i486-pc-linux-gnu* rm -r /usr{,/bin}/*i486-pc-linux-gnu* env-update source /etc/profile emerge -1 python-updater python python-updater find -L /etc/ssl/certs/ -type l -exec rm {} + etc-update
Kompilieren und Aufräumen des Basissystems:
emerge -P emerge -De system grpconv etc-update cat > /etc/locale.gen <<"EOF" en_US ISO-8859-1 en_US.UTF-8 UTF-8 de_DE ISO-8859-1 de_DE@euro ISO-8859-15 de_DE.UTF-8 UTF-8 EOF locale-gen -c /etc/locale.gen emerge --depclean rm -r /usr/lib/perl5{,/*}/5.8.8/i686-linux
Basissystem rekompilieren
Um sicherzustellen, dass das Basissystem ab diesem Punkt keine veraltete Konfiguration oder (speicheresistente) Software nutzt, wird sicherheitshalber kurz die Chroot-Umgebung verlassen und gleich wieder betreten. Im Anschluss wird das Basissystem ein zweites Mal vollständig rekompiliert, damit sichergestellt ist, dass auch wirklich jedes Paket nur noch gegen die aktuell vorhanden Libs gelinkt ist und somit keine veralteten und/oder nicht mehr vorhandenen Funktionen nutzt:
exit chroot /mnt/gentoo /bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' PATH=/sbin:/bin:/usr/sbin:/usr/bin /bin/bash +h cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime env-update source /etc/profile emerge -De system etc-update cat > /etc/locale.gen <<"EOF" en_US ISO-8859-1 en_US.UTF-8 UTF-8 de_DE ISO-8859-1 de_DE@euro ISO-8859-15 de_DE.UTF-8 UTF-8 EOF locale-gen -c /etc/locale.gen
Systemzeit konfigurieren
sed 's@^CLOCK=.*@CLOCK="local"@' -i /etc/conf.d/clock sed 's@^#TIMEZONE=.*@TIMEZONE="Europe/Berlin"@' -i /etc/conf.d/clock
fstab erstellen
Ohne fstab wird das System später nicht booten ;-)
cat > /etc/fstab <<"EOF" /dev/hda1 /boot ext2 noatime,nodiratime 1 2 /dev/hda2 none swap sw 0 0 /dev/hda3 / ext3 noatime,nodiratime 1 1 EOF
Netzwerk konfigurieren
Die Netzwerkonfiguration ist statisch und wird nur als Fallback per DHCP bezogen:
cat > /etc/hosts <<"EOF" 127.0.0.1 localhost.localdomain localhost 10.0.2.15 devnull.domain.tld devnull EOF sed 's@^HOSTNAME=.*@HOSTNAME="devnull"@' -i /etc/conf.d/hostname cat > /etc/conf.d/net <<"EOF" modules=( "iproute2" ) config_eth0=( "10.0.2.15/24 brd 10.0.2.255" ) routes_eth0=( "default via 10.0.2.2" ) dns_servers_eth0="10.0.2.3" fallback_eth0=( "dhcp" ) EOF rc-update add net.eth0 boot
OpenSSL konfigurieren
Zuerst wird die /etc/ssl/openssl.cnf im Abschnitt [ req_distinguished_name ] folgendermassen angepasst:
[ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = DE countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Schleswig-Holstein localityName = Locality Name (eg, city) localityName_default = Kiel 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Max Mustermann Inc # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_default = IT-Abteilung commonName = Common Name (eg, YOUR name) commonName_max = 64 commonName_default = devnull.domain.tld emailAddress = Email Address emailAddress_max = 64 emailAddress_default = admin@domain.tld # SET-ex3 = SET extension number 3
Als nächstes wird ein eigenes CA Zertifikat erstellt und selbst signiert. Hierzu werden jeweils die Default-Werte übernommen und sehr sichere Passworte gewählt. Die Option A challenge password sollte jedoch leer gelassen werden, andernfalls kann es zu Problemen mit einigen Diensten kommen:
cd /etc/ssl /etc/ssl/misc/CA.pl -newca /etc/ssl/misc/CA.pl -newreq /etc/ssl/misc/CA.pl -sign cd
OpenSSH konfigurieren
OpenSSH wird sehr restriktiv konfiguriert, das heisst, dass das Einloggen nur Systemusern, die der Systemgruppe wheel angehören und einen gültigen Public-Key in ihrer ~/.ssh/authorized_keys hinterlegt haben, gestattet ist:
cat >> /etc/ssh/sshd_config <<"EOF" Port 22 Protocol 2 PermitRootLogin no PasswordAuthentication no ChallengeResponseAuthentication no AllowGroups wheel EOF rc-update add sshd default
Systemprogramme installieren
Jetzt werden wichtige Systemprogramme installiert:
emerge syslog-ng logrotate vixie-cron iproute2 dhcpcd rc-update add syslog-ng default rc-update add vixie-cron default
Bootloader installieren
Als Bootloader kommt grub zum Einsatz:
gcc-config 5 source /etc/profile emerge grub gcc-config 1 source /etc/profile rm /boot/grub/*{_,old}* cat > /boot/grub/device.map <<"EOF" (hd0) /dev/hda EOF grub --no-floppy <<"EOF" root (hd0,0) setup (hd0) quit EOF
Bootloader konfigurieren
System ohne Remote-Console:
cat > /boot/grub/grub.conf <<"EOF" timeout 5 default 0 title=Gentoo Linux root (hd0,0) kernel /boot/vmlinuz root=/dev/hda3 noapic EOF
System mit Remote-Console:
cat > /boot/grub/grub.conf <<"EOF" timeout 5 default 0 serial --unit=0 --speed=57600 --word=8 --parity=no --stop=1 terminal serial title=Gentoo Linux root (hd0,0) kernel /boot/vmlinuz root=/dev/hda3 noapic console=tty0 console=ttyS0,57600 EOF cat >> /etc/inittab <<"EOF" s0:12345:respawn:/sbin/agetty -L 57600 ttyS0 vt102 EOF
Kernelsourcen installieren
emerge hardened-sources
Kernelsourcen konfigurieren
Die Kernelkonfiguration /usr/src/linux/.config:
Siehe: Gentoo Hardened Kernel Config
Kernelkonfiguration (Hardware) an das eigene System anpassen:
cd /usr/src/linux make menuconfig
Kernelsourcen kompilieren
Hinweis: Wenn ein 64bit-Hostsystem zum Kompilieren des Kernels genutzt wird, muss in diesem Abschnitt jedes make durch ein make ARCH=i386 ersetzt werden.
make && make install cd /boot ln -s vmlinuz-2.6* vmlinuz cd
Systemtools installieren
emerge gradm gnupg libaio re2c expect bind-tools ntp ed pciutils libutempter lsof lynx
Systemtools konfigurieren
cat > /etc/cron.hourly/ntpdate <<"EOF" #!/bin/sh /usr/sbin/ntpdate -b -s -p 4 -t 0.1 ptbtime1.ptb.de EOF chmod 0755 /etc/cron.hourly/ntpdate rc-update add ntp-client default gradm -P
sysctl.conf einrichten
Mit diesem sed werden ein paar Kernelparameter für die Netzwersicherheit gesetzt:
sed 's@^#net.ipv4@net.ipv4@' -i /etc/sysctl.conf
Root-Passwort setzen
Das Passwort für root sollte mindestens 8 Zeichen lang sein und neben Gross/Klein-Schreibung auch Ziffern und/oder Sonderzeichen enthalten:
passwd root
Arbeitsuser anlegen
Das Passwort für den Arbeitsuser sollte wie das root-Passwort aufgebaut sein, sich von diesem aber deutlich unterscheiden:
useradd admin -m -g users -G cron,wheel passwd admin
SSH-Keys installieren
Für den eben angelegten Arbeitsuser müssen nun noch die SSH-Keys erzeugt werden:
su - admin ssh-keygen -q -b 2048 -t rsa -N "" -f ~/.ssh/id_rsa install -m 0600 ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys exit
Abschliessend müssen die SSH-Keys per Putty auf den Client (PC) kopiert und der Private-Key ins Putty-Format konvertiert und gespeichert werden:
mkdir "%USERPROFILE%\Putty" pscp -scp -P 2222 -l root localhost:/mnt/gentoo/home/admin/.ssh/id_rsa "%USERPROFILE%\Putty\id_rsa" pscp -scp -P 2222 -l root localhost:/mnt/gentoo/home/admin/.ssh/id_rsa.pub "%USERPROFILE%\Putty\id_rsa.pub" puttygen "%USERPROFILE%\Putty\id_rsa"
Künftig kann man sich dann folgendermassen per Putty als Arbeitsuser einloggen:
VBoxManage startvm "GentooHardened" putty -ssh -P 2222 -l admin -i "%USERPROFILE%\Putty\id_rsa.ppk" -t localhost
Reboot ins neue System
Die Basisinstallation ist nun abgeschlossen und das neue System kann gebootet werden:
exit [[ -e /proc/sys/kernel/grsecurity ]] && for i in /proc/sys/kernel/grsecurity/chroot_deny_* ; do echo 0 > ${i} ; done umount /mnt/gentoo/dev umount /mnt/gentoo/proc umount /mnt/gentoo/boot umount /mnt/gentoo shutdown -r now
Wie geht es weiter?
Natürlich mit den Gentoo Hardened Tips Tricks (de) und/oder mit dem Gentoo Hardened Hosting System (de).
Viel Spass mit dem neuen Gentoo Hardened Basissystem.