Lesen Sie Dateien, die einem anderen Benutzer gehören, als Nicht-Root

9

Ich sichere Server auf einem Sicherungsserver. Jeder Server, der gesichert wird, hat ein eigenes Konto auf dem Sicherungsserver, und die Dateien werden synchronisiert. Es ist wichtig, dass die Berechtigungen intakt bleiben (mit rsync -p), um die Wiederherstellung zu vereinfachen.

Ich versuche ein Skript zu erstellen, das die Dateien lesen und Statistiken erstellen kann. Ich mag es nicht, dass dieses Skript unter dem Root-Benutzer ausgeführt wird, und es ist auch unmöglich, es für jeden Backup-Benutzer auszuführen, da das Skript alle Dateien von allen Benutzern lesen kann. Dies führt jedoch zu einem Problem, wenn eine Datei beispielsweise chmodded 600 ist. Ich möchte keine Berechtigungen berühren, aber ein anderer Benutzer außer root und der Eigentümer können sie nicht lesen.

Ein bestimmter Benutzer ohne Rootberechtigung sollte in der Lage sein, alle Dateien in einem Verzeichnis oder einer Partition zu lesen, unabhängig von den Berechtigungsstufen (und der Eigentümer der Dateien sollte keine Möglichkeit haben, dies zu verhindern). Gibt es einen Weg, dies zu erreichen? Ich verwende FreeBSD mit einem ZFS-Volume.

Evianon
quelle
Dies war meine erste Frage auf dieser Seite :) Sie können wahrscheinlich auch einen Blick darauf werfen. unix.stackexchange.com/questions/91488/…
Ramesh

Antworten:

4

Verwenden Sie sudo.

Wenn Ihre sudoersDatei einen genauen und spezifischen Befehl enthält, muss der Befehl genau so aufgerufen werden, wie er in der Datei aufgeführt ist. Andernfalls sudoerswird er abgelehnt.

Z.B:

backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

In diesem Beispiel kann der Benutzer backupden Befehl genau wie gezeigt ausführen:

sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Wenn sie sudo rsync...anstelle des sudo /usr/bin/rsyncBefehls aufrufen, schlägt dies fehl oder wenn die Flags oder Pfade unterschiedlich sind, schlägt der Befehl fehl.

Wenn Sie dies in einem Skript tun, möchten Sie die kennwortlose Verwendung dieser Befehle aktivieren:

backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Weitere Informationen finden Sie in der sudoers(5)Manpage unter Cmnd_list.

Bahamat
quelle
Großartige Idee. Ich habe der sudoers-Datei die Befehle ls, cat, head, tail usw. hinzugefügt und kann sie jetzt mit Root-Rechten ausführen und alle Dateien lesen. Möglicherweise nicht die beste Lösung für alle, da der Benutzer alle Dateien auf dem System lesen kann, aber das ist in meinem Setup kein Problem.
Evianon
Wenn Sie Solaris verwenden würden, hätte ich RBAC und vorgeschlagen pfexec. Aber da Sie auf BSD sind, sudomüssen Sie tun.
Bahamat
4

Sie können eine suidVersion schreiben cat, die nur von Ihrem Sicherungsbenutzer ausführbar ist (machen Sie eine Gruppe exklusiv für den Sicherungsbenutzer und machen Sie die ausführbare Datei nur für diese Gruppe lesbar). Auf diese Weise catkönnen Sie nur Dateien in dem Verzeichnis lesen, an dem Sie interessiert sind. (Sie möchten wahrscheinlich symbolische Links nicht zulassen und auf Tricks wie achten /dir/../otherdir/.)

Dann kann Ihr Skript diese ausführbare Datei verwenden, um Dateien ohne Root-Rechte zu lesen.

cjm
quelle
4

WARNUNG: Wie Stephane in den Kommentaren unten ausgeführt hat, können die Eigentümer der Dateien die ACL weiterhin widerrufen.

