セキュアシェル(SSH)プロトコルとOpenSSHプロジェクトは、Linux上では数十年にわたり存在しています。しかし、Windowsの場合は最近までWindowsワールドでOpenSSHはあまり受け入れられていませんでした。そのため、Windows Serverは通常、事前に構築されて準備が整っているわけではなく、セットアップが必要です。
このチュートリアルでは、Linuxと同様にWindows ServerにSSH接続する方法を簡単に学びます。WindowsにOpenSSHをインストール(または更新)、適切なファイアウォールルールの追加、公開鍵、パスワード、および証明書ベースの認証の設定方法を学びます。
前提条件
この記事の例とデモを効果的にフォローするためには、以下の要件を満たす必要があります。
- A Windows Server machine – This article will use Windows Server 2019 Datacenter. The server this tutorial will use will have a user account called june and will connect to the server at the IP address of 40.117.77.227 with a hostname of ataWindows.
- A local computer with PowerShell 7.1 installed. PowerShell 7.1 is available in Windows, Linux, and macOS. The examples in this article use PowerShell 7.1 in Windows 10.
OpenSSHのダウンロード
Linuxサーバーとは異なり、WindowsサーバーにはデフォルトでSSHサーバーが実行されていません。しかし、MicrosoftはWindows向けのOpenSSHのオープンソースポートをリリースしています。このリリースにより、WindowsマシンにSSHサーバーを設定することができます。
まず始めに、OpenSSHをダウンロードする必要があります。以下の手順に従ってください:
- リモートデスクトップ(RDP)またはお好みのデスクトップマネージャクライアントを使用して、Windows Serverのデスクトップに接続します。
2. Windows Serverのデスクトップで、管理者権限のあるWindows PowerShellを開きます。
3. 次に、以下のコードをコピーし、PowerShellウィンドウに貼り付けてEnterキーを押します。このスクリプトは、現在の作業ディレクトリに最新のOpenSSHリリース(この時点ではv8.1.0.0p1-Beta)をダウンロードします。
PowerShellコードを保存してOpenSSHをダウンロードする場合は、Windows PowerShell ISEやVisual Studio Codeなどのコードエディタを開いて保存することもできます。
4. OpenSSH-Win64.zip ファイルが現在の作業ディレクトリにあることを確認します。以下のコマンドを実行して確認できます。
下記のように、OpenSSH-Win64.zip ファイルがディレクトリ内に存在することがわかります。

OpenSSHのインストール
OpenSSH-Win64.zipをダウンロードしたら、次のステップはサーバーにOpenSSHをインストールすることです。期待している場合、インストールウィザードはありません。
- 同じPowerShellセッション内で、以下のコードをコピーしてPowerShellで実行します。このコードはOpenSSH-Win64.zipファイルの内容をC:\Program Files\OpenSSHに展開します。
2. ZIPファイルを展開した後、PowerShellで以下のコマンドを実行してスクリプトC:\Program Files\OpenSSH\install-sshd.ps1を実行します。このスクリプトは、OpenSSH SSHサーバーサービス(sshd)とOpenSSH認証エージェントサービス(sshd-agent)をインストールします。
期待される結果を以下で確認できます。

SSHサーバーが自動的に起動するようにするには、以下のコマンドをPowerShellで実行します。
SSHトラフィックを許可するためのWindowsファイアウォールルールの追加
この手順は、WindowsサーバーがWindowsファイアウォールを使用している場合にのみ適用されます。サードパーティのファイアウォールを使用しているサーバーの場合は、ポート22を許可する方法に関するファイアウォールのドキュメントを参照してください。
インストールしたOpenSSHは、自動的にSSHトラフィックを許可するファイアウォール例外ルールを作成しません。したがって、次のタスクはファイアウォールルールを手動で作成することです。
新しいWindowsファイアウォールルールを作成する最も簡単な方法の1つは、PowerShellとNew-NetFirewallRule
コマンドレットを使用することです。以下のコマンドは、Allow SSHと呼ばれるファイアウォールルールを作成し、ポート22へのすべての受信TCPトラフィックを許可します。
以下のコマンドをコピーしてPowerShellで実行してください。
以下のスクリーンショットは、ファイアウォールルールを作成した後のPowerShellでの期待される出力を示しています。

