ADMIN-Tipp: Ports unter 1024 ohne Root-Rechte

Jede Woche erscheint in unserem Newsletter ein neuer ADMIN-Tipp. Eine Sammlung aller Tipps finden Sie im Archiv der ADMIN-Tipps.

Immer wieder ist zu lesen, dass die Verwendung von IP-Ports unter 1024 bei Linux Root-Rechte erfordert. Das stimmt aber schon seit längerer Zeit nicht mehr.

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.

21.12.2015
comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023