GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Nicht-Root-Prozess erlauben, sich an Port 80 und 443 zu binden?

Ich bin mir nicht sicher, worauf sich die anderen Antworten und Kommentare hier beziehen. Dies ist ziemlich einfach möglich. Es gibt zwei Optionen, die beide den Zugriff auf Ports mit niedriger Nummer ermöglichen, ohne dass der Prozess auf root erhöht werden muss:

Option 1:Verwenden Sie 01 So gewähren Sie einem Prozess Zugriff auf Ports mit niedriger Nummer:

Damit können Sie einer bestimmten Binärdatei dauerhaften Zugriff gewähren, um sie über den 19 an Ports mit niedriger Nummer zu binden Befehl:

sudo setcap CAP_NET_BIND_SERVICE=+eip /path/to/binary

Weitere Einzelheiten zum e/i/p-Teil finden Sie unter 26 .

Danach 32 in der Lage sein, sich an Ports mit niedriger Nummer zu binden. Beachten Sie, dass Sie 46 verwenden müssen auf der Binärdatei selbst und nicht auf einem Symlink.

Option 2:Verwenden Sie 58 um einmaligen Zugriff zu gewähren, mit feinerer Benutzer-/Gruppen-/Port-Steuerung:

Die 61 (Manpage) Tool existiert genau dafür.

  1. Installieren Sie 77 Verwenden Sie Ihren bevorzugten Paketmanager.

  2. Konfigurieren Sie es so, dass es Zugriff auf die relevanten Ports gewährt, z. um 80 und 443 von allen Benutzern und Gruppen zuzulassen:

    sudo touch /etc/authbind/byport/80
    sudo touch /etc/authbind/byport/443
    sudo chmod 777 /etc/authbind/byport/80
    sudo chmod 777 /etc/authbind/byport/443
    
  3. Führen Sie nun Ihren Befehl über 81 aus (optional unter Angabe von 98 oder andere Argumente finden Sie in der Manpage):

    authbind --deep /path/to/binary command line args
    

    Z. B.

    authbind --deep java -jar SomeServer.jar
    

Beides hat Vor- und Nachteile. Option 1 gewährt der Binärdatei Vertrauen bietet jedoch keine Kontrolle über den Zugriff pro Port. Option 2 gewährt dem Benutzer/der Gruppe Vertrauen und bietet Kontrolle über den Zugriff pro Port, aber ältere Versionen unterstützten nur IPv4 (da ich dies ursprünglich geschrieben habe, wurden neuere Versionen mit IPv6-Unterstützung veröffentlicht).


Dale Hagglund ist genau richtig. Also werde ich nur das Gleiche sagen, aber auf andere Weise, mit einigen Besonderheiten und Beispielen. ☺

Das Richtige in der Unix- und Linux-Welt ist:

  • ein kleines, einfaches, leicht prüfbares Programm zu haben, das als Superuser läuft und den lauschenden Socket bindet;
  • ein weiteres kleines, einfaches, leicht überprüfbares Programm zu haben, das Privilegien fallen lässt, das vom ersten Programm hervorgebracht wurde;
  • um das Fleisch des Gottesdienstes in einem separaten Drittel zu haben Programm, das unter einem Nicht-Superuser-Konto ausgeführt und vom zweiten Programm geladen wird, in der Erwartung, einfach einen offenen Dateideskriptor für den Socket zu erben.

Sie haben eine falsche Vorstellung davon, wo das hohe Risiko liegt. Das hohe Risiko besteht darin, aus dem Netzwerk zu lesen und auf das Gelesene zu reagieren nicht in den einfachen Handlungen, einen Socket zu öffnen, ihn an einen Port zu binden und 109 aufzurufen . Es ist der Teil eines Dienstes, der die eigentliche Kommunikation übernimmt, der das hohe Risiko darstellt. Die Teile, die sich öffnen, 114 , und 122 , und sogar (bis zu einem gewissen Grad) den Teil, der 131 , stellen kein hohes Risiko dar und können unter der Ägide des Superusers ausgeführt werden. Sie verwenden und handeln nicht (mit Ausnahme von Quell-IP-Adressen in 140 Fall) Daten, die unter der Kontrolle von nicht vertrauenswürdigen Fremden über das Netzwerk stehen.

Dafür gibt es viele Möglichkeiten.

153

