WindowsのOpenSSH

OpenSSH Security Testing Kick Offで、Windows用のOpenSSHがいい感じに出来たので試してねという記事が出たのでちょっと今更感はあるけど試してみた。
提供されているOpenSSHは記事の1行目のリンクhttps://github.com/PowerShell/Win32-OpenSSHで入手できる。プロジェクト名がWin32-OpenSSHなわりにWin64なのも用意してあるので「オイラ32bitアプリ嫌いなんだよね」という人も大丈夫。

今回はOpenSSH-Win64.zip (v0.0.13.0)を入手した。
解凍して適当なフォルダに置く。今回はc:/program files/opensshとした。

クライアントとして使用

PowerShellを起動する。

Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\foobar> cd /"program files"/openssh
PS C:\program files\openssh> gci


    ディレクトリ: C:\program files\openssh

    
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2017/04/07     22:44           4197 install-sshd.ps1
-a----       2017/04/16     13:30         315392 scp.exe
-a----       2017/04/16     13:30         331264 sftp-server.exe
-a----       2017/04/16     13:30         381440 sftp.exe
-a----       2017/04/16     13:30        1909760 ssh-add.exe
-a----       2017/04/16     13:30        1964544 ssh-agent.exe
-a----       2017/04/16     13:30        2022912 ssh-keygen.exe
-a----       2017/04/16     13:30         132096 ssh-shellhost.exe
-a----       2017/04/16     13:30        2342400 ssh.exe
-a----       2017/04/16     13:30        2291712 sshd.exe
------       2017/04/07     22:44           3520 sshd_config
-a----       2017/02/07     10:23            567 uninstall-sshd.ps1


PS C:\program files\openssh> ./ssh foobar@192.168.31.219

gciはGet-ChildItemの省略形。UNIX系のOSでいうところのls, DOS系でいうところのdirっぽいもの。
sshで他のホストにログインしてみたところ、普通にログインできた。難しいところも不具合らしいものも見当たらなかった。

ただし、PowerShellの画面なので、それが圧倒的な使いにくさに繋がっている。20数年進化してないこの画面いいかげんどうにかして下さいよ。PowerShellリリース時に改修してりゃ良かったのに何で放置したんだろ。

拍子抜けするほど何も不具合無く動くのでこれで終わり。

サーバーとして使用

まずは管理者としてPowerShellを開く。

PowerShellを開く1
普通にスタートボタンを左クリックしてWまでスクロールし、Windows PowerShellを選択。Windows PowerShellのアイテムリストからWindows PowerShellを「右クリック」して「管理者として実行する」を左クリック。

PowerShellを開く2
Windows10 Creators Update以降はスタートボタンの右クリックで「Windows PowerShell (管理者)」でも行ける。

Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Windows\system32> cd /"program files"/openssh
PS C:\program files\openssh> gci


    ディレクトリ: C:\program files\openssh


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2017/04/07     22:44           4197 install-sshd.ps1
-a----       2017/04/16     13:30         315392 scp.exe
-a----       2017/04/16     13:30         331264 sftp-server.exe
-a----       2017/04/16     13:30         381440 sftp.exe
-a----       2017/04/16     13:30        1909760 ssh-add.exe
-a----       2017/04/16     13:30        1964544 ssh-agent.exe
-a----       2017/04/16     13:30        2022912 ssh-keygen.exe
-a----       2017/04/16     13:30         132096 ssh-shellhost.exe
-a----       2017/04/16     13:30        2342400 ssh.exe
-a----       2017/04/16     13:30        2291712 sshd.exe
------       2017/04/07     22:44           3520 sshd_config
-a----       2017/02/07     10:23            567 uninstall-sshd.ps1


PS C:\program files\openssh> Set-ExecutionPolicy Unrestricted

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y
PS C:\program files\openssh> ./install-sshd.ps1
[SC] SetServiceObjectSecurity SUCCESS
[SC] ChangeServiceConfig SUCCESS
sshd and ssh-agent services successfully installed
PS C:\program files\openssh> Set-ExecutionPolicy  restricted

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y
PS C:\program files\openssh>

インストール用のPowerShellスクリプトを実行したいので、先に実行ポリシーを「制限無し」に変更する。
インストールが終わったら実行ポリシーを「制限あり」に(忘れずに)戻す。何か理由があって通常時にunrestricted,restricted以外にしているということであればそれに戻す。

鍵ファイル作成

インストールは終わったけど鍵ファイルが無い状態なので作成する。作成するのはrsa, dsa, ecdsa, ed25519の4種類。
個別に作るということであれば例えばrsaなら以下。他の鍵ファイルの作成は下の赤字のrsaの部分をdsa, ecdsa, ed25519に代えるだけ。

