以前はWindowsをSSHサーバーにしようと思うとCygwinを入れたりとか サードパーティー的なもので無理やり構築する必要がありましたが、 最近のアップデートでオフィシャルな感じで簡単にSSHサーバーにすることができるようになりました。
前にやってたこととか
以前、WindowsでCygwinを入れてSSHサーバーを立てたりしていました。
他にも色々とSSHサーバーを立てる
最近だとちょっと用途は違うかもしれませんが、Virtual Machine上にLinuxを入れて、とかで サーバーを立ててる人もいると思います。
また、数年前から公式なSSHツールの開発も進められていて 自分でインストールすることで使うこともできるようになっていました。
このツールが今はWindowsから簡単な操作で有効にできる様になっています。
OpenSSH Server
昨年のAnniversary UpdateでWindows本体に導入され、まずは開発者モードでのみ使える様になっていたOpenSSH Server(及びClient)。 さらに昨年末から今年始めにかけて配布されていたFall Creators Updateでこれらがオプション機能として開発者モードでなくても簡単に 追加できる様になりました。
このAnniversary Updateが入った時に、開発者モードにしていると自動でSSHサーバーが立ち上がる様になっていたとかで ちょっと騒ぎになった様なこともあった気がしますが、 現在のWindowsではSSHの機能はデフォルトではOFFになっています。
有効にするにはWindowsの設定からアプリへ行き、アプリと機能のページにあるアプリと機能の欄のオプション機能の管理を開きます。 ここで機能追加へ行くと OpenSSH Server (Beta)というのがあるのでこれをインストールします。 とりあえずのテストとかでも便利なのでついでに必要ならOpenSSH Client (Beta)も。
ここで2つ一気にインストールしようとすると失敗することもあるので ちゃんとオプション機能の管理ページにインストールしたものが追加されてるか確認してください。
出来たらPowerShellなりコマンドプロンプトを立ち上げて
> ssh localhost
とやってssh接続できるか試してみます。
Puttyとかでlocalhost
に向けてssh
してもチェックできます。
上手く行かない場合、サービスが動いているかチェックするため、
コルタナからサービスとかで検索してサービスのウィンドウを立ち上げ、sshd
という名前のサービスが実行中になっているかチェックします。
もしsshd
がなければ上のインストールの所で失敗してるのでもう一回チェック。
実行中になってなければ開始します。
今後も使いたいのであればスタートアップが自動になっているかなどもチェック。
うまくssh出来た場合、 ログインした先のデフォルトシェルはコマンドプロンプトになっていますが、 PowerShellを使いたい場合は
> powershell.exe
と実行するとPowerShellに切り替わります。
レジストリを書き換えるとPowerShellやWSL-bash.exeなどに変更できる、との 記述もありましたが下記にあるやり方だと変更が有効になりませんでした。
PowerShellを管理者権限で開いて
> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
とするとレジストリを書き換えて上のページの例にあるような設定に出来たのですが、
> net stop sshd
> net start sshd
としてSSHサーバーを再起動したりWindows自体を再起動してもSSHするとコマンドプロンプトのままでした。
そのうちまた要チェック。
また、次のWindows Subsytem for Linuxを使う場合には必ずこちらのsshサービスを止めてから 行ってください。 そうでないとこちらのサービスのほうが優先されてLinux側のSSHサーバーが見えなくなります。
もしくはどちらかのサービスのポートを変える必要があります。
Windows Subsystem for Linux (WSL)
もう一つの方法はWindows Subsystem for Linux (WSL)でLinuxを動かしてその中でsshサーバーを動かす方法。 WLSは数年前から開発者向けに使えるようになっていましたが、 Fall Creators Updateで正式に導入され、今は簡単に導入することが出来ます。
導入するにはWindowsの機能の有効化または無効化を開き Windows Subsytem for Linuxにチェックを入れます。
再起動して有効化した後、Microsoft Storeを開いてUbuntuなどを探してインストールします。
今はUbuntu以外にもDebianやopenSUSEとかいくつかありますがとりあえず今回はUbuntuで。
インストールするとスタートメニューにUbuntuがあるはずなのでそれを立ち上げます。 最初に
Installing, this may take a few minutes...
みたいな表示がでてしばらく待ちますが、これ、上手く言ってもこのまま進まないことがあるので、 しばらく立ったら適当にキーを押して進行状況を確認してみてください。
また、最初にインストールするとき、
It appears this distro's installation has become corrupted.
Please try uninstalling and reinstalling the app.
Installation Failed!
Error: 0x800700b7
Press any key to continue...
みたいなエラーが出ることがあります。(Errorコードが0x8000000dだったりもする。)
この場合、よくわからないのですが、とりあえず一度Ubuntuをアンインストールして もう一度インストールすると上手く行くことがあります。
上手く行った場合はユーザー名やパスワードを聞かれますが、これは Windowsのものとは別でも好きなものに設定できます。
Ubuntuが出来たらSSHサーバーを立ち上げますが、ストアからインストールしたUbuntuには 最初から入っているので、
$ sudo service ssh start
とすればサーバーをスタートできます。
が、最初にやったとき、
$ sudo service ssh start
[sudo] password for user:
* Starting OpenBSD Secure Shell server sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
[ OK ]
$ ssh localhost
Connection closed by 127.0.0.1 port 22
みたいな感じで上手くいきませんでした。OK
と出ていますがちゃんと起動できていませんし
実際に上に出てるファイルもありません。
ファイルの読み込み自体はクリティカルなところではないはずですが、色々と準備が足りない感じです。
そこで、一旦最初に入っているものをアンインストールして再インストールすると上手くいきました。
$ sudo apt-get remove --purge openssh-server
$ sudo apt-get update --fix-missing
$ sudo apt-get install openssh-server
とします。途中、一回update
を行っていますが、これを行わずにすぐにinstall
しようとすると
$ sudo apt-get install openssh-server
[sudo] password for user:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libfreetype6
Use 'sudo apt autoremove' to remove it.
Suggested packages:
ssh-askpass rssh molly-guard monkeysphere
The following NEW packages will be installed:
openssh-server
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 338 kB of archives.
After this operation, 912 kB of additional disk space will be used.
Err:1 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 openssh-server amd64 1:7.2p2-4ubuntu2.2
404 Not Found [IP: 2001:67c:1560:8001::14 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/o/openssh/openssh-server_7.2p2-4ubuntu2.2_amd64.deb 404 Not Found [IP: 2001:67c:1560:8001::14 80]
みたいなエラーが出たのでupdate
をしてから行ったところうまくいきました。
このインストールでssh鍵とかも出来て
$ sudo service ssh start
とすると無事立ち上がりsshで入れる様になりました。
ただし、注意として上にも書いたようにWindowsのOpenSSHサーバーが動いていると そちらが優先されるのでsshしたらコマンドプロンプトが立ち上がった、という場合には そちらを切るなどする必要があります。
また、このサーバーはUbuntuを立ち上げてる時だけ動いているので、 Ubuntuのターミナルを閉じると落ちてしまいます。
Ubuntu自体はバックグラウンドでも走れる様になったみたいで、 Windowsのスタートアップ時にsshサーバーを走らせるUbuntuを実行する みたいなことをするとsshサーバーを裏で動かすこともできる様ですが どうも上手く行かなかったのでまたそのうち試してみます。
ポート開放
これでローカルではSSHできるようになりましたが、外から入ろうとすると弾かれます。
コントロールパネル システムとセキュリティ Windows Defenderファイヤウォール 詳細設定 に行き受信の規則を選択して新しい規則を作ります。
- 規則の種類: ポート
- プロトコルおよびポート: TCP, 特定のローカルポート: 22
- 操作: 接続を許可する
- プロファイル: そのまま(でファルトは全部チェック。必要があれば入られたくないところのチェックを外す。
- 名前: ssh (適当に)
みたいな感じで新しい規則を作ります。
これでSSHの22番ポートが開放されるので他のPCからも入れる様になるはずです。
使えるか?
ということでWindowsの公式機能としてSSHサーバーを立てることができる様になりました。
コマンドプロンプト(or PowerShell)使いたい場合hには最初の方法、 Linuxを使いたい場合にはUbuntuなどをWLSで使う方法があります。
これで実際にどうこうできるか、という話ですが、 コマンドプロンプトとかを使い慣れていればその作業は十分にできると思います。
Linuxに関してはLinuxとしてはWLS下での制限が色々ありますがとりあえず簡単にSSHできる環境としては作れます。 ただ、サービスのように立ち上げるのがちょっと面倒。
さらには未だにGNU screenとかがユーザー権限で立ち上がらなかったりしますが。
また、Linux側からWindowsに対して色々自由にできるわけでもないので外からここに入って何ができるか、というのは微妙なところです。
一方、今回は中心の話題ではなかったですが、 OpenSSH Client (Beta) の方が通常使用ではインパクトが大きいかもしれません。
これを入れればWindowsでもサードパーティーなアプリを入れなくても他のマシンに対してSSHできる様になります。