staging.inyokaproject.org

Welche Benutzergruppe erlaubt PING (via RAW sockets) ohne sudo?

Status: Ungelöst | Ubuntu-Version: Kubuntu 24.04 (Noble Numbat)
Antworten |

Hartmut2

Anmeldungsdatum:
11. Oktober 2018

Beiträge: 280

In einem selbstgeschriebenen Programm verwende ich eine plattformübergreifende Bibliothek u.a. für einen PING. Leider benötigt das Programm dadurch unter Ubuntu sudo-Rechte, was ich gerne vermeiden würde, wenn möglich. In der Doku der Bibliothek steht dazu:

For use of RAW sockets you must have some special rights on some systems. So, it working allways when you have root rights.

Damit der aktuelle User z.B. WebDAV ohne sudo benutzen kann, muß man ihn ja nur der Gruppe "davfs2" hinzufügen bzw. damit der aktuelle User serielle Schnittstellen ohne sudo benutzen kann, muß man ihn nur der Gruppe "dialout" hinzufügen.

Gibt es evtl. auch eine Gruppe, der ich den aktuellen User nur hinzufügen muß, damit die o.g. "Spezialrechte" erfüllt sind und das PING kein sudo mehr benötigt? Welche der ca. 90 Gruppen wären wohl sinnvoll zu testen?

verdooft

Anmeldungsdatum:
15. September 2012

Beiträge: 4450

sudo apt install libcap-ng-utils

which ping
/usr/bin/ping

filecap /usr/bin/ping
set       file                 capabilities  rootid
effective /usr/bin/ping        net_raw

Aus der Manpage:

To set a file capability on a specific program:

filecap /bin/ping net_raw net_admin

Hartmut2

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2018

Beiträge: 280

Hallo verdooft, ich verstehe leider nicht, was Du meinst. Soll ich das Paket 'libcap-ng-utils' installieren und damit '/usr/bin/ping' irgendwie "behandeln"? Vermutlich haben wir uns da mißverstanden.

Es geht nicht darum, den zu Ubuntu gehörenden PING-Befehl irgendwie zu ändern. Sondern daß ein selbstgeschriebenen Programm (welches u.a. eine PING-Funktionalität über eine eingebundene plattformübergreifende Bibliothek enthält) keine sudo-Rechte mehr benötigt, indem ich den aktuellen User der richtigen Gruppe hinzufüge.

verdooft

Anmeldungsdatum:
15. September 2012

Beiträge: 4450

Das mit ping war nur ein Beispiel, klar wäre der ausführbaren Datei deiner Anwendung net_raw zu verpassen. Welche Gruppe das eventuell beinhaltet, müsstest du recherchieren.

Weitere Infos zu Capabilities:

https://wiki.archlinux.org/title/Capabilities

Ansonsten gibts noch setuid, siehe: Rechte, nur die benötigten Capabilities zu verpassen ist hat aber bezogen auf Sicherheit wohl Vorteile.

Hier wird noch was mit pam_cap, jetzt wohl das Paket libcap2, und einer capability.conf beschrieben: https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user

Hab mal spaßeshalber im etc-Verzeichnis geschaut, dieses net_raw wird anscheinend öfters verwendet:

