SFTPを設定するためのPowerShellツールの作成方法
Windows を実行している複数のマシンを使用する場合、さまざまなプロトコルを使用して共有リソースにアクセスする必要が生じることがあります。Windows マシン上でファイル共有を作成する場合、通常は SMB プロトコルが使用されます。ただし、Windows 以外のマシンでは、NFS、FTP、SFTP、FTPS、SCP などのプロトコルを使用してファイルを共有することができます。 たとえば、グラフィカルインターフェイスがない Windows Server で PowerShell のみを使用している場合、SFTP 共有に初めて接続するのは難しく感じられるかもしれません。このブログ記事では、PowerShell を使用して Windows で SFTP を利用する方法を説明します。
SFTPとは何ですか?
SFTP は、SSH File Transfer Protocol または 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マシンです
- user1 は、Linuxユーザーの名前です
これらのIPアドレスは、私の例で使用されているものです。適切なコマンドや設定ファイルには、ご自身のIPアドレスと認証情報を入力してください。
Windows用の無料SFTPクライアントであるWinSCPを使用して、SFTP経由でLinuxサーバーに接続し、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”コマンドを入力できます。
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共有に接続するために使用されるユーザーアカウントのパスワードです。
user1 はユーザーの名前です;
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 は、Windows マシンからリモートの SFTP サーバーにアクセスし、SFTP の自動化タスクを実行するために必要な PowerShell モジュールです。PowerShell と SFTP は、マネージドサービスプロバイダーや組織内のシステム管理者によって利用できます。
PowerShell は、Hyper-V 仮想マシンや VMware 仮想マシンの管理によく使用されます( PowerCLI). Hyper-V 仮想マシンのバックアップを忘れずに。PowerShell がコマンドの実行を自動化するのに使われるのと同様に、 NAKIVO Backup & Replication VMのバックアップを自動化し、その他にも多くのデータ保護機能を提供します。さらに、本製品はマルチテナントモードでのインストールをサポートしており、これはマネージドサービスプロバイダーにとって特に有用です。無料版の NAKIVO Backup & Replication 今すぐ、仮想マシンと物理マシンの保護を始めましょう。