Wie Dale Hagglund sagt, der alte "Netzwerk-Superserver" 163 macht dies. Das Konto, unter dem der Dienstprozess ausgeführt wird, ist eine der Spalten in 177 . Es trennt den Listening-Teil und den Drop-Privilege-Teil nicht in zwei separate Programme, die klein und leicht prüfbar sind, aber es trennt den Hauptdienstcode in ein separates Programm, 181 ed in einem Dienstprozess, der mit einem offenen Dateideskriptor für den Socket erzeugt wird.

Die Schwierigkeit des Auditierens ist kein so großes Problem, da man nur das eine Programm auditieren muss. 196 Das Hauptproblem von ist nicht so sehr das Auditing, sondern eher, dass es im Vergleich zu neueren Tools keine einfache, feinkörnige Laufzeitdienstkontrolle bietet.

UCSPI-TCP und Daemontools

Die UCSPI-TCP- und daemontools-Pakete von Daniel J. Bernstein wurden entwickelt, um dies gemeinsam zu tun. Alternativ kann Bruce Guenters weitgehend gleichwertiges daemontools-encore-Toolset verwendet werden.

Das Programm zum Öffnen des Socket-Dateideskriptors und Binden an den privilegierten lokalen Port ist 207 , von UCSPI-TCP. Es macht sowohl den 217 und die 229 .

239 spawnt dann entweder ein Dienstprogramm, das Root-Privilegien selbst aufgibt (weil das zu bedienende Protokoll beinhaltet, als Superuser zu beginnen und sich dann "anzumelden", wie es beispielsweise bei einem FTP- oder SSH-Daemon der Fall ist) oder 242 Dabei handelt es sich um ein in sich geschlossenes kleines und leicht prüfbares Programm, das nur Berechtigungen fallen lässt und dann Ladevorgänge mit dem eigentlichen Serviceprogramm verkettet (von dem daher kein Teil jemals mit Superuser-Berechtigungen ausgeführt wird, wie dies beispielsweise bei 256 ).

Ein Dienst 267 Skript wäre also zum Beispiel (dieses für dummyidentd zum Bereitstellen des Null-IDENT-Dienstes):

#!/bin/sh -e
exec 2>&1
exec \
tcpserver 0 113 \
setuidgid nobody \
dummyidentd.pl

nein

Mein Nosh-Paket wurde dafür entwickelt. Es hat ein kleines 279 Dienstprogramm, genau wie die anderen. Ein kleiner Unterschied besteht darin, dass es mit 280 verwendet werden kann -Stil "LISTEN_FDS"-Dienste sowie mit UCSPI-TCP-Diensten, also dem traditionellen 299 Programm wird durch zwei separate Programme ersetzt:305 und 318 .

Auch hier spawnen und verketten sich Einzweck-Utilities gegenseitig. Eine interessante Besonderheit des Designs ist, dass man Superuser-Privilegien nach 322 löschen kann aber vor sogar 336 . Hier ist ein 349 Skript für 358 das tut in der Tat genau das:

#!/bin/nosh
fdmove -c 2 1
clearenv --keep-path --keep-locale
envdir env/
softlimit -m 70000000
tcp-socket-listen --combine4and6 --backlog 2 ::0 smtp
setuidgid qmaild
sh -c 'exec \
tcp-socket-accept -v -l "${LOCAL:-0}" -c "${MAXSMTPD:-1}" \
ucspi-socket-rules-check \
qmail-smtpd \
'

Die Programme, die unter der Ägide des Superusers laufen, sind die kleinen dienstunabhängigen Chain-Loading-Tools 366 , 372 , 384 , 394 , 404 und 415 . An dem Punkt, dass 422 gestartet wird, ist der Socket geöffnet und an 430 gebunden port, und der Prozess hat keine Superuser-Rechte mehr.

s6, s6-networking und execline

Die Pakete s6 und s6-networking von Laurent Bercot wurden entwickelt, um dies gemeinsam zu tun. Die Befehle sind denen von 442 strukturell sehr ähnlich und UCSPI-TCP.

458 Skripte wären ziemlich gleich, abgesehen von der Ersetzung von 460 für 470 und 483 für 494 . Man könnte sich jedoch auch dafür entscheiden, gleichzeitig das Execline-Toolset von M. Bercot zu verwenden.

Hier ist ein Beispiel eines FTP-Dienstes, leicht modifiziert von Wayne Marshalls Original, der execline, s6, s6-networking und das FTP-Serverprogramm von publicfile verwendet:

