none
Credentials speichern und in Skript verwenden RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte ein Powershell Script schreiben in dem u. a. eine E-Mail mit Send-MailMessage verschickt wird. Wir haben einen Exchange der Authentifizierung benötigt. Das Skript soll später mal auf unterschiedlichsten Servern laufen.

    Nun gibt es ja für das cmdlet Send-MailMessage das Attribut -Credentials mit dem ich die Authentifizierung mitgeben kann. Da das Skript vollautomatisch laufen muss, müsste ich nun das Passwort im Klartext hinterlegen, was ich natürlich vermeiden möchte. Gibt es da irgendeine funktionierende Möglichkeit?

    Ich habe gefunden, wie man die Credentials in ein File speichern kann, so wie hier: http://bsonposh.com/archives/338
    Wenn ich aber die Credentials auf diese Art und Weise im cmdlet angebe bekomme ich die Meldung "The token supplied to the function is invalid".

    Für Hilfe bin ich dankbar.

    Montag, 15. Juli 2013 16:17

Antworten

  • Hallo,

    was Peter schreibt ist richtig, allerdings kannst Du die "einige Daten von R und A" auch selbst bauen, weil ConvertFrom-SecureString einen Parameter -key hat, mit dem Du diese Daten auch auf anderen Systemen nutzen kannst.

    Im folgenden Script wird die Variable $Key zufaellig erzeugt und in einer Datei abgelegt, zusaetzlich zum Kennwort und Usernamen.

    $pw = Read-Host "Kennwort" -AsSecureString
    $key = 1..32 | ForEach-Object {Get-Random -Maximum 256}
    $key -join ' ' | Out-File .\securePassword.txt
    ConvertFrom-SecureString $pw -key $key | Out-File -Append .\securePassword.txt
    [byte[]][char[]]"domain\user" -join "-" | Out-File -Append .\securePassword.txt

    Hiermit wird die Datei engelesen, das geht dann auf jedem System und die Credential gebaut.

    $data = Get-Content .\securePassword.txt
    $key = $data[0] -split ' '
    $SecureIn = ConvertTo-SecureString $data[1] -Key $key
    $data[2] = ($data[2] = $data[2] -split "-" | ForEach-Object {[char]([byte]$_)}) -join ""
    $Cred = New-Object System.Management.Automation.PSCredential $data[2], $SecureIn
    


    Das loest dann dein Problem, stellt aber trotzallem ein Sicherheitsrisiko da, d.h. wer Zugriff auf dein Script und die .\securePassword.txt hat, kann mit dem zweiten Teil des Codes das Ceredential bauen und damit Schabernack treiben, und das noch mehr geht sollte dem ein oder anderen bekannt sein, Stichwort Marshal-Funktion. :-)

    Beste Gruesse
    brima


    • Als Antwort markiert mhedv Dienstag, 16. Juli 2013 11:44
    Montag, 15. Juli 2013 18:23

