Also,
Mir ist aufgefallen, dass bei Manjaro, wenn nur ein Benutzer vorhanden ist, das Tippen reboot
ohnesudo, schlägt einfach fehl und fragt nach dem Sudo-Passwort, während auf einem Ubuntu-Server bei der Eingabe dieses nicht nach dem Sudo-Passwort gefragt wird und das System erfolgreich neu gestartet wird. Meine Frage ist, wie kann ich es so einrichten, dass bei der EingabeNeustart/Herunterfahren/Anhalten, Ubuntu fragt immer nach dem Sudo-Passwort, auch wenn derzeit nur ein Benutzer angemeldet ist? Kann das mit Polkit zu tun haben? Wenn ja, wie kann ich das ändern?
Der Grund für meine Frage ist, dass ich sicher sein möchte, dass niemand, der physischen Zugriff auf meinen Server hat, einen Neustart durchführen kann (außer natürlich durch Herausziehen des Netzkabels, was etwas anderes ist, lol).
Danke
Antwort1
Eine Möglichkeit, wie ich das gemacht habe, istMaskierung der systemd
Ziele, wodurch die Ausführung bestimmter Aktionen verhindert wird, unabhängig davon, wer den Befehl eingibt. Um beispielsweise das Herunterfahren des Systems zu verhindern, können Sie Folgendes tun:
sudo systemctl mask poweroff.target
sudo shutdown
Jetzt schlägt jeder Versuch, das System über oder herunterzufahren, sudo systemctl shutdown
stillschweigend fehl. Dasselbe kann mit Anhalten und Neustarts passieren:
sudo systemctl mask runlevel0.target
sudo systemctl mask halt.target
sudo systemctl mask runlevel6.target
sudo systemctl mask reboot.target
Notiz: runlevel6
ist gleichwertig mit reboot
, und runlevel0
ist gleichwertig mit shutdown
und halt
.
Um dies rückgängig zu machen, können diese Befehle erneut ausgeführt werden, jedoch mit unmask
:
sudo systemctl unmask runlevel0.target
sudo systemctl unmask shutdown.target
sudo systemctl unmask halt.target
sudo systemctl unmask runlevel6.target
sudo systemctl unmask reboot.target
Mit diesem Wissen im Hinterkopf können Sie nun ein Skript schreiben, das ausführbar istnurfür Menschen mit sudo
Zugang:
#!/bin/bash
## Determine the operation to run (mask | unmask)
op=mask
if [[ $1 = unmask ]]
then
op=unmask
fi
## Set the targets we want to mask
declare -a arr=("runlevel0" "runlevel6" "shutdown" "reboot" "halt")
## Run the commands
for i in "${arr[@]}"
do
cmd=$( sudo systemctl $op $i.target )
echo "$i :: $op"
done
WARNUNG:Dieser Code funktioniert, ist aber ziemlich grob. Überprüfen Sie ihn unbedingt mit einer VM oder an einem „sicheren“ Ort, bevor Sie ihn auf einer Produktionsmaschine ausführen.
Jetzt können Sie dieses Skript ausführen, um die Ziele nach dem Booten zu maskieren und das Herunterfahren/Neustarten wie folgt durchzuführen:
sudo ~./setTargetMask.sh unmask
sudo shutdown now
Notiz:Sie können dem Skript jeden beliebigen Namen geben.