sudo grep -R "net_raw" /etc/*
/etc/apparmor/init/network-interface-security/sbin.dhclient:  capability net_raw,
/etc/apparmor.d/sbin.dhclient:  capability net_raw,
[...]

Hartmut2

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2018

Beiträge: 280

Ich habe Paket "libcap-ng-utils" installiert wie von Dir beschrieben. Dann analog zu Deinem Befehl versucht, meiner ausführbaren Datei net_raw zu verpassen:

hg6@i3300:/hg/utis$
filecap /hg/utis/test8
hg6@i3300:/hg/utis$

Leider benötigt das Programm danach immer noch sudo-Rechte.

Von dem was Du noch dazu geschrieben hast, verstehe ich so gut wie nichts, das ist alles völliges Neuland für mich. Die 2 Links sind außerdem noch in Englisch. Ich würde ewig brauchen, mich da einzuarbeiten. Wäre es möglich, daß Du mir ganz konkret schreibst, was ich eingeben muß? Das würde mir sehr helfen.

verdooft

Anmeldungsdatum:
15. September 2012

Beiträge: 4450

Hab doch extra aus der Manpage "To set a file capability on a specific program" zitiert, nach den mir jetzt vorliegenden Informationen müsste es das sein, kannst es ja erstmal ohne net_admin (siehe unten) versuchen:

filecap /hg/utis/test8 net_raw net_admin

Bei net_admin bin ich nicht ganz sicher, der Synopsis nach ists eine zusätzliche Cap:

filecap [ -a | -d | /dir | /dir/file [cap1 cap2 ...] ]

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

Hartmut2 schrieb:

[…] PING. Leider benötigt das Programm dadurch unter Ubuntu sudo-Rechte

Das ist so seit Ubuntu 24.04, vorher konnte jeder normale Benutzer ping benutzen ohne Sonderrechte.

Den Grund für die Änderung kenne ich nicht, aber ich vermute hierbei doch Tendenzen zu Paranoia.

Die einfachste Methode zur Abhilfe ist das Setzen des SUID-Bit, vgl. Artikel Rechte:

sudo chmod u+s /usr/bin/ping 

Hartmut2

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2018

Beiträge: 280

verdooft schrieb:

... kannst es ja erstmal ohne net_admin (siehe unten) versuchen:

filecap /hg/utis/test8 net_raw net_admin

Ok, verstanden. Habe es erstmal ohne net_admin versucht. Ohne sudo vor dem 'filecap' kam eine "not permitted" Fehlermeldung, aber mit sudo davor hat's funktioniert:

hg6@i3300:/hg/utis$
sudo filecap /hg/utis/test8 net_raw
hg6@i3300:/hg/utis$

Jetzt funktioniert das Programm '/hg/utis/test8' auch ohne sudo-Rechte korrekt. Super! Vielen Dank an verdooft für diese Lösung!

Zur Not könnte ich das so einsetzen. Es müsste dann halt jeder Anwender das Paket "libcap-ng-utils" installieren und für jedes betroffene Programm 1x "sudo filecap <programm> net_raw" ausführen.

Deshalb würde ich gerne vor dem Schließen dieses Themas nochmal fragen: ist sich jemand sicher, daß die im 1. Post gefragte alternative Lösung, einfach den aktuellen User in eine geeignete Gruppe aufzunehmen (so wie bei WebDAV und serielle Schnittstellen, s.o.) definitiv nicht möglich ist?

P.S. Danke an kB, muß leider für heute schließen, melde mich morgen nochmal.

Hartmut2

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2018

Beiträge: 280

kB schrieb:

Das ist so seit Ubuntu 24.04, vorher konnte jeder normale Benutzer ping benutzen ohne Sonderrechte.

Das ist merkwürdig. Auf meinem kubuntu funktioniert '/usr/bin/ping' auch seit dem Upgrade auf 24.04 weiterhin ohne sudo-Rechte (und das Sonderrecht SUID ist dort nicht gesetzt):

hg6@i3300:/media/D/Tst$ which ping
/usr/bin/ping
hg6@i3300:/media/D/Tst$ ping 193.99.144.80
PING 193.99.144.80 (193.99.144.80) 56(84) bytes of data.
64 bytes from 193.99.144.80: icmp_seq=1 ttl=249 time=14.8 ms
...
hg6@i3300:/media/D/Tst$ ls -l /usr/bin/ping
-rwxr-xr-x 1 root root 89800 Jul 24 13:51 /usr/bin/ping
hg6@i3300:/media/D/Tst$

Frage: hast Du oder jemand sonst eine Erklärung dafür?

Die einfachste Methode zur Abhilfe ist das Setzen des SUID-Bit, vgl. Artikel Rechte:

sudo chmod u+s /usr/bin/ping 

Habe das mit meinem selbstgeschriebenen Programm vergeblich versucht:

hg6@i3300:/hg/utis$ ls -l test8
-rwxrwxr-x 1 hg6 hg6 5100664 Aug 19 17:26 test8
hg6@i3300:/hg/utis$ sudo chmod u+s test8
[sudo] Passwort für hg6:
hg6@i3300:/hg/utis$ ls -l test8
-rwsrwxr-x 1 hg6 hg6 5100664 Aug 19 17:26 test8
hg6@i3300:/hg/utis$

Das SUID-Bit wurde also gesetzt, aber mein Programm 'test8' funktioniert leider weiterhin nur mit sudo-Rechten korrekt. Ich kannte dieses SUID-Bit bisher nicht. Laut Doku soll es bewirken, daß ein Programm mit den Rechten des Eigentümers der Datei läuft. Was in meinem Fall der aktuelle User ist, was nach meinem Verständnis beim zu lösenden Problem ja nichts nützt. Oder hab ich da was falsch verstanden?

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

Hartmut2 schrieb:

[…] Auf meinem kubuntu funktioniert '/usr/bin/ping' auch seit dem Upgrade auf 24.04 weiterhin ohne sudo-Rechte

Kubuntu ≠ Ubuntu. Möglicherweise haben die Entwickler von Kubuntu schon cap net_raw gesetzt während die Entwickler von Ubuntu noch schlafen.

[…] SUID-Bit […] hab ich da was falsch verstanden?

Vermutlich ja. Das SUID-Bit selbst bringt keine Root-Rechte, sondern sorgt dafür, dass das Programm mit den Rechten seines Besitzers ausgeführt wird. Erst wenn der Besitzer root ist, bringt das den entscheidenden Unterschied. Lese: Rechte

Hartmut2

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2018

Beiträge: 280

kB schrieb:

Hartmut2 schrieb:

[…] Auf meinem kubuntu funktioniert '/usr/bin/ping' auch seit dem Upgrade auf 24.04 weiterhin ohne sudo-Rechte

Kubuntu ≠ Ubuntu. Möglicherweise haben die Entwickler von Kubuntu schon cap net_raw gesetzt während die Entwickler von Ubuntu noch schlafen.

Danke kB für Deinen Post. Deine Vermutung scheint richtig zu sein:

hg6@i3300:/media/D/Tst$ getcap /usr/bin/ping
/usr/bin/ping cap_net_raw=ep
hg6@i3300:/media/D/Tst$

[…] SUID-Bit […] hab ich da was falsch verstanden?

Vermutlich ja. Das SUID-Bit selbst bringt keine Root-Rechte, sondern sorgt dafür, dass das Programm mit den Rechten seines Besitzers ausgeführt wird. Erst wenn der Besitzer root ist, bringt das den entscheidenden Unterschied. Lese: Rechte

Ok, verstanden. Habe mal spaßeshalber meinem Testprogramm den Bestitzer 'root' gegeben und danach das SUID-Bit nochmal gesetzt:

hg6@i3300:/hg/utis$ ls -l test8
-rwxrwxr-x 1 hg6 hg6 5101600 Aug 20 10:20 test8
hg6@i3300:/hg/utis$ sudo chown -v root test8
[sudo] Passwort für hg6:
der Eigentümer von 'test8' wurde von hg6 in root geändert
hg6@i3300:/hg/utis$ sudo chmod u+s test8
hg6@i3300:/hg/utis$ ls -l test8
-rwsrwxr-x 1 root hg6 5101600 Aug 20 10:20 test8
hg6@i3300:/hg/utis$

Jetzt funktioniert mein Programm auch ohne sudo-Rechte korrekt. Vielen Dank für diese Lösung.

Leider hat diese Lösung 2 Nachteile:

  • nach jedem Compilieren des Programms müssen chown + chmod wiederholt werden (und beide benötigen sudo) und das kann bis zu 50x am Tag vorkommen

  • die Anwender des Programms müssen nach jedem Programm-Update ebenfalls beide Befehle wiederholen, wofür sudo nötig wäre, was bisher nicht nötig ist.

Damit hat diese Lösung doch solche Nachteile, daß ich sie nicht mehr praktikabel finde.

Leider hab ich inzwischen festgestellt, daß auch die Lösung von verdooft den Nachteil hat, daß der Befehl "sudo filecap <programm> net_raw" sowohl nach jedem Compilieren des Programms als auch nach jedem Programm-Update beim Anwender wiederholt werden müsste. Das ist zwar 1 Befehl weniger, aber ebenfalls würden jedes Mal dafür sudo-Rechte benötigt. Damit finde ich auch diese Lösung leider nicht mehr praktikabel.

Deshalb würde ich gerne nochmal fragen:
Ist sich jemand sicher, daß die im 1. Post gefragte alternative Lösung, einfach den aktuellen User in eine geeignete Gruppe aufzunehmen (so wie bei WebDAV und seriellen Schnittstellen möglich, siehe 1. Post) hier definitiv nicht möglich ist?

Antworten |