Eine Datei soll zwei Benutzern gehören. Wie? Die harte Verknüpfung schlägt fehl

32

Zwei setuid-Programme /usr/bin/barund /usr/bin/bazteilen sich eine einzige Konfigurationsdatei foo. Der Modus der Konfigurationsdatei ist 0640, da er vertrauliche Informationen enthält. Das ein Programm läuft als bar:bar(die, wie Benutzer bar, Gruppe bar ); der andere als baz:baz. Das Ändern von Benutzern ist keine Option, und selbst das Ändern von Gruppen ist nicht vorzuziehen.

Ich möchte die einzelne Konfigurationsdatei als /etc/bar/foound fest verlinken /etc/baz/foo. Dies schlägt jedoch fehl, da die Datei meines Wissens entweder zu root:baroder zu gehören muss root:baz.

Mögliche Lösung: Erstellen Sie eine neue Gruppe, barbazderen Mitglieder barund sind baz. Gehören foozu root:barbaz.

Das sieht für mich nach einer ziemlich schwierigen Lösung aus. Gibt es keine bessere und einfachere Möglichkeit, die Konfigurationsdatei foozwischen den beiden Programmen zu teilen ?

Im Moment verwalte ich zwei identische Kopien der Datei. Das funktioniert, ist aber offensichtlich falsch. Was wäre richtig?

Zur Information: Ich habe wenig Erfahrung mit Unix-Gruppen und keine mit setgid (2).

thb
quelle
Die Frage ist in der Regel stufenweise. In meinem speziellen Fall handelt es sich bei den beiden Programmen zufällig um Exim4 und Dovecot, E-Mail-Bearbeitungsprogramme, die Kennwörter und TLS-Zertifikate gemeinsam nutzen können.
17.
8
Die Ubuntu (und ich denke Debian) -Lösung dafür ist die ssl-certGruppe, die so ziemlich Ihre barbazGruppe ist. Der Standard besteht darin, alle privaten Schlüssel so ssl-certfestzulegen, dass sie der Gruppe gehören, und die UIDs, die den Programmen zugeordnet sind, die auf sie zugreifen müssen, in diese Gruppe aufzunehmen.
abligh
1
@abligh: Interessant. Mein System ist Debian 8 Jessie. Anscheinend gibt es ein Paket, ssl-certdessen Postinst-Skript bei der Installation die Gruppe erstellt, von der Sie sprechen. Ich hatte es nicht gewusst ssl-cert. Apache2 (auf meinem Host installiert) empfiehlt ssl-cert . Die verschiedenen Exim- und Dovecot-Pakete funktionieren nicht, aber Postfix (nicht auf meinem Host installiert) hängt davon ab ssl-cert. Aufgrund von Apache hat mein Host eine SSL-Zertifikatsgruppe , aber diese Gruppe hat noch keine Mitglieder. Danke für den Hinweis.
Donnerstag,
5
Machen Sie die Programme setgid, nicht setuid. Setuid-Programme sind eine schlechte Idee, da bei einer Kompromittierung die Binärdatei ersetzt werden kann und ein Trojaner entsteht. (Ausnahme: setuid root, da Sie dort keine Wahl haben.)
Gilles 'SO - hören Sie auf, böse zu sein'
1
Does wiki.dovecot.org/HowTo/EximAndDovecotSASL lösen Ihre spezifische Situation?
MvG

Antworten:

50

Sie können ACLs verwenden, damit die Datei von Personen in beiden Gruppen gelesen werden kann.

chgrp bar file
chmod 640 file
setfacl -m g:baz:r-- file

Jetzt können beide barund bazGruppen die Datei lesen.

Hier ist zum Beispiel eine Datei von bin: bin im Modus 640.

$ ls -l foo
-rw-r-----+ 1 bin bin 5 Aug 17 12:19 foo

Das +bedeutet, dass es einen ACL-Satz gibt. Schauen wir uns diesen an.

$ getfacl foo
# file: foo
# owner: bin
# group: bin
user::rw-
group::r--
group:sweh:r--
mask::r--
other::---

