Zum Inhalt

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.

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 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.

# 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)

# 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

apt update
apt full-upgrade

SSH einrichten

  1. SSH-Keys hinterlegen (/root/.ssh/authorized_keys)
  2. SSHD-Konfiguration anpassen (/etc/ssh/sshd_config)
    # 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:

    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

    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 <ich@example.com>
      
  5. Berechtigungen anpassen und Konfigurationsdateien mappen

    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

    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.rckö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:

# -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:

# 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)

    IP=192.168.1.100::192.168.1.1:255.255.255.0::enp2s0:off
    

  3. dropbear konfigurieren (/etc/dropbear/initramfs/dropbear.conf)

    # z.B. -p2222 für Port 2222
    DROPBEAR_OPTIONS=
    

  4. Keys für dropbear hinterlegen

    # 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!

# 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)

# 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). 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.

# Dienst zum Unlock beim Systemstart anlegen
cat > /etc/systemd/system/zfs-load-key.service <<EOF
[Unit]
Description=Load encryption keys
DefaultDependencies=false
Before=zfs-mount.service
After=zfs-import.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/zfs load-key -a

[Install]
WantedBy=zfs-mount.service
EOF

# Dienste aktivieren
systemctl enable zfs-load-key.service
systemctl enable zfs-import@HDD # Für jeden Pool

Warning

Anschließend den Key (/root/local.key) sichern!

Fußnoten


  1. Native ZFS-Verschlüsselung mit Proxmox: Quelle 

  2. Nagscreen mit DPKG-Post-Invoke-Hook dauerhaft entfernen: Quelle 

  3. SMART tests on in use hard drives?: Quelle