Windows環境でSSHサーバーを有効化する

SSHサーバー機能は、最新のWindowsであれば標準機能として利用可能です。

本記事では、SSHサーバーの有効化手順について記載をします。

なぜ、SSHサーバーが必要だったのか

Windows端末同士であれば、リモートデスクトップ接続を利用されるかと思います。

私がSSHサーバー環境が必要になったのは以下のケースででした。

  • コマンドだけで操作をしたい
  • Linuxなど別のプラットフォームから接続したい

前提条件

Windows Server 2022、Windows Server 2019、Windows 10、Windows 11で対応しています。

PowerShellを管理者権限で開いてください。

以下コマンドを実行してPowerShellのバージョンを確認します。

$PSVersionTable.PSVersion

上記のようにメジャーバージョンが5以上、マイナーバージョンが1以上であることを確認します。

次にビルトインAdministatorグループのメンバーであることを確認します。

(New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Trueが返れば大丈夫です。

次のステップに進めます。

手順

Windows 用 OpenSSH のインストール

インストールの状態を確認します。

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

OpenSSH.ServerのStateがNotPresentなのでインストールされていない状態です。

次のコマンドでインストールします。

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

以下の出力が返れば成功です。

OpenSSHサーバーの起動

インストール作業後、OpenSSHサーバーのサービスは停止した状態です。

Get-Service -Name sshd

以下コマンドで起動と確認をします。

Start-Service sshd

Get-Service -Name sshd

サービスの初期状態は、Manual(手動で開始が必要)となっています。

OS起動時に自動的にsshdサービスを起動させる場合は以下のようにします。

Set-Service -Name sshd -StartupType 'Automatic'

サービスの状態確認は以下になります。

(Get-Service -Name "sshd").StartType

ファイアウォールのアクセス許可設定

以下コマンドで22/tcpのアクセスを許可します。

if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
    Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
    New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
    Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
}

「Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists.」の出力が返ればアクセス許可設定は終了です。

ファイアウォールの「受信の規則」で「OpenSSH SSH Server (sshd)」という名前の規則が作成されます。

ローカルユーザーの作成

SSHサーバー接続用のローカルユーザーを用意します。

例えば、ssh_connectというローカルユーザーでパスワードを"P@ssw0rd_x85C"とする場合は以下のようにします。

New-LocalUser -Name "ssh_connect" -Password (ConvertTo-SecureString -String "P@ssw0rd_x85C" -AsPlainText -Force)

接続確認

sshコマンドを実行し接続できるか確認します。

ssh_connectローカルユーザーがlocalhostに接続する場合は以下のようにします。

ssh ssh_connect@localhost

成功すれば、プロンプトの表示が以下のように変わります。

あとはコマンド操作で自由に作業を行います。

トラブルシュート

0x800f0954エラーコードの対処方法

OpenSSHサーバー機能のインストール中に以下のエラーが発生した場合の対処方法を記載します。

更新プログラムの取得をWSUS経由で取得している環境で発生したケースを想定しています。

PS C:\> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Add-WindowsCapability : Add-WindowsCapability に失敗しました。エラー コード = 0x800f0954
発生場所 行:1 文字:1
+ Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Add-WindowsCapability], COMException
    + FullyQualifiedErrorId : Microsoft.Dism.Commands.AddWindowsCapabilityCommand

ローカルグループポリシーを開き、「コンピューターの構成」-「管理用テンプレート」-「システム」-「オプション コンポーネントのインストールおよびコンポーネントの修復のための設定を指定する」を「有効」にし「Windows Server Update Services(WSUS)の代わりに Windows Update から修復コンテンツとオプションの機能を直接ダウンロードする」にチェックを入れ、「OK」をクリックします。

次に以下コマンドでグループポリシーのアップデートをします。

gpupdate /force

グループポリシーが更新された状態で、OpenSSHサーバーのインストールコマンドを実行すれば、成功するはずです。

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

おわりに

以上が即席でWindows環境のOpenSSHサーバー機能を有効化しssh接続をする手順でした。

必要な時のみsshdサービスを起動し、不要な場合はStop-Service sshdコマンドで停止状態にしておくとよいでしょう。

ファイアウォールの設定で送信元を絞る対策も良いかと思います。

自動起動設定にしていると意図せずサービスが起動していた事態を招きかねません。

利用しない場合、私は以下コマンドで無効状態にしています。

Set-Service -Name sshd -StartupType Disabled

(Get-Service sshd).starttype

OpenSSHサーバーによる接続ユーザーの制限や鍵認証などのセキュリティ対策については別記事で書くかもしれません。

執筆担当者プロフィール
宮久保 良彦

宮久保 良彦(日本ビジネスシステムズ株式会社)

モダンワークプレイス部に所属。 Azureに関連する提案、設計、構築を担当しています。 自作PCのカスタマイズが趣味です。

担当記事一覧