2016/12/05 (月)

Windows はあいかわらず不勉強で。。。
でも今回については解決に時間かかったのは不勉強のせいじゃない(苦笑

2016-12-05:Windows7 で sshd を動かす

要望あって、Windows マシンに sshd 立てて sftp でファイルをやりとりするサーバに、という案件。
いまって Windows 版の OpenSSH なんてあるのねー。
というわけで、セットアップ.

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

ここから zip ファイルをダウンロードし、C:\ 直下に展開。
自分の場合、C:\OpenSSH-Win64\ になる。これを環境変数 Path にいれる。「マイコンピュータを右クリックのプロパティ」→「システムの詳細設定」→「環境変数」→「システム環境変数の Path の編集」で、末尾に「;C:\OpenSSH-Win64」を追記。

22番ポート以外で動かしたかったので sshd_config を編集。鍵認証の指定もついでに。

Port 22222
PubkeyAuthentication yes

次に、その 22222 のポートを Firewall 的に開ける。
自分は ESET Smart Security なので、そっちで設定。Windows 標準の Firewall だったり、違うセキュリティソフトの方は、適宜それぞれの設定で。

あとは PowerShell で作業。
管理者権限で PowerShell 起動して、

> cd C:\OpenSSH-Win64
> ssh-keygen.exe -A
C:\OpenSSH-Win64\ssh-keygen.exe: generating new host keys: RSA DSA ECDSA ED25519
> Set-ExecutionPolicy Unrestricted
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):
> .\install-sshlsa.ps1
> .\install-sshd.ps1
[SC] SetServiceObjectSecurity SUCCESS
[SC] ChangeServiceConfig SUCCESS
 Granting SeAssignPrimaryTokenPrivilege to NT SERVICE\SSHD   ... successful
sshd and ssh-agent services successfully installed
> Set-ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):
>

一時的にセキュリティを落としてからセットアップをして、終わったら戻す、という感じ。
以上で設定終了で、あとは起動するだけ。
自動起動の設定もしておこう。

> net start sshd
sshd サービスを開始します.
sshd サービスは正常に開始されました。
> Set-Service sshd -StartupType Automatic
>

サーバの C:\Users\{ユーザー名}\.ssh\ 以下に authorized_keys を置いておけば、鍵認証で ssh のログインができる。
scp でファイルのやりとりも可能。
すばらしい。


以下は個人的にはまったネタ。解決に1時間以上かかった。
この Windows 版の OpenSSH、実は

Compression に対応していない!

ので、つなぎにいくクライアントサイドで Enable Compression とか、.ssh/config に Compression yes とか書いてると、接続できない。
もし自分以外にも接続できずに困っている方がいらっしゃいましたら、圧縮設定を見てみていただきたく。

この問題、接続できないならできないでその理由を吐けばいいものを、

% ssh -p 22222 192.168.0.101
buffer_get_ret: trying to get more bytes 1 than in buffer 0
buffer_get_char_ret: buffer_get_ret failed
buffer_get_char: buffer error

これしか言われない。
-v をつけても大して得られる情報なし。これじゃエラー内容分かんないよ!!!

試行錯誤の過程で、サーバ側の .ssh/authorized_keys をどかしてパスワード認証にしたりするも

% ssh -p 22222 192.168.0.101
waasuke@192.168.0.101's password: 
Permission denied, please try again.
waasuke@192.168.0.101's password: 
buffer_get_ret: trying to get more bytes 1 than in buffer 0
buffer_get_char_ret: buffer_get_ret failed
buffer_get_char: buffer error

エラーは同じ。
なお、↑の最初のパスワード入力はわざと間違えてて、サーバが正しくパスワード認証をしてることはまではこれで把握。

サーバ側にログないのかな、と探すと、インストール直下に sshd.log がある。
しかし開いてみても、、、

2888 23:03:20 455 Failed password for waasuke from 192.168.0.62 port 45020 ssh2
2888 23:03:22 341 Accepted password for waasuke from 192.168.0.62 port 45020 ssh2

これだけ。
やっぱり役に立たNEEEEE!!!

で、ウンウン唸ってたら、仲間が「別のクライアントならどうだ?」とアドバイスをくれた。
Windows クライアントの PuTTY を試す。なんとログイン成功!
えーーー
これまでハマってた CentOS の ssh クライアントと何が違うんだ。。。
文字コード?改行コード?

しばらくして、さらに「.ssh/config じゃね?」とコメントをもらう。
いったんどかしてみたら、CentOS の ssh クライアントからもログインできた。
ここまできたらかなりの絞り込めたね。
あとは .ssh/config の設定をコメントアウトしたりひとつひとつ試し、結果、Compression yes がガンであることが判明。
ついでに Enable Compression にチェックを入れた PuTTY でのログイン失敗も確認。
やれやれ。。。

ちなみに、sshd_config には #Compression delayed とデフォルトでコメントアウトで入っているのだけど、これをコメントはずして値を yes にして sshd を再起動しても、圧縮ありにしたクライアントからの接続はできず。
sshd 自体に実装が入ってないのかー。
と思って project ページをよく見ると、

https://github.com/PowerShell/Win32-OpenSSH/wiki/Project-Scope
Intent of this project is to get to a state that can converge to and integrate into OpenSSH’s main repo. To simplify this integration, following features have been scoped out and will not work on Windows yet:

– VerifyHostKeyDNS
– Client ControlMaster

– Compression
– ProxyCommand (Windows specific feature/work items)

ちゃんと書いてはありましたね。。。

(Compression を実装していないことを責めてるわけじゃもちろんないです。むしろポ―ティングには感謝。
(ただ、分からないエラーメッセージには文句言いたい。サーバサイドもクライアントサイドも。

comment