Alle Antworten

  • Der Witz bei dieser Vorgehensweise ist der:

    Das Passwort wird anhand einiger Daten des Rechners "R" und des Users "A" verschlüsselt. Nur der User "A" der das Passwort abgelegt hat kann dieses auch wieder nutzen. Dein Script muss also auf demselben Rechner "R" laufen mit demselben User Account "A" !

    Ist das gegeben?

    http://winxperts4all.com/index.php?option=com_content&view=article&id=505:mails-mit-authentifizierung-in-einem-powershell-script-versenden&catid=99:powershell&Itemid=4


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Montag, 15. Juli 2013 17:00 vfbvfdbgfdg
    Montag, 15. Juli 2013 16:54
  • Hallo,

    was Peter schreibt ist richtig, allerdings kannst Du die "einige Daten von R und A" auch selbst bauen, weil ConvertFrom-SecureString einen Parameter -key hat, mit dem Du diese Daten auch auf anderen Systemen nutzen kannst.

    Im folgenden Script wird die Variable $Key zufaellig erzeugt und in einer Datei abgelegt, zusaetzlich zum Kennwort und Usernamen.

    $pw = Read-Host "Kennwort" -AsSecureString
    $key = 1..32 | ForEach-Object {Get-Random -Maximum 256}
    $key -join ' ' | Out-File .\securePassword.txt
    ConvertFrom-SecureString $pw -key $key | Out-File -Append .\securePassword.txt
    [byte[]][char[]]"domain\user" -join "-" | Out-File -Append .\securePassword.txt

    Hiermit wird die Datei engelesen, das geht dann auf jedem System und die Credential gebaut.

    $data = Get-Content .\securePassword.txt
    $key = $data[0] -split ' '
    $SecureIn = ConvertTo-SecureString $data[1] -Key $key
    $data[2] = ($data[2] = $data[2] -split "-" | ForEach-Object {[char]([byte]$_)}) -join ""
    $Cred = New-Object System.Management.Automation.PSCredential $data[2], $SecureIn
    


    Das loest dann dein Problem, stellt aber trotzallem ein Sicherheitsrisiko da, d.h. wer Zugriff auf dein Script und die .\securePassword.txt hat, kann mit dem zweiten Teil des Codes das Ceredential bauen und damit Schabernack treiben, und das noch mehr geht sollte dem ein oder anderen bekannt sein, Stichwort Marshal-Funktion. :-)

    Beste Gruesse
    brima


    • Als Antwort markiert mhedv Dienstag, 16. Juli 2013 11:44
    Montag, 15. Juli 2013 18:23
  • Hallo Brima !

    Ich habe diese Möglichkeit erst mal nicht geposted, da hier der Key mit abgespeichert werden muss.
    Der Key liegt dann im Klartext vor. Der Angreifer hat den Schlüssel zum entschlüsseln.
    Dies ist das gleich, als wenn man das Passwort im Klartext abspeichert. Das macht aus meiner Sicht wenig Sinn!


    Das einzige was dich dann noch schützt, sind Zugriffsberechtigungen auf die Datei, die so restriktiv wie möglich gesetzt werden sollten!


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Dienstag, 16. Juli 2013 05:54
  • Hallo Peter,

    deshalb habe ich auch auf die Sicherheitsproblematik aufmerksam gemacht.

    Ich habe hier bei uns Scritpe laufen, wo ich das so mache. Allerdings habe ich das Ganze dann codetechnisch noch mehr verschleiert. Man kann ja z.B.: einen Teil des Keys sonswo speichern, einen Teil im Script usw.,unverdaechtige Variablennamen verwenden usw., wie auch das Script in ein Exe wandeln, z.B.: mit PowerShellStudio, ...

    Das macht dann alles den Aufwand groesser an die Daten zu kommen, wie sicher das nun ist muss jeder fuer sich selbst entscheiden.

    Beste Gruesse
    brima

    Dienstag, 16. Juli 2013 07:05
  • Hi!

    Das Script wird auf auf unterschiedlichen Rechnern ausgeführt, also auch auf anderen, als das Kennwort erstellt wrude. Eine Verschleierung wäre mir schon deutlich lieber als das Kennwort im Klartext. Dass es dann doch missbrauchbar ist, ist nicht ganz so schlimm. Der Account hat keine besonderen Rechte und dort wo das Script liegt kommt normal auch kein nicht-admin hin.

    Ich habe das wie von dir vorgeschlagen versucht, leider stoße ich immer auf den folgenden Fehler:

    ConvertTo-SecureString : key ist ungültig. Die gültige key-Länge muss 128 Bits, 192 Bits oder 256 Bits betragen. ...
    + $SecureIn = ConvertTo-SecureString $Data[1] -Key $Key

    Hast du da eine Idee? Ich habe bereits versucht den maximum Wert bei Get-Random auf 9 zu begrenzen, damit die erste Zeile nur 32 Zeichen hat. Hat aber auch nicht geholfen. Hast du noch eine Idee?

    Danke,
    Michael

    Dienstag, 16. Juli 2013 07:54
  • Der Code von Brima Funktioniert bei mir!

    Nimm mal diesen Code in eine neues Script OHNE Änderungen!

    $PasswordFile = "$env:temp\securePassword.txt"
    
    
    $pw = Read-Host "Kennwort" -AsSecureString
    $key = 1..32 | ForEach-Object {Get-Random -Maximum 256}
    $key -join ' ' | Out-File $PasswordFile
    ConvertFrom-SecureString $pw -key $key | Out-File -Append $PasswordFile
    [byte[]][char[]]"domain\user" -join "-" | Out-File -Append $PasswordFile
    
    # anzeigen der Passwort Datei
    notepad $PasswordFile
    
    #######################
    
    $data = Get-Content $PasswordFile
    $key = $data[0] -split ' '
    $SecureIn = ConvertTo-SecureString $data[1] -Key $key
    $data[2] = ($data[2] = $data[2] -split "-" | ForEach-Object {[char]([byte]$_)}) -join ""
    $Cred = New-Object System.Management.Automation.PSCredential $data[2], $SecureIn
    
    # anzeigen der eingelesenen Credentials
    $Cred.GetNetworkCredential()


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Dienstag, 16. Juli 2013 11:22
  • Hallo,

    das sieht so aus als ob die Datei mit den Daten Key, Kennwort usw. nicht korrect ist. Die sollte so aussehen, zu sehen immer nur der Anfang, 3 Zeilen, wo sic 

    93 142 94 240 ...
    76492d1116743f ...
    100-111-109-97 ...

    Also mit

    $Data = Get-Content .\securePassword.txt

    kannst du die Datei einlesen.

    In der ersten Zeile muss dann der Key stehen 32 durch Blank getrennte nummerische Werte...

    Also einfach nach dem einlesen mal folgendes eingeben:

    ($data[0] -split ' ').count

    Das Ergebnis muss 32 sein.

    Beste Gruesse
    brima

    Dienstag, 16. Juli 2013 11:28
  • Vielen Dank euch beiden, jetzt funktioniert es. Ich habe tatsächlich das Leerzeichen in der ersten Zeile vergessen (also -join '' und -split '' anstatt -join ' ' und -split ' ').

    Jetzt funktionert es!

    Dienstag, 16. Juli 2013 11:44