Sudo-Berechtigungen mit zeitlicher Begrenzung vergeben

Leider ist es mit herkömmlichen Bordmitteln nicht möglich, Sudo-Berechtigungen mit zeitlicher Begrenzung zu vergeben. Mit Hilfe der Bash, einem Cronjob und der Unix-Time ist dies dennoch möglich.

Die Sudo-Rechtezuweisung wird über ein Shell-Skript abgehandelt, welches wir als erstes erstellen:

nano ~/set_sudo_expiration.sh

Dort hinein werden zunächst einmal die folgenden Zeilen eingefügt:

#!/bin/bash

current_date=$(date +%s)

read -p "Benutzername: " username
while [[ ! $days =~ ^[0-9] ]]; do
    read -p "Anzahl der Tage: " days
done

Mit dem Funktionsaufruf $(date +%s) wird die aktuelle Unix-Time in die Variable current_date geschrieben. Die Unix-Time wird an dieser Stelle verwendet, da man mit ihr die aktuelle Uhrzeit präzise abgefragt werden kann. Genauer gesagt, handelt es sich bei der Unix-Time um die vergangenen Sekunden seit dem 1. Januar 1970.
Dann wird mit dem read -p Befehl der Benutzername gesetzt, der die Sudo-Berechtigungen erhalten soll, ebenso, wie die Gültigkeitsdauer in Tagen. Da als Eingabe für die Anzahl der Tage nur Zahlen als Wert entgegengenommen werden sollen, wird diese Abfrage in eine while Loop-gefasst und nur die Werte von 0-9 akzeptiert.

days_in_seconds=$(($days*86400))
expiration_date=$(($current_date+$days_in_seconds))

Da wir auf Ebene der Unix-Time rechnen, müssen die Tage zunächst einmal in Sekunden umgerechnet und in die Variable days_in_seconds geschrieben werden. Danach wird diese Gesamtzahl an Sekunden mit der aktuellen Unix-Zeit zusammengezählt und als Variable expiration_date gespeichert.

/usr/bin/sudo bash -c "echo '$username ALL=(ALL:ALL) ALL' >> /etc/sudoers"

Nun wird die Sudo-Berechtigung in die Datei /etc/sudoers gesetzt.

cat > /etc/cron.daily/sudo_expiration_$username <<EOF
current_date=\$(date +%s)
expiration_date=$expiration_date
remaining_in_seconds=$(($expiration_date-$(date +%s)))
remaining_in_days=$((remaining_in_seconds/60/60/24))
echo "Noch $remaining_in_days Tage gültig"

if [[ \$current_date > \$expiration_date ]]; then
  sed -i /$username/Id /etc/sudoers
  find /etc/cron.daily/ -name sudo_expiration_$username -exec rm {} \;
fi
EOF

chmod +x /etc/cron.daily/sudo_expiration_$username

Als letztes schreibt ein cat Befehl den Cronjob (namens sudo_expiration_username) in den Ordner /etc/cron.daily/. Dieser vergleicht den Ablaufzeitpunkt der Sudo-Berechtigung mit dem aktuellen Datum. Sollte das aktuelle Datum aktueller sein, werden die Sudo-Berechtigung entfernt und der Cronjob mit Hilfe des find-Kommandos gelöscht. Mit chmod wird die Datei noch ausführbar gemacht.

chmod +x ~/set_sudo_expiration.sh

Das vollständige Skript sieht dann so aus:

#!/bin/bash

current_date=$(date +%s)

read -p "Benutzername: " username
while [[ ! $days =~ ^[0-9] ]]; do
    read -p "Anzahl der Tage: " days
done

days_in_seconds=$(($days*86400))
expiration_date=$(($current_date+$days_in_seconds))

/usr/bin/sudo bash -c "echo '$username ALL=(ALL:ALL) ALL' >> /etc/sudoers"

cat > /etc/cron.daily/sudo_expiration_$username <<EOF
current_date=\$(date +%s)
expiration_date=$expiration_date
remaining_in_seconds=\$(($expiration_date-$(date +%s)))
remaining_in_days=\$((remaining_in_seconds/60/60/24+1))
echo "Noch \$remaining_in_days Tage gültig"

if [[ \$current_date > \$expiration_date ]]; then
  sed -i /$username/Id /etc/sudoers
  find /etc/cron.daily/ -name sudo_expiration_$username -exec rm {} \;
fi
EOF

chmod +x /etc/cron.daily/sudo_expiration_$username

Achtet darauf, dass ihr das Skript selbst mit Administrator-Berechtigungen ausführt.
Möchte man die verbleibenden Anzahl an Tagen einsehen, so kann der Cronjob einfach ausgeführt werden:

/etc/cron.daily/sudo_expiration_urmel

Und als Ausgabe erscheint dann in etwa das hier:

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen