LinuxおよびWindows用のPSRemoting:ハウツーガイド

最近のPowerShellの変更の一つには、非Windowsマシンとの相互作用方法が多様化しているという点があります。その中の一つが、SSHを介したPSRemotingのサポートです。SSHを介したPSRemotingは、PSRemotingをLinuxで使用することを意味します。

SSHとLinuxを使用したPSRemotingのセットアップには少し手間がかかりますが、これによりPowerShellを使用してLinuxマシンとネイティブに対話することができます。

このチュートリアルでは、WindowsクライアントをLinuxコンピュータ(CentOS)に接続するためにPSRemoting over SSHを設定する方法、およびその逆の方法を学びます。パスワードと証明書の両方を使用して認証する方法も学びます。

関連記事: PowerShell Remoting: The Ultimate Guide

前提条件

このチュートリアルは手順に沿って進めるため、事前に以下の準備が必要です:

  • A Windows 10 build 1809 or greater machine. The tutorial will use Windows Server 2019 Standard as the remote server.
  • A Linux machine that supports PowerShell 7. The tutorial will use CentOS 8.
  • LinuxマシンでのSudo権限とWindowsマシンでのローカル管理者権限。初期設定後、一部の権限は取り消すことができます。

PSRemoting over SSHのためのWindows(クライアント)の設定

まず、Windowsクライアント上のPSRemotingクライアント(PowerShell)を設定する必要があります。そのためには、PowerShell 7+とOpenSSHの両方を設定および構成する必要があります。

PowerShell 7+のインストール

まず、PowerShell 7+をインストールします。このチュートリアルでは、インストール方法の詳細は説明しません。詳細は以下のリンクを参照してください。

OpenSSHのインストール

また、OpenSSHをインストールする必要もあります。OpenSSHは、PSRemotingがリモートのLinuxコンピュータに接続するために使用するパッケージです。以下に示すように、PowerShellを使用してGet-WindowsCapabilityコマンドレットを使用してOpenSSHをインストールすることができます。

Windowsホストをクライアントおよび/またはサーバーとして使用するかどうかによって、インストールするWindows機能が異なります。Windows ServerからLinuxに接続する場合は、OpenSSHクライアントのみが必要です。LinuxからWindows Serverに接続する場合は、OpenSSHサーバーのみが必要です。

以下のコマンドは、OpenSSHで始まるすべてのWindows機能を検索し、それらをインストールします。したがって、クライアントとサーバーの両方がインストールされます。

Get-WindowsCapability -Online | Where-Object {$_.Name -like 'OpenSSH*'} | Add-WindowsCapability -Online

クライアントのみをインストールする場合は、Where-Objectスクリプトブロック内のフィルターをOpenSSH.Client*に変更し、サーバーの場合はフィルターをOpenSSH.Server*に設定してください。

関連記事: SSHとPowerShellの使用の始め方

SSHサーバーの起動

OpenSSHがインストールされると、Windowsファイアウォールがポート22で開かれますが、OpenSSHサーバーサービスをポートでリッスンするように開始しません。Windows ServerでOpenSSHサーバーを起動し、サービスを起動時に開始するには、次のPowerShellコマンドを実行してください。

Start-Service sshd
Set-Service sshd -StartupType Automatic

OpenSSHの設定の構成

次のステップは、sshd_configデーモン設定ファイルを変更することです。このファイルの中で、まずパスワード認証が有効になっていることを確認し、またPowerShellサブシステムを追加します。

このチュートリアルのこの部分では、最も簡単な方法でパスワードを使用したSSH認証を設定します。後で、証明書を使用したSSH認証の設定方法も学びます。

  1. お気に入りのテキストエディタで設定ファイルを開きます。場所はC:\ProgramData\ssh\sshd_configです。

2. パスワード認証が有効になっていることを確認します。PasswordAuthenticationの行が#でコメントアウトされているか、yesに設定されている場合です。

Password Authentication