パスワード認証を使用してSSHで接続する
この時点で、WindowsにOpenSSHをインストールし、初期のサーバー構成を行いました。次のステップは、SSHを介して実際に接続できるかどうかをテストすることです。
新しく構成されたSSHサーバーをテストするには、ローカルコンピュータでssh
コマンドを実行します。
このセクションの手順は、Linux SSHサーバーに接続する場合も同様です。
1. 今回はローカルコンピュータからPowerShellを開きます。
2. 次に、以下のコマンドを実行してSSHログインプロセスを開始します。ユーザー名とWindows Serverのリモートホストを変更してください。
3. サーバーに初めて接続する場合、ホストの信頼性が確立されていないというプロンプトが表示されます。このメッセージは、あなたのコンピューターがまだリモートホストを認識していないことを意味します。 yesと入力してEnterキーを押して続行してください。
4. パスワードが要求されたら、アカウントのパスワードを入力してEnterキーを押します。

5. ログインした後、以下のスクリーンショットで示されているように、リモートホストのコマンドプロンプトが表示されます。リモートホストのセッションに入力したことを確認したい場合は、hostname
と入力してEnterキーを押します。コマンドはリモートコンピューター名を返すはずです。

OpenSSHのデフォルトシェルをPowerShellに変更する
Windows SSHサーバーに最初にログインしたとき、デフォルトのシェルまたはコマンドインタープリターがCMDであることに気付くでしょう。CMDをデフォルトのSSHシェルとして使用するのは問題ありませんが、代わりにPowerShellをデフォルトのシェルとして使用したい場合は、次の手順に従ってください。
デフォルトのOpenSSHシェルをCMDからPowerShellに変更するには:
まず、Windows Serverで管理者権限のあるPowerShellウィンドウを開きます(すでに開いていない場合)。
次に、レジストリキーHKLM:\SOFTWARE\OpenSSHにDefaultShellという名前の新しいレジストリ文字列値を作成します。 DefaultShell文字列のデータをWindows PowerShellパスC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeに設定します。
以下のスクリーンショットは、コマンドの予想される結果を示しています。

公開キー認証の構成
前のセクションでは、ユーザー名とパスワードで接続しました。これは機能しますが、SSHサーバーとの認証をより安全に行う方法は、キーペアを使用することです。
要するに、キーペアは、公開鍵と秘密鍵と呼ばれる2つの鍵から成り、セキュリティ資格情報のセットを構成します。
公開鍵はサーバーに保存され、秘密鍵はローカルコンピューターに残ります。秘密鍵はパスワードのように扱う必要があります。秘密鍵が漏洩すると、誰でもそれを使用してSSHサーバーにアクセスできます。
管理者_authorized_keysファイルの準備
公開鍵はサーバー上に配置する必要があります。しかし、どこに配置すべきか?WindowsのOpenSSHでは、SSHサーバーは公開鍵をC:\ProgramData\ssh\administrators_authorized_keysファイルから読み込みます。ただし、このファイルはデフォルトでは存在しません。まず、このファイルを作成する必要があります。
以下の手順に従って、administrators_authorized_keysファイルを作成し、適切なアクセス制御リスト(ACL)を設定します。
Windows Serverでの手順:
1. 管理者権限のあるWindows PowerShellコンソールを開きます。
2. 以下のコマンドをコピーしてPowerShellで実行します。このコマンドは、administrators_authorized_keysファイルをNew-Item
コマンドレットを使用して作成します。
以下は、スクリーンショットと似た結果が表示されるはずです。

