WindowsでOpenSSHを使ってSSHサーバーの起動と接続をする方法~PowerShell編

More than 3 years have passed since last update.


はじめに

WindowsのPowerShellで使えるOpenSSHがリリースされています。今回は、このパッケージをインストールし、PowerShellを使って、WindowsでSSH Serverの起動及び、SSH Serverの接続を試みてみたいと思います。なお、私は、Windows初心者ですので、なにか間違いがありましたら、教えてくれると嬉しいです。あと、コマンドプロンプトの表示はWindowsのパスが分かりにくいので一部省略しています。

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


OpenSSH


Download : Pre-release

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


OpenSSHのインストール

一応、PowerShell用のインストールスクリプトを書いておきます。これで、Install-opensshコマンドが使えるようになります。実行すると、$env:programfiles\OpenSSH-Win32にインストールされ、パスが追加されます。

function Install-Openssh {

param ( $TempDir="$env:temp\opensshInstall" )
if(!(Test-Path -Path $TempDir -PathType Container))
{
$null = New-Item -Type Directory -Path $TempDir -Force
}
$client = new-object System.Net.WebClient
$client.DownloadFile("https://github.com/PowerShell/Win32-OpenSSH/releases/download/10_13_2015/OpenSSH-Win32.zip", "$TempDir\OpenSSH-Win32.zip" )
Expand-Archive -Path $TempDir\OpenSSH-Win32.zip -DestinationPath $env:programfiles
$Env:Path += ";$env:programfiles\OpenSSH-Win32"
[Environment]::SetEnvironmentVariable('PATH', $Env:Path, 'Machine')
}

注意: ダウンロードするファイルはreleases/download/10_13_2015でのみ有効なので注意してください。


PowerSHell


PowerShellの基本

まず、バージョンを確認しましょう。見ての通り、PowerShellではいくつかの環境変数が予め設定されていますので、適時使用することで、コマンド短縮に活用できます。また、エイリアスもLinuxコマンドと同じものが幾つか設定されていますので、とりあえずLinuxコマンドを知っている人は、PowerShellを知らなくても叩いてみると良いかもしれません。

C:> $PSversionTable

PowerShellは、基本的に、管理者権限で実行するのと、通常ユーザーで実行するのとでは挙動が異なる場合があります。管理者権限で実行するには、以下のコマンドを実行してみてください。

C:> Start-Process powershell.exe -Verb runas

また、管理者権限でスクリプトの実行ポリシーを変更しておくと、エラー警告が出にくくなります。何らかのスクリプトが実行できないようなときは試してみてください。

C:> Set-ExecutionPolicy RemoteSigned

実行ポリシーの確認は以下のとおり。

C:> Get-ExecutionPolicy

項目
内容

Restricted
すべてのスクリプトが実行禁止

AllSigned
署名されているスクリプトのみが実行可能

RemoteSigned
ローカルに保存されているスクリプトは実行可能

Unrestricted
すべてのスクリプトが実行可


Chocolatey

非公式のパッケージマネージャーです。PowerShellの最新バージョンをインストールしたい場合は、こちらのほうが手軽です。


Powershell,Pre-releaseのインストール

C:> choco install powershell -pre 



Chocolateyのインストール

C:> iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))


そのうち、Win32-OpenSSHが追加されそうです。といっても、ダウンロードして、C¥Program¥ Files¥に解凍し、パスを追加するだけですが。


PowerShell用のインスールスクリプトの解説

再びの解説になります。

一応、PowerShell用のインストールスクリプトを書いておきます。これで、Install-opensshコマンドが使えるようになります。

function Install-Openssh {

param ( $TempDir="$env:temp\opensshInstall" )
if(!(Test-Path -Path $TempDir -PathType Container))
{
$null = New-Item -Type Directory -Path $TempDir -Force
}
$client = new-object System.Net.WebClient
$client.DownloadFile("https://github.com/PowerShell/Win32-OpenSSH/releases/download/10_13_2015/OpenSSH-Win32.zip", "$TempDir\OpenSSH-Win32.zip" )
Expand-Archive -Path $TempDir\OpenSSH-Win32.zip -DestinationPath $env:programfiles
$Env:Path += ";$env:programfiles\OpenSSH-Win32"
[Environment]::SetEnvironmentVariable('PATH', $Env:Path, 'Machine')
}

これをPowerShellで直接入力するか(Enter x2)、ファイルinstall-openssh.psにでもして実行してください。

