Closed11

Windows Serverのsshd設定でハマったメモ

noonworksnoonworks

まずは公式ドキュメントに沿ってsshdをインストール/有効化する。

https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse

PS> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
PS> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

PS> Start-Service sshd
PS> Set-Service -Name sshd -StartupType 'Automatic'
noonworksnoonworks

公開鍵を登録するところについては、Windows独自仕様で管理者ユーザーは通常のauthorized_keysとは異なる場所に登録が必要になるので、指定の場所にファイルを作成。

この時、複数登録したかったので以下のようにしてメモ帳を開いて書き込んだのだが、それが間違いだった。(問題は後述)

# 空のファイルを作って……
管理者PS> echo "" > "$Env:ProgramData\ssh\administrators_authorized_keys"
# メモ帳で開く
管理者PS> notepad "$Env:ProgramData\ssh\administrators_authorized_keys"

書き込みが終わったら、ドキュメントを参考に権限を設定しておく。

管理者PS> icacls.exe "$Env:ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
noonworksnoonworks

あと、これも必要なのかいまいち理解できていないのだが、Linux等と同様に~/.ssh/authorized_keysも作成した。

noonworksnoonworks

Restart-Service sshdでsshdを再起動して設定を反映させて、いざ接続……できない

クライアントマシン> ssh username@winsvrhostname -vvvv
(中略)
debug3: receive packet: type 51

検索するとreceive packet: type 51はサーバー側で認証エラーらしい。
サーバー側でsshd_configを修正し、詳細ログを出力するようにして確認。

sshd_config
# Logging
SyslogFacility LOCAL0
LogLevel DEBUG3

上記設定をしてからRestart-Service sshdでsshdを再起動すると、%programdata%\ssh\logs\sshd.logが出力されるようになる。
そこを確認すると以下のような怪しい行があった。

debug1: trying public key file __PROGRAMDATA__/ssh/administrators_authorized_keys
debug2: __PROGRAMDATA__/ssh/administrators_authorized_keys:1: check options: '\377\376s'
debug2: __PROGRAMDATA__/ssh/administrators_authorized_keys:1: advance: ''
noonworksnoonworks

メモ帳で文字コードを指定する方法はよくわからなかったのと、エディタを導入するのが面倒だったので、powershellで1行ずつ、文字コードを明示して保存した……

cd $Env:ProgramData\ssh
echo "(公開鍵1)" | Out-File -FilePath administrators_authorized_keys -Encoding ascii
echo "(公開鍵2)" | Out-File -FilePath administrators_authorized_keys -Encoding ascii -Append
……

その後、クライアントから再度ssh接続を試みたところ、無事成功。

noonworksnoonworks

ちなみに、sshd_configファイルはメモ帳で読み書きしても全然平気だった。

noonworksnoonworks

ちゃんと原因を調べた。 直接の原因はメモ帳ではなかった。 メモ帳ごめん。

# ①空のファイルを作って……
管理者PS> echo "" > "$Env:ProgramData\ssh\administrators_authorized_keys"
# ②メモ帳で開く
管理者PS> notepad "$Env:ProgramData\ssh\administrators_authorized_keys"

Powershellでは、 リダイレクトで作ったファイルはUTF-16になる そうだ。
つまり私は①の段階で、空ファイル(0byte)を作っているつもりだったが、普通にBOMつきUTF-16ファイルを作っていた。
それを②メモ帳で開いているので、当然メモ帳は保存するときもUTF-16で保存していた。

エラーメッセージにあったcheck options: '\377\376s'\377\376255 254の8進数表記であり、16進数でFF FEだから、そのまんまUTF-16LEですね……sは公開鍵の先頭ssh-ed25519 ~sだろう。

ちなみに、sshd_configファイルはメモ帳で読み書きしても全然平気だった。

こちらは、最初からasciiで保存されていたsshd_configを開いているので、メモ帳でもasciiのまま読み書きできているというだけだ。

犯人は私(共犯者はデフォルトが変なエンコードのpowershell)だった。メモ帳ごめん……

takerutakeru

同じハマり方をした!

echo "" > administrators_authorized_keys
として、あとからメモ帳だかVSCodeでコピペしていました。

追試:PSでecho "" > aaa.txtとして、VSCodeで開くと右下に"UTF-16LE"とでる!

このスクラップは2022/02/02にクローズされました