In diesem Entwurf werden zwei verschiedene Berechtigungen verwechselt: wer ein Verzeichnis benutzen darf und welche Adressen sich überhaupt verbinden dürfen. Eine Kontenliste neben eine Quellenliste zu schreiben wirkt wie eine Paarung, doch Samba wertet die beiden Listen als unabhängige Prädikate. Zugelassen wird jeder, der beide erfüllt, und das ist eine breitere Regel, als die meisten Administratoren beabsichtigen. Die Lösung ist entweder ein anderes Freigabelayout oder eine Richtlinienebene, die ein Paar ausdrücken kann.

Der Mythos: zwei Listen ergeben eine Regel

Die smb.conf-Referenz definiert valid users und hosts allow als zwei unabhängige Parameter, und beim Setzen beider auf einer Freigabe beginnt die Verwirrung. Setzt man valid users = mira, tomas und hosts allow = 10.77.0.21, 10.77.0.22, werden vier Kombinationen zugelassen: Mira von jeder der beiden Adressen, Tomas von jeder der beiden Adressen. Nichts in der Konfiguration bindet den ersten Namen an die erste Adresse, und die Reihenfolge, in der die Namen erscheinen, hat keine Bedeutung. Umsortieren, eine zweite hosts allow-Zeile hinzufügen oder einen Namen pro Zeile setzen ändert nichts. Das Ergebnis ist das Produkt zweier Listen, keine Zuordnung zwischen ihnen.

Was die meisten tatsächlich wollen, ist enger: Mira nur von einer Adresse, Tomas nur von einer anderen. Eine einzelne Freigabedefinition hat keine Syntax für diese Bindung, und keine noch so kluge Reihenfolge erzeugt eine. Das ist eine Richtlinienform, die Samba innerhalb einer Freigabe nicht ausdrückt, und dort überlebt der Mythos.

Was Samba in welcher Reihenfolge prüft

Die Stufen laufen in fester Reihenfolge ab, und eine falsche Reihenfolge führt zur falschen Diagnose. Ein Client öffnet eine Verbindung; eine globale Host-Prüfung läuft, wenn eine konfiguriert ist; der Sitzungsaufbau authentifiziert das Konto; dann verbindet sich der Client mit einer Freigabe, wo deren eigene Hostliste, valid users und die Nur-Lese-Einstellung angewandt werden; und erst wenn eine Datei geöffnet wird, entscheiden die Dateisystemberechtigungen der authentifizierten Identität. Jede Stufe kann die Anfrage allein ablehnen, und das Bestehen einer Stufe sagt nichts über die nächste. Die wichtige Folge ist, dass das Konto bekannt ist, wenn die Hostliste der Freigabe ausgewertet wird, und die Hostliste dennoch keine Möglichkeit hat, dieses Konto zu benennen.

Deshalb kann eine Freigabe einen Benutzer nicht an eine Adresse binden: hosts allow und valid users sind getrennte Prädikate, die auf derselben Baum-Verbindungsstufe angewandt werden, und jedes beantwortet seine eigene Frage. Das Host-Prädikat nimmt den Kontonamen nie als Eingabe, also lässt es sich nicht pro Benutzer schreiben. Nur eine zweite Freigabe oder eine Richtlinienebene außerhalb von Samba kann das Paar ausdrücken.

Globale Werte sind wichtig wegen der Art der Vererbung. Eine Freigabe, die hosts allow auslässt, erbt den globalen Wert, und eine Freigabe, die ihren eigenen setzt, verwendet diesen Wert anstelle des globalen, nicht zusätzlich dazu. Eine breite globale Liste erweitert also die Freigaben, die den Parameter nie setzen, und bewirkt nichts bei einer Freigabe, die ihren eigenen definiert. Führen Sie testparm -s aus und lesen Sie die Werte pro Freigabe, die es ausgibt, denn diese Ausgabe ist die wirksame Richtlinie und die Datei auf der Platte nicht.

Eine Freigabe enger zu fassen bewirkt auch nichts für den Rest des Servers. Andere Freigaben, Druckerwarteschlangen und die IPC-Verbindung behalten ihre eigenen Regeln, sodass ein Entwurf, der auf der Adressliste einer Freigabe beruht, einen Pfad statt des Hosts schützt.

Zwei Freigabenamen über einem Verzeichnis

Wenn dasselbe Verzeichnis von zwei Personen über zwei Adressen erreichbar sein muss, machen Sie es zweimal unter verschiedenen Namen verfügbar. Jeder Abschnitt trägt ein Konto und eine Quelle, was das Paar zu etwas macht, das die Konfiguration durchsetzen kann. Der Preis ist, dass jede Person einen anderen Freigabenamen verwendet, um dieselben Dateien zu erreichen, und das muss eine bewusste Änderung auf Clientseite sein.

