SFTPを設定するためのPowerShellツールの作成方法
Windows を実行している複数のマシンを使用する場合、さまざまなプロトコルを使用して共有リソースにアクセスする必要が生じることがあります。Windows マシンでファイル共有を作成する場合、通常は SMB プロトコルが使用されます。しかし、Windows 以外のマシンでは、NFS、FTP、SFTP、FTPS、SCP などのプロトコルを使用してファイルを共有することができます。 たとえば、グラフィカルインターフェイスのない Windows Server で PowerShell のみを使用している場合、SFTP 共有に初めて接続するのは難しく思えるかもしれません。このブログ記事では、PowerShell を使用して Windows で SFTP を利用する方法を説明します。
SFTPとは何ですか?
SFTPは、SSH File Transfer Protocol(SSHファイル転送プロトコル)またはSecure File Transfer Protocol(セキュア・ファイル転送プロトコル)の略称です。SFTPは、従来のファイル転送プロトコル(FTP)と同様の機能を持ちながら、より安全な代替手段となります。SFTPはOSIモデルのアプリケーション層(レイヤー7)で動作し、SSH接続を利用します。特に、通常はコマンドライン用のSFTPクライアントが組み込まれているLinuxマシンで広く利用されています。 Windowsを使用する場合は、GUIを備えSFTP以外にも対応しているWinSCPなどの無料SSHクライアントをインストールするか、コマンドラインを使用する必要がある場合はPowerShellツールを設定してください。WindowsおよびPowerShellはSFTPをネイティブでサポートしていないため、追加のコンポーネントをインストールする必要があります。
SSH接続を使用する場合、ネットワーク経由のデータ転送は暗号化され、接続は安全です。これは、攻撃者によってデータが傍受される可能性がある従来の非暗号化FTPプロトコルとは異なります。SSHは認証に使用され、Linuxユーザーの認証情報があれば、コマンドラインSFTPクライアントまたはGUIクライアントから認証を通過した後、対象のLinuxマシン上のファイルにアクセスできます。 また、リモートLinuxマシンとローカルのLinuxまたはWindowsマシンとの間でファイルをコピーすることも可能です。LinuxでのSFTPサーバーの設定は難しくありません。SSHサーバーをインストールし、ユーザーを作成し、ユーザーやファイル/ディレクトリに必要な権限を付与するだけです。
SFTPとFTPSを混同しないでください。これら2つのプロトコルは同様の目的で使用されます。 ただし、SFTPは接続に1つのポート番号を使用するのに対し、FTPSは制御チャネルとデータチャネルに複数のポート番号を使用します(ファイアウォールなどのセキュリティ面から見て、設定がより複雑になる可能性があります)。FTPSは、SSL(Secure Socket Layer)を使用したFTPです。このブログ記事では、SFTPサーバーの設定方法については詳しく説明しません。Hyper-V上でのLinux(SSHサーバーを含む)のインストールと設定については、 こちら.
Posh-SSH モジュールのインストール
PowerShell で SFTP や SCP を使用してリモートマシン上のファイル操作(ファイルのコピーや削除など)を行うには、PowerShell に Posh-SSH モジュールをインストールする必要があります。このモジュールをインストールすると、SSH セッションを使用してリモートコンピュータ上でリモートコマンドを実行することも可能になります。 Posh-SSH をインストールして使用するには、PowerShell 3.0 および .NET Framework 4.0 が必要です。したがって、このモジュールは Windows 8 以降のバージョンにインストールできます。また、Windows 7 SP1 では、PowerShell と .NET Framework を手動で更新することも可能です。次のコマンドを実行して、PowerShell SFTP モジュール (Posh-SSH) をインストールしてください:
install-module posh-ssh
別の方法として、次のコマンドを使用してPowerShell用のPosh-SSHモジュールをインストールすることもできます:
iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")
上記のコマンドでPosh-SSHをインストールするには、インターネット接続が必要です。私の場合、PowerShellにPosh-SSHモジュールをインストール済みですので、次の設定手順に進むことができます。
PowerShell でのリモートホストへの接続
このブログ記事では、同じネットワークに接続されたローカルのWindowsマシンとリモートのLinuxマシンという環境を使用しています:
- 192.168.101.210 Windows 10 バージョン 20H2 がインストールされたローカルの Windows マシンです
- 192.168.101.209 SSH(SFTP)サーバーが稼働しているリモートLinuxマシンです
- ユーザー1 はLinuxユーザーの名前です
以下のIPアドレスは、この例で使用しているものです。実際のIPアドレスと認証情報を、適切なコマンドや設定ファイルに入力してください。
Windows用の無料SFTPクライアントであるWinSCPを使用して、LinuxサーバーにSFTPで接続し、SFTP共有を確認してみましょう。SFTPサーバーへの接続は簡単です。 接続するには、接続先のホストのIPアドレス、ポート番号(デフォルトはTCP 22ですが、SSHサーバーをカスタマイズして別のポート番号を使用するように設定することも可能です)、ユーザー名、およびパスワードを入力します。SFTPプロトコルを選択することを忘れないでください。
私の環境ではSFTP接続は正常に動作しています。共有フォルダに2つのファイルをコピーしました(ファイルの保存場所は /home/user1/shared/ (リモートにあるLinuxマシン上で)。ここでは、Windowsから共有フォルダに接続する方法と、PowerShellのPosh-SSHでSFTPを使用する方法について見ていきましょう。
SFTP 経由でファイルを操作するには、まずセッションを確立する必要があります。そのためには、PowerShell で次のコマンドを実行してください:
New-SFTPSession -Computername 192.168.101.209
コマンドを実行すると、認証ウィンドウが表示されます。SFTP経由でアクセスする必要があるファイルが保存されているリモートLinuxマシンにアクセスするために、ユーザー名とパスワードを入力してください。正しい認証情報を入力すると、SFTPセッション番号、リモートホストのIPアドレス、および接続ステータスに関する情報がPowerShellに出力されます。セッションが確立されると、そのセッションにインデックス番号が割り当てられます。
PowerShell コマンドの使用法に関する簡単なヘルプ情報を表示するには、いつでもヘルプ コマンドに適切な引数を指定して入力できます:
help New-SFTPSession
利用可能なすべてのposh PowerShellコマンドを一覧表示する:
Get-Command -Module Posh-SSH
または
Get-command -Name * -module *posh-ssh
以下は、リモートホストでコマンドを実行できるSSHセッションを作成する方法です。例えば、ディレクトリ内のファイル一覧を表示する場合などです:
Import-Module Posh-SSH
$SSHSession = New-SSHSession -ComputerName 192.168.101.209 -Credential $(Get-Credential) -Verbose
$SSH = $SSHSession | New-SSHShellStream
Invoke-SSHCommand -Index 0 -Command "ls -l /home/user1/shared"
PowerShell スクリプトの作成
SFTP リソースを扱う際に PowerShell で実行できる基本的な操作を確認するためのテストスクリプトを作成してみましょう。これは SFTP スクリプトではなく、SFTP を操作するための PowerShell スクリプトです。このテストスクリプトでは、リモートにある Linux マシンからローカルの Windows マシンへ、.NET Framework のインストーラーファイルをコピーします。
作成する test-PS.ps1 以下の内容が含まれたスクリプトファイル。
#Creating a folder to store files downloaded from the SFTP share
New-item -itemtype directory -force -path c:tempps
#Setting credentials for the user account
$password = ConvertTo-SecureString "My_Password000" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("user1", $password)
#Establishing an SFTP session
$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds
#Downloading the .NET installer file by using the established SFTP session
Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps
WindowsマシンでPowerShellを開き、このテストスクリプトが保存されているフォルダに移動して、スクリプトを実行してください
.test-PS.ps1
その NetFrameworkNDP462.exe ファイルは次の場所からコピーする必要があります /home/user1/shared/ (リモートにあるLinuxマシン上で) C:tempps (ローカルのWindowsマシン上で)。下のスクリーンショットにあるように、私の環境ではファイルのコピーは正常に完了しました。
SFTP リソース内のディレクトリにあるファイルを一覧表示するには、次のような内容の PowerShell スクリプトを作成します。
$passwordTest = "Your_Password000"
$securePasswordTest = ConvertTo-SecureString $passwordTest -AsPlainText -Force
$credentialsTest = New-Object System.Management.Automation.PSCredential ("user1", $securePasswordTest)
$sessionTest = New-SFTPSession -ComputerName 192.168.101.209 -Credential $credentialsTest -AcceptKey
$sourceTest = "/home/user1/shared/"
$destinationTest= "c:tempps"
Get-SFTPChildItem -Recursive $sessionTest -Path $sourceTest | ForEach-Object{
if ($_.Fullname -like '*.csv')
{
Get-SFTPFile $sessionTest -RemoteFile $_.FullName -LocalPath $destinationTest -Overwrite
}
write-output $_.FullName
}
Remove-SFTPSession $sessionTest -Verbose
場所:
Your_Password000 は、SSH経由でSFTP共有に接続するために使用されるユーザーアカウントのパスワードです;
ユーザー1 はユーザーの名前です;
192.168.101.209 これは、SFTP経由でファイルにアクセスするために接続するリモートホストのIPアドレスです。
スクリプトを次のように保存します list-files.ps1 このスクリプトファイルが保存されているフォルダーから、ローカルマシンのPowerShellでこのスクリプトを実行してください。
.list-files.ps1
次の点に注意してください -Recursive テストスクリプトで定義されたパラメータ。以下のスクリーンショットでは、 -Recursive このパラメータがある場合と、ない場合。
上記の例のようなスクリプトを実行する際の欠点の一つは、認証情報がスクリプトのプレーンテキストとして保存されるため、セキュリティ上安全ではないという点です。スクリプトを開くことができるユーザー(読み取り専用権限であっても)は、パスワードを確認し、このパスワードを使用して不正アクセスを行う可能性があります。
セキュリティレベルを向上させ、パスワードを暗号化された状態でファイルに保存する方法があります。Windows Data Protection API を使用してパスワードを暗号化することで、そのパスワードファイルを作成したユーザーアカウントおよびコンピュータからのみアクセスできるようになります。
(get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"
そうすると、パスワードは暗号化された状態でテキストファイルに保存されます。万が一、誰かがこのファイルの内容を閲覧しても、パスワードが平文で表示されることはありません。
パスワードの入力が必要な場合は、暗号化されたパスワードが保存されているファイルを指定してください(C:temppassword.txt (当方のケースでは)。
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential("user1",$password)
このパスワードの定義方法は、より安全です。パスワードを定義したスクリプトを修正することができます。テキストエディタでスクリプトを開く代わりに、 ps1 ファイルを選択し、コンテキストメニューからクリックします Edit.
Windows PowerShell ISE が開きます。これは Windows のネイティブツールであり、利便性を高めるために構文を色分け表示し、右ペインには利用可能な PowerShell コマンドが表示されます。
テストスクリプト内のコマンドは、以下の通りです:
New-item -itemtype directory -force -path c:tempps
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$creds = $credential = New-Object System.Management.Automation.PsCredential("user1",$password)
$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds
Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps
スクリプトを再度変更し、Windows マシン上でダウンロードしたインストーラーファイルを実行するように設定できます。.NET Framework をサイレントモードでインストールするコマンド(インストーラーファイルがあるディレクトリから実行)は次のとおりです:
.NetFrameworkNDP462.exe /q /norestart
ファイル名が異なる場合は、インストールファイルの名前を入力してください。
スクリプトの最後に次の行を追加してください:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
インストール完了後にインストールファイルを削除したい場合は、スクリプトの最後に次の行を追加することを検討してください:
remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force
PowerShell と Posh-SSH を使用すると、SFTP プロトコルを利用してネットワーク内のホスト間でファイルをコピーし、PowerShell での操作を自動化できます。多数のコンピュータにソフトウェアを一括インストールする必要がある場合、ファイルをダウンロードして実行するスクリプトを作成することで、時間を節約できます。
結論
LinuxマシンにSSHサーバーが設定されていれば、SFTPを介してLinuxマシンとの間でファイルをコピーできるようになりました。Posh-SSHは、リモートSFTPサーバーにアクセスしてSFTPの自動化タスクを実行したいWindowsマシン上でSFTPを使用するために必要なPowerShellモジュールです。PowerShellとSFTPは、マネージドサービスプロバイダーや組織内のシステム管理者によって利用できます。
PowerShellは、Hyper-V仮想マシンやVMware仮想マシンの管理によく使用されます( PowerCLI)。Hyper-V 仮想マシンのバックアップを忘れないでください。PowerShell がコマンドの実行を自動化するために使われるのと同様に、 NAKIVO Backup & Replication VMのバックアップを自動化し、その他多くのデータ保護機能を提供します。さらに、本製品はマルチテナントモードでのインストールをサポートしており、マネージドサービスプロバイダーにとって特に有用です。無料版をダウンロード NAKIVO Backup & Replication 今すぐ仮想マシンと物理マシンの保護を始めましょう。










