Windows 10 でSSHサーバーするならどっち？「Github版 vs オプション機能版」


# あらすじ

Windows10では2018年の秋から、公式にSSHサーバーの機能が搭載されています。以前から、Github上で公開されていたものが、WindowsのGUI設定画面から使えるようになったものです。「電卓(calc.exe)」や「メモ帳(notepad.exe)」とは逆の順序ですね。名前は「OpenSSH for Windows」です。Windows上でSSHサーバーを扱うためのインストール方法の選択をしやすいように、記事を書きました。

この記事では、Github版を「[openssh-portable](https://github.com/PowerShell/openssh-portable)からダウンロードしてインストールするもの」、追加機能版を「WindowsのGUI設定画面からインストールできるもの」と事前定義しておきます。

# OpenSSH for Windows とは？

Github上で、Microsoft社の[Powershellチーム](https://github.com/PowerShell)が開発をしているSSH用のソフトウェアです。リポジトリは「[openssh-portable](https://github.com/PowerShell/openssh-portable)」です。過去の開発履歴は一部「[Win32-OpenSSH](https://github.com/PowerShell/Win32-OpenSSH)」に残っているようです。もともと、[OpenSSH OSS Project](https://openssh.com/)で開発されている[openssh](https://github.com/openssh/openssh-portable)をMicrosoft社がフォークしたものです。

# Github公開版との互換性

preview版やalpha版の時点からgithubで公開されていました。これが、WindowsのGUI設定から有効化できるようになったものです。
しかし、インストールボタンで勝手に置き換えてくれるわけではありません。過去にgithubからインストールしてある場合には、競合が発生します。githubのものをアンインストールしてから有効化するようにしましょう。

「なぜ手動で置き換えが必要になるのか？」ということを話します。Windowsの設定画面からインストールするものは標準機能です。そして、Windowsの内製機能と同じ方法でインストールされます。ところが、Githubからインストールするものは、利用者が独自にインストールするものです。そのため、Windowsの機能とは別のところでインストールされており、個体値が変動しすぎて管理できません。それゆえ、自動で置き換えるようなインストーラーを開発するのは現実的ではないと推測できます。

# ロードマップ

Windows 10 Fall Creators Update(1709)の時点ではbeta実装でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/a3fb9139-92dd-8589-aa7d-caf49cc932db.png)
現在、既にbeta符号は取れて正式リリースとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/d5c1cd00-4b51-988f-42dc-2e5b802b3af9.png)

ただし、標準では無効化されており、今後もそのままだと予想されます。Linuxでも標準ではOFFとなっており、有効化しなければ使えません。Linuxと同等のセキュリティレベルが保てるように考慮されていると推察できます。このまま追加機能として残り続けるのではないでしょうか。

今はLinuxと同じように「インストールされているが無効」ではなく、インターネットからダウンロードしながらインストールする形になっています。今後、「インストールされているが無効」が標準になるのかは分かりません。

# 各種比較

## ドキュメントの充実度

- [追加機能版のDocs](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_overview)
- [旧Github版のWiki](https://github.com/PowerShell/Win32-OpenSSH/wiki/Project-Status)
- [Github版のReadMeから飛ばされる OpenBSDのマニュアル](https://man.openbsd.org/sshd)

今のところ、Github版には英語版のみしかありません。そのうえ、古い側のリポジトリにしかWikiがありません。新しい側のリポジトリを見ると、「古い側のリポジトリにあるから見てね」とか「OpenBSDと同じだから、そっち見てね」とのことです。追加機能版には日本語版がありますが、そこには、「Github版をインストールした場合にはそちらのWikiを読んでください」との表記があります。もはや、「Github版を使うな」という無言の圧力を感じ取れます。

## コマンドラインでインストールするときの難易度

Github版だと、`invoke-webrequest`して、`Expand-Archive`して、・・・。結構手間です。
「どうしてもGithub版を使いたいんだ」という人は手動で頑張るか、Powershellスクリプトを書きましょう。
または、Chocolateyでインストールする方法もあります。`choco install openssh`でインストールできます。

追加機能版だと、Powershellで2行です。

```posh
## 取得

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
# インストール

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```

## 管理の複雑度

「Active Directory」で管理したい場合には確実に追加機能版を利用することになるでしょう。Github版はWindowsの機能として認定されていないため、「Active Directory」から管理するために複雑な手順を踏む必要があることは明白です。

# 追加機能版の有効化方法

GUIからだと「設定→アプリと機能→オプション機能の追加」で追加できます。

CUIでは、Powershellを使ってインストールします。

```posh
# 取得

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
# インストール

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```

# ほんとに有効化

上記の手順でインストールした後、実際に起動しなければいけません。Linuxと同じですね。

PowerShellで以下のコマンドを実行するか、後で記載する手順を実行してください。

```posh
Start-Service sshd
# OPTIONAL but recommended:

Set-Service -Name sshd -StartupType 'Automatic'
# Confirm the Firewall rule is configured. It should be created automatically by setup.

Get-NetFirewallRule -Name *ssh*
# There should be a firewall rule named "OpenSSH-Server-In-TCP", which should be enabled

# There should be a firewall rule named "OpenSSH-Server-In-TCP", which should be enabled

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
```

上記のスクリプトの代わりに手動で行う場合には、下記の手順を行ってください。

1. スタートメニューを開いて「services」と入力すると「サービス」が見つかる
1. `Enter`キーで実行すると`%windir%\system32\services.msc`が起動する
1. ここで、`SSHD`というサービスを見つける
1. 右クリックしてプロパティを開く
1. 無効または手動になっているはずなので、自動に変える
1. 起動ボタンをクリック
1. スタートメニューで「firewall」と検索すると「ファイアウォールの詳細設定」が見つかる
1. `Enter`キーで実行すると`%windir%\system32\WF.msc`が起動する
1. ここで、受信側で`sshd`という名前のものを新規作成
1. この時、TCPの22番ポートを対象にする

# スクリプト書きました

これを自動でやるスクリプトを書いたので、もしよければ使ってください。
https://github.com/ShortArrow/MakeSshdOnWin10

中身としては、上記の手順に加えて、

- Powershellのバージョンが6以上か確認
- SSHクライアントもインストール
- 管理者権限で実行されているのか確認
- 既にファイアウォール例外を作成済みならスキップ
- インストール済ならスキップ

などの処理を加えています。

また、ps1単体では実行がブロックされるため、
launch.cmdを使って権限スコープをスクリプト単位で変更して実行するようにしています。

# まとめ

SSHで安全性を保ったまま、物理的な移動をサボりましょう！
やっほー。生活の質の向上です！

問題点などございましたら、コメントいただけると助かります。

**Excelsior!**