Frage Beschränken Sie einen Linux-Benutzer auf die Dateien, die er besitzt


Stellen Sie sich ein Server-Setup eines gemeinsam genutzten Webhosting-Unternehmens vor, in dem mehrere (~ 100) Kunden Shell-Zugriff auf einen einzelnen Server haben.

Viele Web- "Software" empfiehlt zu chmod-Dateien 0777. Ich bin nervös wegen unserer Kunden, die diesen Tutorials unklug folgen und ihre Dateien für unsere anderen Kunden öffnen. (Ich verwende bestimmt nicht cmod 0777 unnötigerweise selbst!) Gibt es eine Methode, um sicherzustellen, dass Kunden nur auf ihre eigenen Dateien zugreifen können und sie daran hindern, von anderen Benutzern auf lesbare Dateien zuzugreifen?

Ich schaute hinein AppArmor, aber das ist sehr eng an einen Prozess gekoppelt, der in dieser Umgebung zu scheitern scheint.


24
2017-07-11 11:33


Ursprung


Ich würde mir eigentlich überlegen, ob die Empfehlungen der "Web-Software" zutreffen chmod files 0777 ist unbedingt notwendig, d. h. die Hauptursache des Problems zu adressieren, und nicht das Symptom, dass dadurch jedermann die Dateien anderer Personen lesen kann. Viele Male die Erlaube allen Zugriff Empfehlung ist einfach eine billige Möglichkeit, Supportanrufe zu vermeiden, oder es fehlt an technischem Können, um Berechtigungen richtig einstellen zu können. In fast keinem Fall musste ich Dateien einstellen 0777 oder gewähren Sie Anwendungen vollen Root-Zugriff, wenn Sie dazu aufgefordert werden. Hier hilft die Ausbildung der Nutzer und / oder Verkäufer massiv. - Cosmic Ossifrage
@ CosmicOssifrage, Benutzer können nicht so leicht erzogen werden, sie wollen keine Anweisungen oder Handbücher lesen. - Cristian Ciupitu
Jede "Web-Software", die immer noch 777 Berechtigungen empfiehlt, muss entfernt werden Schuss. Benutzen suexec oder mpm_itk oder ähnliches. - Shadur
@ CosmicOssifrage Ich glaube nicht, dass Phillipp Benutzer dazu auffordert oder zwingt chmod 0777 ihre Dateien. Ich denke, er ist nervös, wenn sie gehen loltoturialz.com/php_problems und Einstellung chmod 0777 allein, während sie blind einem schlecht geschriebenen Artikel folgen. Es gibt wirklich keine Möglichkeit, sie daran zu hindern oder sie daran zu hindern, sich zu ärgern, wenn jemand seine Sachen stiehlt. - Kevin
@kevin - genau deshalb wurde die Garantie ungültig gemacht. Ich habe fast nie eine ernsthafte Appliance (sei es Software kompiliert, eine Reihe von Skripten oder was auch immer) ohne eine solche Klausel gesehen. Und ob Sie es glauben oder nicht - in den meisten Umgebungen ist sich der Nutzer dessen bewusst - Dani_l


Antworten:


Setzen Sie a beschränkt und unveränderlich Verzeichnis zwischen der Außenwelt und den geschützten Dateien, z.B.

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

oder /home/joe/restricted/public_html.

Eingeschränkt bedeutet, dass nur der Benutzer und möglicherweise der Webserver sie lesen können (z. B. Modi) 0700/0750 oder einige ACLs).

Unveränderlichkeit kann mit gemacht werden chattr +i oder durch Ändern der Eigentümerschaft in etwas Ähnliches root:joe.

Eine einfache Möglichkeit, diese Hierarchie unter Ubuntu zu erstellen, wäre die Bearbeitung /etc/adduser.conf und einstellen GROUPHOMES zu yes.


34
2017-07-11 11:56





Es gibt eine Option, die Sie berücksichtigen sollten (je nachdem, wie viel Arbeit Sie dafür tun möchten).

Wie andere bereits geschrieben haben, können Sie "normal" nicht verhindern, dass jemand mit Shell-Zugriff lesbare Dateien liest.

