Geben Sie dem Benutzer Lese- / Schreibzugriff auf nur ein Verzeichnis


18

Ich betreibe einen Server und muss einem einzelnen Benutzer Lese- / Schreibzugriff auf ein bestimmtes Verzeichnis gewähren. Ich habe Folgendes versucht:

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

Das Obige scheint zu funktionieren, gibt dem Benutzer jedoch nur Lesezugriff auf den Rest des Servers.

Wie kann ich Berechtigungen einrichten, damit der Benutzer nur in einem bestimmten Ordner lesen und schreiben kann? Der Benutzer sollte auch Programme wie ausführen können mysql.


2
Die kurze Antwort: Verwenden Sie eine Chroot.
Chris Down

@ Chris Care, um das in einer Antwort zu erläutern? Manish und ich haben damit zu kämpfen und können es scheinbar nicht zum Laufen bringen.
Machen Sie den

Wo würde sich das mysqlProgramm befinden? Der Benutzer muss in der Lage sein, es und alle benötigten Bibliotheken und Datendateien zu lesen.
Gilles 'SO- hör auf böse zu sein'

@ Gilles Hmm. Soweit ich das beurteilen kann, handelt es sich um eine Standard-MySQL-Installation von apt-get (nicht von meinem System, sondern von Undo).
Manishearth

Antworten:


18

Negative ACLs

Sie können verhindern, dass ein Benutzer auf bestimmte Teile des Dateisystems zugreift, indem Sie Zugriffssteuerungslisten festlegen . So stellen Sie beispielsweise sicher, dass der Benutzer unter folgenden abcdBedingungen nicht auf eine Datei zugreifen kann /home:

setfacl -m user:abcd:0 /home

Dieser Ansatz ist einfach, Sie müssen jedoch daran denken, den Zugriff auf alle Elemente zu blockieren, auf die Sie nicht abcdzugreifen möchten.

Chroot

Richten Sieabcd eine Chroot ein , dh beschränken Sie den Benutzer auf einen Teilbaum des Dateisystems, um eine positive Kontrolle über das, was angezeigt wird , zu erhalten.

Sie müssen alle Dateien, die der Benutzer benötigt (z. B. mysqlund alle Abhängigkeiten, wenn der Benutzer ausgeführt werden soll mysql), unter der Chroot erstellen . Sagen wir, der Weg zur Chroot ist /home/restricted/abcd; Das mysqlProgramm muss unter verfügbar sein /home/restricted/abcd. Ein symbolischer Link, der außerhalb der Chroot zeigt, ist nicht sinnvoll, da die Suche nach symbolischen Links vom Chroot-Gefängnis betroffen ist. Unter Linux können Sie Bind-Mounts gut nutzen:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

Sie können auch Dateien kopieren (aber dann müssen Sie darauf achten, dass sie auf dem neuesten Stand sind).

Fügen Sie eine ChrootDirectoryDirektive zu hinzu, um den Benutzer auf die Chroot zu beschränken /etc/sshd_config.

Match User abcd
    ChrootDirectory /home/restricted/abcd

Sie können es testen mit: chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

Sicherheitsrahmen

Sie können auch Sicherheitsframeworks wie SELinux oder AppArmor verwenden. In beiden Fällen müssen Sie eine ziemlich heikle Konfiguration schreiben, um sicherzustellen, dass Sie keine Löcher hinterlassen.


Könnte es nicht einfacher sein, einem bestimmten Verzeichnis Lese- und Schreibberechtigungen zu erteilen, indem man Gruppen erstellt? Beispielsweise könnte er eine neue Gruppe erstellen und chown verwenden, um den Verzeichnisgruppeneigentümer zur erstellten Gruppe zu machen und den Benutzer der Gruppe hinzuzufügen. Zuletzt geben Sie dem Verzeichnis Lese- und Schreibrechte für Gruppen.
Qasim

@Qasim Voraussetzung ist, dass für alle Dateien die Berechtigungen und der Besitz wie gewünscht festgelegt sind. Es gibt so viele Dinge, die schief gehen können (Dateien, die von einem anderen Ort kopiert oder mit ihren Berechtigungen aus einem Archiv extrahiert wurden, Dateien, die zu einer anderen Gruppe gehören müssen, Dateien, die nicht für Gruppen lesbar sein sollten, Benutzer, die Fehler machen oder können). Sorgen Sie nicht dafür, dass die Gruppenzugänglichkeit wie gewünscht bleibt ...) dass Gruppen dieses Problem nicht wirklich lösen.
Gilles 'SO - hör auf böse zu sein'