Wir können die Zeile sehen group:sweh:r--: Das bedeutet, dass die Mitglieder der Gruppe swehsie lesen können.

Hey das bin ich!

$ id
uid=500(sweh) gid=500(sweh) groups=500(sweh)

Und ja, ich kann die Datei lesen.

$ cat foo
data
Stephen Harris
quelle
23

Sie können diese Aussagen überdenken:

Mögliche Lösung: Erstellen Sie eine neue Gruppe barbaz, deren Mitglieder barund sind baz. Gehören foozu root:barbaz.

Das sieht für mich nach einer ziemlich schwierigen Lösung aus. Gibt es keine bessere und einfachere Möglichkeit, die Konfigurationsdatei foozwischen den beiden Programmen zu teilen ?

Warum ist es schwerfällig, eine neue Gruppe zu gründen? Dies hat folgende Vorteile gegenüber ACLs:

  • Obwohl Sie dies als eine Hypothese mit Befehlen /usr/bin/barund formuliert haben /usr/bin/baz, ist es relevant, dass diese beiden Programme eine Konfigurationsdatei gemeinsam nutzen können. Dies legt nahe, dass die Programme natürlich verwandt sind. Das Erstellen einer neuen Gruppe für sie scheint eine Beziehung zu beschreiben, die tatsächlich besteht, und sollte Verhalten auslösen (z. B. Berechtigungen zum Lesen der allgemeinen Konfigurationsdatei).
  • Die Lösung dieses Problems über Gruppen ist für jedes Unix portierbar , dh Sie können sich auf denselben Mechanismus verlassen, der auf jedem Unix- oder Unix-ähnlichen System genauso funktioniert. ACLs sind weitaus komplexer und die Portabilität kann ein Problem darstellen.

Persönlich sehe ich ACLs als die schwerfällige Lösung und Gruppen als den einfacheren, traditionellen Unix-Weg.

user9999999
quelle
16

Ich würde denken, dass dies eine typische Verwendung für Access Control Lists (ACLs) wäre. Fügen Sie der ACL der Konfigurationsdatei beide Benutzer (oder Gruppen) hinzu:

/etc/foo  root:root rw-------  # Traditional Unix ownership and permission for foo
$ setfacl -m user: bar: rw- / etc / foo # Ermöglicht der Benutzerleiste, foo zu lesen und zu schreiben
$ setfacl -m Benutzer: baz: rw- / etc / foo # Ermöglicht auch Benutzer baz, foo zu lesen und zu schreiben

Möglicherweise müssen Sie zuerst das acl-Paket installieren.

Baard Kopperud
quelle
3

Stellen Sie den Dateimodus 0660(oder auch 0440wenn das Schreiben nicht erforderlich ist) und das Eigentumsrecht ein bar:baz. Dann kann ein Prozess dank Benutzerberechtigungen auf die Datei zugreifen, der andere dank Gruppenberechtigungen. Dies funktioniert auch auf Dateisystemen, in denen ACLs dies nicht tun.

MvG
quelle
2

Ich werde dies einreichen, da es noch nicht erwähnt wird. Auch wenn dies wahrscheinlich nicht das ist, was Sie wollen, kann es die Antwort für andere Menschen mit einer ähnlichen Frage sein.

Die "neue" "Cloud" -Methode besteht darin, die gesamte Konfiguration von einem Konfigurationsverwaltungssystem (z. B. Chefkoch , Marionette oder Ansible ) verwalten zu lassen. In diesem Fall spielt es keine Rolle, dass Sie zwei unterschiedliche, aber identische Dateien auf dem Server haben, da beide eine Kopie der einzelnen Datei aus dem Konfigurationsverwaltungssystem sind.

Der Hauptvorteil dieser Vorgehensweise besteht darin, dass Ihre Konfiguration (zusammen mit allen anderen Konfigurationen) versioniert ist und die Bereitstellung eines neuen identischen oder nahezu identischen Servers so einfach wird, dass keine Automatisierung möglich ist.

(Da Sie das Konfigurationsmanagement nicht verwenden, würde ich für das Gruppensystem wie in der Antwort von @ drg vorgehen.)

Law29
quelle