Shell-Skript: Verwenden Sie Sudo darin oder führen Sie es mit Sudo aus?

13

Wenn ich ein Shell-Skript schreibe, in dem einige, aber nicht alle darin enthaltenen Befehle Superuser-Berechtigungen benötigen, soll ich

  • Fügen Sie sudo zu den Befehlen hinzu, die Superuser-Berechtigungen benötigen, und führen Sie das Shell-Skript ohne sudo oder aus

  • Fügen Sie den Befehlen, die Superuser-Berechtigungen benötigen, kein sudo hinzu, sondern führen Sie das Shell-Skript mit sudo aus?

Auf die zweite Weise muss ich mein Kennwort nur einmal angeben, aber alle Befehle im Skript werden mit Superuser-Berechtigungen ausgeführt, einschließlich der Befehle, die nicht benötigt werden.

In erster Linie muss ich mein Kennwort möglicherweise mehrmals für verschiedene sudo-Befehle angeben, während die Superuser-Berechtigungen nur den Befehlen gewährt werden, die sie benötigen.

Aus Sicherheitsgründen ist der erste Weg besser. Der Einfachheit halber ist der zweite Weg besser.

  1. Ich habe darüber nachgedacht, den ersten Weg einzuschlagen. Ich muss mich also mit der Unannehmlichkeit auseinandersetzen, meine Passwörter für mehrere sudo-Befehle im Shell-Skript bereitzustellen.

  2. Stephen Harris schrieb :

    Ein gut geschriebenes Skript erkennt, ob es mit den richtigen Berechtigungen ausgeführt wird, und ruft sudo überhaupt nicht auf, aber es gibt viele schlechte Skripte

    Soll ich also den zweiten Weg gehen? Wenn ja,

    • Wie kann ich schreiben "Skript würde erkennen, ob es mit den richtigen Berechtigungen ausgeführt wurde und sudo überhaupt nicht aufruft"?

    • Wie kann ich die Sicherheit verbessern, um das Problem zu vermeiden, Befehlen Superuser-Berechtigungen zu erteilen, die sie nicht benötigen, wenn das Skript mit sudo ausgeführt wird?

  3. Hätte dieser einfache Ansatz das Beste aus beiden Ansätzen: Fügen Sie sudo zu Befehlen hinzu, die es nur benötigen, und führen Sie das Skript mit oder ohne sudo aus, je nachdem, ob ich Komfort oder Sicherheit möchte? Hat dieser Ansatz ein Problem?

Vielen Dank.

Tim
quelle
Ich dachte, ich sudohätte einen Standard-Cache für Anmeldeinformationen. Ist dies auf Ihrer Plattform deaktiviert?
Pipe
@pipe Sein Skript schläft möglicherweise eine bestimmte Zeit lang, und auf diese Weise funktioniert der Cache möglicherweise nicht.
LinuxSecurityFreak

Antworten:

15

So beheben Sie Ihr erstes Problem:

Wie kann ich schreiben "Skript würde erkennen, ob es mit den richtigen Berechtigungen ausgeführt wurde und sudo überhaupt nicht aufruft"?

Es gibt eine einfache POSIX-Prüfung für root:

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

Alternativ möchten in Bash möglicherweise leistungsorientiertere Codierer Folgendes verwenden:

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

Beachten Sie, dass ich den Code absichtlich in Funktionen zur Wiederverwendung eingeschlossen habe.

So beheben Sie Ihr zweites Problem:

Wie kann ich die Sicherheit verbessern, um das Problem zu vermeiden, Befehlen Superuser-Berechtigungen zu erteilen, die sie nicht benötigen, wenn das Skript mit sudo ausgeführt wird?

Daran kann man nicht viel ändern. Zumindest fällt mir nichts ein. Wenn ich das Skript sehen würde, hätte ich möglicherweise Vorschläge. Aber da Sie es nicht in Ihre Frage aufgenommen haben ... Wenn Sie das gesamte Skript mit sudooder als ausführen root, sehe ich keine Möglichkeit, dies zu kontrollieren.

So adressieren Sie den Kommentar:

Was halten Sie von "Verwenden Sie Sudo darin und führen Sie es mit Sudo aus"?

In meinen Skripten gehe ich normalerweise mit dem letzteren Ansatz vor, aber das bedeutet nicht unbedingt, dass ich ihn Ihnen empfehle. Weil es davon abhängt, für wen das Skript bestimmt ist - rootnur für ; für Benutzer meistens mit Ausnahme einiger Benutzer, die sudoRechte haben; Sie müssten Ihr Skript buchstäblich in die Frage aufnehmen, damit ich mit jedem Wert antworten kann.

