Home > Windows にまつわる e.t.c.

PowerShell 6 へリモート接続する(クロスプラットフォーム/パスワード認証編)


PowerShell は Windows 専用のシェルスクリプトでしたが、PowerShell 6 から、Windows/Linux/MacOS 対応のマルチプラットフォームに進化しました。

これは、Windows 以外でも PowerShell が使えるだけではなく、クロスプラットフォーム間で PowerShell を使ったリモート操作が可能になりました。

なんと素敵 !!

従来の PowerShell リモーティングは、WinRM を使っています。

PowerShell リモーティング over WinRM

 

このような仕組みになっているので、Linux 等の Windows 以外のプラットフォームから Windows を操作する場合は、WinRM クライアントを使って、PowerShell コマンドを叩いたり、PowerShell スクリプトを起動しています。(telnet で PowerShell コマンドを叩いているイメージ)

 

これに対し、PowerShell 6 では、ssh をトランスポートに使い、マルチプラットフォームでネイティブな PowerShell リモーティングが可能になったのです。

PowerShell リモーティング over ssh

 

ssh をトランスポートに使用したので、公開鍵方式の認証が可能になっています。

従来の WinRM の場合、ワークグループ環境では資格情報(ID/パスワード)を使った認証が必要だったのですが、ssh を使うと公開鍵認証が使えるようになるので Windows だけの環境でも導入するメリットがあります。

公開鍵認証は次回説明します。

 

今回は、Windows Server 2016 / CentOS 7 / Windows 10 間での PowerShell リモーティングを解説しますが、PowerShell 6 と Win32-OpenSSH は Windows 7/ Windows Server 2008 R2 以降に対応しているので、このバージョン以降の環境であれば使用可能です。

 

【お願い】
便宜上 administrator / root で説明をしていますが、運用環境では administrator / root は使用せず、管理用のアカウントを別に作成してください。

 

Index

少々ボリューミーになったので、Index 置きます

必要なもの
PowerShell Remoting Server(Windows Server 2016) の構築
PowerShell Remoting Client(Windows Server 2016 / Windows 10 1709(RS3) 以前) の構築
PowerShell Remoting Client(Windows 10 1803(RS4) 以降) の構築
初めての PowerShell over ssh(Windows to Windows)
PowerShell Remoting Server(CentOS 7) の構築
初めてのクロスプラットフォーム PowerShell over ssh(Windows to CentOS 7)
CentOS 7 から Windows Server 2016 への PowerShell over ssh(CentOS 7 to Windows)
まとめ

 

必要なもの

PowerShell over ssh 環境を作るのに必要なものをリストアップします。

 

PowerShell 6

何はなくとも、PowerShell 6 が無い事には始まりません。

PowerShell/PowerShell: PowerShell for every system!
https://github.com/PowerShell/PowerShell

 

PowerShell 6 は GitHUB で公開されています。

以下のページにプラットフォーム別のインストール方法が「How to Install」のリンク先に書いてありますので、その手順に従って PowerShell 6 のインストールをしてください。

Windows の場合は、https://github.com/PowerShell/PowerShell の Downloads にある .msi をダウンロードして通常のアプリケーションと同様にインストールします。

 

Win32 Open SSH

Windows Server 2016 と Windows 10 1803 より前のバージョンには ssh がインストールされていないので、Win32-OpenSSH をダウンロードをしておきます。

Releases - PowerShell/Win32-OpenSSH
https://github.com/PowerShell/Win32-OpenSSH/releases

 

これを書いている時点最新は v7.6.0.0p1-Betaです(GA 版は存在しません)。x86/x64 別になっているので、該当する .zip をダウンロードします。

・ OpenSSH-Win64.zip (x64 用)
・ OpenSSH-Win32.zip (x86 用)

CentOS 7 の場合、標準的なインストールオプションでインストールすれば ssh は標準で入っていますので、Open SSH をインストールする必要はありません。

 

まずはシンプルな パスワード認証環境を作成しましょう。

 

PowerShell Remoting Server(Windows Server 2016) の構築

まずは、(僕が)慣れている Windows Server 2016 に PowerShell remoting server 環境を作ります。

まずはざっくりインストールの流れ

・PowerShell 6 インストール
・ssh 受信用に Windows ファイヤーウォール穴あけ(tcp/22)
・Win32-OpenSSH インストール
・sshd サービス自動起動設定 / サービス起動
・sshd サービス設定
・sshd サービス再起動
・ssh への Path を通す

 

では具体的な手順です。

 

PowerShell 6 インストール

