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


はじめに

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

OpenSSH

Download : Pre-release

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

参考:

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で設定します。この場合、古いパスワードは空。

参考: