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-Key: 42755057410

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

Printed on: April 22, 2024 at 16:04 o'clock

Member: DerWoWusste
DerWoWusste Mar 12, 2024 updated at 14:08:46 (UTC)
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.
Member: Globetrotter
Globetrotter Mar 12, 2024 at 19:09:52 (UTC)
Goto Top
Hi @all...
.. oder nur selbstsignierte PSScripte innerhalb der Domain akzeptieren...

Gruss Globe!
Member: Dani
Dani Mar 13, 2024 at 18:24:41 (UTC)
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
Member: tech-flare
tech-flare Mar 14, 2024 at 17:22:42 (UTC)
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ß