PS C:\program files\openssh> ./ssh-keygen.exe -f ./ssh_host_rsa_key -t rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [Enter]
Enter same passphrase again: [Enter]
Your identification has been saved in .\ssh_host_rsa_key.
Your public key has been saved in .\ssh_host_rsa_key.pub.
The key fingerprint is:
SHA256:4KIxlWx0jDAG8AUiYJ6gUcluwXqXzUxSfpFUOQ7Z5ec gato@DESKTOP-0GU1CRT@DESKTOP-0GU1CRT
The key's randomart image is:
+---[RSA 2048]----+
|@**+o+o.o=.o.    |
|*=*=o+o +.+.     |
|.=..=Bo .o .. .  |
|. +oo.+o  .  o   |
| oo.. . S     E  |
|   + .           |
|  .              |
|                 |
|                 |
+----[SHA256]-----+
PS C:\program files\openssh>

個別に鍵ファイルを作成(更新)するのではなく一括でということであれば以下。

PS C:\program files\openssh> ./ssh-keygen -A
C:\program files\openssh\ssh-keygen.exe: generating new host keys: RSA DSA ECDSA ED25519
PS C:\program files\openssh> gci


    ディレクトリ: C:\program files\openssh


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2017/05/10     21:18                logs
-a----       2017/04/07     22:44           4197 install-sshd.ps1
-a----       2017/04/16     13:30         315392 scp.exe
-a----       2017/05/10     21:04          16384 secedit.jfm
-a----       2017/05/10     21:04        1048576 secedit.sdb
-a----       2017/04/16     13:30         331264 sftp-server.exe
-a----       2017/04/16     13:30         381440 sftp.exe
-a----       2017/04/16     13:30        1909760 ssh-add.exe
-a----       2017/04/16     13:30        1964544 ssh-agent.exe
-a----       2017/04/16     13:30        2022912 ssh-keygen.exe
-a----       2017/04/16     13:30         132096 ssh-shellhost.exe
-a----       2017/04/16     13:30        2342400 ssh.exe
-a----       2017/04/16     13:30        2291712 sshd.exe
------       2017/04/07     22:44           3520 sshd_config
-a----       2017/05/10     21:28            668 ssh_host_dsa_key
-a----       2017/05/10     21:28            627 ssh_host_dsa_key.pub
-a----       2017/05/10     21:28            227 ssh_host_ecdsa_key
-a----       2017/05/10     21:28            199 ssh_host_ecdsa_key.pub
-a----       2017/05/10     21:28            432 ssh_host_ed25519_key
-a----       2017/05/10     21:28            119 ssh_host_ed25519_key.pub
-a----       2017/05/10     21:28           1679 ssh_host_rsa_key
-a----       2017/05/10     21:28            419 ssh_host_rsa_key.pub
-a----       2017/02/07     10:23            567 uninstall-sshd.ps1



PS C:\program files\openssh>

sshdを起動

PS C:\program files\openssh> net start sshd

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

サービスとして登録済みのものを開始させるのでC:\program files\opensshから実行しなくてはならないということではない。
ここでサービスが正常に開始されずに System Error 5 が出ることがある。(後述)

サービス設定
インストール後の初期値は自動起動になっていないので自動起動させたい場合はサービスの設定でsshdを自動起動にする。
またはPowerShellから Set-Service sshd -StartupType Automatic

ファイアウォール ポップアップ
ファイアウォールのポップアップが出た場合はアクセスを許可する範囲の必要に応じて「プライベートネットワーク」と「パブリックネットワーク」にチェックをする。
[アクセスを許可する]を押す。

起動失敗
設定ファイルはsshd_configなので普通なら鍵ファイルのpathを変更してやれば正常に読み込んで起動してくれる筈だが、試した範囲では設定ファイル内のデフォルト値として書かれているpathのC:\etc\sshフォルダを作成してそこに鍵ファイルを置いてやらないとsshdがサービスとして起動してくれなかった。
上の画面が出る。(これは「サービス」からsshdを起動させた場合。PowerShellからsshdを起動させた場合はポップアップは出ずに文字でエラーが表示される)
ローカル コンピューターのsshdサービスを開始できません。エラー5: アクセスが拒否されました。
ところが一度正常に起動できてしまえば次からはC:\etc\sshが無くても動いちゃう?よく解らないなぁ・・・
別の原因がある?

他の端末からWindowsにsshでログインする場合、Windowsのローカルアカウントがあれば普通に ssh hoge@windows-pcのIPアドレス/ホスト名 でログインできる。ここは普通。マイクロソフトアカウントを使う場合、それがfoobar@example.comとすると ssh foobar@windows-pcのIPアドレス/ホスト名 で良いみたい。example.comどこ行った?

何かコマンドを実行した際に表示される内容が複数行の場合、普通なら1行ずつ改行されて「ズラズラ」っと表示される筈だけど、1行にひたすら上書きになることがある。プロンプトが出た後はまた正常に改行される。その発生条件に一貫性が無いので、ときどきのランダムなのかな?