Linuxサーバへのリモートログインにはsshが使われることが多い。sshは開発者や管理者に欠かすことのできない機能であり、Linuxサーバへの最初の入り口でもある。最近ではクラウドやコンテナにLinux環境を構築することが多いため、物理的なLinuxサーバを見たことがないとか、Linuxサーバの物理コンソールからログインしたことがないといったユーザーのほうが多いのではないだろうか。

こうなってくると、WindowsでもLinuxと同じようにsshでログインできるようにしたい。同じツールでログインできたほうが便利だ。

Windowsにssh経由でログインするというのはあまりイメージが湧かないかもしれないが、MicrosoftはすでにWindows 11やWindows 10にOpenSSHサーバを機能として導入しており、ssh経由でログインできるようになっている。セットアップは少々面倒だが、WindowsやPowerShellを活用していく上ではぜひとも利用したい機能だ。今回は、Windows 11およびWindows 10でOpenSSHサーバを有効化する方法を説明する。

OpenSSHサーバセットアップ (Windows 11)

Windows 11では設定プリケーションからOpenSSHサーバを有効化できる。設定アプリケーションを起動し、 「アプリ」→「オプション機能」→「機能を表示」→「OpenSSHサーバー」にチェック→「次へ」→「インストール」を選択し、システムを再起動した後に機能を有効化できる。

OpenSSHサーバーがインストールされた状態

OpenSSHサーバの設定ファイルは「C:\ProgramData\ssh\sshd_config」だ。次のようにデフォルトの設定ファイルをコピーして編集する。なお、以降の作業はすべて管理者権限のWindows Terminalで実行する。

copy C:\WINDOWS\SYSTEM32\OPENSSH\sshd_config_default C:\ProgramData\ssh\sshd_config
notepad C:\ProgramData\ssh\sshd_config

C:\ProgramData\ssh\sshd_configは最後の2行は次のような内容になっていると思う。

Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

この行の先頭に#を挿入してコメントアウトする。

#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

OpenSSHサーバへのログインは、公開鍵暗号を基本と考えよう。

ただしWindowsでは、C:\ProgramData\ssh\administrators_authorized_keysが存在し、かつ適切なアクセス許可が設定されていないと、C:\ProgramData\ssh\administrators_authorized_keysをチェックしに行った後で公開鍵認証そのものが無効になってしまう。つまり、個々のユーザーの$HOME/.ssh/authorized_keysよりもC:\ProgramData\ssh\administrators_authorized_keysが優先されてしまい、$HOME/.ssh/authorized_keysに公開鍵を配置しておいても使われないのだ。これはかなり不便である。LinuxやMacといったほかのOSと同じように、$HOME/.ssh/authorized_keysの公開鍵を使った公開鍵認証が有効になってほしい。

$HOME/.ssh/authorized_keysを有効にする方法はいくつかある。ここでは前述したようにC:\ProgramData\ssh\sshd_configの該当部分をコメントアウトすることで、$HOME/.ssh/authorized_keysを有効にする。

OpenSSHサーバにアクセスする必要があるので、ファイアウォールでOpenSSHサーバへのアクセスを許可する必要がある。まず、次のようにコマンドを実行してファイアウォールの設定を確認する。

Get-NetFirewallRule -Name *ssh*

Windows 11では最初からOpenSSHサーバへのアクセスは許可されているはずだが、もし許可されていない場合には、次のようにコマンドを実行してOpenSSHサーバへのアクセスを許可する。

New-NetFirewallRule -Name  -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

ここまで作業したら、次のコマンドでOpenSSHサーバを起動する。

Start-Service sshd

もし、OpenSSHサーバを起動した後でC:\ProgramData\ssh\sshd_configを書き換えたりしたのであれば、次のコマンドでOpenSSHサーバを再起動する。

Restart-Service sshd

このままだと、Windows 11を再起動するごとに手動でOpenSSHサーバを起動しなければならない。そこで、Windows 11起動時にOpenSSHサーバが自動的に起動するように、次のコマンドを実行してOpenSSHサーバの自動起動を有効化する。

Set-Service -Name sshd -StartupType 'Automatic'

sshでログインした場合のシェルは「cmd.com」になっている。これをPowerShell 7へ変更しよう。次のコマンドを実行することでsshでログインした際のシェルがPowerShell 7となる。

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\PowerShell\7\pwsh.exe" -PropertyType String -Force

これでWindows 11におけるOpenSSHサーバのセットアップは完了だ。

OpenSSHサーバセットアップ (Windows 10)

Windows 10におけるOpenSSHサーバのセットアップ方法はWindows 11とほとんど同じだ。ただし、OpenSSHを設定アプリケーションで有効化する方法が(というかラベルの名前が)少しだけ異なっている。Windows 10では設定アプリケーションから「アプリ」→「オプション機能」→「機能の追加」→「OpenSSHサーバー」にチェック→「インストール」を選択した後、システムを再起動することでOpenSSHサーバを有効化できる。

OpenSSHサーバーがインストールされた状態

以降の作業は管理者権限のWindows Terminalまたはほかのターミナルで実行する。まず、デフォルトの設定ファイルをコピーして編集する。

copy C:\WINDOWS\SYSTEM32\OPENSSH\sshd_config_default C:\ProgramData\ssh\sshd_config
notepad C:\ProgramData\ssh\sshd_config

$HOME/.ssh/authorized_keysを有効化するために、C:\ProgramData\ssh\sshd_configファイルの次の2行を編集する。

Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

次のように最後の2行をコメントアウトして保存する。

#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

続いて、OpenSSHサーバにアクセスできるようにファイアウォールの設定を変更する。まず、次のようにコマンドを実行してOpenSSHサーバに関するファイアウォールルールを確認する。Windows 10ではデフォルトでOpenSSHサーバへのアクセスは禁止されていると思う。

Get-NetFirewallRule -Name *ssh*

次のようにコマンドを実行してOpenSSHサーバへのアクセスを許可する。

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

ここまで設定したら次のコマンドを実行してOpenSSHサーバを起動する。

Start-Service sshd

Windows 10を再起動するとOpenSSHサーバは停止してしまうので、次のように自動起動の設定を有効化する。

Set-Service -Name sshd -StartupType 'Automatic'

OpenSSHサーバ起動後にC:\ProgramData\ssh\sshd_configを書き換えたりしたのであれば、次のコマンドでOpenSSHサーバを再起動する。

Restart-Service sshd

sshでログインした場合のシェルは「cmd.com」になっている。これをPowerShell 7へ変更する。次のコマンドを実行することでsshでログインした際のシェルがPowerShell 7となる。

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\PowerShell\7\pwsh.exe" -PropertyType String -Force

これでWindows 10におけるOpenSSHサーバのセットアップは完了だ。

OpenSSHサーバの動作を確認

セットアップがうまくいけば次のようにOpenSSHサーバの動作を確認できる。

OpenSSHサーバの動作を確認

OpenSSH経由でWindowsにログインした場合、Windowsの機能をフルに活用するにはいくらか自分で工夫する必要があり、PowerShellスクリプトもそこで大いに役に立つ。次回以降はこの辺りの説明を行っていく。