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

##はじめに

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`にインストールされ、パスが追加されます。

```bash:
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を知らなくても叩いてみると良いかもしれません。

```bash:
C:> $PSversionTable
```

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

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

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

```bash:
C:> Set-ExecutionPolicy RemoteSigned
```

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

```bash:
C:> Get-ExecutionPolicy
```

|項目|内容|
|---|---|
|Restricted 	|すべてのスクリプトが実行禁止|
|AllSigned 	|署名されているスクリプトのみが実行可能|
|RemoteSigned 	|ローカルに保存されているスクリプトは実行可能|
|Unrestricted 	|すべてのスクリプトが実行可|

##Chocolatey

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

```bash:Powershell,Pre-releaseのインストール
C:> choco install powershell -pre 
```

```bash:Chocolateyのインストール
C:> iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
```

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

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

再びの解説になります。

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

```bash:
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`にでもして実行してください。

![](https://raw.githubusercontent.com/mba-hack/images/master/windows10-powershell-openssh-install.png)

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

```bash:
# 現在のプロセスにパスを追加する
$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サーバーを立てる

```bash:サーバー
# なんかよくわからなけど、鍵の作成
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のインストールが面倒な方は、こんな感じのコマンドを実行します。

```bash:
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`にあります。

```bash:c/programfiles/OpenSSH-Win32/sshd_config
#公開鍵ログイン
PubkeyAuthentication yes
```

参考:

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

##OpenSSHでサーバーへ接続する

```bash:クライアント
# 通常の設定でパスワードによるアクセスをする
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