Soll ich „sudo“ in einem Skript oder „sudo“ für das gesamte Skript verwenden?

Soll ich „sudo“ in einem Skript oder „sudo“ für das gesamte Skript verwenden?

Ich betreibe eine kleine Gruppe von macOS-Rechnern für Studenten (sagen wir 20) und sie alle müssen mit Dingen wie Homebrew und anderen Paketen und Anwendungen eingerichtet werden. Ich schreibe ein Bash-Skript, um alle benötigten Dinge automatisch auf jedem Computer zu installieren. Einige der Befehle, die ich verwenden werde, müssen als Root ausgeführt werden, die meisten jedoch nicht.

Ich habe mich gefragt, ob es besser wäre, jeden dieser Befehle im Skript einzeln mit sudo auszuführen oder sudo aus dem Skript wegzulassen und das gesamte Skript mit sudo auszuführen. Ich würde gerne wissen, welche Methode sicherer (sicherheitstechnisch) und für meine Situation besser ist. Ich möchte im gesamten Skript lieber nicht nach einem Passwort gefragt werden, aber ich möchte auch nicht jede Zeile im Skript als Root ausführen, da dies unsicher ist.

Antwort1

Führen Sie nach dem Prinzip der geringsten Privilegien so wenig wie möglich als Root aus. Führen Sie daher innerhalb des Skripts sudo aus.

Beachten Sie, dass Sie beim ersten Mal, wenn ein Befehl sudo erfordert, möglicherweise dazu aufgefordert werden. (Das trifft nicht zu, wenn Sie in /etc/sudoers NOPASSWD verwenden, eine Technik, die viele Leute als unsicher ablehnen.) Wenn Sie jedoch sudo ausführen und ein Passwort eingeben, merkt sich sudo den Erfolg für eine gewisse Zeit. Standardmäßig beträgt dieser Zeitraum fünf Minuten. Wenn Sie also „sudo echo hi“ ausführen, Ihr Passwort eingeben und dann kurz danach das Skript ausführen, müssen Sie beim Ausführen des Skripts nicht nach einem Passwort gefragt werden. Realistischer ist, dass Sie, wenn Sie nur das Skript ausführen, wahrscheinlich nur einmal aufgefordert werden, sudo auszuführen ... vorausgesetzt, dass Ihr Skript weniger als ein paar Minuten braucht, um die verbleibenden Aufgaben abzuschließen.

Bei einigen echoBefehlen mache ich mir vielleicht keine Gedanken, aber wenn wichtige Inhalte ohne zusätzliche Berechtigungen ausgeführt werden können, möchte ich aus Sicherheitsgründen im Allgemeinen die Menge maximieren, die mit minimalen Berechtigungen ausgeführt wird.

Als Beispiel für die Minimierung von Berechtigungen möchte ich Ihnen ein weiteres Beispielszenario zeigen. Statt:
sudo -c "sample-command >> /var/log/output.txt"

Ich verwende gerne:
sample-command | sudo tee -a /var/log/output.txt >> /dev/null

Auf diese Weise wird der gesamte Befehl ohne „sudo“ ausgeführt und der einzige Teil, der letztendlich über erweiterte Berechtigungen verfügt, ist der Teil, der erweiterte Berechtigungen benötigt, also der Teil, der in die Datei schreibt.

Mein Ziel hier ist eindeutig, die Anzahl der erhöhten Berechtigungen zu minimieren. Wenn Ihr gesamtes Skript keine erhöhten Berechtigungen erfordert, ist der bevorzugte Ansatz (aus Sicherheitsperspektive) die Minimierung der Anzahl der erhöhten Berechtigungen.

Antwort2

Hängt davon ab, was die Befehle sind. Für die Befehle, die aus dem Internet heruntergeladen werden, ist es besser, sie nicht als Root auszuführen. Aber die anderen Befehle sollten als Root ausgeführt werden können. Ich würde den Befehl in zwei Skripte aufteilen: eines für Nicht-Root-Befehle und eines für Root-Befehle

Vielleicht könnte ich besser helfen, wenn ich die Liste der Befehle bekommen könnte.

Antwort3

Normalerweise (nehme ich an) möchten Sie, dass das Skript wie jeder andere Befehl/jede andere Anwendung/jedes andere Dienstprogramm behandelt wird. In diesem Fall werden Sie normalerweise nicht nach einem Passwort gefragt, um Ihre Berechtigungen zu erhöhen; Sie werden einfach abgelehnt und erhalten eine Fehlermeldung. So etwas wie:
Permission denied, oderOperation not permitted.

Sie haben jedoch ausdrücklich erwähnt, dass Sie:
„… möchte nicht jede Zeile des Skripts als Root ausführen …“
Daher sehe ich keine wirkliche Alternative zum expliziten und ausschließlichen Aufruf sudoin bzw. aus den spezifischen Codezeilen, in denen dies relevant ist.

Sie haben auch erwähnt, dass Sie:
„… möchte lieber nicht im gesamten Skript nach einem Passwort gefragt werden…“
Und die Wahrscheinlichkeit ist groß, dass Sie das nicht tun werden. Sie werden nicht bei jedem Aufruf von sudo dazu aufgefordert, es sei denn, zwischen den Vorgängen vergeht eine beträchtliche Zeitspanne.

Antwort4

Hier ist eine Lösung: Führen Sie das Skript als rootaus sudound führen Sie alle Befehle, die keine erhöhten Berechtigungen erfordern, als ursprünglicher Benutzer mit aus sudo -u $SUDO_USER <command>.

Hier ist ein Beispielskript example.sh:

#!/bin/bash

if [ "$(whoami)" != "root" ] ; then
    echo "Run this script with sudo" >&2
    exit 1
fi

sudo -u "${SUDO_USER:-$USER}" this_command_run_as_user
this_command_run_as_root
this_command2_run_as_root

Sie würden es folgendermaßen ausführen:

sudo ./example.sh

Der Vorteil dieser Vorgehensweise besteht darin, dass das Passwort des Benutzers höchstens einmal beim Start des Skripts abgefragt wird. Timeouts für müssen Sie sich keine Gedanken machen sudo.

verwandte Informationen