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
.
permissions
files
account-restrictions
Manishearth
quelle
quelle
mysql
Programm befinden? Der Benutzer muss in der Lage sein, es und alle benötigten Bibliotheken und Datendateien zu lesen.Antworten:
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
abcd
Bedingungen nicht auf eine Datei zugreifen kann/home
:Dieser Ansatz ist einfach, Sie müssen jedoch daran denken, den Zugriff auf alle Elemente zu blockieren, auf die Sie nicht
abcd
zugreifen möchten.Chroot
Richten Sie
abcd
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.
mysql
und alle Abhängigkeiten, wenn der Benutzer ausgeführt werden sollmysql
), unter der Chroot erstellen . Sagen wir, der Weg zur Chroot ist/home/restricted/abcd
; Dasmysql
Programm 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:Sie können auch Dateien kopieren (aber dann müssen Sie darauf achten, dass sie auf dem neuesten Stand sind).
Fügen Sie eine
ChrootDirectory
Direktive zu hinzu, um den Benutzer auf die Chroot zu beschränken/etc/sshd_config
.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.
quelle
/var/www/allowfolder
und ihre Unterverzeichnisse muss zugegriffen werden können, nicht nur auf sich/var/www/allowfolder
selbst. 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/www
für den Zugriff die Berechtigung x benötigt/var/www/allowfolder
.Sie sollten verwenden
chroot
. Derchroot
Befehl ä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
dir
mit drei Dateien:a
,b
,c
, undls
. Die ersten drei sind reguläre Dateien.ls
ist ein Hardlink zur echtenls
Binärdatei, damit wir Dateien in der Chroot auflisten können.Ich gehe
chroot
indir
. (Beachten Sie, dass ich wahrscheinlich einige Verzeichnisse im Stammverzeichnis vergesse.)Hier ist das Setup in Form einer Shell-Ausgabe:
Jetzt werde ich
chroot
indir
. Das/bin/bash
Argument legt fest, welcher Prozess mit dem neuen Stammverzeichnis ausgeführt werden soll. Der Standardwert ist/bin/sh
.Nun verlassen wir die
chroot
:Ich hoffe, das zeigt, wie der
chroot
Befehl funktioniert. Grundsätzlich müssen Sie zur Lösung Ihres Problems beichroot
jeder 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 denmysql
Befehl zugreifen kann , führen Sie Folgendes aus:quelle
chmod
. Wenn Sie sagen "Wäre es nicht einfacher, einen Befehl auszuführen ... verlieren Sie nicht den Zugriff auf sie", lautet dieser Befehlchroot
. 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
)chroot
selbst zu spielen, oder mir mitteilen , was keinen Sinn ergibt . noch besser, mach beides. (und lies die manpages.)