概要
PowerShell リモート処理では通常、接続交渉とデータ転送に WinRM が使用されます。 SSH が Linux および Windows のプラットフォームで利用可能になり、実際のマルチプラットフォームの PowerShell リモート処理を実行できます。
WinRM は PowerShell リモート処理セッションに堅牢なホスティング モデルを提供します。 SSH ベースのリモート処理では現在、リモート エンドポイント構成および JEA (Just Enough Administration) はサポートされていません。
SSH リモート処理を使用すると、Windows コンピューターと Linux コンピューター間で基本的な PowerShell セッションリモート処理を実行できます。 SSH リモート処理で、SSH サブシステムとしてターゲット コンピューター上に PowerShell ホスティング プロセスを作成します。 最終的には、エンドポイント構成と JEA をサポートするために、WinRM と同様の一般的なホスティング モデルを実装します。
New-PSSession
、Enter-PSSession
、およびInvoke-Command
コマンドレットに、この新しいリモート処理接続をサポートするための新しいパラメーターが設定されました。
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
リモート セッションを作成するには、 HostName パラメーターを使用してターゲット コンピューターを指定し、ユーザー名に UserName を指定します。 コマンドレットを対話形式で実行すると、パスワードの入力を求められます。 KeyFilePath パラメーターと共に秘密キー ファイルを使用して SSH キー認証を使用することもできます。 SSH 認証のキーの作成はプラットフォームによって異なります。
一般的なセットアップ情報
PowerShell 6 以降、SSH をすべてのコンピューターにインストールする必要があります。 コンピューターとの間でリモート接続できるように、SSH クライアント (ssh.exe
) とサーバー (sshd.exe
) の両方をインストールします。 Windows 用 OpenSSH は、Windows 10 ビルド 1809 および Windows Server 2019 で使用できるようになりました。 詳細については、「 OpenSSH を使用した Windows の管理」を参照してください。 Linux の場合は、SSH (sshd サーバーを含む) をインストールします。これは、お使いのプラットフォームに適しています。 SSH リモート処理機能を取得するには、GitHub から PowerShell をインストールする必要もあります。
リモート コンピューターで PowerShell プロセスをホストする SSH サブシステムを作成するように SSH サーバーを構成する必要があります。 また、 パスワード または キーベースの認証を 有効にする必要があります。
Windows コンピューターに SSH サービスをインストールする
最新バージョンの PowerShell をインストールします。 詳細については、「 Windows への PowerShell のインストール」を参照してください。
New-PSSession
パラメーター セットを一覧表示することで、PowerShell で SSH リモート処理がサポートされていることを確認できます。 SSH で始まるパラメーター セット名があることがわかります。 これらのパラメーター セットには 、SSH パラメーターが含まれます。(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
最新の Win32 OpenSSH をインストールします。 インストール手順については、「 OpenSSH の概要」を参照してください。
注
PowerShell を OpenSSH の既定のシェルとして設定する場合は、「 OpenSSH 用の Windows の構成」を参照してください。
$Env:ProgramData\ssh
にあるsshd_config
ファイルを編集します。パスワード認証が有効になっていることを確認します。
PasswordAuthentication yes
リモート コンピューターで PowerShell プロセスをホストする SSH サブシステムを作成します。
Subsystem powershell C:/progra~1/powershell/7/pwsh.exe -sshs
注
OpenSSH for Windows には、サブシステム実行可能ファイルのスペースを含むパスを使用できなくなるバグがあります。 この問題を回避するには、次の 2 つの方法があります。
- PowerShell 実行可能パスに Windows 8.3 スタイル の短い名前を使用する
- スペースのないパスを作成する PowerShell 実行可能ファイルへのシンボリック リンクを作成する
詳細については、PowerShell/Win32-OpenSSH リポジトリの 問題 #784 を参照してください。
スペースを含むパスのセグメントの 8.3 スタイルの名前のみを取得する必要があります。 既定では、PowerShell 7 は
C:\Program Files\PowerShell\7\
にインストールされます。Program Files
の 8.3 スタイルの名前はprogra~1
する必要があります。 次のコマンドを使用して、名前を確認できます。Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
8.3 名は、無効にできる NTFS ファイル システムの従来の機能です。 この機能は、PowerShell がインストールされているボリュームで有効にする必要があります。
または、スペースのないパスを作成する PowerShell 実行可能ファイルへのシンボリック リンクを作成することもできます。 この方法は、PowerShell 実行可能ファイルへのパスが変更された場合にリンクを更新できるため、
sshd_config
ファイルを更新する必要がないため、推奨されます。実行可能ファイルへのシンボリック リンクを作成するには、次のコマンドを使用します。
$newItemSplat = @{ ItemType = 'SymbolicLink' Path = 'C:\ProgramData\ssh\' Name = 'pwsh.exe' Value = (Get-Command pwsh.exe).Source } New-Item @newItemSplat
このコマンドは、ホスト キーやその他の構成を格納するために OpenSSH サーバーによって使用されるのと同じディレクトリにシンボリック リンクを作成します。
必要に応じて、キー認証を有効にします。
PubkeyAuthentication yes
詳細については、「 OpenSSH キーの管理」を参照してください。
sshd サービスを再起動します。
Restart-Service sshd
OpenSSH がインストールされているパスを PATH 環境変数に追加します。 たとえば、
C:\Program Files\OpenSSH\
のようにします。 このエントリを使用すると、ssh.exe
を見つけることができます。
Ubuntu Linux コンピューターに SSH サービスをインストールする
最新バージョンの PowerShell をインストールする方法については、「 Ubuntu への PowerShell のインストール」を参照してください。
Ubuntu OpenSSH サーバーをインストールします。
sudo apt install openssh-client sudo apt install openssh-server
sshd_config
ファイルを/etc/ssh
場所で編集します。パスワード認証が有効になっていることを確認します。
PasswordAuthentication yes
必要に応じて、キー認証を有効にします。
PubkeyAuthentication yes
Ubuntu での SSH キーの作成の詳細については、 ssh-keygen の manpage を参照してください。
PowerShell サブシステム エントリを追加します。
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
注
PowerShell 実行可能ファイルの既定の場所は
/usr/bin/pwsh
。 場所は、PowerShell のインストール方法によって異なる場合があります。
ssh サービスを再起動します。
sudo systemctl restart sshd.service
macOS コンピューターに SSH サービスをインストールする
最新バージョンの PowerShell をインストールします。 詳細については、「 macOS への PowerShell のインストール」を参照してください。
次の手順に従って、SSH リモート処理が有効になっていることを確認します。
-
System Settings
を開きます。 -
General
をクリックします -
Sharing
をクリックします。 -
Remote Login
をオンにして、Remote Login: On
を設定します。 - 適切なユーザーへのアクセスを許可します。
-
sshd_config
ファイルを/private/etc/ssh/sshd_config
場所で編集します。nano などのテキスト エディターを使用します。
sudo nano /private/etc/ssh/sshd_config
パスワード認証が有効になっていることを確認します。
PasswordAuthentication yes
PowerShell サブシステム エントリを追加します。
Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo
注
PowerShell 実行可能ファイルの既定の場所は
/usr/local/bin/pwsh
。 場所は、PowerShell のインストール方法によって異なる場合があります。必要に応じて、キー認証を有効にします。
PubkeyAuthentication yes
sshd サービスを再起動します。
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
注
オペレーティング システムをアップグレードすると、SSH 構成ファイルが上書きされる可能性があります。 アップグレード後に構成ファイルを確認してください。
認証
SSH 経由の PowerShell リモート処理は、SSH クライアントと SSH サービス間の認証交換に依存し、認証スキーム自体は実装しません。 その結果、多要素認証を含む構成済みの認証スキームはすべて、POWERShell とは無関係に SSH によって処理されます。 たとえば、セキュリティを強化するために公開キー認証とワンタイム パスワードを要求するように SSH サービスを構成できます。 多要素認証の構成は、このドキュメントの範囲外です。 PowerShell リモート処理で使用する前に、多要素認証を正しく構成し、PowerShell の外部で動作することを検証する方法については、SSH のドキュメントを参照してください。
注
ユーザーはリモート セッションで同じ特権を保持します。 つまり、管理者は昇格されたシェルにアクセスでき、通常のユーザーはアクセスできません。
PowerShell リモート処理の例
リモート処理をテストする最も簡単な方法は、1 台のコンピューターで試してみる方法です。 この例では、同じ Linux コンピューターへのリモート セッションを作成します。 PowerShell コマンドレットを対話形式で使用しているため、SSH からのプロンプトが表示され、ホスト コンピューターの確認とパスワードの入力を求められます。 リモート処理が機能していることを確認するために、Windows コンピューターでも同じことを行うことができます。 次に、ホスト名を変更して、コンピューター間でリモート接続します。
Linux から Linux
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 SSH1 UbuntuVM1 RemoteMachine Opened DefaultShell Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName PSComputerName
------- ------ ----- ----- ------ -- -- ----------- --------------
0 0 0 19 3.23 10635 635 pwsh UbuntuVM1
0 0 0 21 4.92 11033 017 pwsh UbuntuVM1
0 0 0 20 3.07 11076 076 pwsh UbuntuVM1
Linux から Windows
Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]
Windows から Windows
C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 SSH1 WinVM2 RemoteMachine Opened DefaultShell Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable
Name Value
---- -----
PSEdition Core
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
SerializationVersion 1.1.0.1
BuildVersion 3.0.0.0
CLRVersion
PSVersion 6.0.0-alpha
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
GitCommitId v6.0.0-alpha.17
[WinVM2]: PS C:\Users\PSRemoteUser\Documents>
制限事項
sudo コマンドは、Linux コンピューターへのリモート セッションでは機能しません。
SSH 経由の PSRemoting はプロファイルをサポートしていないため、
$PROFILE
にアクセスできません。 セッションに入ったら、完全なファイルパスを使用してプロファイルをドット ソーシングすることで、プロファイルを読み込むことができます。 これは SSH プロファイルには関係ありません。 既定のシェルとして PowerShell を使用し、SSH 経由でプロファイルを読み込むよう SSH サーバーを構成できます。 詳細については、SSH ドキュメントを参照してください。PowerShell 7.1 より前のバージョンでは、SSH 経由のリモート処理では、第 2 ホップのリモート セッションはサポートされていませんでした。 この機能は、WinRM を使用するセッションに限定されていました。 PowerShell 7.1 を使用すると、
Enter-PSSession
とEnter-PSHostProcess
を任意の対話型リモート セッション内から操作できます。
こちらも参照ください
PowerShell