3. PowerShellサブシステムを追加します。PowerShell 7の場合、次の行を追加します:Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo

  • -sshsオプションは、PowerShell 7をSSHのサブシステムとして実行するために使用されます。
  • -NoLogoオプションは、PowerShellが起動時に著作権情報を非表示にするため、SSHセッションを開始する際に予期しない出力がないことを保証します。

4. 設定ファイルを保存して閉じます。

5. sshd Windowsサービスを再起動します。PowerShellでRestart-Service sshdと実行することができます。

これで、このWindows ServerにPSRemoting over SSHを使用して接続するために必要な設定がすべて完了しました。(クライアント)から接続するための(サーバー)への準備が整いました。

PSRemoting over SSHのためのLinux(サーバー)のセットアップ

次は、同様のセットアップを持つLinuxの設定です。PowerShellのインストールとOpenSSHの設定を行います。

CentOSを使用しているため、異なるディストリビューションを使用している場合は、一部のコマンドが異なることに注意してください。

PowerShell 7+のインストール

まず、PowerShell 7をインストールします。このチュートリアルでは、インストール方法について説明しません。代わりに、次のリンクを参照してください。

関連:Windows、macOS、LinuxでPowerShell 7をダウンロードしてインストールする方法

OpenSSHの設定

Windows Serverと同様に、OpenSSHが必要です。ただし、Windowsとは異なり、OpenSSHはおそらくすでにインストールされています。このチュートリアルでは、CentOS 8を実行しているLinuxマシンには、デフォルトでクライアントとサーバーの両方がすでにインストールされていますが、以下のコマンドを使用して確認できます:

rpm -qa openssh*

クライアントとサーバーがインストールされている場合、以下のような出力が表示されるはずです。

Configuring OpenSSH

SSH設定ファイルを構成するには:

  1. 以下のコマンドを実行して、sshd_configファイルを開きます:sudo vi /etc/ssh/sshd_config。

2. 構成ファイルにWindows Serverと同様にPowerShellサブシステムを追加します。以下の行を設定ファイルに追加します。

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

3. viを終了し、ファイルを保存します。

4. 変更を適用するためにsshデーモンを再起動します。以下のコマンドを実行します:sudo systemctl restart sshd。

デフォルトでは、パスワードと公開鍵認証はほとんどの場合で有効になっています。CentOS 8も含まれます。ここで追加する必要はありません。

Windows/Linux間のパスワード認証による接続

LinuxとWindowsの両方のマシンに設定を完了したら、それらの作業を活用する時が来ました。では、パスワード認証を使用してWindowsからLinuxに接続し、その逆も試してみましょう。

パスワードベースの認証は、ユーザー名とパスワードを使用してSSHを利用するのと同じように見えるでしょう。

接続コマンド

WindowsからLinuxへのPSRemoting over SSHの接続、またはLinuxからWindowsへの接続をテストするために、”アドホック”セッションとInvoke-Command cmdletを使用した永続セッションの両方を使用しましょう。

関連記事:Invoke-Command:リモートコードを実行する最良の方法

Invoke-Commandを使用してPSRemoting接続をテストするには、次の手順を実行します:

  1. PowerShell 7コンソールを開きます。

2. Invoke-Command cmdletのパラメータを設定します。この場合、以下のパラメータは、SRV1というコンピュータに、Userというローカルユーザーアカウントを使用して接続します。

$SessionParams = @{
     HostName = SRV1
     UserName = user
     SSHTransport = $true
 }

3. 上記のパラメータをスプラットしてInvoke-Commandを実行し、スクリプトブロック内でコマンド(この場合はGet-Process)を実行します。

関連記事:PowerShell Splatting: それは何ですか、そしてどのように機能しますか?

Invoke-Command @SessionParams -ScriptBlock {Get-Process}

その後、SRV1コンピュータ上で実行中のすべてのプロセスのリストが表示されます。

また、以下の手順で接続を確立し、相互にコマンドを実行できる永続的な接続も設定できます:

  1. 上記のパラメータを提供し、それらをNew-PSSessionコマンドレットに渡すこと。

2. Enter-PSSessionコマンドレットを使用してそのセッションに対話的に接続する。

