# Proxmox-Basissetup ## Proxmox installieren Mittels Installationsassistent die Installation durchführen. Wichtig ist es lediglich, die Netzwerkkonfiguration für die Managementschnittstelle korrekt zu konfigurieren und das korrekte RAID-Level (In der Regel Mirroring) für die Systemplatten auszuwählen. Alle weiteren Netzwerke und Speichermedien werden nach der Installation konfiguriert. ## Optional: Single-Node-Installation Falls kein Cluster gewünscht wird, können die HA-Dienste deaktiviert werden. ```bash systemctl disable -q --now pve-ha-lrm systemctl disable -q --now pve-ha-crm systemctl disable -q --now corosync ``` ## Netzwerkkonfiguration vornehmen 1. Alle Schnittstellen auf MTU 9000 einstellen (unter Advanced), dies ist für die volle Bandbreite bei 10G notwendig! 2. Mindestens ein eigenes Netz für den Cluster und Ceph erstellen (vorzugsweise 10G) 3. Bridge anlegen für VLANs für die VMs anlegen (vmbr1, vorzugsweise 10G) 4. IPs passend festlegen 5. Konnektivität prüfen ## Laufwerke mit ZFS einrichten 1. Einzelne ZFS-Volumes korrekt einrichten 2. Jeweils geeignete RAID-Level auswählen !!! tip Optional: Falls eine Verschlüsselung gewünscht wird, ist es sinnvoll, zunächst das Standard-Datenset zu verschlüsseln und danach weitere Volumes direkt verschlüsselt anzulegen. In diesem Fall diesen Schritt auslassen. Er wird [später](#datenpartitionen-verschlusseln) nachgeholt. ## Systemupdates ### Paketquellen anpassen Üblicherweise wird man im heimischen Umfeld keine Lizenz für Proxmox besitzen. Daher stehen die Enterprise-Repos nicht zur Verfügung. Diese sollte entfernt und die Standard-Repos hinzugefügt werden. ``` bash # No-Subscription Repo anlegen sed 's/pve-enterprise/pve-no-subscription/g' \ /etc/apt/sources.list.d/pve-enterprise.list >\ /etc/apt/sources.list.d/pve-no-subscription.list sed -i 's/pve-enterprise/pve-no-subscription/g' \ /etc/apt/sources.list.d/ceph.list # Enterprise-Repo deaktivieren sed -i 's/^/# /' /etc/apt/sources.list.d/pve-enterprise.list ``` ### Nagscreen entfernen Der aus der fehlenden Lizenz resultierende Nagscreen lässt sich mittels eines Hooks für DPKG dauerhaft entfernen. (Siehe auch [^2]) ``` bash # Nagscreen mittels Post-Invoke-Hook dauerhaft entfernen. echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | \ grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { \ echo 'Removing subscription nag from UI...'; \ sed -i '/.*data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' \ /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; \ }; fi\"; };" > /etc/apt/apt.conf.d/no-nag-script # Widget Toolkit neuinstallieren, um Nagscreen anzuwenden. apt --reinstall install proxmox-widget-toolkit ``` ### System updaten ``` bash apt update apt full-upgrade ``` ## SSH einrichten 1. SSH-Keys hinterlegen (```/root/.ssh/authorized_keys```) 2. SSHD-Konfiguration anpassen (```/etc/ssh/sshd_config```) ``` bash # Port 22 wird immer für die Clusterkommunikation benötigt, # kann aber natürlich später mit Firewallregeln auf die # betroffenen Hosts beschränkt werden. Auf jeden Fall muss Port # 22 hier zusätzlich angegeben werden. # Port 2222 Port 22 # Root-Login nur mit Key PermitRootLogin prohibit-password # Passwort-Login verbieten PasswordAuthentication no # TCP-Forwarding (Tunnel) erlauben AllowTcpForwarding yes # X11-Weiterleitung verbieten X11Forwarding no ``` ## Mail einrichten ### Postfix mit Relay 1. In ```/etc/postfix/main.cf``` folgende Ergänzungen vornehmen: ``` cf relayhost = [smtp.example.com]:587 smtp_use_tls = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt sender_canonical_classes = envelope_sender, header_sender sender_canonical_maps = regexp:/etc/postfix/sender_canonical_maps smtp_header_checks = regexp:/etc/postfix/smtp_header_checks ``` 2. ```/etc/postfix/sasl_passwd``` mit Zugangsdaten erstellen: ``` [smtp.example.com]:587 ich@example.com:mein1234passwort ``` 3. Abhängigkeiten installieren ``` bash apt install libsasl2-modules ``` 4. Absender erzwingen - In ```/etc/postfix/sender_canonical_maps```: ``` /.+/ ich@example.com ``` - In ```/etc/postfix/smtp_header_checks```: ``` /From:.*/ REPLACE From: SERVERNAME ``` 5. Berechtigungen anpassen und Konfigurationsdateien mappen ``` bash chmod 600 /etc/postfix/sasl_passwd postmap /etc/postfix/sasl_passwd postmap /etc/postfix/sender_canonical_maps postmap /etc/postfix/smtp_header_checks ``` 6. Dienst neustarten und testen ``` bash systemctl restart postfix.service echo "Testmail von postfix" | mail -s "Postfixtest" test@example.com ``` ## Festplattenüberwachung Standardmäßig überwacht Proxmox mit dem ```zfs-zed``` die ZFS-Speicher. Diese senden dann bei Unregelmäßigkeiten per Mail eine Nachricht. In der Konfigurationsdatei ```/etc/zfs/zed.d/zed.rc```können weitere Einstellungen hierzu, z.B. Push-Dienste wie ntfy eingerichtet werden. Dies kann jedoch im Zweifelsfall recht spät sein, da die Nachrichten erst bei Ausfällen in ZFS-Pools kommen. Daher ist es wünschenswert, zusätzlich S.M.A.R.T.-Monitoring einzurichten. Die Smartmontools sind bereits installiert und so eingerichtet, dass sie für alle Festplatten auffällige Werte melden. Um zusätzlich regelmäßige Selbsttests auszuführen, muss die Konfiguration angepasst werden. Hierzu in ```/etc/smartd.conf``` Folgendes [^3] eintragen: ``` bash # -H: Monitor SMART Health Status, report if failed # -f: Monitor for failure of any 'Usage' Attributes # -u: Report changes in 'Usage' Normalized Attributes # -p: Report changes in 'Prefailure' Normalized Attributes # -l: Monitor SMART log. Type is one of: error, selftest # -n POWERMODE: check the device unless it is in SLEEP or STANDBY mode # -n N: After N checks are skipped in a row, powermode is ignored and the check is performed anyway # -n q: When a periodic test is skipped, smartd normally writes an informal log message. The message can be suppressed by appending the option ',q' # -o: Enable/disable automatic offline tests (on/off) # -S: Enable/disable attribute autosave (on/off) # -s: start a short self-test every day between 2-3am, and a long self test Wednesdays between 3-4am # -I 194: ignore normalized temperature # -W: track Temperature changes >= 5 Celsius, report Temperatures >= 45 Celsius # -i 9: Ignore device Attribute number ID when checking for failure of Usage Attributes (9: hours-pn-lifetime attribute) # -R 5: Report changes in Raw value of Reallocated_Sector_Ct (5) # -C 197: Report if Current Pending Sector count non-zero # -U 198: Report if Offline Uncorrectable count non-zero # -m ADD Send warning email to ADD for -H, -l error, -l selftest, and -f # -M exec PATH: Executes the specified script or program when an error is detected. DEVICESCAN -H -f -u -p -l error -l selftest -n standby,24,q \ -I 194 \ -I 190 \ -W 5,45,50 \ -i 9 \ -R 5 \ -C 197 \ -U 198 \ -o on -S on -s (L/../../3/04|S/../.././03) \ -m root \ -M exec /usr/share/smartmontools/smartd-runner ``` ## Verschlüsselung einrichten ### Proxmox-Root verschlüsseln (Siehe auch [^1]) !!! danger Der Verlust der verwendeten Passphrase führt unweigerlich zum Datenverlust! Das Starten des Servers und der Zugriff auf die enthaltenen Daten ist nur mit dieser Passphrase möglich! 1. System von einem externen Medium mit ZFS-Support starten (z.B. im Proxmox-Installer ++ctrl+alt+f3++ drücken). 2. In der Shell folgende Schritte ausführen: ``` bash # Aktuellen Root-Pool importieren zpool import -f rpool # Einen Snapshot erstellen zfs snapshot -r rpool/ROOT@copy # Ein temporäres Dateisystem aus dem Snapshot erzeugen zfs send -R rpool/ROOT@copy | zfs receive rpool/copyroot # Das alte Dateisystem löschen zfs destroy -r rpool/ROOT # Ein neues Dateisystem mit aktivierter Verschlüsselung erstellen zfs create -o encryption=on -o keyformat=passphrase rpool/ROOT # Die Dateien vom temporären in das neue Dateisystem kopieren zfs send -R rpool/copyroot/pve-1@copy | zfs receive\ -o encryption=on rpool/ROOT/pve-1 # Den Mountpoint des neuen Dateisystems setzen # Falls dies hängt, das System booten, im initramfs den Pool # importieren und dort den Mountpoint setzen. Danach weiter # wie beschrieben. zfs set mountpoint=/ rpool/ROOT/pve-1 # Prüfen, dass alles verschlüsselt ist zfs get encryption # Das temporäre Dateisystem löschen zfs destroy -r rpool/copyroot/pve-1@copy zfs destroy -r rpool/copyroot # Den Pool wieder exportieren zpool export rpool ``` 3. System neustarten ### Remote-Unlock aktivieren Damit man den Server auch über das Netzwerk mittels SSH entschlüsseln und somit starten kann, muss man Dropbear SSH einrichten. 1. dropbear-initramfs installieren (```apt install dropbear-initramfs```) 2. initramfs mit fester IP ausstatten (```/etc/initramfs-tools/initramfs.conf```) ``` bash IP=192.168.1.100::192.168.1.1:255.255.255.0::enp2s0:off ``` 3. dropbear konfigurieren (```/etc/dropbear/initramfs/dropbear.conf```) ``` bash # z.B. -p2222 für Port 2222 DROPBEAR_OPTIONS= ``` 4. Keys für dropbear hinterlegen ``` bash # Autorisierte Schlüssel hinterlegen cp /root/.ssh/authorized_keys /etc/dropbear/initramfs # Hostkeys konvertieren rm /etc/dropbear/initramfs/*_key cd /etc/ssh for file in ssh_host_*_key; do echo Konvertiere $file cp $file /tmp/$file ssh-keygen -m PEM -p -f /tmp/$file newfile=${file/ssh_host/dropbear} newfile=${newfile/key/host_key} dropbearconvert openssh dropbear /tmp/$file /tmp/$newfile mv /tmp/$newfile /etc/dropbear/initramfs/ rm /tmp/$file done # Ramdisk updaten update-initramfs -u ``` ### Datenpartitionen verschlüsseln !!! info Die Datenpartitionen werden mit einem Key verschlüsselt, der im Dateisystem des Servers liegt. Dieser ist durch die Verschlüsselung des Root-Sets geschützt, wenn der Server ausgeschaltet ist, ist jedoch prinzipiell lesbar, wenn der Server läuft. Die Rechte des Keyfiles sind konservativ gesetzt (Zugriff nur für root) dennoch bleibt dies eine Abwägung zwischen Komfort und Sicherheit. Besser wäre eine spezifische Key-Partition, die nach dem Booten wieder gesperrt würde. Dies ist bei Nutzung von Ceph jedoch ohnehin nicht möglich, da die Keys für Ceph im Root-Dateisystem der Monitore liegen und verfügbar sein müssen. !!! tip Optional: Insbesondere bei Clustereinrichtung sollte in Proxmox der Storage (local-zfs) gelöscht und nach der Verschlüsselung ein passender neuer angelegt werden, der der Storage-ID im Cluster entspricht. !!! danger Der Verlust der verwendeten Schlüsseldatei (```/root/local.key```) führt unweigerlich zum Datenverlust! Das Starten des Servers und der Zugriff auf die enthaltenen Daten ist nur mit dieser Schlüsseldatei möglich! ``` bash # Key generieren openssl rand -hex 32 > /root/local.key chmod 600 /root/local.key # Datensets löschen, evtl. weitere zfs destroy -r rpool/data zfs destroy -r rpool/var-lib-vz # Neue, verschlüsselte Datensets anlegen zfs create -o encryption=on -o keyformat=hex \ -o keylocation=file:///root/local.key rpool/data zfs create -o encryption=on -o keyformat=hex \ -o keylocation=file:///root/local.key rpool/var-lib-vz # Abweichende Mountpoints setzen zfs set mountpoint=/var/lib/vz rpool/var-lib-vz ``` #### Optional: Weitere Pools anlegen (z.B. HDD) ``` bash # Pool erstellen (statt mirror nach Bedaf auch raidz1, raidz2 usw.) # Alternativ über die UI von Proxmox erstellen, dort aber das Häkchen # bei "Add Storage" entfernen. zpool create -m /HDD HDD mirror /dev/sdb /dev/sdc # Neues, verschlüsseltes Datenset anlegen zfs create -o encryption=on -o keyformat=hex \ -o keylocation=file:///root/local.key HDD/data # Als Storage zu Proxmox hinzufügen pvesm add zfspool HDD -pool HDD/data ``` ### Unlock beim Systemstart Standardmäßig wird beim Systemstart nur die Root-Partition entschlüsselt, um den Vorgang komfortabel zu halten, werden die weiteren Datensets hier mit Keymaterial aus dieser Partition entschlüsselt (Siehe [Hinweis](#datenpartitionen-verschlusseln)). Dazu wird ein entsprechender Dienst angelegt. Passiert dies nicht, wird Proxmox viele Fehler produzieren, da es versucht, die VMS und Container zu starten, jedoch nicht auf deren Images zugreifen kann. ``` bash # Dienst zum Unlock beim Systemstart anlegen cat > /etc/systemd/system/zfs-load-key.service <