#!/command/execlineb -PW
multisubstitute {
    define CONLIMIT 41
    define FTP_ARCHIVE "/var/public/ftp"
}
fdmove -c 2 1
s6-envuidgid pubftp 
s6-softlimit -o25 -d250000 
s6-tcpserver -vDRH -l0 -b50 -c ${CONLIMIT} -B '220 Features: a p .' 0 21 
ftpd ${FTP_ARCHIVE}

ipsvd

Gerrit Papes ipsvd ist ein weiteres Toolset, das auf der gleichen Linie wie ucspi-tcp und s6-networking läuft. Die Werkzeuge sind 504 und 513 dieses Mal, aber sie tun dasselbe, und der Hochrisikocode, der das Lesen, Verarbeiten und Schreiben von Dingen durchführt, die von nicht vertrauenswürdigen Clients über das Netzwerk gesendet werden, befindet sich immer noch in einem separaten Programm.

Hier ist das Beispiel von M. Pape für die Ausführung von 528 in einem 531 Skript:

#!/bin/sh
exec 2>&1
cd /public/10.0.5.4
exec \
chpst -m300000 -Uwwwuser \
tcpsvd -v 10.0.5.4 443 sslio -v -unobody -//etc/fnord/jail -C./cert.pem \
fnord

549

556 , das neue Dienstüberwachungs- und Init-System, das in einigen Linux-Distributionen zu finden ist, soll tun, was 563 tun können. Es verwendet jedoch keine Suite kleiner, eigenständiger Programme. Man muss 573 auditieren leider vollständig.

Mit 587 man erstellt Konfigurationsdateien, um einen Socket zu definieren, der 592 zuhört, und ein Dienst, der 603 beginnt. Die "Unit"-Datei des Dienstes hat Einstellungen, die einem eine große Kontrolle über den Dienstprozess geben, einschließlich dessen, unter welchem ​​Benutzer er läuft.

Wenn dieser Benutzer kein Superuser ist, 616 erledigt die ganze Arbeit, den Socket zu öffnen, ihn an einen Port zu binden und 628 aufzurufen (und ggf. 632 ) in Prozess Nr. 1 als Superuser, und der Dienstprozess, den er erzeugt, wird ohne Superuser-Rechte ausgeführt.


Ich habe einen etwas anderen Ansatz. Ich wollte Port 80 für einen node.js-Server verwenden. Ich konnte es nicht tun, da Node.js für einen Nicht-Sudo-Benutzer installiert wurde. Ich habe versucht, Symlinks zu verwenden, aber es hat bei mir nicht funktioniert.

Dann habe ich erfahren, dass ich Verbindungen von einem Port zu einem anderen Port weiterleiten kann. Also habe ich den Server auf Port 3000 gestartet und eine Portweiterleitung von Port 80 auf Port 3000 eingerichtet.

Dieser Link stellt die eigentlichen Befehle bereit, die dazu verwendet werden können. Hier sind die Befehle -

lokaler Host/Loopback

645

extern

652

Ich habe den zweiten Befehl verwendet und es hat bei mir funktioniert. Ich denke also, dass dies ein Mittelweg ist, um dem Benutzerprozess nicht zu erlauben, direkt auf die unteren Ports zuzugreifen, sondern ihnen den Zugriff über die Portweiterleitung zu ermöglichen.


Linux
  1. So öffnen Sie Port 80 und 443 in FirewallD

  2. Installieren Sie SoftHSM und greifen Sie über das Java-Programm darauf zu

  3. Linux – Netzwerkzugriff eines Prozesses blockieren?

  4. Wie kann ich den Port und die IP-Adresse mit Firewalld, IP-Tabellen und UFW unter Linux zulassen oder blockieren?

  5. UNIX / Linux :Wie crontab den Zugriff basierend auf den Dateien cron.allow und cron.deny validiert

Ubuntu 22.04 öffnet HTTP-Port 80 und HTTPS-Port 443 mit ufw

So finden Sie die Prozess-ID eines Programms und beenden es [Kurztipp]

Wie man ein C-Programm unter Linux schreibt und ausführt

Verfolgung einer bestimmten IP und eines bestimmten Ports

An Ports kleiner als 1024 ohne Root-Zugriff binden

Stunneln Sie den VPN-Verkehr und stellen Sie sicher, dass es wie SSL-Verkehr auf Port 443 aussieht