Allerdings könnten Sie sie in ihr eigenes Haus chroot, im Grunde beschränken den Shell-Zugriff zunächst nur das gewünschte Stammverzeichnis (AKA das Home-Verzeichnis) und zweitens verhindern, dass die Benutzer alles ausführen, was sie nicht ausführen sollen.

Ich habe einen ähnlichen Ansatz gewählt, als ich einen Benutzer hatte, der Zugriff auf die Webdateien hatte, aber ich wollte nicht, dass er andere Dateien außerhalb des Webordners sah.

Das hatte eine Menge Overhead, war ein Chaos zu Setup, und jedes Mal, wenn ich etwas aktualisierte, brach es.

Aber für heute denke ich, dass du es mit der OpenSSH Chroot-Option:

WikiBooks OpenSSH


15
2017-07-11 12:12



chroot für SFTP ist einfach zu implementieren, aber ich bin mir nicht sicher, ob es so einfach für den Shell-Zugriff ist. Sie müssten eine Chroot mit allen Binärdateien und Bibliotheken für jeden Benutzer einrichten. - Cristian Ciupitu
Das ist implementierungsspezifisch. ARCHLINUX hat einen spezifischen arch-chroot-Befehl, der sich um alle zusätzlichen Bind-Mounts usw. kümmert wiki.archlinux.org/index.php/Change_Root#Change_root - Dani_l
@ CristianCiupitu das ist, was ich getan habe, nur eine bestimmte Teilmenge von Befehlen mit der Verknüpfung aller notwendigen Bibliotheken, das ist, warum ich sagte, es war ein Chaos :) Dani_l wahr, mein Setup war ein Debian-Server, ich habe nie die Zeit, gentoo traurig einzuchecken . - Dennis Nolte
@Dani_l: Was ist mit den installierten Paketen? Das arch-chroot Befehl scheint das nicht zu erfassen. Und dann gibt es auch das Problem von verschwendeten Speicherplatz mit allen Duplikaten. Ich sage nicht, dass es unmöglich ist, es zu tun, nur dass es momentan etwas komplizierter ist. - Cristian Ciupitu
Etwas, das dies einfacher macht, ist die Verwendung von UnionFS, um Benutzer in eine spezielle Verbindung der rootfs im Nur-Lesen-Modus und in ein Lese-Schreib-Ausgangsverzeichnis zu chrooten, das heißt, sie sehen alle Systempakete und Binärdateien, aber Schreibvorgänge werden automatisch ausgeführt ihr Heimatordner. Dies muss mit allen Home-Verzeichnissen 700 Berechtigungen gekoppelt sein, sonst könnten Benutzer Dateien von anderen Benutzern sowieso lesen. - Vality


Ich habe festgestellt, dass POSIX Access Control Lists Ihnen als Systemadministrator erlaubt, Ihre Benutzer vor der schlimmsten eigenen Ignoranz zu schützen, indem Sie die reguläre Benutzergruppen-andere Dateisystem-Berechtigung außer Kraft setzen, ohne eine wichtige Chance zu haben .

Sie können besonders nützlich sein, wenn Sie zum Beispiel (f.i.) Home-Verzeichnisse benötigen, um weltweit zugänglich zu sein, da der Web-Inhalt für Apache zugänglich sein muss ~/public_html/. (Mit ACLs können Sie jetzt den umgekehrten Vorgang ausführen, indem Sie den Zugriff für alle entfernen und eine bestimmte effektive ACL für den Apache-Benutzer verwenden.)

Ja, ein sachkundiger Benutzer kann sie wieder entfernen / überschreiben, sind nur selten genug, dass das unwahrscheinlich ist, und diese Benutzer, die in der Lage sind, sind in der Regel nicht diejenigen, bequem chmod -R 777 ~/ Wie auch immer, richtig?

Sie müssen das Dateisystem mit dem mounten acl mount option:

 mount -o remount,acl /home

In vielen Distributionen werden standardmäßig Benutzergruppen erstellt, jeder Benutzer hat seine primäre Gruppe, und ich habe alle Benutzer in einer sekundären Gruppe mit dem einfallslosen Namen eingestellt users.

Mit ACLs ist es nun einfach, anderen Benutzern den Zugriff auf die Home-Verzeichnisse zu verwehren:

