次の方法で共有


SSH 経由の PowerShell リモート処理

概要

PowerShell リモート処理では通常、接続交渉とデータ転送に WinRM が使用されます。 SSH が Linux および Windows のプラットフォームで利用可能になり、実際のマルチプラットフォームの PowerShell リモート処理を実行できます。

WinRM は PowerShell リモート処理セッションに堅牢なホスティング モデルを提供します。 SSH ベースのリモート処理では現在、リモート エンドポイント構成および JEA (Just Enough Administration) はサポートされていません。

SSH リモート処理を使用すると、Windows コンピューターと Linux コンピューター間で基本的な PowerShell セッションリモート処理を実行できます。 SSH リモート処理で、SSH サブシステムとしてターゲット コンピューター上に PowerShell ホスティング プロセスを作成します。 最終的には、エンドポイント構成と JEA をサポートするために、WinRM と同様の一般的なホスティング モデルを実装します。

New-PSSessionEnter-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 サービスをインストールする

  1. 最新バージョンの PowerShell をインストールします。 詳細については、「 Windows への PowerShell のインストール」を参照してください。

    New-PSSession パラメーター セットを一覧表示することで、PowerShell で SSH リモート処理がサポートされていることを確認できます。 SSH で始まるパラメーター セット名があることがわかります。 これらのパラメーター セットには 、SSH パラメーターが含まれます。

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. 最新の Win32 OpenSSH をインストールします。 インストール手順については、「 OpenSSH の概要」を参照してください。

    PowerShell を OpenSSH の既定のシェルとして設定する場合は、「 OpenSSH 用の Windows の構成」を参照してください。

  3. $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 キーの管理」を参照してください。

  4. sshd サービスを再起動します。

    Restart-Service sshd
    
  5. OpenSSH がインストールされているパスを PATH 環境変数に追加します。 たとえば、C:\Program Files\OpenSSH\ のようにします。 このエントリを使用すると、 ssh.exe を見つけることができます。

Ubuntu Linux コンピューターに SSH サービスをインストールする

  1. 最新バージョンの PowerShell をインストールする方法については、「 Ubuntu への PowerShell のインストール」を参照してください。

  2. Ubuntu OpenSSH サーバーをインストールします

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. 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 のインストール方法によって異なる場合があります。

  4. ssh サービスを再起動します。

    sudo systemctl restart sshd.service
    

macOS コンピューターに SSH サービスをインストールする

  1. 最新バージョンの PowerShell をインストールします。 詳細については、「 macOS への PowerShell のインストール」を参照してください。

    次の手順に従って、SSH リモート処理が有効になっていることを確認します。

    1. System Settingsを開きます。
    2. General をクリックします
    3. Sharingをクリックします。
    4. Remote Loginをオンにして、Remote Login: Onを設定します。
    5. 適切なユーザーへのアクセスを許可します。
  2. 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
      
  3. 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-PSSessionEnter-PSHostProcess を任意の対話型リモート セッション内から操作できます。

こちらも参照ください