GitHUB からダウンロードした PowerShell 6 の .msi をインストールします

ふつーなインストーラーなので、手順省略(手抜きと言わないで w)

 

ssh 受信用に Windows ファイヤーウォール穴あけ(tcp/22)

GUI でも netsh でも PowerShell でもかまわないので、tcp/22 の受信をを通します。

 

Win32-OpenSSH インストール

ダウンロードした .zip を解凍し、フォルダ名を OpenSSH に変更し、それを C:\Program Files へ移動します。

 

install-sshd.ps1 を管理権限で実行するとサービスが登録されます。

 

sshd サービス自動起動設定/サービス起動

GUI でも、PowerShell でも構わないので、sshd サービスを「自動起動」に設定し、sshd サービスを起動します。

 

sshd サービス設定

設定ファイルは、C:\ProgramData\ssh\sshd_config なので、こいつをテキストエディタで開いて、以下設定をします。

PubkeyAuthentication の有効化(# を外す)
PasswordAuthentication の有効化(# を外す)
Subsystem powershell C:\Program Files\PowerShell\6.0.1\pwsh.exe -sshs -NoLogo -NoProfile を追加
("Subsystem powershell" + pwsh.exe のフルパス + "-sshs -NoLogo -NoProfile" を追加)

 

sshd サービス再起動

GUI or コマンド or PowerShell で sshd サービスを再起動します。

 

ssh への Path を通す

ssh コマンドフォルダ(C:\Program Files\OpenSSH)を Path に追加します。

 

PowerShell で設定する

PowerShell で設定するのであれば、.zip の中身を C:\Program Files\OpenSSH に置いた後に、以下をコピペします。(要管理権限)
PowerShell 6 は New-NetFirewallRule をサポートしていないので PowerShell 5 で実行します。

##################################
# Setup sshd for WS16
##################################
# Run install-sshd.ps1
$InstallPS1 = Join-Path $env:ProgramFiles "OpenSSH\install-sshd.ps1"
. $InstallPS1

# Open FW
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

# sshd service auto start
Set-Service sshd -StartupType Automatic

# start sshd service
Start-Service sshd

# Edit sshd_config
$SshdConfigPath = Join-Path $env:ProgramData ssh\sshd_config
$PwshFullPath = cmd /c where pwsh.exe
$SshdConfig = Get-Content $SshdConfigPath

$NewSshdConfig = @()
$PubkeyAuthentication = $false
$PasswordAuthentication = $false
foreach( $Line in $SshdConfig ){
    # Enable PubkeyAuthentication
    if( $Line -match "PubkeyAuthentication" ){
        $NewSshdConfig += "PubkeyAuthentication yes"
        $PubkeyAuthentication = $true
        continue
    }

    # Enable PasswordAuthentication
    if( $Line -match "PasswordAuthentication" ){
        $NewSshdConfig += "PasswordAuthentication yes"
        $PasswordAuthentication = $true
        continue
    }

    # skip Subsystem powershell
    if( $Line -match "Subsystem powershell" ){
        continue
    }

    $NewSshdConfig += $Line
}

if( $PubkeyAuthentication -eq $false ){
    $NewSshdConfig += "PubkeyAuthentication yes"
}

if( $PasswordAuthentication -eq $false ){
    $NewSshdConfig += "PasswordAuthentication yes"
}

# Add Subsystem powershell line
$NewSshdConfig += "Subsystem powershell " + $PwshFullPath + " -sshs -NoLogo -NoProfile"

# Update sshd config
Set-Content $SshdConfigPath -Value $NewSshdConfig

# Restart sshd Service
Restart-Service sshd

# Add Path
setx /m Path ($env:Path + ";" + (Join-Path $env:ProgramFiles OpenSSH))

 

PowerShell Remoting Client(Windows Server 2016 / Windows 10 1709(RS3) 以前) の構築

今度は、操作元である PowerShell remoting client 環境 を Windows Server 2016 に作ってみましょう。

Windows 10 1709(RS3) 以降も同じ手順です。

Windows OS から PowerShell over ssh をする場合には、PowerShell 6 と Win32-OpenSSH をインストールします。

1709(RS3) には ssh client beta が入っていますが、どうも動きが怪しいので Win32-OpenSSH を使う事をお勧めします。

先と同様に、 Windows Server 2016 に PowerShell remoting Client 環境を作ります。

まずはざっくりインストールの流れ

・PowerShell 6 インストール
・Win32-OpenSSH インストール
・ssh への Path を通す

 

Server 側を作るより、圧倒的に手順が少ないですね。

パスワード認証の場合は、ssh.exe に Path が通っていれば良いだけです。

 

では具体的な手順です。

手順と言ってもファイルを配置して Path 通すだけです。

 

PowerShell 6 インストール

ダウンロードした PowerShell 6 の .msi をインストールします

 

Win32-OpenSSH インストール

ダウンロードした .zip を解凍し、フォルダ名を OpenSSH に変更。それを C:\Program Files へ移動します。

 

ssh への Path を通す

ssh コマンドフォルダ(C:\Program Files\OpenSSH)を Path に追加します。

 

PowerShell で設定する

PowerShell で設定するのであれば、.zip の中身を C:\Program Files\OpenSSH に置いた後に、以下をコピペします。

# Add Path
setx /m Path ($env:Path + ";" + (Join-Path $env:ProgramFiles OpenSSH))

 

PowerShell プロンプトを開きなおせば、ssh への Path が通るので、ssh コマンドが使えるようになります。

 

PowerShell Remoting Client(Windows 10 1803(RS4) 以降) の構築

Windows 10 1803(RS4) 以降は、ssh client が OS 標準でサポートされているので、Win32-OpenSSH のインストールは不要です。 PowerSehll 6 のみインストールするだけです。

・PowerShell 6 インストール

具体的手順は省略しても問題無いですよね?

 

もし、ssh client がインストールされていなければ、[アプリ] - [アプリと機能] - [オプション機能管理] で OpenSSH クライアントをインストールします。

 

初めての PowerShell over ssh(Windows → Windows)

PowerShell remoting clientで PowerShell 6 を開き、サーバー側に対し、以下の PowerShell リモーティングコマンドレットを叩きます。

New-PSSession
Enter-PSSession
Invoke-Command

 

従来の WinRM と over ssh では、使用するオプションが違います。(オプションの違いを認識して WinRM / Over ssh を切り替えています)

オプション WinRM ssh
接続先指定 -ComputerName -HostName
アカウント指定 -Credential -UserName

 

例えば、172.24.58.68 に対して administrator 接続する場合は、以下のようにします。

Enter-PSSession -HostName 172.24.58.68 -UserName administrator

 

PowerShell Remoting Server(CentOS 7) の構築

いよいよクロスプラットフォーム用に CentOS 7 に PowerShell remoting server 環境を作ってみましょう。

CentOS 7 では sshd 稼働しているので、PowerShell 6 インストールと sshd の設定変更だけです。

ざっくりインストールの流れ

・PowerShell 6 インストール
・sshd 設定
・sshd 再起動

 

では手順説明です。

 

PowerShell 6 インストール

CentOS 7 への PowerShell 6 インストール手順は GitHub を見てください(手抜きご容赦)

 

sshd 設定

設定ファイルは、/etc/ssh/sshd_config なので、こいつを vi 等のテキストエディタで開いて、以下設定をします。

PubkeyAuthentication の有効化(# を外す)
PasswordAuthentication の有効化(# を外す)
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile を追加
("Subsystem powershell" + pwsh のフルパス + "-sshs -NoLogo -NoProfile" を追加)

 

sshd 再起動

以下コマンドで sshd を再起動します。

sudo service sshd restart

 

PowerShell で設定する

CentOS 7 にも PowerShell 6 をインストールしたので、PowerShell で設定出来ます。
PowerShell で設定するのであれば以下をコピペします。
(ただ単に僕が vi 苦手なので PowerShell で設定したかっただけ w)

##################################
# Edit sshd_config for CentOS 7
##################################
$SshdConfigPath = "/etc/ssh/sshd_config"
$PwshFullPath = "/usr/bin/pwsh"

# Edit sshd_config
$SshdConfig = Get-Content $SshdConfigPath
$NewSshdConfig = @()
$PubkeyAuthentication = $false
$PasswordAuthentication = $false
foreach( $Line in $SshdConfig ){
    # Enable PubkeyAuthentication
    if( $Line -match "PubkeyAuthentication" ){
        $NewSshdConfig += "PubkeyAuthentication yes"
        $PubkeyAuthentication = $true
        continue
    }

    # Enable PasswordAuthentication
    if( $Line -match "PasswordAuthentication" ){
        $NewSshdConfig += "PasswordAuthentication yes"
        $PasswordAuthentication = $true
        continue
    }

    # skip Subsystem powershell
    if( $Line -match "Subsystem powershell" ){
        continue
    }

    $NewSshdConfig += $Line
}

if( $PubkeyAuthentication -eq $false ){
    $NewSshdConfig += "PubkeyAuthentication yes"
}

if( $PasswordAuthentication -eq $false ){
    $NewSshdConfig += "PasswordAuthentication yes"
}

# Add Subsystem powershell line
$NewSshdConfig += "Subsystem powershell " + $PwshFullPath + " -sshs -NoLogo -NoProfile"

# Update sshd config
Set-Content $SshdConfigPath -Value $NewSshdConfig

# Restart sshd
sudo service sshd restart

(表示が乱れているのはご容赦)

 

初めてのクロスプラットフォーム PowerShell over ssh(Windows → CentOS 7)

それでは、Windows 環境の PowerShell 6 から CentOS 7 の PowerShell に接続してみます。

手順は、Windows Server 2016 への接続と全く同じです。

Enter-PSSession -HostName 172.24.58.55 -UserName root

 

接続して $PSVersionTable を見ると、OS が Linux、Platform が Unix になっているので、CentOS 7 に接続されていることが分かります。

 

CentOS 7 から Windows Server 2016 への PowerShell over ssh(CentOS 7 → Windows)

CentOS 7 では ssh への Path が通っているので、PowerShell 6 をインストールするだけです。

Windows Server 2016 への接続手順は同じです。

Windows から CentOS 7 へ ssh 接続し、CentOS 7 の PowerShell 6 を起動し、そこから Windows Server 2016 へ接続するとこんな感じになります。

 

CentOS7 から CentOS 7 への PowerShell も全く同じ手順でリモート操作が出来ます。

 

PowerShell remoting over ssh の使い方は、プラットフォームを選ばず全く同じコマンドレットとオプションでリモート操作ができるので、OS 混在環境を運用する際にとても便利です。

 

まとめ

構築と接続の手順が入り混じってしまったので、最後に今回のまとめです

 

PowerShell Remoting Server 構築

PowerShell Remoting Server(Windows Server 2016) の構築

・ PowerShell 6 インストール
・ ssh 受信用に Windows ファイヤーウォール穴あけ(tcp/22)
・ Win32-OpenSSH インストール
・ sshd サービス自動起動設定 / サービス起動
・ sshd サービス設定
・ sshd サービス再起動
・ ssh への Path を通す

PowerShell Remoting Server(CentOS 7) の構築

・ PowerShell 6 インストール
・ sshd 設定
・ sshd 再起動

 

PowerShell Remoting Client 構築

PowerShell Remoting Client(Windows Server 2016 / Windows 10 1709(RS3) 以前) の構築

・ PowerShell 6 インストール
・ Win32-OpenSSH インストール
・ ssh への Path を通す

PowerShell Remoting Client(Windows 10 1803(RS4) 以降) の構築

PowerShell 6 インストール

PowerShell Remoting Client(CentOS 7) の構築

PowerShell 6 インストール

 

PowerShell Remoting 接続

PowerSehll Remoting over ssh 接続の方法

PowerSehll Remoting コマンドレットで、接続先指定を -HostName 、接続アカウント指定を -UserName で指定します。

例)
Enter-PSSession -HostName 172.24.58.68 -UserName administrator

 

関連情報

PowerShell 6 へリモート接続する(Windows 編)
http://www.vwnet.jp/windows/PowerShell/2018020501/ConnectRemotePS6.htm

PowerShell 6 へリモート接続する(クロスプラットフォーム/公開鍵認証編)
http://www.vwnet.jp/Windows/PowerShell/2018032101/PsRemoteOverSSHwKey.htm

リモート コンピューターの対話操作(Enter-PSSession)
http://www.vwnet.jp/windows/PowerShell/EnterPSSession.htm

リモート コンピューターのバッチ操作(Invoke-Command)
http://www.vwnet.jp/windows/PowerShell/InvokeCommand.htm

リモート コンピューターのパラレル バッチ操作(Invoke-Command -AsJob)
http://www.vwnet.jp/windows/PowerShell/Invoke-CommandAsJob.htm

Linux からの WinRM アクセスを許可する
http://www.vwnet.jp/windows/PowerShell/EnableWinRMFromLinux.htm

PowerShell 6.0 on CentOS 7
http://www.vwnet.jp/Windows/PowerShell/2018012401/PS6onCent7.htm

 

参考情報

Install Win32 OpenSSH - PowerShell/Win32-OpenSSH Wiki
https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH

SSH 経由の PowerShell リモート処理PowerShell Remoting Over SSH | Microsoft Docs
https://docs.microsoft.com/ja-jp/powershell/scripting/core-powershell/ssh-remoting-in-powershell-core?view=powershell-6

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.