Wie kann ich eine vernünftige Textdatei mit einem Bash-Skript einpacken, mit dem jeder Benutzer für $ USER grep kann?

383
Pavel

Ich habe also eine Datei data.txt, die den Benutzernamen und einige Daten speichert, eine Zeile pro Benutzer. Ich hätte gerne ein Bash-Skript, das von den Benutzern ausgeführt werden kann und das sie aufrufen kann

grep -w "^$USER" data.txt 

um ihre Informationen abzurufen, aber nicht in der Lage zu sein, das Ganze zu lesen data.txt. Gibt es einen einfachen Setuid-Trick dafür?

Muss nicht Bash sein, jede C- oder Perl-Lösung ist in Ordnung.

0
Entschuldigung, ich verstehe es nicht. Möchten Sie ein kurzes Beispiel geben? Pavel vor 8 Jahren 0
Sorry, macht immer noch keinen Sinn für mich. Der Punkt ist, dass das Skript unter seinem Benutzernamen in einer Datei grep, die ich nicht als Ganzes lesbar machen möchte (sie können das Skript öffnen und sehen, wo `data.txt` sich befindet). Pavel vor 8 Jahren 0

1 Antwort auf die Frage

0
Kamil Maciorowski

Dies ist eine Lösung mit Bash-Skripts.

Ich gehe davon aus, dass Sie setuid nicht für Skripte verwenden können, wie in dieser U & L-Antwort erläutert . Der Rat darin ist zu verwenden

ein Wrapper, der die Umgebung desinfiziert (z. B. sudomit der env_resetOption).


In diesem Beispiel verwende ich /etc/our_secrets.txtanstelle von data.txt. Beschränken Sie zunächst den Zugriff auf die Datei:

sudo chown root: /etc/our_secrets.txt sudo chmod 600 /etc/our_secrets.txt 

Dann erstellen Sie ein Skript /usr/local/sbin/sget_my_secret. Dies ist das Skript:

#!/bin/sh exec /bin/grep -w "^$SUDO_USER" /etc/our_secrets.txt 

Und seine Berechtigungen:

sudo chown root: /usr/local/sbin/sget_my_secret sudo chmod 744 /usr/local/sbin/sget_my_secret 

Jetzt sollten Sie sudo visudoIhre sudoersDatei ausführen und ändern, damit Benutzer sie aufrufen können sudo /usr/local/sbin/sget_my_secret. Der grundlegendste Weg ist das Hinzufügen

ALL ALL=(ALL) NOPASSWD: /usr/local/sbin/sget_my_secret 

in die Datei. Jetzt kann jeder Benutzer laufen sudo sget_my_secret. Zur Vereinfachung benötigen Sie ein anderes Skript /usr/local/bin/get_my_secret:

#!/bin/sh exec /usr/bin/sudo /usr/local/sbin/sget_my_secret 

Ihre Berechtigungen:

sudo chown root: /usr/local/bin/get_my_secret sudo chmod 755 /usr/local/bin/get_my_secret 

In diesem Moment kann jeder Benutzer laufen get_my_secret, um seine Informationen zu erhalten (falls vorhanden). Das ist, was passiert:

  1. get_my_secret läuft mit normalen Berechtigungen.
  2. Es versucht zu rennen sudo /usr/local/sbin/sget_my_secret.
  3. sudoers Datei sagt, dass es das kann.
  4. sget_my_secret wird mit erhöhten Berechtigungen ausgeführt.
  5. Erhöht grepdie Datei.

Sicherheitshinweise:

  • In meinem Debian ist die erwähnte env_resetOption standardmäßig aktiviert.
  • Sie können diese ALL ALL=(ALL) ...Zeile durch eine restriktivere ersetzen .
  • In den Skripten verwende ich volle Pfade, wo immer ich kann.
  • Jeder, der sget_my_secretmit Spoofing laufen $SUDO_USERkann, kann das Geheimnis eines anderen abrufen. Ich denke, wenn Sie das können, können Sie auch our_secrets.txtdirekt lesen .
  • Sie denken vielleicht, Sie könnten Benutzern die Ausführung erlauben sudo grep. aber dies würde sie grepfür alles in jeder Datei erlauben ! Es sget_my_secretgeht darum, nur diese spezielle ausführbare Datei in die sudoersDatei aufzunehmen.