Benutzer dürfen ein Shell-Skript ausführen, ohne dessen Inhalt zu sehen?

1465
James

Ich hätte gerne einen hg-Hook, der E-Mails über ein Google Mail-Konto sendet. Natürlich möchte ich nicht, dass jemand das Skript zum Senden von E-Mails außer mir oder root lesen kann, da es ein Kennwort enthält. Ich habe also folgendes versucht:

-rwsr-xr-x 1 james james 58 Feb 18 12:05 incoming.email.sh -rwx--x--x 1 james james 262 Feb 18 12:04 send-incoming-email.sh 

Wo incoming.email.shist die Datei als Hook ausgeführt:

#! /bin/bash /path/to/send-incoming-email.sh 

Wenn ich jedoch versuche, als anderer Benutzer auszuführen, erhalte ich die Fehlermeldung:

/bin/bash: /path/to/send-incoming-email.sh: Permission denied 

Die send-incoming-email.shDatei funktioniert gut, wenn ich wie ich selbst laufe.

Ist das, was ich versuche zu tun, oder wird setuid nicht auf Befehle übertragen, die von einem Shell-Skript ausgeführt werden?

System ist Ubuntu 10.04.2 LTS.

1

2 Antworten auf die Frage

3
Jeremy Sturdivant

Wenn Sie Ihre Lösung so verwenden möchten, wie sie ist, würde ein einfacher Hack die Verwendung eines kurzen C-Programms anstelle eines Shellskripts sein:

int main(){ setuid(geteuid()); system("/path/to/send-incoming-email.sh"); } 

Und haben Sie diese setuid, um die Race-Bedingung zu vermeiden und gleichzeitig die Ausführung des Skripts als root abzusagen.

Dies ist bei weitem nicht die beste Lösung, löst aber das beschriebene Problem.

`setuid (geteuid ())` wird anscheinend benötigt. grawity vor 13 Jahren 0
Ganz richtig, guter Fang! Redigiert, um das zu reflektieren. Jeremy Sturdivant vor 13 Jahren 0
Ich bekomme immer noch die Erlaubnis verweigert, wenn ich als anderer Benutzer ausgeführt werde: `/ bin / bash: /path/to/send-incoming-email.sh: Berechtigung verweigert` (Berechtigungen:` -rwsr-xr-x 1 james james 7227 18. Februar 16:45 eingehende.email`) James vor 13 Jahren 0
Um zu verdeutlichen, dass Sie eingehende E-Mails von einem anderen Benutzer ausführen, und diese Nachricht wird angezeigt? Führen Sie "id" anstelle des eingehenden E-Mail-Skripts aus, um die setuid-Operation zu testen, und stellen Sie sicher, dass das eingehende E-Mail-Skript weiterhin direkt von Ihrem Benutzer ausgeführt wird. Jeremy Sturdivant vor 13 Jahren 0
2
grawity

Linux wird das setuidBit für Shell-Skripts ignorieren, um mögliche Race-Bedingungen zu vermeiden.


Der "richtige" Weg, um E-Mails auf Unix / Linux-Systemen zu senden, besteht darin, einen MTA wie Postfix, Exim4 oder Sendmail zu konfigurieren und das SMTP-Authentifizierungs-Chaos handhaben zu lassen. Es gibt auch "Nur-Relais" -MTAs - esmtp, msmtp, ssmtp . Alle diese Dienste können SMTP-Relaying ("Smarthost") mit Authentifizierung durchführen, beispielsweise über Gmail-Server. Auf einem Multi-User-Rechner wird es kniffliger, aber immer noch machbar.

(Wenn ein MTA konfiguriert ist, wird das Senden einer E-Mail durch Weitergeben der Daten an durchgeführt /usr/sbin/sendmail rcpt@address.)