Windowsには標準でSSHのサーバもクライアントも用意されていないが、
Windows版OpenSSH のプレリリース版がある。
ちょっと前に、それがリリース段階になったとニュースがでていた。
Microsoftは5月1日(米国時間)、「OpenSSH Security Testing Kick Off|Windows PowerShell ...
まだ正式版ではないが、インストールしてみる。
インストール環境:Windows10 64bit
ダウンロード
ここから最新版(インストール時の最新は v0.0.15.0)をダウンロードする。
"Win32-OpenSSH" ってなっているが、64bitもある。

"OpenSSH-Win64.zip" をダウンロードして
"
Install Win32 OpenSSH"を参考に進める。
ダウンロードしたファイルを解凍し、任意の場所に置く。
C:\Program Files\OpenSSH-Win64
パスを通しておく。[システムの詳細設定] から、「環境変数」をクリック。

[システム環境変数] の "Path" を選択して、[編集] をクリック。

[新規] をクリックして、OpenSSHフォルダの配置先を入力。

SSHサーバーインストール
PowerShellを管理者権限で起動する。
OpenSSHフォルダに移動。
cd 'C:\Program Files\OpenSSH-Win64'
実行ポリシーの変更
現在の設定を確認。
Get-ExecutionPolicy
スクリプトの実行が禁止されているので、
実行ポリシーを「制限無し(Unrestricted)」に変更。
(インストールが完了したら実行ポリシーを元の「制限あり(Restricted)」に戻します)
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 |
sshd と ssh-agent サービスのインストール
コマンドを実行する。
.\install-sshd.ps1
[SC] SetServiceObjectSecurity SUCCESS [SC] ChangeServiceConfig SUCCESS [SC] ChangeServiceConfig2 SUCCESS sshd and ssh-agent services successfully installed |
"successfully installed" と表示されれば完了。
ホストキーの生成
コマンドを実行する。
(ウイルスバスターで警告が出た。自己責任で実行許可する)
.\ssh-keygen.exe -A
C:\Program Files\OpenSSH-Win64\ssh-keygen.exe: generating new host keys: RSA DSA ECDSA ED25519 |
.\FixHostFilePermissions.ps1 -Quiet
"FixHostFilePermissions.ps1"は、v0.0.15.0 で追加されました。
ファイルのパーミッションを修正するためのようです。
(参考:
OpenSSH utility scripts to fix file permissions)
Windowsファイアウォールの設定
TCPポート 22番の受信許可設定を行う。
コマンドを実行する。
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH
追加された設定を確認してみる。
[コントロールパネル] - [Windowsファイアウォール] から、
[詳細設定] を選択する。

[受信の規制] を確認すると、
"SSH" の名称で規制が追加されているはず。

"SSH" のプロパティを確認すると、
[プロトコルおよびポート] タブで、TCPポート22番が設定されているのがわかる。

sshd と ssh-agent サービスの起動
コマンドを実行する。
Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic
追加された設定を確認してみる。
[コントロールパネル] - [管理ツール] から、
[サービス] をクリックし、サービスの一覧を表示させる。

"sshd" と "ssh-agent" のスタートアップの種類が、"自動"になっているはず。
この設定でWindowsが起動すれば、自動的に "sshd" と "ssh-agent" のサービスの起動する。
再起動させ、確認してみる。
再起動後、サービスの一覧を表示させると、

状態が、"実行中"となっているのがわかる。
実行ポリシーを元に戻す
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 |
設定を確認し、元に戻っていることを確認する。
Get-ExecutionPolicy
他の端末からWindowsにsshでログイン
Tera Termを使い、ログインしてみる。
SSHサーバーとなるWindowsPCのIPアドレスとポート番号を入れ、接続する。

サーバーの確認と、

アカウント認証が行われる。
SSHサーバーとなるWindowsPCのアカウントとパスワードを入れ、[OK] をクリック。

認証されると、WindowsPCに接続できた。

SSHクライアントとして使う
パスは通してあるので、
コマンドプロンプト または PowerShell で、コマンドを実行する。
(ウイルスバスターで警告が出た。自己責任で実行許可する)
ssh 接続先ユーザー名@接続先IPアドレス
接続はできたが、はっきり言って、画面はコマンドプロンプトやPowerShellのままなので、
あまり使い勝手は良いものではない。
SSHサーバーのポート番号を変更
SSHサーバーのポート番号の初期値は、22番ポートを使う。セキュリティ向上のため、ポート番号の変更をしておく。
ポート番号を変更
PowerShellを管理者権限で起動し、OpenSSHフォルダに移動。
"sshd_config" ファイルを開く。
notepad .\sshd_config
#Port 22
↓コメントアウトを外し、22番以外に変更。
Port 50022
変更したらファイルを保存。
Windowsファイアウォールの変更
インストール時には、ポート22番で設定をした。変更したポート番号で、ファイアウォールも変更する。
[コントロールパネル] - [Windowsファイアウォール] - [詳細設定] から、
[受信の規制] をクリック。
"SSH" を選択し、右クリックから [プロパティ] を選択し、
[プロトコルおよびポート] タブで、変更したポート番号に合わせる。