3. 次に、ssh_host_dsa_keyファイルに現在割り当てられているACLを取得し、そのACLをadministrators_authorized_keysファイルにコピーします。これを行うには、以下のコマンドを実行します。
OpenSSHサービスでは、administrators_authorized_keysファイルへのアクセスがAdministratorsグループとSYSTEMアカウントに制限されている必要があります。そして、ssh_host_dsa_keyのACLをadministrators_authorized_keysにコピーすることは意味があります。なぜならACLは既に設定されているからです。
4. 今、Windows Explorerを開いてください。
5. C:\ProgramData\ssh\フォルダに移動してください。
6. administrators_authorized_keysファイルを右クリックし、プロパティをクリックしてください。
7. プロパティページで、セキュリティタブをクリックし、詳細をクリックします。

8. その後、アクセス許可が以下の画像のように表示されているか確認してください。

新しいSSHキーペアの生成
新しいSSHキーペアを生成するには、Windows 10(およびそれ以降)に組み込まれているOpenSSHクライアントツールの一部であるssh-keygen
コマンドを使用します。これはほとんどのLinuxオペレーティングシステムでも利用可能です。
このセクションに示す例は、WindowsおよびLinuxコンピューターの両方で動作します。
ローカルコンピューターで、PowerShellコンソールで:
1. 以下のコマンドを実行して、ホームフォルダの.sshディレクトリに移動してください。
次に、ssh-keygen
コマンドを入力してEnterキーを押します。キーを保存するファイルの場所を入力するように求められた場合は、デフォルトの場所を保持してEnterキーを押します。これにより、SSHクライアントが自動的にSSHキーを認証する際にSSHキーを見つけることができます。
Windowsでは、デフォルトのキーファイルはC:\Users\<username>\.ssh\id_rsaです。
次のプロンプトで、パスフレーズを空白のままにしてください。この時点では、テストにパスフレーズを使用する必要はありません。
プライベートキーにパスフレーズを追加すると、そのセキュリティが大幅に向上します。パスフレーズは、プライベートキーへの第二の要素認証(2FA)として機能します。
コマンドによって、id_rsa(プライベートキー)とid_rsa.pub(公開キー)の2つのファイルが作成されたことに気付くでしょう。

公開キーをWindows SSHサーバーに展開する
プライベートパブリックキーペアを生成したので、次のステップは、公開キーをSSHサーバーのC:\ProgramData\ssh\administrators_authorized_keysファイルにコピーすることです。
ローカルコンピューターで、PowerShellコンソールで次のように入力します:
1. 以下のコードをコピーしてPowerShellで実行します。最初にユーザー名とIPアドレスを変更してください。各コマンドの上にあるコメントを参照して、各コマンドの目的を知ることができます。
2. パスワードが求められたら入力し、sshが公開鍵をコピーするように進みます。以下に示すような類似の結果が表示されます。

公開鍵認証を使用したSSH接続
SSHサーバーに公開鍵をコピーしたので、認証にパスワードを使用する必要がなくなりました。下記のように、sshはパスワードを求めませんでした。

証明書認証の設定
公開鍵認証と同様に、証明書認証はパスワードなしまたはパスフレーズで保護されています。証明書ログインを有効にするには、SSHサーバーに公開鍵を展開しないでキーペアを生成する手順を踏みます。
SSHサーバーのauthorized_keysやadministrators_authorized_keysファイルに公開鍵をマッピングする必要はありません。代わりに、公開鍵は証明機関(CA)キーを使用して署名されます。
証明機関(CA)キーの作成
署名のためのCAキーの生成は、この記事で前述したユーザーキーペアの生成と似ています。ただし、今回は新しいCAキーのファイル名を指定する必要があります。そのために、PowerShellコンソールでWindows Server上で次の操作を行います:
以下のようにssh-keygen
コマンドを実行します。このコマンドはCAキーをC:\ProgramData\ssh\ca_userkeysに作成しますが、別のファイル名を使用しても構いません。異なるファイル名を使用してもCAキーの機能に影響はありません。
パスフレーズが求められたら、パスフレーズを空白のままにしてEnterキーを押します。
以下に、コマンドによって2つのファイルが作成されたことがわかります。ca_userkeysは秘密鍵であり、ca_userkeys.pubは公開鍵です。

