Obwohl Linux in vielem die Philosophie des alten Unix fortführt, bleibt der Fortschritt nicht stehen. Ein Beispiel dafür sind die sogenannten Capabilities, mit denen sich Prozesse respektive Files ausstatten lassen, um die grobe Vergabe der klassischen Unix-Rechte etwas feiner abzustufen. Über Capabilitites ist es etwa auch möglich, einem Prozess zu erlauben, einen Port kleiner als 1024 zu öffnen, was auf alten Systemen dem Root-User vorbehalten ist. Möglich ist dies mit einem Linux-Kernel ab Version 2.6.24, also vermutlich mit jeder aktuellen Linux-Distribution. Zur Vergabe der entsprechenden Capability ist nicht mehr nötig als der folgende Aufruf, der natürlich mit Root-Rechten erfolgen muss:
setcap 'cap_net_bind_service=+ep' /Pfad/zum/Binary
Eine Einschränkung dabei ist, dass sich Skripte aus Sicherheitsgründen auf diese Art nicht mit Capabilities ausstatten lassen. Auch der Linker-Pfad LD_LIBRARY_PATH lässt sich aus dem gleichen Grund nicht verändern.
Wer etwa auf Port 80 ein Python-Skript ohne Root-Rechte als Webserver laufen lassen möchte, kann zu einem Trick greifen und aus dem Skript ein Binary machen. Der Python-Code dafür ist kurz:
#!/usr/bin/python import SimpleHTTPServer import SocketServer Handler = SimpleHTTPServer.SimpleHTTPRequestHandler httpd = SocketServer.TCPServer(("", 80), Handler) print "serving at port", PORT httpd.serve_forever()
Das Tool cxfreeze aus dem gleichnamigen Paket macht daraus ein Binary:
cxfreeze webserver.py
Wenn Sie dem Endprodukt mit setcap die nötigen Capabilities vergeben, klappt's auch mit dem Servieren:
$ sudo setcap 'cap_net_bind_service=+ep' /home/oliver/dist/webserver $ ./dist/webserver serving at port 80
Ein alternativer Ansatz, den Python-Anwendungen wie Raw-Socket gehen, ist einen in C geschriebenen und compilierten Wrapper zu verwenden, der über die nötigen Capabilities verfügt.
Genauso wie beschrieben lässt sich auch der Apache-Webserver konfigurieren, allerdings müssen Sie sich dann noch um die Runtime- und Logging-Verzeichnisse kümmern, wie es das entsprechende Howto beschreibt.