これで、他の端末からsshでログインするときには、
22番ではなく、変更したポート番号が有効となる。
公開鍵認証
セキュリティを高めるため、パスワード認証によるアクセスを禁止し、公開鍵認証を有効にする。
公開鍵認証を有効化
PowerShellを管理者権限で起動し、OpenSSHフォルダに移動。
"sshd_config" ファイルを開く。
notepad .\sshd_config
#PubkeyAuthentication yes
↓コメントアウトを外す。
PubkeyAuthentication yes
#PasswordAuthentication yes
↓コメントアウトを外し、"no" を設定。
PasswordAuthentication no
sshdサービスを再起動させれば、
パスワード認証が禁止になり、公開鍵認証が有効となる。
公開鍵、秘密鍵ペアの作成①
SSHクライアント側で作成し、SSHサーバーへ公開鍵を設定する。
Tera Termを使い作成する。
[設定] - [SSH鍵生成] を選択。

デフォルトのままでいいので、
(鍵の種類: RSA 、ビット数:2048)
[生成] をクリック。

生成が完了したら、鍵を保存。
[公開鍵の保存]:適当に名前(*.pub)を付けて保存する。(id_rsa.pub)
後でSSHサーバー側に渡す鍵となる。

[秘密鍵の保存]:適当に名前(拡張子なし)を付けて保存する。(id_rsa)
パスフレーズは空のままでも大丈夫。
SSHクライアント(
Tera Term)で参照する鍵となる。

公開鍵をSSHサーバーに設定
作成した公開鍵をSSHサーバーにUSBメモリでも何でもいいので渡す。
SSHサーバーでの公開鍵の保存先は、
C:\Users\<ユーザー>\.ssh
新規保存の場合は、渡した公開鍵(*.pub)を
"authorized_keys" に、リネームする。
(補足) コマンドプロンプトで処理しようと、 type .\id_rsa.pub >> authorized_keys と実行したら、認証に失敗した。 よくみたら作成された"authorized_keys"ファイルが UTF-16 に変換されていた。 改行コードもCRLFになった。 これでは鍵ペアにならず認証されない。 なので、そのままリネームした。 |
既に、"authorized_keys" が存在する場合は、
テキストエディタで、"authorized_keys" と、公開鍵(*.pub) を開き、
公開鍵(*.pub)の内容を、"authorized_keys" へ貼り付ければいい。
SSHクライアントから公開鍵認証で接続
Tera Termを使い、ログインしてみる。
ホストとTCPポートを指定して接続。
SSH認証にて、
[RSA/DSA鍵を使う] を選び、
作成した秘密鍵を選択する。
ユーザー名とパスフレーズを入力して、[OK] をクリック。

認証され、接続できた。

公開鍵、秘密鍵ペアの作成②
①では、クライアント側で鍵を作成した。試しに、今度は、サーバー側で作成してみる。
SSHサーバーでの公開鍵の保存先で作成する。
PowerShellを起動(管理者権限では無い)し、.sshフォルダに移動。
cd 'C:\Users\<ユーザー>\.ssh'
鍵を作成する。Enterキーを押し、進める。
パスフレーズは空のままで大丈夫。
ssh-keygen -t rsa
Generating public/private rsa key pair. Enter file in which to save the key (C:\Users\********/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in C:\Users\********/.ssh/id_rsa. Your public key has been saved in C:\Users\********/.ssh/id_rsa.pub. .... |
ここで、作成された "id_rsa.pub" のプロパティを表示、
[セキュリティ]タブを見てみると、
[グループ名またはユーザー名] に、"Everyone" が含まれていた。

これがあると認証に失敗したので、"Everyone" を削除する。
[編集] をクリックする。
"Everyone" を選択し、[削除] をクリック。

あとは、公開鍵ファイル名(id_rsa.pub)を、
同様に "authorized_keys" にリネームする。
秘密鍵は、
今度は逆にクライアント側に渡す。
この秘密鍵を使い、
SSHクライアントから公開鍵認証で接続する。アンインストール
インストール手順同様に、
PowerShellを管理者権限で起動し、OpenSSHフォルダに移動。
実行ポリシーを変更し、スクリプトの実行を許可しておく。
sshd と ssh-agent サービスをアンインストールする
コマンドを実行。
.\uninstall-sshd.ps1
sshd successfully uninstalled ssh-agent successfully uninstalled |
"successfully uninstalled" と表示されれば完了。
実行ポリシーを元に戻しておく。Windowsファイアウォールの削除
追加したWindowsファイアウォールも、忘れずに削除しておく。
[コントロールパネル] - [Windowsファイアウォール] - [詳細設定] から、
[受信の規制] をクリック。
"SSH" を選択し、右クリックから [削除] を実行する。

まとめ
Windowsには、SSHクライアントとして
Tera Term や
PuTTY があるので、SSHクライアントのためにインストールするほどでも無いと思った。
WindowsでSSHサーバーになれるのであれば、SSH ポートフォワーディングが使えるので、
【Windows】 - 【Windows(SSHサーバー)】- 【VirtualBox(ゲストOS)】
という接続ができる。
VirtualBoxを使い動いているゲストOSへ対して、他PCからアクセスできるようになるので
VirtualBoxが入っているPC以外を使い作業していたときに、作業効率が良くなった。
VirtualBox: ホストOSからゲストOSへのアクセスUbuntu サーバの初期設定 sshUbuntu サーバの初期設定 ssh(秘密鍵)