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 置きます
必要なもの
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/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 をダウンロードして通常のアプリケーションと同様にインストールします。
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 をインストールする必要はありません。
まずはシンプルな パスワード認証環境を作成しましょう。
まずは、(僕が)慣れている Windows Server 2016 に PowerShell remoting server 環境を作ります。
まずはざっくりインストールの流れ
・PowerShell 6 インストール
・ssh 受信用に Windows
ファイヤーウォール穴あけ(tcp/22)
・Win32-OpenSSH インストール
・sshd サービス自動起動設定 / サービス起動
・sshd サービス設定
・sshd サービス再起動
・ssh への Path を通す
では具体的な手順です。
GitHUB からダウンロードした PowerShell 6 の .msi をインストールします
ふつーなインストーラーなので、手順省略(手抜きと言わないで w)
GUI でも netsh でも PowerShell でもかまわないので、tcp/22 の受信をを通します。
ダウンロードした .zip を解凍し、フォルダ名を OpenSSH に変更し、それを C:\Program Files へ移動します。
install-sshd.ps1 を管理権限で実行するとサービスが登録されます。
GUI でも、PowerShell でも構わないので、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" を追加)
GUI or コマンド or PowerShell で sshd サービスを再起動します。
ssh コマンドフォルダ(C:\Program Files\OpenSSH)を Path に追加します。
PowerShell で設定するのであれば、.zip の中身を C:\Program Files\OpenSSH
に置いた後に、以下をコピペします。(要管理権限)
PowerShell 6 は New-NetFirewallRule をサポートしていないので
PowerShell 5 で実行します。
|
今度は、操作元である 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 の .msi をインストールします
ダウンロードした .zip を解凍し、フォルダ名を OpenSSH に変更。それを C:\Program Files へ移動します。
ssh コマンドフォルダ(C:\Program Files\OpenSSH)を Path に追加します。
PowerShell で設定するのであれば、.zip の中身を C:\Program Files\OpenSSH に置いた後に、以下をコピペします。
# Add Path setx /m Path ($env:Path + ";" + (Join-Path $env:ProgramFiles OpenSSH)) |
PowerShell プロンプトを開きなおせば、ssh への Path が通るので、ssh コマンドが使えるようになります。
Windows 10 1803(RS4) 以降は、ssh client が OS 標準でサポートされているので、Win32-OpenSSH のインストールは不要です。 PowerSehll 6 のみインストールするだけです。
・PowerShell 6 インストール
具体的手順は省略しても問題無いですよね?
もし、ssh client がインストールされていなければ、[アプリ] - [アプリと機能] - [オプション機能管理] で OpenSSH クライアントをインストールします。
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
いよいよクロスプラットフォーム用に CentOS 7 に PowerShell remoting server 環境を作ってみましょう。
CentOS 7 では sshd 稼働しているので、PowerShell 6 インストールと sshd の設定変更だけです。
ざっくりインストールの流れ
・PowerShell 6 インストール
・sshd 設定
・sshd 再起動
では手順説明です。
CentOS 7 への PowerShell 6 インストール手順は GitHub を見てください(手抜きご容赦)
設定ファイルは、/etc/ssh/sshd_config なので、こいつを vi 等のテキストエディタで開いて、以下設定をします。
PubkeyAuthentication の有効化(# を外す)
PasswordAuthentication の有効化(# を外す)
Subsystem powershell /usr/bin/pwsh -sshs
-NoLogo -NoProfile を追加
("Subsystem powershell" + pwsh のフルパス + "-sshs -NoLogo
-NoProfile" を追加)
以下コマンドで sshd を再起動します。
sudo service sshd restart
CentOS 7 にも PowerShell 6 をインストールしたので、PowerShell
で設定出来ます。
PowerShell で設定するのであれば以下をコピペします。
(ただ単に僕が vi 苦手なので PowerShell で設定したかっただけ w)
|
(表示が乱れているのはご容赦)
それでは、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 では 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 6 インストール
・ ssh 受信用に Windows
ファイヤーウォール穴あけ(tcp/22)
・ Win32-OpenSSH インストール
・ sshd サービス自動起動設定 / サービス起動
・ sshd サービス設定
・ sshd サービス再起動
・ ssh への Path を通す
・ PowerShell 6 インストール
・ sshd 設定
・ sshd 再起動
・ PowerShell 6 インストール
・ Win32-OpenSSH インストール
・ ssh
への Path を通す
PowerShell 6 インストール
PowerShell 6 インストール
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
Copyright © MURA All rights reserved.