logo_header

icon_register icon_logout

icon_bubbles Forum

icon_bubbles Wiki

icon_bubbles Blogs

icon_bubbles Planet

RootForum Community » Wiki

Gentoo Hardened Base System (de)

From RootForum Community » Wiki

Jump to:navigation, search

Contents

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.