Windows Server での OpenSSH の設定方法[完全ガイド]

セキュアシェル(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をダウンロードする必要があります。以下の手順に従ってください:

  1. リモートデスクトップ(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などのコードエディタを開いて保存することもできます。

## ネットワーク接続プロトコルをTLS 1.2に設定
## OpenSSHの最新リリースURLを定義
 $url = 'https://github.com/PowerShell/Win32-OpenSSH/releases/latest/'
## 最新のリリースダウンロードリンクを取得するためのWebリクエストを作成
 $request = [System.Net.WebRequest]::Create($url)
 $request.AllowAutoRedirect=$false
 $response=$request.GetResponse()
 $source = $([String]$response.GetResponseHeader("Location")).Replace('tag','download') + '/OpenSSH-Win64.zip'
## 最新のOpenSSH for Windowsパッケージを現在の作業ディレクトリにダウンロード
 $webClient = [System.Net.WebClient]::new()
 $webClient.DownloadFile($source, (Get-Location).Path + '\OpenSSH-Win64.zip')

4. OpenSSH-Win64.zip ファイルが現在の作業ディレクトリにあることを確認します。以下のコマンドを実行して確認できます。

Get-ChildItem *.zip

下記のように、OpenSSH-Win64.zip ファイルがディレクトリ内に存在することがわかります。

Checking if the OpenSSH zip file exists

OpenSSHのインストール

OpenSSH-Win64.zipをダウンロードしたら、次のステップはサーバーにOpenSSHをインストールすることです。期待している場合、インストールウィザードはありません。

  1. 同じPowerShellセッション内で、以下のコードをコピーしてPowerShellで実行します。このコードはOpenSSH-Win64.zipファイルの内容をC:\Program Files\OpenSSHに展開します。
# ZIPファイルを一時的な場所に展開する
 Expand-Archive -Path .\OpenSSH-Win64.zip -DestinationPath ($env:temp) -Force
# 一時的な場所から展開されたZIPの内容をC:\Program Files\OpenSSH\に移動する
 Move-Item "$($env:temp)\OpenSSH-Win64" -Destination "C:\Program Files\OpenSSH\" -Force
# C:\Program Files\OpenSSH\内のファイルのブロック解除
 Get-ChildItem -Path "C:\Program Files\OpenSSH\" | Unblock-File

2. ZIPファイルを展開した後、PowerShellで以下のコマンドを実行してスクリプトC:\Program Files\OpenSSH\install-sshd.ps1を実行します。このスクリプトは、OpenSSH SSHサーバーサービス(sshd)とOpenSSH認証エージェントサービス(sshd-agent)をインストールします。

& 'C:\Program Files\OpenSSH\install-sshd.ps1'

期待される結果を以下で確認できます。

Installing OpenSSH

SSHサーバーが自動的に起動するようにするには、以下のコマンドをPowerShellで実行します。

## sshdサービスの起動タイプを手動から自動に変更します。
 Set-Service sshd -StartupType Automatic
## sshdサービスを起動します。
 Start-Service sshd

SSHトラフィックを許可するためのWindowsファイアウォールルールの追加

この手順は、WindowsサーバーがWindowsファイアウォールを使用している場合にのみ適用されます。サードパーティのファイアウォールを使用しているサーバーの場合は、ポート22を許可する方法に関するファイアウォールのドキュメントを参照してください。

インストールしたOpenSSHは、自動的にSSHトラフィックを許可するファイアウォール例外ルールを作成しません。したがって、次のタスクはファイアウォールルールを手動で作成することです。

新しいWindowsファイアウォールルールを作成する最も簡単な方法の1つは、PowerShellとNew-NetFirewallRuleコマンドレットを使用することです。以下のコマンドは、Allow SSHと呼ばれるファイアウォールルールを作成し、ポート22へのすべての受信TCPトラフィックを許可します。

以下のコマンドをコピーしてPowerShellで実行してください。

New-NetFirewallRule -Name sshd -DisplayName 'Allow SSH' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

以下のスクリーンショットは、ファイアウォールルールを作成した後のPowerShellでの期待される出力を示しています。

Creating a Windows Firewall Rule to allow Port 22

パスワード認証を使用してSSHで接続する

この時点で、WindowsにOpenSSHをインストールし、初期のサーバー構成を行いました。次のステップは、SSHを介して実際に接続できるかどうかをテストすることです。

新しく構成されたSSHサーバーをテストするには、ローカルコンピュータでsshコマンドを実行します。

このセクションの手順は、Linux SSHサーバーに接続する場合も同様です。

1. 今回はローカルコンピュータからPowerShellを開きます。

2. 次に、以下のコマンドを実行してSSHログインプロセスを開始します。ユーザー名とWindows Serverのリモートホストを変更してください。

ssh june@40.117.77.227

3. サーバーに初めて接続する場合、ホストの信頼性が確立されていないというプロンプトが表示されます。このメッセージは、あなたのコンピューターがまだリモートホストを認識していないことを意味します。 yesと入力してEnterキーを押して続行してください。

4. パスワードが要求されたら、アカウントのパスワードを入力してEnterキーを押します。

Connecting via SSH using Password Authentication

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

Getting the hostname of the SSH server

OpenSSHのデフォルトシェルをPowerShellに変更する

Windows SSHサーバーに最初にログインしたとき、デフォルトのシェルまたはコマンドインタープリターがCMDであることに気付くでしょう。CMDをデフォルトのSSHシェルとして使用するのは問題ありませんが、代わりにPowerShellをデフォルトのシェルとして使用したい場合は、次の手順に従ってください。

デフォルトのOpenSSHシェルをCMDからPowerShellに変更するには:

まず、Windows Serverで管理者権限のあるPowerShellウィンドウを開きます(すでに開いていない場合)。

次に、レジストリキーHKLM:\SOFTWARE\OpenSSHDefaultShellという名前の新しいレジストリ文字列値を作成します。 DefaultShell文字列のデータをWindows PowerShellパスC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeに設定します。

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

以下のスクリーンショットは、コマンドの予想される結果を示しています。

Changing the default OpenSSH shell

公開キー認証の構成

前のセクションでは、ユーザー名とパスワードで接続しました。これは機能しますが、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 コマンドレットを使用して作成します。

New-Item -Type File -Path C:\ProgramData\ssh\administrators_authorized_keys

以下は、スクリーンショットと似た結果が表示されるはずです。

Creating the administrators_authorized_keys file

3. 次に、ssh_host_dsa_keyファイルに現在割り当てられているACLを取得し、そのACLをadministrators_authorized_keysファイルにコピーします。これを行うには、以下のコマンドを実行します。

get-acl C:\ProgramData\ssh\ssh_host_dsa_key | set-acl C:\ProgramData\ssh\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. プロパティページで、セキュリティタブをクリックし、詳細をクリックします。

Opening advanced security settings

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

Viewing advanced security permission

新しいSSHキーペアの生成

新しいSSHキーペアを生成するには、Windows 10(およびそれ以降)に組み込まれているOpenSSHクライアントツールの一部であるssh-keygenコマンドを使用します。これはほとんどのLinuxオペレーティングシステムでも利用可能です。

このセクションに示す例は、WindowsおよびLinuxコンピューターの両方で動作します。

ローカルコンピューターで、PowerShellコンソールで:

1. 以下のコマンドを実行して、ホームフォルダの.sshディレクトリに移動してください。

cd ~/.ssh

次に、ssh-keygenコマンドを入力してEnterキーを押します。キーを保存するファイルの場所を入力するように求められた場合は、デフォルトの場所を保持してEnterキーを押します。これにより、SSHクライアントが自動的にSSHキーを認証する際にSSHキーを見つけることができます。

Windowsでは、デフォルトのキーファイルはC:\Users\<username>\.ssh\id_rsaです。

次のプロンプトで、パスフレーズを空白のままにしてください。この時点では、テストにパスフレーズを使用する必要はありません。

プライベートキーにパスフレーズを追加すると、そのセキュリティが大幅に向上します。パスフレーズは、プライベートキーへの第二の要素認証(2FA)として機能します。

コマンドによって、id_rsa(プライベートキー)とid_rsa.pub(公開キー)の2つのファイルが作成されたことに気付くでしょう。

Generating a new SSH key pair on the local computer

公開キーをWindows SSHサーバーに展開する

プライベートパブリックキーペアを生成したので、次のステップは、公開キーをSSHサーバーのC:\ProgramData\ssh\administrators_authorized_keysファイルにコピーすることです。

ローカルコンピューターで、PowerShellコンソールで次のように入力します:

1. 以下のコードをコピーしてPowerShellで実行します。最初にユーザー名とIPアドレスを変更してください。各コマンドの上にあるコメントを参照して、各コマンドの目的を知ることができます。

# 公開キーを読み取る
 $public_key = Get-Content ~/.ssh/id_rsa.pub
# sshを使用してサーバーのadministrators_authorized_keysに公開キーを追加します。
 ssh june@40.177.77.227 "'$($public_key)' | Out-File C:\ProgramData\ssh\administrators_authorized_keys -Encoding UTF8 -Append"

2. パスワードが求められたら入力し、sshが公開鍵をコピーするように進みます。以下に示すような類似の結果が表示されます。

Deploying the public key to the Windows SSH server

公開鍵認証を使用したSSH接続

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

Connecting with SSH using Public Key Authentication

証明書認証の設定

公開鍵認証と同様に、証明書認証はパスワードなしまたはパスフレーズで保護されています。証明書ログインを有効にするには、SSHサーバーに公開鍵を展開しないでキーペアを生成する手順を踏みます。

SSHサーバーのauthorized_keysやadministrators_authorized_keysファイルに公開鍵をマッピングする必要はありません。代わりに、公開鍵は証明機関(CA)キーを使用して署名されます。

証明機関(CA)キーの作成

署名のためのCAキーの生成は、この記事で前述したユーザーキーペアの生成と似ています。ただし、今回は新しいCAキーのファイル名を指定する必要があります。そのために、PowerShellコンソールでWindows Server上で次の操作を行います:

以下のようにssh-keygenコマンドを実行します。このコマンドはCAキーをC:\ProgramData\ssh\ca_userkeysに作成しますが、別のファイル名を使用しても構いません。異なるファイル名を使用してもCAキーの機能に影響はありません。

パスフレーズが求められたら、パスフレーズを空白のままにしてEnterキーを押します。

ssh-keygen -f C:\ProgramData\ssh\ca_userkeys

以下に、コマンドによって2つのファイルが作成されたことがわかります。ca_userkeysは秘密鍵であり、ca_userkeys.pubは公開鍵です。

Creating the Certificate Authority (CA) Key on a Windows SSH server

CAキーを生成したので、SSHサーバーにCAを信頼し、CAキーをどこに見つけるかを伝える必要があります。これを行うには、C:\ProgramData\ssh\sshd_configファイルに新しい行TrustedUserCAKeys path/to/ca_userkeys.pubを追加します。

以下のコマンドを実行して、ファイルsshd_configに構成項目を追加します。

# SSHサーバーがWindowsの場合
 echo TrustedUserCAKeys C:\ProgramData\ssh\ca_userkeys.pub>> C:\ProgramData\ssh\sshd_config

ユーザーの公開鍵を署名する

この時点で、CAキーが生成され、SSHサーバーがCAの公開鍵ファイルを信頼するように構成されています。残りは、ユーザーの公開鍵を署名することです。

ローカルコンピューターのPowerShellコンソールで次の操作を行います。

1. id_rsa.pubファイルを使用して、SCPコマンドを使用してSSHサーバーのホームドライブにコピーします。ユーザー名とIPアドレスを正しい値に変更してください。

scp ((Resolve-Path ~/.ssh/id_rsa.pub).Path) june@40.117.77.227:id_rsa.pub

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-keygen -s C:\ProgramData\ssh\ca_userkeys -I id_username -V +4w -n username ~/id_rsa.pub

SSHセッションでコマンドを実行した後、以下に示すような類似の出力が得られるはずです。 コマンドが新しいファイルid_rsa-cert.pubを生成したことがわかります。 これが署名されたユーザー証明書です。

Signing the User Key

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

scp june@40.117.77.227:id_rsa-cert.pub ((Resolve-Path ~/.ssh/).Path)

コピーが完了すると、ホームフォルダーに署名されたユーザー証明書が保存されています。

Finding the SSH user certificate

証明書認証を使用してSSHで接続します。

証明書認証を構成し、今やユーザー証明書を取得しています。これでSSHサーバーに証明書認証で接続できるかどうかをテストする必要があります。

証明書を使用してSSHに接続するコマンドは、パスワードまたは公開鍵を使用する場合と同じです。ただし、以前に公開鍵認証を有効にした場合は、まず無効にしてください。さもないと、SSHは証明書の代わりにキーペアを継続して使用します。

キーペアを無効にするには、administrators_authorized_keysファイルから公開鍵を削除します。これを行うには、以下の手順に従います。

次のコマンドは、administrators_authorized_keysファイル全体を空にします。すべてのマップされた公開鍵を削除したくない場合は、テキストエディタを使用して各ファイルから選択した公開鍵を手動で削除してください。

Windows ServerにSSH接続している間:

1. PowerShellで以下のコードを実行してadministrators_authorized_keysファイルを空にします。

# administrators_authorized_keysファイルをクリア
 $NULL > C:\ProgramData\ssh\administrators_authorized_keys
# administrators_authorized_keysが空であることを確認
 Get-Content C:\ProgramData\ssh\administrators_authorized_keys

2. この時点で、authorized_keysおよびadministrators_authorized_keysファイルが空であることがスクリーンショットで確認できます。

Emptying the administrators_authorized_keys

3. exitと入力し、Enterキーを押してSSHセッションから切断します。PowerShellセッションに戻ります。

4. 公開鍵を削除した後、次のSSHログイン試行では証明書認証が使用されます。ログイン体験は公開鍵認証と同じです。

Connecting with SSH using Certificate Authentication

結論

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

Source:
https://adamtheautomator.com/openssh-windows/