Create a persistent session
 $session = New-PSSession @SessionParams
 Connect interactively
 Enter-PSSession -Session $session

3. 上記のEnter-PSSessionコマンドを実行した後、ユーザーのパスワードを入力するように求められます。認証が完了すると、PowerShell内で他のマシンに接続されます。

上記のコマンドのいずれも、一般的なCredentialパラメータを使用してユーザー名とパスワードを提供する必要はありません。代わりに、SSHTransportパラメータを使用しました。SSHは、WindowsがWindowsコンピュータから別のコンピュータに移動する際に使用する認証プロセスとは異なるため、PSCredentialオブジェクトを解釈することはできません。

関連記事:PowerShellのGet-Credentialコマンドレットとクレデンシャルに関するすべてのこと

この方法を使用すると、切断セッションも利用できます。

公開鍵ベースの認証の設定

パスワードベースの認証はセットアップが簡単で使いやすいですが、2つの問題があります。

  • 手動でコマンドを安全に実行するための方法がありません。
  • パスワードがネットワーク上を送信されます。

この場合、パスワードはSSH接続内で暗号化されていますが、サーバーはパスワードを平文で受け取ります。サーバーが何らかの方法で侵害されると、セキュリティ上の問題になる可能性があります。

公開/秘密キーの生成

任意の公開鍵認証を使用する場合、まずクライアントから公開鍵を生成する必要があります。この要件はLinuxとWindowsの両方に適用されます。

LinuxまたはWindowsのサーバーマシンで次の手順を実行します:

  1. ssh-keygenを実行して鍵ペアを生成します。

Linuxでssh-keygenを実行する場合、デフォルトでRSA鍵ペアが生成されます。多くの新しいLinuxオペレーティングシステムでは、デフォルトでRSA鍵ペアを認証に使用できません。これを修正するには、ssh-keygen -t ed25519を使用してください。

2. 私鍵を保存するパスと、暗号化するためのパスフレーズを入力するように求められます。認証時にパスワードを入力しないで済むようにする場合は、パスフレーズを空白のままにしておくことができます。

3. Windowsのみ:次のコマンドをPowerShellから実行します。ここで、<ProfilePath>はプロファイルのパス(おそらくC:\Users\UserName)です。

Set-Service ssh-agent -StartupType Automatic
 Start-Service ssh-agent
 ssh-add .ssh\id_ed25519
 Remove-Item ~.ssh\id_ed25519

WindowsのOpenSSHの実装には、ssh-agentサービスがあり、Windowsセキュリティコンテキスト内のユーザーにプライベートキーを保存することができます。これにより、SSHの秘密鍵をssh-agentにインポートし、さらにファイルシステムからキーを削除してより安全に保護することができます。

4. 生成された公開鍵(<ユーザーホームディレクトリ>\.ssh\id_ed25519.pub)を接続するサーバーにコピーします。Windowsにはこのコピーを行うためのツールが提供されていないため、SCPを使用して完了することができます。以下のコマンドを実行して公開鍵をLinuxマシンにコピーします。

scp C:\Users\Username.ssh\id_ed25519.pub username@ServerB:~/.ssh/authorized_keys

LinuxからWindowsにコピーするには:

scp ~/.ssh/id_ed25519.pub administrator@ServerA:.ssh/authorized_keys

5. ログインしているユーザーのパスワードを入力します。入力後、PowerShell/Bashが鍵をコピーし、リモートマシンから切断されます。

公開鍵認証を使用してWindows/Linuxに接続する

公開鍵と秘密鍵を設定したら、WindowsとLinuxの間で接続することは簡単です。パスワードベースの認証とほぼ同じです。

Windowsで公開鍵を使用して接続する場合、上記の接続コマンドと同じコマンドを使用します。ただし、資格情報の入力を求められないことに気付くでしょう。

以下は、接続中に何が起こっているかを確認するために-vスイッチを使用してLinuxからWindowsに接続する例です。

Example of connecting from Linux to Windows using the -v switch

Source:
https://adamtheautomator.com/psremoting-linux/