LibreWorkspace blockiert iFrames durch automatisch gesetzten CSP-Header

Bei jedem Update schreibt LibreWorkspace automatisch immer eine Zeile in das Caddyfile, die die Einbindung von Drittseiten deaktiviert.

Diese Zeile sorgt dafür, dass man Seiten von meinem Server nicht mehr per iFrame auf anderen Domains einbinden kann. Der Browser blockiert das dann mit einer Fehlermeldung.

Ich habe die Zeile schon manuell entfernt, aber am nächsten Tag ist sie wieder da.

Fragen: Kann man das irgendwo dauerhaft abschalten?

Danke für die Hilfe.

Hi Dustin,

das liegt am neuen Portal Modus.
Evtl. im Dashboard Eintrag den Iframe Modus deaktivieren.
Ansonsten hilft wohl gerade nur ein konkurrierendes Skript, was Dir die Iframe-Zeile wieder rausnimmt.
Ist aber notiert und eine Funktion, die die IFrame Zeile deaktiviert wird in die nächste Version reinkommen.

Hallo Jean-Frédéric,

vielen Dank für die Rückmeldung und dafür, dass du das für eine der nächsten Versionen einplanst. Das mit dem Skript habe ich bereits umgesetzt.

Mein aktuelles Problem ist allerdings, dass mein Server dadurch mindestens einmal pro Stunde für 1 bis 2 Minuten nicht erreichbar ist. Gibt es dafür eine Lösung, oder lässt sich das irgendwie abmildern?

Beide Skripte:

fix-opnform-csp.sh entfernt den unerwünschten Content-Security-Policy-Header aus der Caddyfile und lädt Caddy neu, sobald dieser Header (durch ein LibreWorkspace-Update) wieder eingefügt wurde, inklusive Lock-Schutz, Stabilitäts-Check und Statusmeldung an Uptime Kuma.

root in 🌐 la in ~ 
❯ cat /usr/local/bin/fix-opnform-csp.sh
#!/bin/bash
CADDYFILE=/etc/caddy/Caddyfile
LOCKFILE=/tmp/fix-opnform-csp.lock
LOGFILE=/var/log/fix-opnform-csp.log
PUSH_URL="Platzhalter"

push_status() {
    curl -s -G --max-time 5 \
        --data-urlencode "status=$1" \
        --data-urlencode "msg=$2" \
        --data-urlencode "ping=" \
        "$PUSH_URL" >/dev/null 2>&1
}

# Nicht doppelt laufen, inotify-Trigger und Timer koennen gleichzeitig ausloesen
if [ -f "$LOCKFILE" ]; then
    exit 0
fi
touch "$LOCKFILE"
trap 'rm -f "$LOCKFILE"' EXIT

# Stabilitaetscheck: Datei darf sich innerhalb von 3 Sekunden nicht aendern
check1=$(stat -c '%Y %s' "$CADDYFILE")
sleep 3
check2=$(stat -c '%Y %s' "$CADDYFILE")

if [ "$check1" != "$check2" ]; then
    echo "$(date): Caddyfile wird gerade geschrieben, ueberspringe diesen Lauf" >> "$LOGFILE"
    exit 0
fi

if grep -q "Content-Security-Policy.*frame-ancestors" "$CADDYFILE"; then
    push_status down "CSP-Header gefunden, repariere"
    sed -i '/Content-Security-Policy.*frame-ancestors/d' "$CADDYFILE"
    if caddy validate --config "$CADDYFILE" --adapter caddyfile >/tmp/caddy-validate.log 2>&1; then
        caddy reload --config "$CADDYFILE"
        echo "$(date): CSP-Header entfernt und Caddy neu geladen" >> "$LOGFILE"
        push_status up "CSP-Header automatisch entfernt und Caddy neu geladen"
    else
        echo "$(date): FEHLER, Caddyfile nach Fix ungueltig, kein Reload" >> "$LOGFILE"
        cat /tmp/caddy-validate.log >> "$LOGFILE"
        push_status down "FEHLER: Caddyfile nach Fix ungueltig, kein Reload"
    fi
else
    push_status up "OK, kein CSP-Header gefunden"
fi

watch-caddyfile.service überwacht die Caddyfile per inotify im Monitor-Modus auf Änderungen und ruft fix-opnform-csp.sh sofort auf, sobald eine Schreiboperation abgeschlossen ist, als Ergänzung dazu läuft alle 5 Minuten ein Timer als Backup-Trigger.#

root in 🌐 la in ~ 
❯ cat /etc/systemd/system/watch-caddyfile.service
[Unit]
Description=Watch Caddyfile and fix OpnForm CSP
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'inotifywait -m -e close_write,moved_to --format "%%f" /etc/caddy/ | while read -r filename; do if [ "$filename" = "Caddyfile" ]; then /usr/local/bin/fix-opnform-csp.sh; fi; done'
Restart=always

[Install]
WantedBy=multi-user.target

Trigger-Timer-Dateien:

root in 🌐 la in ~ 
❯ cat /etc/systemd/system/fix-opnform-csp.service
cat /etc/systemd/system/fix-opnform-csp.timer
[Unit]
Description=Fix OpnForm CSP Header in Caddyfile (Timer-Trigger)

[Service]
Type=oneshot
ExecStart=/usr/local/bin/fix-opnform-csp.sh
[Unit]
Description=Run fix-opnform-csp every 5 minutes

[Timer]
OnBootSec=1min
OnUnitActiveSec=5min

[Install]
WantedBy=timers.target

root in 🌐 la in ~ 
❯