Kann ich eine Datei nur für ein Skript und nicht für einen Benutzer zugänglich machen?

11

Ich habe einen Benutzer mit eingeschränktem Zugriff auf das System (dh er ist kein Sudoer). Nennen wir ihn Bob .

Ich habe ein Skript oder eine Binärdatei, der ich als Systemadministrator vertraue und die ich problemlos als Root ausführen kann. Rufen wir das Skript auf get-todays-passphrase.sh. Die Aufgabe dieses Skripts besteht darin, Daten aus einer "privaten" Datei (die einem anderen Benutzer / einer anderen Gruppe als Bob oder sogar einer Root-Datei gehört) zu lesen /srv/daily-passphrasesund nur eine bestimmte Zeile aus der Datei auszugeben: die Zeile, die dem heutigen Datum entspricht .

Benutzer wie Bob dürfen die Passphrase von morgen nicht kennen, obwohl sie in der Datei aufgeführt ist. Aus diesem Grund ist die Datei /srv/daily-passphrasesdurch Unix-Berechtigungen geschützt, sodass Nicht-Root-Benutzer wie Bob nicht direkt auf die Datei zugreifen dürfen. Sie dürfen das get-todays-passphrase.shSkript jedoch jederzeit ausführen , wodurch die "gefilterten" Daten zurückgegeben werden.


Zusammenfassend (die TL; DR- Version):

  1. Bob kann die geschützte Datei nicht lesen
  2. Das Skript kann die geschützte Datei lesen
  3. Bob kann jederzeit das Skript ausführen, das die Datei lesen kann

Ist dies innerhalb von Unix-Dateiberechtigungen möglich? Oder wenn Bob ein Skript startet, ist das Skript dann immer dazu verdammt, mit denselben Berechtigungen wie Bob ausgeführt zu werden?

IQAndreas
quelle

Antworten:

13

Dies ist eigentlich üblich und recht unkompliziert. sudoMit dieser Option können Sie bestimmte Anwendungen einschränken, die ein Benutzer aufrufen kann. Mit anderen Worten, Sie müssen ihnen nicht alle Wurzeln oder nichts geben; Sie können ihnen die sudoBerechtigung zum Ausführen eines bestimmten Befehls erteilen . Dies ist genau das, was Sie wollen, und es ist sehr üblich, dass Benutzer Git-Repositorys über SSH und dergleichen pushen können.

Dazu müssen Sie lediglich eine Zeile hinzufügen, /etc/sudoersdie ungefähr so ​​aussieht

bob ALL=(root) NOPASSWD: /path/to/command/you/trust

(Der NOPASSWD:Teil ist nicht erforderlich, aber in dieser Situation sehr häufig.) Zu diesem Zeitpunkt bobkann /path/to/command/you/trustüber sudo aufgerufen werden, aber sonst nichts.

Das heißt, jemandem Wurzel zu geben - was wir hier tun - ist möglicherweise nicht ganz das, was Sie wollen. Insbesondere wenn Ihr Skript einen Fehler aufweist, besteht die Gefahr, dass Ihre Box verwurzelt wird. Aus diesem Grunde können Sie stattdessen lieber einen Benutzer zu erstellen , die speziell mit Datei-Wort zu besitzen, specialuser-dann chowndie Datei zu ihnen, und haben die /etc/sudoersMarke , bobdass spezieller Benutzer sein. In diesem Fall wäre die Zeile, die Sie hinzufügen, sudoerseinfach

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust
Benjamin Pollack
quelle
7
Ich würde vorschlagen, nicht den "Root" -Weg zu gehen - erstellen Sie einen speziellen Benutzer / eine spezielle Gruppe für diesen Zweck.
Guntbert
Guter Punkt; Ich werde die Antwort emendieren.
Benjamin Pollack
7

Vorwort:

Wie in den Kommentaren und aus den in dieser Antwort erläuterten Gründen erwähnt, ignoriert der Linux-Kernel das setuid / setguid- Bit bei der Behandlung eines Skripts. Ich werde Benjamins Antwort nicht duplizieren, sondern das Skript durch ein ausführbares ersetzen , um meine Antwort korrekt zu machen.


Kurze Antwort: Verwenden Sie setgid

Detaillierte Schritte:

  1. Erstellen Sie eine neue Gruppe (z. B. Readpass)
  2. Machen Sie diese Gruppe zum Eigentümer der Passphrasendatei sudo chown :readpass thatfile
  3. Machen Sie die Datei nur für ihre Gruppe lesbar sudo chmod g=r,o= thatfile
  4. Machen Sie Ihren ausführbaren sgid- Lesepass:sudo chmod g+s thatfile

Auf diese Weise wird Ihre ausführbare Datei mit den Berechtigungen der besitzenden Gruppe ausgeführt und kann somit die Datei lesen.

guntbert
quelle
2
Setgid und Setuid sind mit Skripten nicht einfach zu bearbeiten, oder?
Muru
1
Sie können unter Linux kein Skript setgid erstellen: Das setgid-Bit wird ignoriert. Fügen Sie stattdessen eine Sudo-Regel hinzu, thatfilemit der Bob mit der Gruppe ausgeführt werden kann readpass.
Gilles 'SO - hör auf böse zu sein'