[[Vorlage(Archiviert)]] {{{#!vorlage Warnung Die Verwendung dieses Howto geschieht auf eigene Gefahr. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich zusätzlich an den Verfasser des Howtos. }}} {{{#!vorlage Hinweis Diese Howto-Anleitung wurde zuletzt von [user:kB:] im November 2017 unter '''Ubuntu 17.10''', '''Ubuntu 16.04''' und '''Ubuntu 14.04''' erfolgreich getestet. }}} {{{#!vorlage Wissen [:Programme_starten: Starten von Programmen] [:Terminal: Ein Terminal öffnen] [:sudo: Root-Rechte] [:NetworkManager:] [:NetworkManager/NetworkManager_ohne_GUI:] [:PolicyKit:] }}} [[Inhaltsverzeichnis()]] = Einleitung = NetworkManager stellt eine moderne Methode zur Konfiguration, Verwaltung und zum Betrieb des Netzwerkes eines Rechners dar und kann sowohl für Desktop-Systeme[4] als auch für Konsolen-Systeme[5] (z.B. Server) eingesetzt werden. Dieses HOWTO richtet sich an Administratoren, die ihr System vor dem Missbrauch durch Unberechtigte absichern wollen. Dieses HOWTO kann auch als Tutorial für PolicyKit gelesen werden; es beschreibt am Beispiel NetworkManager, wie man die von PolicyKit verwalteten programmspezifischen Berechtigungen modifizieren kann. NetworkManager erlaubt in der Standardeinstellung __jedem__ Benutzer weitreichende Eingriffe in das Netzwerk. Die in der jeweiligen Situation (Art der Session und Gruppenzugehörigkeit des Benutzers) möglichen Eingriffe kann man aus NetworkManager[1][2][5] abfragen: {{{#!vorlage Befehl nmcli general permissions # für NM Version ab 1.2 (ab Ubuntu 16.04) nmcli nm permissions # für NM Version 0.9.8.8 (Ubuntu 14.04) }}} Für einen lokalen Benutzer von Ubuntu 16.04, der nicht zur Gruppe `sudo` gehört, ergibt das diese Liste: {{{ tester@gnome25:~$ groups tester tester@gnome25:~$ nmcli general permissions BEFUGNIS WERT org.freedesktop.NetworkManager.enable-disable-network ja org.freedesktop.NetworkManager.enable-disable-wifi ja org.freedesktop.NetworkManager.enable-disable-wwan ja org.freedesktop.NetworkManager.enable-disable-wimax ja org.freedesktop.NetworkManager.sleep-wake nein org.freedesktop.NetworkManager.network-control ja org.freedesktop.NetworkManager.wifi.share.protected ja org.freedesktop.NetworkManager.wifi.share.open ja org.freedesktop.NetworkManager.settings.modify.system Legitimierung org.freedesktop.NetworkManager.settings.modify.own ja org.freedesktop.NetworkManager.settings.modify.hostname Legitimierung org.freedesktop.NetworkManager.settings.modify.global-dns unbekannt org.freedesktop.NetworkManager.reload Legitimierung }}} Für einen lokalen Benutzer, der zur Gruppe `sudo` gehört, ergibt das fast dieselbe Liste; lediglich für die Aktion ''org.freedesktop.NetworkManager.settings.modify.system'' wird „''Legitimierung''“ durch „''ja''“ ersetzt. Diese komfortable Großzügigkeit ist zweckmäßig für Rechner, die in der Regel nur einen angemeldeten Benutzer kennen bzw. in wechselnden Netzwerk-Umgebungen betrieben werden, also z.B. mitgeführte Laptops. Bereits bei stationär betriebenen Arbeitsstationen möchten IT-Verantwortliche jedoch oft den Benutzern nur die benötigten Rechte geben und Eingriffe in das Netzwerk gehören nicht dazu. Bei Servern bzw. allgemein bei Rechnern, die gleichzeitig mehrere angemeldete Benutzer kennen, wäre es sogar kontraproduktiv, wenn ein Benutzer alle anderen durch Eingriffe ins Netzwerk beeinträchtigen würde. Administratoren, welche die Standard-Berechtigungen von NetworkManager einschränken möchten, erhalten im folgenden Abschnitt Hinweise, welche Dateien hierfür bearbeitet werden müssen und in den dann folgenden Abschnitten beispielhafte, aber konkrete Anleitungen. = NetworkManager mit PolicyKit unter Ubuntu = NetworkManager verwendet [:PolicyKit:] zur Legitimation von Eingriffen in das Netzwerk. Hier wird Grundwissen zum Zusammenspiel der Komponenten vermittelt als Grundlage zur Erstellung einer eigenen Konfiguration. PolicyKit existiert in 3 Generationen, die sich in ihren Fähigkeiten und bezüglich ihrer Konfiguration unterscheiden: 1. Generation: Das ursprüngliche '''PolicyKit''' ist veraltet und wurde durch polkit-1 ersetzt. Der Name PolicyKit wird aber gelegentlich (eigentlich fälschlicherweise) noch für den Nachfolger verwendet. 1. Generation: '''polkit-1''' in den Versionen bis einschließlich ''0.105'' wird konfiguriert über Dateien in den Verzeichnissen * /usr/lib/i386-linux-gnu/polkit-1/ * '''/usr/share/polkit-1/actions/''': Definition der Aktionen mit implizit gesetzten Rechten über Konfigrationsdateien mit Endung '''.policy''' * '''/var/lib/polkit-1/localauthority/''': Konfigrationsdateien mit Endung '''.pkla''' und * '''/etc/polkit-1/localauthority/''': Konfigrationsdateien mit Endung '''.pkla '''zur Änderung der impliziten Rechte durch Vergabe expliziter Rechte 1. Generation: '''polkit-1''' verwendet ab Version ''0.106'' andere Unterverzeichnisse, eine andere Dateiendung ('''.rules''') und ein anderes Format für die Konfigurationsdateien. * '''/usr/share/polkit-1/actions/''': Definition der Aktionen mit implizit gesetzten Rechten über Konfigrationsdateien mit Endung '''.policy''' * '''/usr/share/polkit-1/rules.d/''': JavaScript-Funktionen in Dateien mit Endung '''.rules''' und * '''/etc/polkit-1/rules.d/''': JavaScript-Funktionen in Dateien mit Endung '''.rules''' zur Änderung der impliziten Rechte durch Vergabe expliziter Rechte ''Ubuntu'' verwendet in den Versionen 14.04 LTS, 16.04 LTS, 17.04 und 17.10 (und voraussichtlich auch in naher Zukunft) polkit-1 in der Version ''0.105'' (also 2. Generation von PolicyKit). Bei dieser Version sind Regeln in Dateien '''*.rules''' unwirksam; nur Konfigurationen in Dateien '''*.pkla''' werden beachtet. Andere Betriebssysteme verwenden möglicherweise andere Strategien hinsichtlich der Generation bzw. Version von polkit-1. Deshalb sind weder die hier für Ubuntu in den hier getesteten Versionen beschriebenen Maßnahmen auf andere Betriebssysteme übertragbar noch kann man voraussetzen, dass Hinweise bezüglich PolicyKit für andere Betriebssysteme bei Ubuntu funktionieren! Die in den '''*.policy'''-Dateien als `implicit` gesetzten Rechte gelten als Vorgaben. Die Vorgaben können durch Angaben in Dateien in den Verzeichnissen '''/var/lib/polkit-1/localauthority/''' und '''/etc/polkit-1/localauthority/''' modifiziert werden; dabei sind alle Dateien in diesen Verzeichnissen und Unterverzeichnissen funktional gleichberechtigt und werden in lexikalischer Reihenfolge abgearbeitet. Jedoch wird eine Datei unter '''/etc''' nach einer gleichlautenden Datei unter '''/var''' bearbeitet. (Siehe: [#Dokumentation Dokumentation und Links]) Die Datei-Hierarchie unter '''/var/lib/polkit-1/localauthority/''' ist für aus Paketen bezogenen Änderungen vorgesehen, eigene Änderungen sollte man unter '''/etc/polkit-1/localauthority/''' ablegen. Für NetworkManager relevant sind bei einem Ubuntu-16.04-Gnome-Desktop die Dateien: * '''/usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy''' * '''/var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla''' * '''/var/lib/polkit-1/localauthority/10-vendor.d/org.freedesktop.NetworkManager.pkla''' = Anleitung: Berechtigungen überprüfen = Die effektiven Berechtigungen unterscheiden sich abhängig von Ubuntu-Version und -Flavor sowie installierter Software; sie sind daher hier nicht übersichtlich auflistbar. Im folgenden Text wird beschrieben, wie man sich die benötigten Informationen aus dem eigenen System beschaffen kann. == Implizite Berechtigungen == Die relevanten Daten aus den '''*.policy'''-Dateien erhält man mit einem zweistufigen Verfahren: 1. Eine Liste aller vom NetworkManager behandelten Aktionen liefert der Befehl `pkaction`[1][2]: {{{#!vorlage Befehl pkaction | grep NetworkManager }}} 1. Die impliziten Rechte für eine bestimmte Aktion aus dieser Liste (hier exemplarisch für `org.freedesktop.NetworkManager.network-control`) erhält man mit: {{{#!vorlage Befehl pkaction --verbose --action-id org.freedesktop.NetworkManager.network-control | grep implicit }}} Alternativ kann man komfortabler das im [#Anhang-Skript-pk-inspector Anhang] beschriebene Skript `pk-inspector` benutzen, welches auf den vorstehend genannten Befehlen beruht: {{{#!vorlage Befehl ./pk-inspector --policy }}} == Explizite Berechtigungen == Zur Abfrage der expliziten Rechte benötigt man selbst `root`-Rechte[3] zum Durchsuchen der '''*.pkla'''-Dateien in einem zweistufigen Verfahren: 1. Eine Liste aller relevanten Dateien generiert man mittels find: {{{#!vorlage Befehl sudo find /var/lib/polkit-1/ /etc/polkit-1/ -type f -exec grep -i -e '^Action=.*NetworkManager' -q '{}' \; -print }}} Beispielhafte Ausgabe: {{{ /var/lib/polkit-1/localauthority/10-vendor.d/org.freedesktop.NetworkManager.pkla /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla }}} 1. Die so gefundenen Dateien kann man z.B. mit `cat` sichten: {{{#!vorlage Befehl sudo cat /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla }}} Beispielhafte Ausgabe: {{{ … [Adding or changing system-wide NetworkManager connections] Identity=unix-group:admin;unix-group:sudo Action=org.freedesktop.NetworkManager.settings.modify.system ResultActive=yes … }}} Alternativ kann man komfortabler das im #Anhang-Skript-pk-inspector Anhang] beschriebene Skript `pk-inspector` benutzen, welches auf den vorstehend genannten Befehlen beruht: {{{#!vorlage Befehl ./pk-inspector --rules }}} = Anleitung: PolicyKit konfigurieren = Hier wird beispielhaft eine Konfiguration beschrieben, mit der NetworkManager nur noch `root` Änderungen am Netzwerksystem vornehmen läßt – d.h. PolicyKit wird für NetworkManager effektiv ausgeschaltet. Dies erhebt nicht den Anspruch, für jeden Anwendungsfall die optimale Strategie zu sein. Man legt in '''/etc/polkit-1/localauthority/''' das Verzeichnis '''99/''' und in diesem eine Datei an, deren beliebiger Name auf '''.pkla''' enden muss: {{{#!vorlage Befehl sudo mkdir -p /etc/polkit-1/localauthority/99/ ; sudo touch "$_/00-NetworkManager-deny.pkla" }}} {{{ ### /etc/polkit-1/localauthority/99/00-NetworkManager-deny.pkla [NetworkManager deny all] Identity=unix-user:* Action=org.freedesktop.NetworkManager.* ResultAny=no ResultInactive=no ResultActive=no }}} Die Änderung wird sofort wirksam, da PolicyKit seine Konfigurationsverzeichnisse ständig überwacht. Nach Erstellung der Datei kann ein normaler Benutzer mittels '''nmcli''' oder einer anderen Benutzer-Schnittstelle wie '''nmtui''' oder '''nm-applet''' noch die meisten Netzwerk-Einstellungen abfragen, aber nicht mehr ändern. Änderungen erfordern einen Aufruf als `root`, z.B. kann man mittels '''sudo nmcli''' den sudo-Mechanismus benutzen. Bei der Erstellung eigener Konfigurationen sind diese Hinweise zu beachten: * Für PolicyKit unter Ubuntu bedeutet Adminstrator: Zugehörigkeit zur Gruppe `sudo`. Das kann man – global für alle Programme, welche PolicyKit benutzen! – in einer Konfigurationsdatei unter '''/etc/polkit-1/localauthority.conf.d/''' einstellen. (Bei Ubuntu existiert die Gruppe `admin` nicht mehr; sie wurde durch die Gruppe `sudo` ersetzt.) * NetworkManager gewährt zusätzlich der Gruppe `netdev` Rechte, aber nur für die Aktion org.freedesktop.NetworkManager.settings.modify.system. * Die ganze Litanei der '''pkla'''-Dateien wird zweimal durchlaufen: 1. Zuerst werden die Rechte über die Gruppenzugehörigkeiten des aufrufenden Benutzers ermittelt. 1. In einem zweiten Durchgang werden die gewährten Rechte über die per Benutzer-Kennung ermittelten Rechte ggf. überschrieben oder erst ermittelt. * Die vorstehend beschriebene Arbeitsweise ergibt in der Praxis: Man kann eine auf Benutzer-Ebene entzogene Berechtigung nicht wirksam auf Gruppenebene wieder gewähren! * Wenn die Berechtigungen für einen Benutzer, der zu mehreren Gruppen gehört, ermittelt werden soll, dann werden die Gruppen in aufsteigender Reihenfolge ihrer numerischen ID abgearbeitet. Nachdem man zunächst allen Benutzern mit der Datei '''00-NetworkManager-deny.pkla''' die implizit zugeteilten Rechte entzogen hat, kann man ausgesuchten Benutzern wieder Rechte verleihen. Hierzu kann man eine weitere Datei benutzen: {{{#!vorlage Befehl sudo mkdir -p /etc/polkit-1/localauthority/99/ ; sudo touch "$_/99-NetworkManager-allow.pkla" }}} {{{ ### /etc/polkit-1/localauthority/99/99-NetworkManager-allow.pkla [NetworkManager.settings.modify.system allow some user] Identity=unix-user:klaus; Action=org.freedesktop.NetworkManager.settings.modify.system ResultActive=auth_admin_keep }}} In dieser Datei selektiert man die gewünschten Benutzer namentlich; man kann keine numerischen ID benutzen. Eine Selektion über Gruppen ist syntaktisch möglich, funktioniert aber wie oben beschrieben leider nicht. = Alternativen = Anstelle einer eigenen Konfiguration von PolicyKit kann man auch erwägen: 1. Ersatz/Änderung der Datei '''/usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy''': Die geänderte Datei wird jedoch bei Updates überschrieben! 1. Ersatz des NetworkManagers durch ein anderes Konfigurationsprogramm (ifupdown, Wicd …) 1. Ersatz des Standard-Paketes durch einen selbst ohne PolicyKit aus den Quellen übersetzten NetworkManager = Anhang: Skript pk-inspector = Das Skript `pk-inspector` vereinfacht die Sichtung der relevanten Dateien für die Vergabe der Berechtigungen zur Nutzung von NetworkManager. Es muss nach dem [https://ubuntuusers.de/user/kB/#Policy-Kit Herunterladen] noch mit {{{#!vorlage Befehl chmod +x pk-inspector }}} ausführbar gemacht werden. Eine Gebrauchsanleitung erhält man mit der Option `--help`. Man kann dieses Programm auch zur Sichtung der Berechtigungen für andere Programme, die PolicyKit benutzen, verwenden. Man muss dann einen charakteristischen Teil der polkit-Aktion als Suchbegriff angeben. Beispielsweise gibt {{{#!vorlage Befehl ./pk-inspector --all apt }}} die Berechtigungen bezüglich der Paketverwaltung aus. = Dokumentation = * [:Manpages:]: polkit, pklocalauthority * [https://www.freedesktop.org/software/polkit/docs/0.105/] {en} Referenz PolicyKit (als Version 0.105 von polkit-1) = Links = == intern == * [:PolicyKit:] * [:NetworkManager:] * [:NetworkManager/NetworkManager_ohne_GUI:] == extern == * [http://www.linux-magazin.de/ausgaben/2012/11/sudo-policykit] {de} (ab Seite 3 unten – Text davor hier OT.) * [http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2010/07/Admin-Rechte-gezielt-vergeben-mit-PolicyKit] {de} #tag: Howto