dieseyer
Goto Top

Aufgabenplanung: Sicherheit beim Starten von Skripten

Hallo zusammen,

werden Skripte über die Aufgabenplanung (Schedule Tasks) gestartet, besteht die Gefahr, dass sich jemand über das Verändern des Skripts Rechte erschleicht oder Schaden anrichtet. Um dies zu verhindern, kann man auf signierte Skripte setzen . . . was aber nicht so einfach ist.

Mein Vorschlag: Von dem Skript einen MD5-Hash ermitteln und in der Aufgabenplanung vor der Skriptausführung den Hash überprüfen.

Also als Erstes den MD5-Hash ermitteln:
$F='\\pc022.dieseyer.net\c$\Entwicklung\Komplett\backup-wim.ps1'  
Get-FileHash $F -a MD5
Das Ergebnis:
Algorithm Hash                             Path
--------- ----                             ----
MD5       287E1ABAAF0B6EA7308905D465350B70 \\pc022.dieseyer.net\c$\Entwi...
Wichtig: Im Hash ist auch der Pfad zur Datei enthalten. Ändert man also den Pfad zur Datei, muss man einen neuen Hash ermitteln.

Nun in der 'Aufgabenplanung' eine 'Aufgabe erstellen. . .' und alles wie gewünscht ausfüllen.

In 'Aktionen' wird in 'Programm/Skript:' nur 'powershell' eingtragen (ohne [Durchsuchen] reicht).

In das Feld 'Argumente hinzufügen:' folgenden Code einfügen, aber als EINZEILER!

Der EINZEILER:
-command "&{ $H='287E1ABAAF0B6EA7308905D465350B70';$D='\\pc022.dieseyer.net\c$\Entwicklung\Komplett\';$F=$D+'backup-wim.ps1';$L=$D+'backup-wim_Task.log';$T=$F+' .. '+(Get-Date);if ( [string]( Get-FileHash $F -a MD5 ).Hash -eq $H ){'ok:   '+$T | out-file  -a $L; & $F}else{'-ok: '+$T | out-file  -a $L} }"  

Zur Erklärung ist der Einzeiler strukturiert besser lesbar:
-command "&  
{
  $H='287E1ABAAF0B6EA7308905D465350B70';  
  $D='\\pc022.dieseyer.net\c$\Entwicklung\Komplett\';  
  $F=$D+'backup-wim.ps1';  
  $L=$D+'backup-wim_Task.log';  
  $T=$F+' .. '+(Get-Date);  
  if ( [string]( Get-FileHash $F -a MD5 ).Hash -eq $H )
  {
   'ok:   '+$T | out-file  -a $L; & $F  
  }else{
   '-ok: '+$T | out-file  -a $L  
  } 
}"  

Die Parameter für die powershell.exe sind mit " (Anführungszeichen) eingeschlossen. Dadurch kann man im Parameter nicht einfach mit weiteren " arbeiten.
- command  "&{    }"  

Die Variablen:
$H erhält den Hash-Wert, den wir zuerst errechnet lassen haben
$D ist das Verzeichnis, in dem das Skript liegt
$F ist der komplette Pfad zum Skript
$L ist der komplette Pfad zur .log - Datei (Nur mit Logging ist immer nachvollziehvar, was passiert ist.)
$T ist ein Teil des Textes für die .log - Datei

Was passiert?
In dieser Zeile wird der MD5-Hash der Datei zur Laufzeit ermittelt und mit dem in $H verglichen:
if ( [string]( Get-FileHash $F -a MD5 ).Hash -eq $H )

Bei Übereinstimmung der Hash-Werte folgt dieser Abschnitt:
   'ok:   '+$T | out-file  -a $L; & $F  
Zuerst wird der Logging-Text zusammengebaut und dann in die .log - Datei geschrieben ( 'ok: '+$T | out-file -a $L ), bevor das Skript startet ( & $F ).

Bei NICHT-Übereinstimmung des Hash-Wertes ( also nach } else { ) folgt statt dessen dieser Abschnitt:
   '-ok:   '+$T | out-file  -a $L  
Auch hier wird zuerst der Logging-Text zusammengebaut und dann in .log - Datei geschrieben ( '-ok: '+$T | out-file -a $L ), aber das Skript NICHT gestartet.

Beim Speichern der 'Geplanten Aufgabe' muss das Passwort hinterlegt werden. Deshalb im Reiter 'Allgemein' den Punkt 'Unabhängig von der Nutzeranmeldung ausführen' auswählen. Dann kommt beim Speichern mit [OK] auch die Passwortabfrage. Dadurch kann keine Änderung an der 'Aufgabe' ohne Wiederholung des Passwortes erfolgen.

Zum Test lässt sich in der 'Aufgabenplanungsbibliothek' mit der rechten Maustaste auf die Aufgabe 'Ausführen' auswählen und das Skript so unabhängig vom eingestellten Zeitplan starten. Mit [F5] ist der Status aktualisiert.

Info: Wird das Skript geändert, muss ein neuer Hash gebildet und in die 'Geplante Aufgabe' eingetragen werden. Um das zu vereinfachen, ist der Hash in eine Variable am Anfang des Einzeilers eingetragen.

Warum einen MD5-Hash? Jedes andere Hash-Verfahren ist auch verwendbar, aber der MD5-Hash ist der kürzeste.

Content-ID: 42755057410

Url: https://administrator.de/contentid/42755057410

Ausgedruckt am: 21.11.2024 um 09:11 Uhr

DerWoWusste
DerWoWusste 12.03.2024 aktualisiert um 15:08:46 Uhr
Goto Top
Moin.

Wenn jemand einen Task einrichtet, dann darf das Auszuführende von nicht-Admins nicht veränderbar sein.
Mehr ist dabei nicht nötig. Man legt es also auf ein Netzwerkshare oder, wenn es sein muss, lokal in ein Verzeichnis, wo Nutzer nur Leserechte haben. Weitere Schutzmaßnahmen sind dann unnötig.
Globetrotter
Globetrotter 12.03.2024 um 20:09:52 Uhr
Goto Top
Hi @all...
.. oder nur selbstsignierte PSScripte innerhalb der Domain akzeptieren...

Gruss Globe!
Dani
Dani 13.03.2024 um 19:24:41 Uhr
Goto Top
Moin,
.. oder nur selbstsignierte PSScripte innerhalb der Domain akzeptieren...
das lässt sich problemlos umgehen, in dem du vorher einfach die Ausführungsrichtlinie (Set-ExecutionPolicy) änderst, oder?

Von dem Skript einen MD5-Hash ermitteln
Warum MD5. Ist doch ebenfalls nicht mehr sicher.


Gruß,
Dani
tech-flare
tech-flare 14.03.2024 um 18:22:42 Uhr
Goto Top
Moin,
Hi
.. oder nur selbstsignierte PSScripte innerhalb der Domain akzeptieren...
das lässt sich problemlos umgehen, in dem du vorher einfach die Ausführungsrichtlinie (Set-ExecutionPolicy) änderst, oder?
Dies ist aber nicht von einem "normalen" User möglich, wenn diese per GPO vorgegeben ist.
Gruß