そして、先ほど作ったInstall-opensshコマンドを実行します。すると、c:¥Program Files¥OpenSSH-Win32にインストールされ、パスが追加されるはず...。パスが追加されると、ssh.exeコマンドなどが直接使えるようになります。

# 現在のプロセスにパスを追加する

$Env:Path += ";$env:programfiles\OpenSSH-Win32"

# 永続的にパスを追加する(Windows環境変数を書き換える)
$Env:Path += ";$env:programfiles\OpenSSH-Win32"
[Environment]::SetEnvironmentVariable('PATH', $Env:Path, 'Machine')

ちなみに、$env:programfilesは、x86の場合、c:¥Program Files(x86)になります。注意してください。


OpenSSHでサーバーを立てる


SSHサーバーを立てる


サーバー

# なんかよくわからなけど、鍵の作成

C:> cd $env:programfiles\OpenSSH-Win32
C:> ssh-keygen.exe -t rsa -f ssh_host_rsa_key
C:> ssh-keygen.exe -t dsa -f ssh_host_dsa_key
C:> ssh-keygen.exe -t ecdsa -f ssh_host_ecdsa_key
C:> ssh-keygen.exe -t ed25519 -f ssh_host_ed25519_key

# ファイアウォールの設定, ローカルポート22を開けている
C:> New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH

# バックグラウンドで起動するコマンドを追加するウィンドウを表示する, なお、sysinternals(ps tool)が必要になるのでインストールしておくこと, 当該ツールをインストールした後は、psexec.exeがあるフォルダへのパスを追加するか、そこにcdで移動すると実行可能になります
# https://technet.microsoft.com/en-us/sysinternals/bb897553
C:> psexec.exe -i -s cmd.exe

# バックグラウンドでSSHサーバーを起動する, psexec.exeで立ち上げたcmd.exeにてsshd.exeを実行することで、SSHサーバーであるsshd.exeのバックグラウンド起動を追加することが可能
C:> sshd.exe



PsToolsのインストール(psexec.exeを含む)

PsToolsのインストールが面倒な方は、こんな感じのコマンドを実行します。

function Install-Pstools {

param ( $TempDir="$env:temp\pstoolsinstall" )
if(!(Test-Path -Path $TempDir -PathType Container))
{
$null = New-Item -Type Directory -Path $TempDir -Force
}
$client = new-object System.Net.WebClient
$client.DownloadFile("https://download.sysinternals.com/files/PSTools.zip", "$TempDir\PSTools.zip" )
$null = New-Item -Type Directory -Path $env:programfiles\PSTools -Force
Expand-Archive -Path $TempDir\PSTools.zip -DestinationPath $env:programfiles\PSTools
$Env:Path += ";$env:programfiles\PSTools"
[Environment]::SetEnvironmentVariable('PATH', $Env:Path, 'Machine')
}

C:> Install-pstools


SSHサーバーの設定

OpenSSHを使っている方なら知っていると思いますが、sshd_configを編集します。これは、c:¥Program Files¥Open-SSH¥sshd_configにあります。


c/programfiles/OpenSSH-Win32/sshd_config

#公開鍵ログイン

PubkeyAuthentication yes

参考:

https://github.com/PowerShell/Win32-OpenSSH/wiki/Deploy-Win32-OpenSSH


OpenSSHでサーバーへ接続する


クライアント

# 通常の設定でパスワードによるアクセスをする

C:> ssh.exe user@host
C:> ssh.exe -l user@domain host

# 鍵の作成を行う
# 公開鍵と秘密鍵の作成, -fオプションは、鍵ファイルを置く場所とファイル名を指定している, カレントディレクトリに id_rsa(秘密鍵)と id_rsa.pub(公開鍵) が作成される
C:> ssh-keygen.exe -t rsa -f id_rsa

# 公開鍵の登録, これは先ほど作成した id_rsa.pub をサーバーの %systemdrive%\users\user\\.ssh\authorized_keys に置くことで登録します

# 鍵でアクセスする
# サーバーに公開鍵が登録されていると、以下のコマンド -i オプションで秘密鍵を指定し、ログインできるようになります
C:> ssh.exe -i .\id_rsa user@host
C:> ssh.exe -i .\id_rsa -l user@domain host


パスワードを設定していない場合は、Ctrl+Alt+Deleteで設定します。この場合、古いパスワードは空。

参考:

https://github.com/PowerShell/Win32-OpenSSH/wiki/ssh.exe-examples