## 0 ## Dieser Begleittext gehört zur Artikelserie über das Einrichten eines verschlüsselten Basissystems beim Hoster Ultra-VPS: http://www.projekt-rootserver.de/basissystem-trockenuebungen-und-grundlagen/ Bitte bearbeite diese Text-Datei und trage darin die Werte von Deinem Server ein. Sichere sie *ausschließlich* in Deinem True-Crypt Volume! Die Datei dient auch als Dokumentation und Referenz, wenn Du später dringend ein Passwort brauchst oder den Installationsweg nachvollziehen möchtest... ## 1 ## Vorbereitungen Domain DNS umleiten und Subdomain für den Hostname einrichten: xyz.domain.bla im VPS Control Center dann unbedingt den 'Hostname' entsprechend ändern! Host: [Copy / Paste HIER] * Über SSH am Server verbinden (mit 'root' anmelden - Port 22) (Siehe dazu - http://www.projekt-rootserver.de/putty/) * Plattenverteilung sichern $ df [Copy / Paste HIER] * Netzwerkkonfiguration sichern $ cat /etc/network/interfaces [Copy / Paste HIER] * 'non-free' Repsoitories hinzufügen, auf Deutschen Mirror umstellen und Security hinzufügen: $ echo "deb http://ftp.de.debian.org/debian/ wheezy main contrib non-free" > /etc/apt/sources.list && echo "deb-src http://ftp.de.debian.org/debian/ wheezy main contrib non-free" >> /etc/apt/sources.list && echo "deb http://security.debian.org/ wheezy/updates main contrib non-free" >> /etc/apt/sources.list && echo "deb-src http://security.debian.org/ wheezy/updates main contrib non-free" >> /etc/apt/sources.list * System updaten $ apt-get update && apt-get upgrade * Erste Pakete installieren $ apt-get install openssh-server dmsetup cryptsetup lvm2 dropbear busybox pwgen htop * Passwörter erzeugen (Siehe dazu - http://www.projekt-rootserver.de/passwoerter-erstellen-mit-pwgen/) $ pwgen -sy 32 64 [Copy / Paste HIER] PW HDD-Crypt: [Copy / Paste HIER] === WICHTIG! PW sollte mindestens 256 Zeichen haben (512 MAX)! Also 8x 32er PWs zusammenfügen! PW root: [Copy / Paste HIER] PW USER-Key: [Copy / Paste HIER] PW User: [Copy / Paste HIER] PW MySQL-Root: [Copy / Paste HIER] PW SSL-Cert: [Copy / Paste HIER] ("USER" durch Deinem Benutzernamen ersetzen!) (Wichtige Passwörter - wie die oben - sollten 64 Zeichen haben. Also 2x 32er PWs zusammenfügen...) * root passwort ändern $ passwd [Copy / Paste] von oben! * sshd config ändern (Siehe dazu - http://www.projekt-rootserver.de/ssh-absichern-basics-ssh-port-aendern/) $ nano /etc/ssh/sshd_config - Port 55544 ... oder Port Deiner Wahl. 55544 ist hier nur zu Demonstrationszwecken gewählt ... * ssh neu starten $ service ssh reload JETZT mit einer neuen SSH-Verbindung ausprobieren, ob Du Dich als root über 55544 auch wirklich anmelden kannst! Wenn nicht: Config überprüfen!!! NICHT weitermachen, wenn der Login nicht geht, sonst hast Du Dich ausgesperrt! * Rebooten $ reboot ## 2 ## Luks Container erstellen und einrichten * Über SSH verbinden (mit 'root' anmelden - Port 55544) * Container Datei erstellen (/dev/zero zum testen; /dev/urandom für produktiv (dauert ewig)) ### 27000+0 records in ### 27000+0 records out ### 28311552000 bytes (28 GB) copied, 3638.04 s, 7.8 MB/s (==> Dauert recht genau eine Stunde...) $ dd if=/dev/urandom of=/data.bin bs=1M count=27000 * Nach Erstellung data.bin: ----------------------------- $ df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 30963708 28864980 525864 99% / udev 10240 0 10240 0% /dev tmpfs 102108 80 102028 1% /run /dev/xvda1 30963708 28864980 525864 99% / tmpfs 5120 0 5120 0% /run/lock tmpfs 217300 0 217300 0% /run/shm * LUKS initialisieren und öffnen $ cryptsetup -y -c aes-xts-plain -s 512 luksFormat /data.bin ### mit YES bestätigen! ### HIER den Code für das verschlüsselte System per [Copy / Paste] einfügen! $ cryptsetup luksOpen /data.bin lukslvm * LVM einrichten ('root' mit 3 GB, 'tmp' mit 1 GB und 'var' mit 22 GB) $ pvcreate /dev/mapper/lukslvm # (Erstellen des LVM Containers) $ vgcreate vg /dev/mapper/lukslvm # (Erstellen der VolumeGroup "vg") $ lvcreate -L 3G -n root vg # (root Partition anlegen) $ lvcreate -L 22G -n var vg # (var Partition anlegen; Web-, Mail-, DB-Storage) $ lvcreate -L 1G -n tmp vg # (tmp Partition anlegen) ### ODER in einer Zeile: $ pvcreate /dev/mapper/lukslvm && vgcreate vg /dev/mapper/lukslvm && lvcreate -L 3G -n root vg && lvcreate -L 22G -n var vg && lvcreate -L 1G -n tmp vg * Rebooten (es sind IO Probleme aufgetreten.. reboot hat geholfen) $ reboot * Über SSH verbinden (mit 'root' anmelden - Port 55544) * Einloggen und LVM wieder starten $ cryptsetup luksOpen /data.bin lukslvm $ vgscan $ vgchange -ay * Dateisysteme erstellen $ mkfs.ext4 /dev/mapper/vg-root $ mkfs.ext4 /dev/mapper/vg-var $ mkfs.ext4 /dev/mapper/vg-tmp ### ODER in einer Zeile: $ mkfs.ext4 /dev/mapper/vg-root && mkfs.ext4 /dev/mapper/vg-var && mkfs.ext4 /dev/mapper/vg-tmp ## 3 ## System in Container umziehen * Volumes mounten $ mount /dev/mapper/vg-root /mnt/ $ mkdir /mnt/tmp /mnt/var $ mount /dev/mapper/vg-tmp /mnt/tmp $ mount /dev/mapper/vg-var /mnt/var ### ODER in einer Zeile: $ mount /dev/mapper/vg-root /mnt/ && mkdir /mnt/tmp /mnt/var && mount /dev/mapper/vg-tmp /mnt/tmp && mount /dev/mapper/vg-var /mnt/var * System in den Cotainer überspielen $ rsync -aAXv /* /mnt --exclude={/data.bin,"/dev/*","/proc/*","/boot/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*",/lost+found} ### sent 933994636 bytes received 552166 bytes 7953589.80 bytes/sec ### total size is 931895170 speedup is 1.00 * System Verzeichnise einhängen $ mount -o bind /dev /mnt/dev $ mount -o bind /sys /mnt/sys $ mount -t proc none /mnt/proc ### ODER in einer Zeile: $ mount -o bind /dev /mnt/dev && mount -o bind /sys /mnt/sys && mount -t proc none /mnt/proc * "physikalische" Platte einhängen $ mkdir /mnt/parent $ mount -o bind / /mnt/parent * ins neue "System" chrooten $ chroot /mnt * Link auf /boot erstellen $ rm -rf /boot $ ln -s /parent/boot /boot * Anpassen der fstab ### Mit 'Strg+K' alle Zeilen löschen und dann die neue fstab per [Copy/Paste] einfügen $ nano /etc/fstab --- snip it --- /dev/mapper/vg-root / ext4 defaults 0 1 /dev/mapper/vg-tmp /tmp ext4 defaults 0 2 /dev/mapper/vg-var /var ext4 defaults 0 2 /dev/xvda2 swap swap defaults 0 0 proc /proc proc defaults 0 0 --------------- * loop Modul zur initramfs hinzufügen $ echo loop >> /etc/initramfs-tools/modules * nanof Modul zur initramfs hinzufügen (Modul der nanortuellen NIC) $ echo nanof >> /etc/initramfs-tools/modules * Anpassen der initramfs.conf (unten anfügen) $ nano /etc/initramfs-tools/initramfs.conf DEVICECE=eth0 DROPBEAR=y * Hinterlegen der 'authorzied_keys' (Schloss) für den "rootcrypt" Schlüssel $ cd /etc/initramfs-tools/root/.ssh/ $ rm -rf id_* $ nano authorized_keys ## Hier den Public Key "rootcrypt" per (Copy/Paste) hinein kopieren. WICHTIG: In GENAU EINE ZEILE! $ cd * Netzwerkkonfiguration für initramfs (Muss entsprechend an Deine UltraVPS angepasst werden!) Erst die Daten holen: $ cat /etc/network/interfaces export IP={IP}::{GW}:{Netmask}:{Hostname}:eth0 ### Das ist die Form, in der die Werte eingetragen werden müssen. Die Werte bekommst Du aus der Konfigurationsdatei "/etc/network/interfaces" $ nano /etc/initramfs-tools/conf.d/network_config --- snip it --- export IP={IP-Adresse}::{Gateway}:{Netzmaske}:{Hostname}:eth0 --------------- ### Hier bitte Deine Werte anstelle der geschweiften Klammern eintragen! Wichtig: Nach der IP-Adresse kommen zwei Doppelpunkte... * Netzwerkkonfiguration des systems ergänzen $ nano /etc/network/interfaces ### an eth0 Block anfügen (unter Netmask!) pre-up ip addr flush dev eth0 * SSH keys in dropbear übernehmen $ /usr/lib/dropbear/dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key $ /usr/lib/dropbear/dropbearconvert openssh dropbear /etc/ssh/ssh_host_dsa_key /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key * Standard Port des dropbear ändern $ nano /usr/share/initramfs-tools/scripts/init-premount/dropbear - letzte Zeile ändern in /sbin/dropbear -p 55544 ### Hier bitte auch wieder einen Port Deiner Wahl eintragen. 55544 haben wir hier nur als Beispiel genommen... * Anlegen der initramfs Scripte $ nano /etc/initramfs-tools/hooks/mount_cryptroot --- snip it --- #!/bin/sh # This script generates two scripts in the initramfs output, # /root/mount_cryptroot.sh and /root/.profile ALLOW_SHELL=0 # Set this to 1 before running update-initramfs if you want # to allow authorized users to type Ctrl-C to drop to a # root shell (useful for debugging, potential for abuse.) # # (Note that even with ALLOW_SHELL=0 it may still be possible # to achieve a root shell.) # if [ -z ${DESTDIR} ]; then exit fi SCRIPT="${DESTDIR}/root/mount_cryptroot.sh" cat > "${SCRIPT}" << 'EOF' #!/bin/sh # create directory for mount point of the physical denanoce [ -d /crypt ] || mkdir --mode=0700 /crypt # mount physical denanoce in /crypt mount -t ext3 /dev/xvda1 /crypt # cryptsetup data.bin /sbin/cryptsetup luksOpen /crypt/data.bin lukslvm # activate volume group /sbin/vgchange -ay EOF chmod +x "${SCRIPT}" # Run mount_cryptroot by default and close the login session afterwards # If ALLOW_SHELL is set to 1, you can press Ctrl-C to get to an interactive prompt cat > "${DESTDIR}/root/.profile" << EOF ctrl_c_exit() { exit 1 } ctrl_c_shell() { # Ctrl-C during .profile appears to mangle terminal settings reset } if [ "$ALLOW_SHELL" == "1" ]; then echo "Unlocking rootfs... Type Ctrl-C for a shell." trap ctrl_c_shell INT else echo "Unlocking rootfs..." trap ctrl_c_exit INT fi /root/mount_cryptroot.sh && exit 1 || echo "Run ./mount_cryptroot.sh to try unlocking again" trap INT EOF --------------- * Script ausführbar machen $ chmod +x /etc/initramfs-tools/hooks/mount_cryptroot $ nano /etc/initramfs-tools/scripts/local-bottom/cryptboot --- snip it --- #!/bin/sh # create dirctory for mount point [ -d ${rootmnt}/parent ] || mkdir --mode=0700 ${rootmnt}/parent # move phsical mount in new root mount -n -o move /crypt ${rootmnt}/parent --------------- * Script ausführbar machen $ chmod +x /etc/initramfs-tools/scripts/local-bottom/cryptboot * Anpassen des default init Scripts der initramfs-tools (so wird der root Parameter beim booten ignoriert!) $ nano /usr/share/initramfs-tools/init # Export relevant variables - Zeile: export ROOT= ändern in: export ROOT=/dev/mapper/vg-root # Parse command line options - Block beginnend mit [root=* - Block komplett weg!] root=*) ROOT=${x#root=} case $ROOT in LABEL=*) ... bis HIER entfernen! rootflags stehen lassen... rootflags=*) ... * Anpasen des default local Scripts der initramfs-tools, damit 'panic drop' in initramfs shell verhindert wird $ nano /usr/share/initramfs-tools/scripts/local - den folgenden Block löschen [#Default bis einschließlich erstes fi; ersetzen durch 'siehe unten'] # Default delay is 30s slumber=${ROOTDELAY:-30} slumber=$(( ${slumber} * 10 )) while [ ! -e "${ROOT}" ] \ || ! $(get_fstype "${ROOT}" >/dev/null); do /bin/sleep 0.1 slumber=$(( ${slumber} - 1 )) [ ${slumber} -gt 0 ] || break done if [ ${slumber} -gt 0 ]; then log_end_msg 0 else log_end_msg 1 || true fi - und dann ändern in while [ ! -e "${ROOT}" ] \ || ! $(get_fstype "${ROOT}" >/dev/null); do /bin/sleep 0.1 done log_end_msg 1 || true * Neue Initramfs mit den eben gemachten Änderungen bauen $ update-initramfs -u ### update-initramfs: Generating /boot/initrd.img-3.2.0-4-amd64 ### cryptsetup: WARNING: invalid line in /etc/crypttab for lukslvm - ### mount: special device /crypt does not exist * grub updaten $ update-grub * Zurück ins "Muttersystem" $ exit * mounts aufräumen $ umount /mnt/var /mnt/tmp /mnt/dev /mnt/sys /mnt/proc /mnt/parent /mnt * System neustarten und Daumen drücken! $ reboot * Nach ca. 15 Sekunden per SSH als "root" mittels des "rootcrypt"-Keys und des in dropbear eingestellten Ports (55544) auf den Server verbinden. * Es müsste nun eine Passwortabfrage erscheinen. Nach Eingabe des HDD-Crypt-PWs sollte sich die Session beenden. Im Hintergrund fährt nun das System hoch ;) ## 4 ## Altes System aufräumen * Über SSH verbinden (mit 'root' anmelden - Port 55544) * Altes Zeug löschen ;) $ cd /parent $ rm -rf bin/ dev/ opt/ run/ srv/ usr/ etc/ lib/ media/ proc/ sbin/ sys/ var/ home/ lib64/ mnt/ root/ selinux/ tmp/ * DONE! System müsste ab jetzt sauber booten - mit Passwortabfrage am Anfang! ## 5 ## Restlichen Platz der /parent Parition als Swap verwenden * Datei anlegen für swap Bereich $ dd if=/dev/urandom of=/parent/swap.bin bs=1M count=1400 ### 1400+0 records in ### 1400+0 records out ### 1468006400 bytes (1.5 GB) copied, 190.172 s, 7.7 MB/s (Bisschen mehr als 3 Minuten...) * Luks Container anlegen $ cryptsetup -y -c aes-xts-plain -s 512 luksFormat /parent/swap.bin ### "Enter, Enter" bei der Passwortabfrage. Wir erstellen ein leeres PW und ändern das später. * Luks keyfile anlegen, damit swap automatisch gemounted werden kann $ dd if=/dev/urandom of=/root/.swapkey bs=1024 count=4 $ chmod 0400 /root/.swapkey * Keyfile zum Container hinzufügen $ cryptsetup luksAddKey /parent/swap.bin /root/.swapkey * Und "leeres" PW löschen: $ cryptsetup luksRemoveKey /parent/swap.bin ### Wenn er nach dem PW fragt, "Enter" drücken... Das leere PW ist weg, er öffnet ab jetzt nur noch mit dem Key. * Container öffen und als Swap initalisieren $ cryptsetup -d /root/.swapkey luksOpen /parent/swap.bin luksswap $ mkswap -f /dev/mapper/luksswap * Container in /etc/crypttab eintragen (wird dann beim Booten automatisch geladen) $ nano /etc/crypttab luksswap /parent/swap.bin /root/.swapkey luks * Swap in fstab einhängen $ nano /etc/fstab - hier den alten swap Eintrag rauswerfen (/dev/xvda2 bei UltraVPS) - stattdessen eintragen: /dev/mapper/luksswap swap swap defaults 0 0 * Maschine rebooten $ reboot * Über SSH verbinden (mit 'root' anmelden - Port 55544) * Testen, ob alles geklappt hat $ swapon -s - sollte so was in der Art anzeigen: Filename Type Size Used Priority /dev/mapper/luksswap partition 1431548 0 -1 * Alte swap-Partition vom Provider mit Müll überschreiben $ dd if=/dev/urandom of=/dev/xvda2 ### dd: writing to `/dev/xvda2': No space left on device ### 131073+0 records in ### 131072+0 records out ### 67108864 bytes (67 MB) copied, 16.5725 s, 4.0 MB/s * DONE. Finally :) ## 6 ## Final Checks * Plattenaufteilung: $ df -h Filesystem Size Used Avail Use% Mounted on rootfs 3.0G 730M 2.1G 26% / udev 10M 0 10M 0% /dev tmpfs 100M 136K 100M 1% /run /dev/xvda1 30G 28G 86M 100% /parent /dev/mapper/vg-root 3.0G 730M 2.1G 26% / tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 200M 0 200M 0% /run/shm /dev/mapper/vg-tmp 1008M 34M 924M 4% /tmp /dev/mapper/vg-var 22G 478M 21G 3% /var * /parent directory $ ls -aplh /parent total 28G drwxr-xr-x 4 root root 4.0K Jul 5 15:41 ./ drwxr-xr-x 23 root root 4.0K Jul 5 15:22 ../ drwxr-xr-x 3 root root 4.0K Jul 5 15:33 boot/ -rw-r--r-- 1 root root 27G Jul 5 16:00 data.bin lrwxrwxrwx 1 root root 30 Jul 3 15:39 initrd.img -> /boot/initrd.img-3.2.0-4-amd64 drwx------ 2 root root 16K Jul 3 15:39 lost+found/ -rw-r--r-- 1 root root 1.4G Jul 5 15:55 swap.bin lrwxrwxrwx 1 root root 26 Jul 3 15:39 vmlinuz -> boot/vmlinuz-3.2.0-4-amd64 *** Gratulation - die Basisinstalltion ist jetzt abgeschlossen *** ## 7 ## Links zum Nachlesen der Quellen http://www.ducea.com/2006/06/24/inspecting-the-content-of-an-initrd-file/ http://blog.shadura.me/2013/01/05/truecrypt-ntfs-3g-loop/ http://www.opopop.net/booting_linux_from_a_loop_file_system/ https://www.digitalocean.com/community/tutorials/how-to-use-dm-crypt-to-create-an-encrypted-volume-on-an-ubuntu-vps http://www.stefan-seelmann.de/wiki/jiffybox http://www.howtoforge.com/automatically-unlock-luks-encrypted-drives-with-a-keyfile http://www.thomas-krenn.com/de/wiki/Voll-verschl%C3%BCsseltes-System_nanoa_SSH_freischalten https://projectgus.com/2013/05/encrypted-rootfs-over-ssh-with-debian-wheezy/ http://pubmem.wordpress.com/2010/09/16/how-to-resize-lvm-logical-volumes-with-ext4-as-filesystem/ ## 8 ## Grundkonfiguration des Basissystems - SSH absichern und Firewall installieren * Über SSH verbinden (mit 'root' anmelden - Port 55544) * Überflüssige Consolen spawns entfernen $ nano /etc/inittab Von Zeile: 1:2345:respawn:/sbin/getty 38400 tty1 Bis Zeile: 6:23:respawn:/sbin/getty 38400 tty6 auskommentieren. * ipv6 dekativieren ( $ echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 ) - besser gleich persistent: $ echo "net.ipv6.conf.all.disable_ipv6 = 1" > /etc/sysctl.d/01-disable-ipv6.conf * Zeitzone anpassen $ dpkg-reconfigure tzdata - Europe / Berlin * Locales bauen $ dpkg-reconfigure locales [*] de_DE.UTF-8 UTF-8 Default: de_DE.UTF-8 ### Generating locales (this might take a while)... ### de_DE.UTF-8... done ### en_US.UTF-8... done ### Generation complete. ### *** update-locale: Warning: LANGUAGE (en_US:en) is not compatible with LANG (de_DE.UTF-8). Disabling it. * Add User ### Hier natürlich "Deinen" Benutzer eintragen. "Bla" ist hier nur zu Testzwecken gewählt... (Siehe dazu - http://www.projekt-rootserver.de/ssh-absichern-basics-vom-passwort-zum-schluessel/) $ adduser bla - Enter new UNIX password: <...> [Copy / Paste von oben!] - Retype new UNIX password: <...> [Copy / Paste von oben!] - Full Name []: BlaBla - Rest leer lassen und "durchEntern" :) $ mkdir /home/bla/.ssh $ chown -R bla:bla /home/bla $ nano /home/bla/.ssh/authorized_keys - [Copy / Paste von oben!] $ chown bla:root /home/bla/.ssh/authorized_keys $ chmod 0600 /home/bla/.ssh/authorized_keys * Sudo Befehle mit bla-User ermöglichen $ visudo -f /etc/sudoers.d/server --- snip it --- bla ALL=(ALL:ALL) ALL --------------- * sshd config ändern (Siehe dazu - http://www.projekt-rootserver.de/ssh-absichern-basics-root-benutzer-nicht-einloggen-lassen/) (Siehe dazu - http://www.projekt-rootserver.de/puttygen/) $ nano /etc/ssh/sshd_config - PermitRootLogin no - PasswordAuthentication no * ssh neu starten $ service ssh reload JETZT ausprobieren, ob Du Dich als bla mit dem Key auch wirklich anmelden kannst! Wenn nicht: Config überprüfen!!! NICHT weitermachen, wenn der Login nicht geht, sonst hast Du Dich ausgesperrt! * Shorewall aufsetzen und für SSH anpassen $ apt-get install shorewall $ cd /usr/share/doc/shorewall/examples/one-interface/ && cp interfaces policy rules zones /etc/shorewall/ $ cd $ nano /etc/default/shorewall - startup=1 $ nano /etc/shorewall/policy - net / all / drop: Log level entfernen. (Sprich: "info" löschen...) Sonst knallt uns das LOG voll. $ nano /etc/shorewall/rules - Zeile anfügen (für SSH): --- snip it --- # SSH Port aufmachen ACCEPT net $FW tcp 55544 - - 5/min:8 --------------- ### WICHTIG: Hier unbedingt DEINEN SSH-Port eintragen! Sonst hast Du Dich ausgesperrt :/ * Update-Script anlegen $ apt-get install debian-goodies ### Brauchen wir für 'checkrestart' - dieses Script sieht nach, ob wir nach dem Update diverser Bibliotheken irgendwelche Dienste neu starten müssen $ nano upup #!/bin/bash apt-get update apt-get upgrade checkrestart * Script ausführbar machen $ chmod 700 upup * System updaten - geht in Zukunft ohne viel Tipperei ;) $ ./upup * System neu starten $ reboot * Server entsperren / über SSH verbinden - Erst als „root“ mittels des „rootcrypt“-Keys und des in dropbear eingestellten Ports (55544) zwecks HDD-Entschlüsselung über PW. 15 bis 30 Sekunden warten… - Ab jetzt mit dem User „bla“ und seinem ‚bla‘-Key + PW vom Key anmelden – Port 55544 Anhang: ========= IP-Adresse / SSH-Port: [Copy / Paste HIER] HDD-Crypt PW: [Copy / Paste HIER] ssh-Schlüssel rootcrypt (für authorized_keys): [Copy / Paste HIER] PW bla-Key: [Copy / Paste HIER] ssh-Schlüssel bla (für authorized_keys): [Copy / Paste HIER] *EOF*