[shared-mira]
    path = /srv/shared
    guest ok = no
    read only = yes
    valid users = mira
    hosts allow = 10.77.0.21
    hosts deny = ALL

[shared-tomas]
    path = /srv/shared
    guest ok = no
    read only = yes
    valid users = tomas
    hosts allow = 10.77.0.22
    hosts deny = ALL

Ein Freigabe-Gate ist keine Dateisystemberechtigung. Beide Identitäten brauchen weiterhin Zugriff auf das Verzeichnis über die zugrunde liegende ACL, und die Nur-Lese-Einstellung ist eine zweite Ebene, nicht die einzige. Gewähren Sie Schreibzugriff nur, wenn der Arbeitsablauf ihn erfordert, und prüfen Sie dann, ob von einer Identität erstellte Dateien für die andere nutzbar bleiben.

Beide Abschnitte zeigen auf einen Pfad, daher wirkt eine Änderung am Verzeichnis auf beide Freigaben. Das ist meist der Punkt, bedeutet aber auch, dass ein Berechtigungsfehler für beide Benutzer gleichzeitig sichtbar ist.

Was die Quelladresse beweisen kann

Die Adresse, die Samba sieht, ist die Adresse, die den Server erreicht hat, nicht die, die der Client zu haben glaubt. Ein VPN-Gateway, das jeden Client auf eine Quelladresse übersetzt, hebt den Unterschied auf: Alle Clients kommen als derselbe Host an, und die Quellenliste kann sie nicht mehr unterscheiden. Stabile Zuteilung pro Client und ein Gateway, das die Quelle bewahrt, sind Voraussetzungen dafür, Adressen überhaupt als Richtlinie zu verwenden. Ohne beides misst die Beschränkung das Gateway statt den Benutzer.

Selbst dann ist eine Adresse kein Gerät. Zwei Laptops hinter einer Tunneladresse, ein neu zugewiesener Lease und eine gemeinsam genutzte Workstation widerlegen gemeinsam die Annahme, dass eine Quelle eine Person identifiziert. Behandeln Sie die Beschränkung als Netzwerkumfang und halten Sie authentifizierte SMB-Konten als Identitätsebene fest, mit einem Gerätenachweis wie einem Zertifikat, wenn Sie eine Geräteautorisierung benötigen.

Das ist auch der Grund, warum der Entwurf Freigaben und nicht den Server absichert. Ein abgelehntes Paar kann dennoch eine Sitzung öffnen, eine andere Freigabe erreichen oder den Server auflisten, was ein anderes Ergebnis ist als ein Authentifizierungsfehler beim Verbinden. Wenn die Anforderung Ablehnung vor der Authentifizierung ist, sind Sambas Freigabeparameter das falsche Werkzeug.

Beweisen Sie es mit gekreuzten Paaren

Validieren Sie die Konfiguration und testen Sie dann die vier Kombinationen mit frischen Verbindungen statt einer wiederverwendeten Sitzung. Das beabsichtigte Paar sollte das Verzeichnis erreichen, und beide gekreuzten Paare sollten fehlschlagen. Eine zwischengespeicherte Sitzung aus einem früheren Test beantwortet bereitwillig die falsche Kombination und lässt eine kaputte Regel korrekt aussehen.

testparm -s
smbclient //fileserver/shared-mira -U mira -c 'ls'
smbclient //fileserver/shared-tomas -U tomas -c 'ls'
smbstatus --shares

Eine Syntaxprüfung beweist nur, dass die Datei sich parsen lässt. Anmeldedaten, ACLs und die Host-Entscheidung werden durch eine tatsächliche Verbindung ausgeübt, also führen Sie den Clientbefehl von der Adresse aus, die Sie testen wollen, und beobachten Sie, welche Stufe ihn ablehnt. Gelingt ein gekreuztes Paar, ist die wirksame Hostliste breiter, als der Abschnitt nahelegt, und testparm -s ist das Erste, was zu lesen ist. Scheitert ein gekreuztes Paar aus dem falschen Grund, sind das Konto oder die ACL verdächtig.

Sitzungen mit smbstatus zu überwachen und zu beenden ist eine Reaktion nach Beginn des Zugriffs, keine Zulassungskontrolle. Eine gesamte beobachtete Adresse zu blockieren kann auch unbeteiligte Benutzer hinter demselben NAT trennen, weshalb die Entscheidung in die Freigabedefinition gehört und die Überwachung in den Reaktionsprozess. Halten Sie beides getrennt, und der Entwurf bleibt ehrlich darüber, was er durchsetzt.

Ähnliche Artikel