OS再インストールしてから、めんどくさくて後回しにしてたSSHサーバーの設定をやってみました。
Windows10にはOpenSSHが標準でインストールされるようになったようです。昔は、Cygwinから入れてたんで、楽になったと思いきや、簡単なのはインストールだけの、罠多すぎ仕様でした。。。orz
意外とWindows10でのSSHサーバー構築方法をきちんと纏めてるの無かったので、手順を記録しておきます。
インストール
Windowsのスタートボタン→設定→アプリ→オプション機能→拡張機能の追加
「OpenSSHサーバー」をクリックしてインストールボタンをクリック
設定1(サーバーの設定)
1. Windowsのスタートボタン→マイドキュメント
2. 上図のように辿って、コントロールパネルを開く
3. 表示方法→小さいアイコンをクリック
4. 管理ツール→サービスを開く
5. 「OpenSSH SSH Server」をダブルクリック。サービスの状態は停止となっているはずなので、開始をクリックする。
6. 「C:\ProgramData\ssh」に設定ファイルが生成される。(サービスを開始しないと設定ファイルはなにも無い。)
7. 設定ファイルが生成されていることを確認したら、一旦、OpenSSH SSH Serverを停止する。
8. 生成された、「sshd_config」をコピーしてバックアップしておく。
9. スタートボタンを押して、noteと打つ。メモ帳を右クリックして管理者として実行を押す。
10. メモ帳のファイル→開く から、sshd_configを開く。
11. sshフォルダの「sshd_config」に対して、以下の項目を設定して上書き保存。
(#がコメントアウトなので、必要な項目があれば、#を外して設定する。)
#Port 22
→Port XXXXX
XXXXXは、任意のssh接続に使いたいポート番号(1024 〜 65535)。デフォルトの22はセキュリティ的にそのまま使いたくないので変更。
#SyslogFacility AUTH
→SyslogFacility AUTH
OpenSSH7.7だと、AUTHPRIVは無くなってるっぽいので、AUTH。
#LogLevel INFO
→LogLevel VERBOSE
ログが細かく出るようにする。
#PermitRootLogin prohibit-password
→PermitRootLogin no
rootユーザーで操作しないので、rootユーザのログインを禁止。
#PubkeyAuthentication yes
→PubkeyAuthentication yes
公開鍵方式有効化。
#PasswordAuthentication yes
→PasswordAuthentication no
公開鍵方式のみに設定。パスワード認証は許可しない。
#PermitEmptyPasswords no
→PermitEmptyPasswords no
空パスワードでのアクセスは許可しない。
以下の指定を追加
ChallengeResponseAuthentication no
チャレンジレスポンス認証を無効化
AllowUsers user_name
接続できるユーザーを制限
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
↓
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
コメントアウトする。これがあると、Administratorsグループ所属の場合は、.sshの下のauthorized_keysを読んでくれない。
仕様環境: OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
12. サービスの「OpenSSH SSH Server」を開始し、スタートアップの種類を手動から自動に設定する。
設定2(鍵の生成)
1. スタートボタンをクリック→「cmd」と打つと、コマンドプロンプトと表示されるので、右クリックして管理者として実行
2. コマンドプロンプトが開いたら、下記のように打ってキーを生成
ssh-keygen -t ed25519 -N "mypassphrase" -C "comment"
ed25519は暗号化の種類。2020年時点だと、取り合えずこれ使っとけば良さげ。
mypassphraseの部分に自分が設定したいパスワードを入れる。
commentと書いた部分には、コメントを入れるわけだが、何も設定しないと、公開鍵にユーザー名とコンピューター名が入ってしまう。公開する意図がなければ、ダミーでいいので必ずコメントを入れる。
3. 下記のようにファイル保存先の指定が出るが、何も入力せずにEnterを押す。
Enter file in which to save the key (C:\Users\username/.ssh/id_ed25519):
※逆にこれを設定すると手動でいろいろ設定しないといけないので大変です。
4. C:\Users\USERNAME\.sshに、秘密鍵「id_ed25519」と公開鍵「id_ed25519.pub」が生成される。
5. .sshフォルダから、ファイルをコピーしバックアップする。
6. .sshフォルダの秘密鍵を削除し、公開鍵を「authorized_keys」にリネームする。
設定3(ディレクトリの権限設定)
.sshとauthorized_keysへのアクセス権に本人以外の書き込み権限があるとputtyなどでのアクセス時にエラーが出る。アクセス権をchmod 700となるようにする。cuiは面倒くさいんでguiでやる方法。
- .sshフォルダを右クリックしてプロパティを開く。
- セキュリティタブをクリック
- 詳細設定をクリック
- 継承の無効化をクリック
- 「継承されたアクセス許可をこのオブジェクトの明示的なアクセス許可に変換します。」をクリック
- 所有者の変更をクリック
7. 「選択するオブジェクト名を入力してください」に、自分のユーザー名を入力してEnter(例: ユーザー名が「taro」なら「taro」と打ってEnter)
8. 本人以外のアクセス許可がいたら削除(SYSTEM、Administrators、Everyoneなど)
9. OKで閉じる。
10. 同様に「authorized_keys」もプロパティを開き、本人以外のユーザーを削除する。「authorized_keys」は詳細設定の画面で、ユーザーをダブルクリックし、アクセス設定を読取りと書き取りのみにチェックを入れる。
設定4(puttygenインストール)
puttygenを落としてインストール。
putty-gdiなら、レジストリじゃなくiniファイルに設定が保存出来たりと便利なんで、gdiを使いたかったが、Ed25519の生成が出来なさそうだったので、本家の方をダウンロード。
gdiの方のputtygenの設定項目は暗号化の種類の所にEdDSAという記載だけで、Ed25519という記載は見当たりませんでした。HPを見たら、Ed448に対応してましたと記載はありましたが、Ed25519への対応の記載はなかったので、念のため本家の方のputtygenでEd25519の秘密鍵を生成しました。もしかしたら、gdiの方でも問題ないのかもしれませんが、試すの面倒なので試してません。
設定5(ppkファイルの生成)
puttyやWinSCPでアクセスするために、秘密鍵をppkファイルに変換します。
1. puttyのインストールフォルダにある、puttygen.exeを起動。
2. Loadから、ssh-keygenで作った秘密鍵を読み込み。
3. 秘密鍵に設定したパスフレーズを入力してOK
4. Ed25519にチェックを入れる。
5. SavePrivateKeyを押してファイル名を付けて保存。
設定6(putty-gdiインストール)
こっちの方が使いやすいんでこっち入れてます。
本家に追従してれば、gdiのputtygenがEd25519の生成に対応してなくても、putty.exeで使う分には対応してるんじゃないかと思い試してみたら使えたんで使ってます。
putty-gdiの最新版を落として、展開する。
展開したら、フォルダ「ini」と「ja-JP」に入っているものを、putty.exeと同じディレクトリに置く。
レジストリじゃなくiniファイルで設定できるようになり、日本語化される。
puttyでの接続テスト設定
1. puttyを起動したら下記設定をして開くを押す。
セッション
ホスト名: [ユーザー名]@localhost
ex) taro@localhost
ポート: 設定したポート番号
接続→SSH→認証
認証のためのプライベートキーファイル: 作成したppkファイル
2. 初めてアクセスするサーバーだけど本当に大丈夫かというSecurity Alertが出たらはいをクリック
3. 「Passphrase for key: 」という表示が出たら、秘密鍵を作るときに入れたパスワードを入力
問題なくログインできればOK。
外部から接続する場合。
ルーター介してるなら、ルーターのポート開放を設定
インターネット回線がV6プラスを使ってる場合使えるポート番号が限定されてるので注意。
ポート開放しただけで繋がらなかったら、取り合えずファイアウォールを一時停止してテスト。
これで繋がるなら、ファイアウォールに、sshdを通すように設定。
やり方は環境によるから適宜ググる。
WinSCP
ファイルのやり取りするなら、WinSCPが便利
※久々に弄ったのを確認してると、ファイル名に特定の文字列が入ってると表示されないのを確認。。。
「-」が2個入ってるフォルダー名付けたフォルダは表示されなかったりする。。。
なじぇ。。。
地味に引っかかった部分メモ
PasswordAuthentication
sshd_configに、
PasswordAuthentication no
を設定して、秘密鍵を設定せずにsshでアクセスしようとしたら下記のエラー
Permission denied (publickey,keyboard-interactive).
また、秘密鍵を設定しても同じエラーが発生。
sshd_configの一番下に書いてある、下記2行をコメントアウト
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
どうやら、administrators groupに属していると、.sshの中のauthorized_keysを読みにいかないようだ。
秘密鍵のアクセス権
下記のように打って動作チェックしようとしたら、秘密鍵のアクセス権でエラーが出た。
ssh -p [ポート番号] -i [秘密鍵] [ユーザー名]@localhost
Permissions for ‘[秘密鍵]’ are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
秘密鍵のパーミッションがガバガバすぎるということらしい。
秘密鍵ファイルのプロパティ→セキュリティタブ→詳細設定
所有者が自分のユーザー名になっていることを確認
継承の無効化をクリック
「継承されたアクセス許可をこのオブジェクトの明示的なアクセス許可に変換します。」をクリック
「Authenticated Users」と「Users」を削除(Everyoneなんかもいたら削除。基本的に、自分と、AdministratorsとSYSTEM以外削除)
Administratorsの権限を読み込みと書き込み以外外す。
秘密鍵のプロパティに戻り、セキュリティタブの編集をクリック
追加をクリックし、「選択するオブジェクト名を入力してください」に、自分のユーザー名を入力してEnter(例: ユーザー名が「taro」なら「taro」と打ってEnter)
アクセス許可の読み取りと書き込みのみにチェックを入れてOK
参考: ファイルの保存先
– | Path |
---|---|
Executable binary | %WINDIR%\System32\OpenSSH 例. C:\Windows\System32\OpenSSH |
sshd_config | %PROGRAMDATA%\ssh\sshd_config 例. C:\ProgramData\ssh\sshd_config |
authorized_keys | %USERPROFILE%\.ssh\authorized_keys 例. C:\Users\USERNAME\.ssh\authorized_keys |
参考
2017年版 SSH公開鍵認証で使用する秘密鍵ペアの作り方
https://qiita.com/wnoguchi/items/a72a042bb8159c35d056
コメント