Как исправить безопасность в сценариях WinSCP SFTP в PowerShell с помощью жестко заданных паролей - PullRequest
1 голос
/ 11 марта 2020

Поэтому моя организация поручила мне устранить некоторые проблемы безопасности в отношении некоторых автоматизированных сценариев, которые имеют жестко запрограммированные пароли в сценариях, которые выполняются как автоматизированные задачи. Одна из таких задач содержит сценарии SFTP, которые экспортируют и импортируют файлы в и из них с паролем, именем хоста, учетными данными, портом и всем, что отображается в сценарии. В результате я хотел бы сначала узнать о том, как вызывать такие учетные данные в отдельном файле, который можно скрыть, а два - о шифровании и его защите позже. Но моя главная задача - убрать их из сценария на случай, если traffi c будет перехвачен. Вот как выглядит код PowerShell:

param (
    $localPath = 'E:\FTP\SchooLinks\course_requests.csv',
    $remotePath = '/schoolinks_exports/course_planning/course_requests.csv'
)

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = "<domain_name>"
        UserName = "<username>"
        Password = "<password>"
        SshHostKeyFingerprint = "<fingerprint>"
    }

    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Upload files
        $transferOptions = New-Object WinSCP.TransferOptions
        $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

        $transferResult =
            $session.GetFiles($remotePath, $localPath, $False, $transferOptions)

        # Throw on any error
        $transferResult.Check()

        # Print results
        foreach ($transfer in $transferResult.Transfers)
        {
            Write-Host "Download of $($transfer.FileName) succeeded"
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

Другой, который у нас выглядит, выглядит так:

param (
    $localPath = 'E:\FTP\TalentEd\SkywardApplicantExportSQL.txt',
    $remotePath = '/SkywardApplicantExportSQL.txt'
)

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = "<domain>"
        UserName = "<username>"
        Password = "<password>"
        SshHostKeyFingerprint = "<sha_fingerprint>"
    }

    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Upload files
        $transferOptions = New-Object WinSCP.TransferOptions
        $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

        $transferResult =
            $session.GetFiles($remotePath, $localPath, $False, $transferOptions)

        # Throw on any error
        $transferResult.Check()

        # Print results
        foreach ($transfer in $transferResult.Transfers)
        {
            Write-Host "Download of $($transfer.FileName) succeeded"
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

Я знаком с Python и json и вызывающими вещами в файле json, похожем на следующее:

import json
with open('secrets.json','r') as f:
      config = json.load(f)

и вызов его с помощью (config['object']['nested_element']) в сценарии Python. Я хотел бы сделать что-то подобное с PowerShell, однако у меня очень ограниченные знания в PowerShell.

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Yeppers, конечно, никогда не хранят кредиты в виде открытого текста в файлах.

Существует несколько способов хранения учетных данных для использования. Защищенный файл (xml, et c ..), реестр или Windows Диспетчер учетных данных, и это хорошо задокументировано на сайтах Microsoft, а также во многих статьях по всему Интернету и с помощью вопросов и ответов в StackOverflow.

Просто найдите 'надежно храните учетные данные PowerShell'

Примеры результатов ...

Работа с паролями, защищенные строки и учетные данные в Windows PowerShell

Как запустить сценарий PowerShell для нескольких доменов Active Directory с разными учетными данными

Доступ к Windows Учетные данные Диспетчер из PowerShell

Сохранение зашифрованных паролей в реестре для PowerShell

... и / или модулей через MS powershellgallery.com, устанавливаемых напрямую из вашей среды PowerShell.

Find-Module -Name '*cred*' | 
Format-Table -AutoSize
<#
# Results

Version        Name                            Repository Description                                                                                          
-------        ----                            ---------- -----------                                                                                          
2.0            CredentialManager               PSGallery  Provides access to credentials in the Windows Credential Manager                                     
2.0.168        VcRedist                        PSGallery  A module for lifecycle management of the Microsoft Visual C++ Redistributables. Downloads the supp...
1.3.0.0        xCredSSP                        PSGallery  Module with DSC Resources for WSMan CredSSP.                                                         
1.1            VPNCredentialsHelper            PSGallery  A simple module to set the username and password for a VPN connection through PowerShell. Huge tha...
1.0.11         pscredentialmanager             PSGallery  This module allows management and automation of Windows cached credentials.                          
4.5            BetterCredentials               PSGallery  A (compatible) major upgrade for Get-Credential, including support for storing credentials in Wind...
1.0.4          WindowsCredential               PSGallery  Management module for Windows Credential Store.                                                      
... 
#>
1 голос
/ 13 марта 2020

Огромное спасибо @postanote и @Martin Prikryl, я смог понять это. В основном вы можете использовать файл config. xml с содержимым, подобным следующему:

<Configuration>
  <localPath>insert_local_file_path</localPath>
  <remotePath>insert_remote_file_path</remotePath>
  <Protocol>[WinSCP.Protocol]::Sftp</Protocol>
  <HostName>insert_hostname</HostName>
  <UserName>username</UserName>
  <Password>mypassword</Password>
  <SshHostKeyFingerPrint>fingerprint</SshHostKeyFingerPrint>
</Configuration>

Здесь вы можете использовать следующее в начале вашего шаблона:

# Read XML configuration file
[xml]$config = Get-Content ".\config.xml"

param (
    $localPath = $config.Configuration.localPath
    $remotePath = $config.Configuration.remotePath
)

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = $config.Configuration.Protocol
        HostName = $config.Configuration.HostName
        UserName = $config.Configuration.UserName
        Password = $config.Configuration.Password 
        SshHostKeyFingerprint = $config.Configuration.SshHostKeyFingerprint
    }

I есть больше шаблонов SFTP, которые люди могут использовать на
https://github.com/Richard-Barrett/ITDataServicesInfra/tree/master/SFTP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...