Debian / c't-VDR im Zaum halten
Posted by Tobi
VDR mir root-Rechten laufen zu lassen, macht zwar vieles einfacher, birgt aber potentielle Sicherheitsrisiken.
VDR mir root-Rechten laufen zu lassen, macht zwar vieles einfacher, birgt aber potentielle Sicherheitsrisiken. So war es bisher möglich mittels der SVDRP-Schnittstelle von VDR, jede beliebige Datei zu überschreiben (CAN-2005-0071). Dem soll nun Abhilfe geschaffen werden. Die Security-Fixes, die Thomas Schmidt bei den offiziellen Debian-Paketen umgesetzt hat, haben nun auch Einzug in c't-VDR gehalten.
VDR
Eine Reihe von Patches und Anpassungen des init-Skripts schränken die Freiheiten, welche VDR sich bisher als root-User nehmen konnte, erheblich ein. Es ist nicht mehr möglich, VDR ohne weiteres mit root-Rechten zu starten. Stattdessen läuft VDR nun mit dem Benutzer "vdr" in der gleichnamigen Gruppe und hat von Haus aus nur noch in diesen Verzeichnissen Schreibrechte:
/var/lib/vdr/
/var/cache/vdr/
/var/lib/video/
/var/lib/video.00/
/var/lib/video.01/ # nur bei c't-VDR!
Hinweis: Wer ein anderes Aufnahmeverzeichnis verwendet, sollte zunächst mit "chown -R vdr:vdr /verzeichnis/" den Besitzer auf den Benutzer und die Gruppe "vdr" ändern.
Darüber hinaus gehört der Benutzer "vdr" den Gruppen "video" und "cdrom" an, was ihm Zugriff auf die DVB-Geräte sowie CDROM- und DVD-Laufwerke gestatten.
Hinweis: Wenn das CDROM/DVD-Laufwerk via IDE-Devices (/dev/hdx)
angesprochen wird, so muss dieses Device u.U. noch der Gruppe "cdrom" mit
"chown :cdrom /dev/hdx" zugeordnet werden. "ls -l /dev/hdx" gibt
Auskunft darüber, ob dies notwendig ist.
Verschiedene Patches machen VDR noch etwas sicherer und ermöglichen den Betrieb als Benutzer mit eingeschränkten Rechten:
- set-system-time-as-user von Ludwig Nussel erlaubt es VDR, auch ohne root-Rechte die Systemzeit zu setzen.
- Der SVDRP-Port wurde standardmäßig deaktiviert und kann nur durch die Option "--port" freigegeben werden (Thomas Schmidt)
- Ein Patch von Darren Salt verhindert, dass VDR als root gestartet wird.
- Ein Patch für den CAN-2005-0071-Bug sorgt dafür, dass mit dem GRAB-Kommando keine Dateien überschrieben werden können.
Um VDR trotz der Einschränkungen noch Zugriff auf für "root" reservierte Funktionen, wie dem Neustarten von VDR, zu gewähren, installiert das VDR-Paket mit /usr/lib/vdr/ctvdrwrapper ein kleines Tool mit gesetzten setuid/setguid-Bits und "root" als Besitzer. Die von diesem Tool aufgerufenen Funktionen werden damit automatisch als "root" ausgeführt, auch wenn das Tool selber von einem andern Benutzer verwendet wird.
Hinweis: Um VDR trotz allem unter dem Benutzer "root" zu starten, sind ein paar Änderungen in /etc/default/vdr nötig. Zum einen muss der Username und die Gruppe angegeben werden:
USER="root"
GROUP"root"
Zum anderen muss mittels des Parameters --allow-root das Starten als root explizit erlaubt werden:
OPTIONS="-w 60 --allow-root"
Es ist nicht ratsam VDR als root zu starten, falls es nicht unbedingt nötig ist!
Plug-ins
Für Plug-ins gelten die selben Beschränkungen wie für VDR. Auch sie haben standardmäßig nur auf die oben aufgeführten Verzeichnisse Zugriff. Muss ein Plug-in in ein anderes Verzeichnis schreiben, gibt die Installationsroutine des Plug-in-Pakets dem Benutzer oder der Gruppe "vdr" automatisch Schreibzugriff darauf. So z.B. beim osdteletext-Plug-in, welches seine Videotext-Seiten in /var/cache/vdr/vtx speichert. Zu beachten ist, dass damit auch alle anderen Plug-ins, VDR selber und die von VDR gestarteten Add-ons und Scripte Schreibzugriff auf diese Verzeichnisse bekommen.
vdr-plugin-dvdselect / vdr-plugin-dvd
In seiner ursprüngliche Fassung hat das dvdselect-Plug-in den Link /dev/dvd, welcher auf das eigentlich DVD-Gerät verweist, überschrieben. Mit den Rechten des Benutzers "vdr" ist dies nicht mehr möglich. Das Plug-in verwendet daher nun /var/cache/vdr/dvd als Link auf das DVD-Gerät.
Hinweis: Bei einem Update von vdr-plugin-dvdselect kann diese Änderung jedoch nicht vorgenommen werden, da der Pfad auf diesen Link im VDR-Setup gespeichert wird. Der Pfad muss daher über die Plug-in-Einstellungen oder in /var/lib/vdr/setup.conf bei einem Update manuell geändert werden!
Auch das dvd-Plug-in muss natürlich den neuen Link als DVD-Gerät verwenden. Diese Einstellung kann mit der Option "-C" in /etc/vdr/plugins/ geändert werden, was das c't-VDR-Paket beim Update automatisch erledigt.
Add-ons
Über das OSD-Menü aufgerufene Add-on-Skripte werden ebenfalls mit dem Benutzer "vdr" aufgerufen. Wer eigene Skripte eingebunden hat sollte diesen Umstand berücksichtigen.
vdradmin
VDRAdmin wird nicht von VDR gestartet, sondern läuft als eigenständiger Daemon-Prozess im Hintergrund. Bisher war es so, dass auch VDRAdmin mit root-Rechten ausgeführt wurde. Neuere Versionen des Paketes starten VDRAdmin mit dem Benutzer "vdradmin" in der gleichnamigen Gruppe. Ein Problem welches sich daraus ergibt, betrifft die VDR-Screenshots, welche VDRAdmin für seinen "1-Hz-Mini-Fernseher" verwendet. VDR erzeugt die Screenshots mit dem Benutzer "vdr", worauf der Benutzer "vdradmin" erstmal keinen Zugriff hat. Die Lösung dieses Problems ist es, beim Start von VDRAdmin in /tmp ein Verzeichnis mit gesetztem setgid-Bit und "vdradmin" als Gruppe zu erzeugen. Speichert VDR darin einen Screenshot ab, so wird diese Datei automatisch der Gruppe "vdradmin" zugeordnet, obwohl sie von "vdr" angelegt wurde. VDRAdmin kann damit den Screenshot lesen und löschen.
Hinweis: Da VDRAdmin nicht mehr als root ausgeführt wird, kann es auch keine privilegierten Ports (< 1024) mehr öffnen. Wer seinen VDRADmin etwa auf Port 80 betreibt kann VDRAdmin dann nicht mehr starten. In /etc/init.d/vdradmin kann der User, unter dem VDRAdmin gestartet wird, wieder auf "root" gesetzt werden. Alternativ ist es möglich, den Port beispielsweise auf 8001 zu setzten und via Port-Forwarding mit portfw, redir4a oder iptables auf Port 80 umzubiegen (Siehe auch How to run Tomcat on Port 80).
Ein installierter Apache-Webserver eröffnet noch eine dritte Möglichkeit. Mit mod_proxy und den folgenden Zeilen in der httpd.conf, kann VDRAdmin auch hinter Apache versteckt werden:
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass /vdradmin/ http://127.0.0.1:8001/
</IfModule>
xxv
XXV ist enger mit VDR verzahnt als VDRAdmin und wird daher, genau wie VDR, als Benutzer "vdr" anstatt als "root" ausgeführt.