Windowsにsshd、sftp-serverの実行環境を構築する

# 概要

Windows10にsshd、sftp-serverの実行環境を構築したときのメモです。
sshd、sftp-serverは、MicrosoftがWindows向けに開発しているWin32-OpenSSHを使用しました。

**環境**

* Windows10 Professional
    * PowerShell 5.1
    * Win32-OpenSSH 0.0.0.6

**参考**

* [Installing SFTP/SSH Server on Windows using OpenSSH] (https://winscp.net/eng/docs/guide_windows_openssh_server)
* [Top 10: Windows Firewall Netsh Commands] (http://windowsitpro.com/windows-server/top-10-windows-firewall-netsh-commands)

# SSHで使用するポートの設定

デフォルトはポート22ですが、この例ではポート20022を使用します。
下記の操作で、Windowsのファイアウォールがポート20022を通すように設定を行います。

管理者権限でコマンドプロンプトを起動し、下記のコマンドを実行します。

## ルールの追加

```bat
> netsh advfirewall firewall add rule name="sshd" dir=in action=allow protocol=TCP localport=20022 profile=private
OK
```

## ルールの確認

```bat
> netsh advfirewall firewall show rule name="sshd"

規則名:                               sshd
----------------------------------------------------------------------
有効:                                 はい
方向:                                 入力
プロファイル:                         プライベート
グループ:
ローカル IP:                          任意
リモート IP:                          任意
プロトコル:                           TCP
ローカル ポート:                      20022
リモート ポート:                      任意
エッジ トラバーサル:                  いいえ
操作:                                 許可
OK
```

## ルールの有効化／無効化

enableに指定する値が"yes"：有効化、"no":無効化になります。

```bat
> netsh advfirewall firewall set rule group="sshd" new enable=(yes|no)
```

なお、画面で操作する場合は、「コントロールパネル → システムとセキュリティ → Windows ファイアウォール → 画面左側メニューの詳細設定」で、左側のメニューから”受信の規則”をクリックし、左側の操作メニューから”新しい規則..."を選択します。
あとは、新規の受信の規則のウィザードに従ってポートを開放するルールを追加します。

### Tips

ポート22を開けるルールの追加方法を検索すると、PowerShellで下記のコマンドを使った説明をよく見ますが、この方法が有効なのはWindows Server 2012、Windows 8になります。Window 7または10は、netshコマンドを使う必要があるようです。

```bat
> New-NetFirewallRule -DisplayName "sshd" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow
```

# Win32-OpenSSH

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

OpenSSH-Win64.zipをダウンロードし、適当な場所へ展開します。
この例では、展開したディレクトリをC:\OpenSSH-Win64に配置し、このディレクトリを環境変数Pathに追加しました。

## sshd_configの編集

下記の設定を変更します。

```text
#Port 22
Port 20022
```

```text
#Subsystem	sftp	sftp-server.exe
Subsystem	sftp	C:\OpenSSH-Win64\sftp-server.exe
```

## インストール

このディレクトリをカレントディレクトリにして、管理者権限でコマンドプロンプトを起動し下記のコマンドを実行します。

```
> powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
[SC] SetServiceObjectSecurity SUCCESS
[SC] ChangeServiceConfig SUCCESS
 Granting SeAssignPrimaryTokenPrivilege to NT SERVICE\SSHD   ... successful
sshd and ssh-agent services successfully installed
```

```
> ssh-keygen.exe -A
ssh-keygen.exe: generating new host keys: RSA DSA ECDSA ED25519
```

```
> powershell.exe -ExecutionPolicy Bypass -File install-sshlsa.ps1

```

```
> ssh-keygen.exe -l -f ssh_host_rsa_key -E md5
2048 MD5:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:** HOME-DEV-PC\rubytomato@home-dev-pc (RSA)
```

一部マスクしています。
ここでPCを再起動します。


### サービスの開始

管理者権限でコマンドプロンプトを起動し、netコマンドでsshdサービスを開始します。
sshdサービスが開始されると、同時にsftp-serverも使用できるようになります。

```
> net start sshd

sshd サービスは正常に開始されました。
```

### サービスの停止

```
> net stop sshd

sshd サービスは正常に停止されました。
```


# クライアントの設定

## 認証鍵ファイルの作成

sftpサーバー用の認証鍵ファイルを作成します。
この例ではPuTTYのPUTTYGET.EXEを使用し、パスフレーズなしで秘密鍵ファイルと公開鍵ファイルを作成しました。

* 公開鍵ファイル："sftp_rsa.pub"
* 秘密鍵ファイル："sftp_rsa.ppk"

公開鍵ファイルから、authorized_keysファイルを作成し、C:\Users\USERNAME\.sshに配置します。

```bat
> ssh-keygen -i -f sftp_rsa.pub >> authorized_keys
```

## WinSCPの設定

WinSCPを起動しログイン画面で”新しいサイト”をクリックして設定を追加します。

ユーザー名には、Windowsアカウントのユーザー名を入力します。

![sftp1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/c3253f2a-c23f-8cbb-78a1-d14109a67919.png)

リモートディレクトリを指定します。（しなくても問題ありません。）

![sftp2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/8a474c96-bb26-c1dd-6cc4-9fa9152de915.png)

秘密鍵にPUTTYGET.EXEで作成した鍵ファイルを指定します。

![sftp3.png](https://qiita-image-store.s3.amazonaws.com/0/22772/f00ce4eb-33f4-4844-8552-51f71841d61e.png)