Howto/NetworkManager absichern

Achtung!

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.

Hinweis:

Diese Howto-Anleitung wurde zuletzt von kB im November 2017 unter Ubuntu 17.10, Ubuntu 16.04 und Ubuntu 14.04 erfolgreich getestet.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Starten von Programmen

  2. Ein Terminal öffnen

  3. Root-Rechte

  4. NetworkManager

  5. NetworkManager/NetworkManager ohne GUI

  6. PolicyKit

Inhaltsverzeichnis
  1. Einleitung
  2. NetworkManager mit PolicyKit unter Ubuntu
  3. Anleitung: Berechtigungen überprüfen
    1. Implizite Berechtigungen
    2. Explizite Berechtigungen
  4. Anleitung: PolicyKit konfigurieren
  5. Alternativen
  6. Anhang: Skript pk-inspector
  7. Dokumentation
  8. Links
    1. intern
    2. extern

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:

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.

  2. 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

  3. 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 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:

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]:

    pkaction | grep  NetworkManager 
  2. Die impliziten Rechte für eine bestimmte Aktion aus dieser Liste (hier exemplarisch für org.freedesktop.NetworkManager.network-control) erhält man mit:

    pkaction --verbose --action-id org.freedesktop.NetworkManager.network-control | grep implicit 

Alternativ kann man komfortabler das im Anhang beschriebene Skript pk-inspector benutzen, welches auf den vorstehend genannten Befehlen beruht:

./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:

    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
  2. Die so gefundenen Dateien kann man z.B. mit cat sichten:

    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:

./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:

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:

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:

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!

  2. Ersatz des NetworkManagers durch ein anderes Konfigurationsprogramm (ifupdown, Wicd …)

  3. 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 Herunterladen noch mit

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

./pk-inspector --all apt 

die Berechtigungen bezüglich der Paketverwaltung aus.

Dokumentation

intern

extern