Wenn Sie Root-Zugriff auf den Computer haben, können Sie dies mit ACLs tun :

setfacl -R -m u:USERNAME:r /path/to/direcory

Dadurch erhalten USERNAMESie Lesezugriff auf alle Dateien und Verzeichnisse unter /path/to/directory.

terdon
quelle
Die Eigentümer der Dateien können diese ACLs weiterhin entfernen.
Stéphane Chazelas
@StephaneChazelas oh. Auch wenn dies von root gemacht wurde? Das habe ich nicht bemerkt. Kennst du einen Weg darum herum?
Terdon
Nein, unter Linux hätte ich mir eine Kombination aus Linux-Funktionen und LSM angesehen. Auf FreeBSD habe ich keine Ahnung.
Stéphane Chazelas
1

Bindfs ist ein FUSE- Dateisystem, das Ansichten eines Verzeichnisbaums mit unterschiedlichen Berechtigungen und Besitzverhältnissen bereitstellt. Es gibt keinen Port für FreeBSD, aber Sie können aus dem Quellcode kompilieren.

Um dem Benutzer backupper(und nur diesem Benutzer) eine Ansicht zu geben, /some/fileswo alle Dateien lesbar sind, hängen Sie eine weltweit lesbare Ansicht von /some/filesin ein privates Verzeichnis von ein backupper.

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files
Gilles 'SO - hör auf böse zu sein'
quelle
0

ZFS verfügt hierfür über einige Mechanismen.

Einer der Mechanismen ist noch in Arbeit und noch nicht implementiert, ermöglicht jedoch das Mounten eines Datasets mit einer 'Eigentümer'-Überschreibung. In diesem Fall können Sie einen Snapshot klonen, ihn mit dem für den Sicherungsbenutzer überschriebenen Eigentümer bereitstellen, ihn sichern und dann den Klon zerstören. Der Nachteil ist, dass Sie nicht den tatsächlichen Besitz der Dateien sichern.

Die beste Lösung sind wahrscheinlich die ACLs im ZFS-nfsv4-Stil

Allan Jude
quelle
0

Ich habe zwei Ideen, wie dieses Problem mit FreeBSD-spezifischen Technologien gelöst werden kann, obwohl ich es auch nicht ausprobiert habe:

  • Verwenden Sie Capsicum. Dies ist meine bevorzugte Methode. Da es kürzlich auf Linux portiert wurde, sollte es auch dort funktionieren. Es würde so gehen:

    1. Erstellen Sie einen Drop-Cap-Write-Befehl, der CAP_WRITE löscht und dann einen in der Befehlszeile angegebenen Befehl ausführt
    2. Verwenden Sie sudo, damit der Sicherungsbenutzer diesen Befehl ohne Kennwort ausführen kann
    3. Verwenden Sie optional die ForceCommand-Direktive von sshd_config, um diesen Befehl automatisch auszuführen, wenn sich der Sicherungsbenutzer anmeldet. Auf diese Weise muss der Remotebenutzer in seinem Sicherungsskript kein Drop-Cap-Write angeben.
  • Verwenden Sie die obligatorische Zugriffskontrolle. Dies funktioniert unter Linux AFAIK nicht und ist schwieriger einzurichten. Es würde so gehen:

    1. Erstellen Sie ein Backup-Jail mit dem Root-Verzeichnis /. Codieren Sie den Jailid hart.
    2. Führen Sie sshd im Backup-Gefängnis aus. Erlauben Sie root, sich hier anzumelden, auch wenn Sie keine Root-Anmeldungen im regulären sshd zulassen
    3. Setzen Sie ugidfw_enable = "YES" in /etc/rc.conf
    4. Verwenden Sie eine ugidfw-Regel, die ungefähr so ​​aussieht:

    ugidfw Betreff hinzufügen uid root jailid BACKUP_JAIL_ID mode rsx

Alan Somers
quelle