Vor:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

Legen Sie jetzt die effektiven Verzeichnisberechtigungen für Mitglieder der users Gruppe zu 0 nicht lesen, schreiben oder zugreifen:

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

Das + sign kennzeichnet das Vorhandensein von ACL-Einstellungen dort. Und das getfacl kann bestätigen, dass:

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

Das group:users:--- zeige, dass die Gruppe effektiv kein Zugriffsrecht hat, trotz der regulären Berechtigungen für andere Wesen other::rwx 

Und testen als user1:

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

Eine zweite gemeinsame Lösung auf gemeinsam genutzten Systemen besteht darin, dass der Automounter Home-Verzeichnisse bei Bedarf einen Server bereitstellt, der für den Shell-Zugriff reserviert ist. Das ist alles andere als narrensicher, aber normalerweise werden nur eine Handvoll Benutzer gleichzeitig angemeldet, dh nur die Home-Verzeichnisse dieser Benutzer sind sichtbar und zugänglich.


11
2017-07-11 13:49



Was ist "f.i."? Ich würde nicht empfehlen, Akronyme oder Abkürzungen zu verwenden, es sei denn, sie sind eine klassische wie "z. B.", "d. H.", "Etc" und vielleicht OP. - Cristian Ciupitu


Linux Container (LXC) könnte die beste Kombination von chroot und separatem System sein.

  1. Sie sind mehr wie eine erweiterte Chroot, keine Virtualisierung, aber Sie könnten verschiedene Betriebssysteme in einem Server kombinieren.

  2. Sie können einem Benutzer ein komplettes Betriebssystem geben und ihn dort chrootten. Wenn sich der Benutzer anmeldet, geht er in seinen Container. Außerdem können Sie dort die Prozessor- und Speichernutzung begrenzen.

Stéphane Graber, der Autor von LXC, hat eine nette Sache Anleitung um Ihnen den Einstieg zu erleichtern.


3
2017-07-11 13:57



Sie können nicht wirklich verschiedene Betriebssysteme kombinieren, weil alle die verwenden müssen Linux Kernel, aber Sie können anders verwenden Verteilungen. - Cristian Ciupitu
Danke :) Ja, verschiedene Linux-Kernel-basierte Betriebssysteme. - maniaque
@CristianCiupitu meinst du den gleichen identischen Linux Kernel? Oder meinen Sie, dass jeder Container eine andere Version des Kernels haben kann? - agks mehx
@agksmehx, Alle LXC-Container teilen sich den Kernel des Hosts. Nur ihre Anwendungen und Bibliotheken werden verwendet. Wenn Sie beispielsweise einen RHEL 7-Host mit einem Ubuntu 14.04-Container haben, wird der RHEL-Kernel (3.10.0-123) verwendet, während der Ubuntu-Kernel (3.13.0-24.46) nicht verwendet wird. lies auch dieser Kommentar aus dem Tutorial. Da die Kernel der Container nicht verwendet werden, ist es möglicherweise eine gute Idee, sie zu entfernen, um Speicherplatz zu sparen. - Cristian Ciupitu
@ CristianCiupitu das ist, was ich dachte. Es war nicht klar aus der Antwort oder Kommentar, also wollte ich klären. - agks mehx


Zum Beispiel, wenn der Benutzer nur Zugriff auf sein eigenes haben soll home Verzeichnis, sollten Sie tun:

cd /home
sudo chmod 700 *

Jetzt /home/username ist nur für den Besitzer sichtbar. Um dies als Standard für alle neuen Benutzer festzulegen, bearbeiten Sie sie /etc/adduser.conf und einstellen DIR_MODE zu 0700 anstatt der 0755 Standard.

Natürlich, wenn Sie den Standard-DIR_MODE ändern wollen, hängt es von Ihrer Distribution ab, die eine, die ich gepostet hat, arbeitet an Ubuntu.

bearbeiten

Wie @ Dani_l richtig erwähnt, diese Antwort ist richtig, wenn sie NICHT weltlesbar gemacht wird.


3
2017-07-11 11:41