LinuxSecurityFreak
quelle
sudo -u "$SUDO_USER" command...?
Michael Homer
Vielen Dank. Was halten Sie von "Verwenden Sie Sudo darin oder führen Sie es mit Sudo aus"?
Tim
Vielen Dank. Hätte dieser einfache Ansatz das Beste aus beiden Ansätzen: Fügen Sie sudo zu Befehlen hinzu, die es nur benötigen, und führen Sie das Skript mit oder ohne sudo aus, je nachdem, ob ich Komfort oder Sicherheit möchte? Hat dieser Ansatz ein Problem?
Tim
@ MichaelHomer Ich habe mich gefragt, was sudo -u "$SUDO_USER" commandhier bedeuten soll.
Tim
@ Tim Obwohl ich mit diesem Ansatz kein Problem finde, könnte jemand mit vernünftigen Argumenten Einwände erheben. Dies liegt wirklich außerhalb des Rahmens Ihrer ursprünglichen Frage. Ich muss jetzt mein monatliches M-Disc-Backup durchführen, daher denke ich, dass ich heute noch nicht verfügbar bin. Tut mir leid. Ich hoffe, ich habe zumindest den Hauptpunkt beantwortet. Bis morgen.
LinuxSecurityFreak
-4

Ich denke, ich kann das beantworten.

Soll ich also den zweiten Weg gehen?

Es gibt keinen Grund, warum Sie hier ein Problem haben sollten. Deshalb:

Wenn es nur einen Befehl gibt, der als root ausgeführt werden muss, ist runIhr Programm als rootoder sudoweil sudoin Ihrem Skript der längere Weg. Haben Sie vergessen, dass Programmierer faul sind?

Wenn Sie viele Befehle müssen runwie rootdann führen Sie es wie rootoder sudo.

Wie kann ich die Sicherheit verbessern, um das Problem zu vermeiden, Befehlen Superuser-Berechtigungen zu erteilen, die sie nicht benötigen, wenn das Skript mit sudo ausgeführt wird?

Wenn andere Benutzer runIhr Programm benötigen, richten Sie es sudofür diese ein, da sudoes sehr anpassbar ist und Ihre Anforderungen erfüllt.

Hier ist ein Beispiel mit sudo:

Immer verwenden, visudowenn Sie die sudoers-Datei bearbeiten .....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo eignet sich auch hervorragend zum Ändern von Benutzern in Ihrem Programm / Skript. Hier ist eine Zeile aus einem meiner Skripte:

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

Wie kann ich schreiben "Skript würde erkennen, ob es mit den richtigen Berechtigungen ausgeführt wurde und sudo überhaupt nicht aufruft"?

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
Wie kann ich feststellen, ob ein Shell-Skript mit Root-Berechtigungen ausgeführt wird?

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

EDIT auf Anfrage des Gentleman @terdon:

Stellen Sie sich Ihr Skript so vor ...

Ist es ein öffentliches Skript (andere Leute als Sie werden es verwenden) Was macht das Skript? Zeigt es Ihnen die Zeit? Oder aktualisiert es iptables auf 200 Systemen? Wenn Sie es nur benutzen, ist es beruflich oder beruflich oder für den persönlichen Gebrauch?

Sie müssen nur im Voraus wissen, woraus Ihre Benutzergruppe besteht, das war's.

Wenn es writtenAdmins geben oder verkaufen soll, warum sollte es dann nicht scripterlaubt sein, als zu laufen root? Welchen Schaden kann es anrichten?

Echte Skripte / Programme werden oft als privilegierter Benutzer ausgeführt und niemand erwähnt, dass dies kein Problem ist, aber wenn Programmierer, meistens Anfänger wie ich, über diese Dinge sprechen, ist dies eine echte Sicherheitsbedrohung ... was der Typ in Ihrem Beitrag Ihnen sagt Beziehen Sie sich auf den Versuch zu sagen, während es nicht elegant ist, dass einige Leute sich die Kontrolle ansehen, die Sie über den systemund Ihren Code haben. Stellen Sie Dateien auf mehr Berechtigungen ein, als Sie verwenden werden, haben Sie alle Überprüfungen in Ihrem Logik oder wird ein talentierter Programmierer Gefahren in Ihrem Code sehen, wenn Sie nur einen Blick darauf werfen?

Wenn Sie code needs rootverwenden sudo, und wenn es viele gibt, führen Sie es einfach als root....... meine Antwort endet hier puh

etwas etwas
quelle
2
@somethingSomething Könnten Sie erklären, warum Sie empfehlen, das Skript immer als root auszuführen, auch wenn nur ein einziger Befehl root-Berechtigungen benötigt? Sie geben in Ihrer Antwort zwei Möglichkeiten an (ein Befehl erfordert Root-Rechte oder mehrere), aber Sie schlagen für beide dasselbe vor.
Terdon
2
Ich habe über dieses Problem nachgedacht und andere ähnliche Diskussionen gelesen. Diese Antwort verwirrt mich nur. (Aber Sie haben bereits genug Abstimmungen.)
Joe