CAキーを生成したので、SSHサーバーにCAを信頼し、CAキーをどこに見つけるかを伝える必要があります。これを行うには、C:\ProgramData\ssh\sshd_configファイルに新しい行TrustedUserCAKeys path/to/ca_userkeys.pub
を追加します。
以下のコマンドを実行して、ファイルsshd_configに構成項目を追加します。
ユーザーの公開鍵を署名する
この時点で、CAキーが生成され、SSHサーバーがCAの公開鍵ファイルを信頼するように構成されています。残りは、ユーザーの公開鍵を署名することです。
ローカルコンピューターのPowerShellコンソールで次の操作を行います。
1. id_rsa.pub
ファイルを使用して、SCPコマンドを使用してSSHサーバーのホームドライブにコピーします。ユーザー名とIPアドレスを正しい値に変更してください。
2. Windowsサーバーにsshでログインします。 ログインしたら、ssh-keygen
を実行してユーザーの公開鍵を署名します。 下記のコマンドは複数のパラメータを使用していることに気付くでしょう。 それぞれを詳しく見ていきましょう。
-s C:\ProgramData\ssh\ca_userkeys
– 署名する公開鍵のCAキーの場所を指定します。 この例では、CAキーは生成したものです。-I id_username
– 署名されたユーザー公開鍵に割り当てるIDを指定します。id_username
の値を任意の名前に変更します。-V +4w
– このパラメータは署名された鍵の有効期間を指定します。 この例では、+4w
は署名されたユーザーキーが4週間有効であることを意味します。 この値は好みに応じて変更できます。-n username
– これは署名された公開鍵の所有者のユーザー名です。<path to id_rsa.pub>
– これは署名するユーザーの公開鍵の場所です(Windows)。
SSHセッションでコマンドを実行した後、以下に示すような類似の出力が得られるはずです。 コマンドが新しいファイルid_rsa-cert.pubを生成したことがわかります。 これが署名されたユーザー証明書です。

3. 今度は、ローカルコンピューターのPowerShellセッションに戻り、サーバーからid_rsa-cert.pubファイルをローカルコンピューターにコピーします。 コマンドを実行する前に、ユーザー名とIPアドレスを正しい値に変更してください。
コピーが完了すると、ホームフォルダーに署名されたユーザー証明書が保存されています。

証明書認証を使用してSSHで接続します。
証明書認証を構成し、今やユーザー証明書を取得しています。これでSSHサーバーに証明書認証で接続できるかどうかをテストする必要があります。
証明書を使用してSSHに接続するコマンドは、パスワードまたは公開鍵を使用する場合と同じです。ただし、以前に公開鍵認証を有効にした場合は、まず無効にしてください。さもないと、SSHは証明書の代わりにキーペアを継続して使用します。
キーペアを無効にするには、administrators_authorized_keysファイルから公開鍵を削除します。これを行うには、以下の手順に従います。
次のコマンドは、administrators_authorized_keysファイル全体を空にします。すべてのマップされた公開鍵を削除したくない場合は、テキストエディタを使用して各ファイルから選択した公開鍵を手動で削除してください。
Windows ServerにSSH接続している間:
1. PowerShellで以下のコードを実行してadministrators_authorized_keysファイルを空にします。
2. この時点で、authorized_keysおよびadministrators_authorized_keysファイルが空であることがスクリーンショットで確認できます。

3. exit
と入力し、Enterキーを押してSSHセッションから切断します。PowerShellセッションに戻ります。
4. 公開鍵を削除した後、次のSSHログイン試行では証明書認証が使用されます。ログイン体験は公開鍵認証と同じです。

結論
これで、OpenSSH Windowsサーバーをゼロから設定し、さまざまな認証手段の探索と設定まで行いました。これで、Linuxと同じようにWindowsサーバーに接続できます!