Sie werden aus irgendeinem Grund als "lesbar" bezeichnet. - Mark K Cowan
@DennisNolte Tatsächlich hilft es, selbst wenn Dateien weltweit lesbar sind, wenn sie sich in einem Verzeichnis befinden, das du nicht gelesen oder ausgeführt hast, kannst du sie sowieso nicht lesen. - Vality
@Vality stimmt, entfernt meinen Kommentar, da es offensichtlich falsch ist. - Dennis Nolte


Nur um pedantisch zu sein - Nein, gibt es nicht.
@Marek gab eine richtige Antworten, aber Ihre Frage ist falsch - Sie können nicht verhindern, dass irgendjemand auf "lesbare" Dateien zugreift.
Entweder sind sie lesbar oder nicht. @ Mareks Antwort ist richtig, wenn man sie NICHT weltweit lesbar macht.


2
2017-07-11 11:54



Falsch, chroot / jail der Benutzer in einen Unterordner und er kann keine "normal" lesbaren Dateien lesen. - Dennis Nolte
-1 Ich denke, du bist der OP-Frage unnötig kritisch gegenüber. Er möchte seinen Kunden ein Sicherheitsnetz geben, falls sie nicht schlau über ihre Berechtigungen sind. Aber mir scheint nicht, dass das OP nicht weiß, wie Unix-Dateiberechtigungen funktionieren oder grundlegende Sicherheitsprinzipale. - Kevin
Außerdem können Sie die Dateien in ein Verzeichnis innerhalb eines 000-Berechtigungsverzeichnisses stellen, sodass niemand darauf zugreifen kann, selbst wenn die Dateien für alle lesbar sind. - Vality
niemand? nicht einmal root? ;-) - Dani_l
@Kevin stimmte zu, dass mein Kommentar sehr unnotig ist. Aber Dani_I sollte ich nicht glauben, dass er pedandisch und falsch ist. Ich sage nicht, dass ich mit dem Rest seiner Antwort nicht einverstanden bin. - Dennis Nolte


In den bisher gegebenen Antworten sehe ich die "eingeschränkte Schale" nicht.

ln / bin / bash / bin / rbasch

Legen Sie dies als ihre Login-Shell fest.


0
2017-07-13 05:35





Wenn der Webserver für jede gehostete Domäne als derselbe Benutzer und dieselbe Gruppe ausgeführt wird, ist es schwierig (wenn nicht unmöglich), die Einrichtung zu sichern.

Sie möchten, dass bestimmte Dateien sowohl für den Benutzer als auch für den Webserver zugänglich sind, nicht jedoch für andere Benutzer. Aber sobald der Webserver auf sie zugreifen kann, kann ein anderer Benutzer sie lesen, indem er einen Symlink auf die Datei innerhalb ihrer eigenen Website setzt.

Wenn Sie jede Website als separaten Benutzer ausführen können, wird es ziemlich einfach. Jeder Kunde hat nun zwei Benutzer auf dem System, eines für den Webserver und eines für den Shell-Zugriff.

Erstellen Sie eine Gruppe, die diese zwei Benutzer enthält. Erstellen Sie nun ein Verzeichnis mit dieser Gruppe und dem Benutzer root. Dieses Verzeichnis sollte Berechtigungen haben 750, was bedeutet, dass root vollen Zugriff hat und die Gruppe den Zugriff gelesen und ausgeführt hat. Innerhalb dieses Verzeichnisses können Sie Home-Verzeichnisse für jeden der beiden Benutzer erstellen. Dies bedeutet, dass das Home-Verzeichnis des Benutzers nicht mehr das Formular hat /home/username, sondern etwas mit mindestens einer weiteren Verzeichniskomponente. Dies ist kein Problem, nichts erfordert, dass Home-Verzeichnisse entsprechend dieser speziellen Konvention benannt werden.

Es kann schwierig sein, Websites mit unterschiedlichen Benutzern und Gruppen zu verwenden, wenn Sie namensbasierte Vhosts verwenden. Sollte sich herausstellen, dass Sie nur die Trennung der Arbeit mit IP-basierten vhosts machen können, und Sie haben nicht genügend IP-Adressen für jede Website, können Sie jede Webseite auf einer IPv6-Adresse hosten und einen Reverse-Proxy für alle von ihnen auf ein setzen IPv4-Adresse


0
2017-08-09 14:30