Ich meine, ich sehe nicht, wie Dateien ihre eigenen Berechtigungen haben müssten, wenn die Gruppenberechtigungen für das Verzeichnis so festgelegt wären, dass kein Benutzer in das Verzeichnis "cd" oder das Verzeichnis "ls" kann.
Qasim

@Qasim Auf jede Datei unter /var/www/allowfolderund ihre Unterverzeichnisse muss zugegriffen werden können, nicht nur auf sich /var/www/allowfolderselbst. Und umgekehrt dürfen andere Dateien nicht zugänglich sein. Tatsächlich kann eine Lösung, die ausschließlich auf Dateiberechtigungen und ACL basiert, die Anforderungen nicht vollständig erfüllen: Sie würde es dem Benutzer zumindest ermöglichen, zu testen, ob ein bestimmter Name unter existiert /var/www, da er /var/wwwfür den Zugriff die Berechtigung x benötigt /var/www/allowfolder.
Gilles 'SO - hör auf böse zu sein'

Oh ok ich sehe aber, wenn wir das / var-Verzeichnis von diesem ausschließen und sagen wir, wir sprechen über ein normales Verzeichnis im / home / user-Verzeichnis?
Qasim

5

Sie sollten verwenden chroot. Der chrootBefehl ändert das Stammverzeichnis, das allen untergeordneten Prozessen angezeigt wird. Ich werde ein Beispiel geben, um zu demonstrieren, wie es funktioniert.

Dies wurde an Ort und Stelle geschrieben; Ich stehe momentan nicht vor einem UNIX-Rechner. In diesem Beispiel gibt es ein Verzeichnis mit dem Namen dirmit drei Dateien: a, b, c, und ls. Die ersten drei sind reguläre Dateien. lsist ein Hardlink zur echten lsBinärdatei, damit wir Dateien in der Chroot auflisten können.

Ich gehe chrootin dir. (Beachten Sie, dass ich wahrscheinlich einige Verzeichnisse im Stammverzeichnis vergesse.)

Hier ist das Setup in Form einer Shell-Ausgabe:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

Jetzt werde ich chrootin dir. Das /bin/bashArgument legt fest, welcher Prozess mit dem neuen Stammverzeichnis ausgeführt werden soll. Der Standardwert ist /bin/sh.

$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

Nun verlassen wir die chroot:

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

Ich hoffe, das zeigt, wie der chrootBefehl funktioniert. Grundsätzlich müssen Sie zur Lösung Ihres Problems bei chrootjeder Anmeldung einen Befehl als dieser Benutzer ausführen . Fügen Sie ihn möglicherweise in ein Startskript ein?

Ein Hardlink zu einer Datei funktioniert auch dann in einer weiter chroot, wenn auf diese Datei nicht auf andere Weise zugegriffen werden kann (dies funktioniert, weil Hardlinks auf Inodes und nicht auf Pfade verweisen). Damit der Benutzer beispielsweise auf den mysqlBefehl zugreifen kann , führen Sie Folgendes aus:

ln /usr/bin/mysql /path/to/chroot/target

Aber würde das nicht erfordern, dass ich eine ganze Chroot-Umgebung mit allen Symlinks einrichte? Wäre es nicht einfacher, einen Befehl auszuführen, damit der neue Benutzer keinen Zugriff auf die anderen Verzeichnisse hat, aber Programme wie Apache nicht den Zugriff darauf verlieren?
Manishearth

Gibt es überhaupt eine Möglichkeit (über chmod), einem Benutzer den Lesezugriff auf den Rest des Dateisystems zu verweigern, ohne den Zugriff anderer Benutzer zu beeinträchtigen?
Manishearth

@Manishearth Es gibt keinen einfachen Weg mit chmod. Wenn Sie sagen "Wäre es nicht einfacher, einen Befehl auszuführen ... verlieren Sie nicht den Zugriff auf sie", lautet dieser Befehl chroot. Wenn du erklärst, was du mit "einer ganzen Chroot-Umgebung" meinst oder warum dies ein Problem wäre, verstehe ich es vielleicht besser. (Beachten Sie, dass Sie mit einem oneliner Zugriff auf alle ausführbaren Dateien geben: ln /bin/* /path/to/chroot/target)
strugee

@Manishearth Wenn mein Beispiel keinen Sinn ergeben hätte, würde ich Sie ermutigen, mit sich chrootselbst zu spielen, oder mir mitteilen , was keinen Sinn ergibt . noch besser, mach beides. (und lies die manpages.)
strugee 18.11.13

@Manishearth Wenn Ihnen diese Antwort ausreichend geholfen hat, um Sie zur Antwort zu führen, sollten Sie in Betracht ziehen, sie zu akzeptieren.
Strugee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.