メモ

ACTABAのホームページ

TOP > Windows 11 ProでOpenSSHの鍵認証を設定してみた

見出し

Windows 11 ProでOpenSSHの鍵認証を設定してみたのでそのメモ。

サーバの管理をしていると、SSHサーバを踏み台として(ポートフォワーディングを使って)、サーバを管理することが多いと思います。
これまで、踏み台のSSHサーバは、Linuxで構築していたと思います。
WindowsもOpenSSHが簡単?にインストールすることができるようになりましたので、OpenSSHでポートフォワーディングを使ってみようと思い、OpenSSHの鍵認証を試したのでそのメモ。

下記を参考にしました。
・Windows 用 OpenSSH の概要
 https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell
・Windows 用 OpenSSH でのキーベースの認証
 https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_keymanagement
・Windows Server および Windows 用 OpenSSH サーバーの構成
 https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_server_configuration

OpenSSHをインストールする

初めにOpenSSHをインストールします。
「設定」を開き「アプリ」を選択して「オプション機能」からインストールできますが、「オプション機能」が表示されない場合があるようです。
そこで、今回はPowerShellでコマンドを実行して、インストールします。

OpenSSHがインストールされているか確認する

PowerShellを管理者として実行します。
「検索」欄に"power"と入力します。
screenshot

候補に「Windows PowerShell」が表示されますので、右側のメニュー「管理者として実行する」をクリックします。
screenshot

PowerShellで下記のコマンドを実行して、「OpenSSH」がインストールされているかを確認します。

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
実行結果
screenshot

OpenSSHクライアントはインストールされていますが、OpenSSHサーバはインストールされていません。

OpenSSHをインストールする

PowerShellを管理者として実行します。
PowerShellで下記のコマンドを実行して、OpenSSHサーバをインストールします。

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
実行結果
screenshot

OpenSSHクライアントをインストールする場合は下記のコマンドを実行します。
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0


OpenSSHの初期設定

OpenSSHサーバはサービスとして動作しますので、サービスの起動が必要です。
また外部からSSHサーバにアクセスするにはファイアウォールの設定も必要です。PowerShellからインストールすると、ファイアウォールは自動で設定されるようです。

OpenSSHサーバのサービス起動します。
サービス一覧で「OpenSSH SSH Server」を選択して「開始」します。
(「OpenSSH Authentication Agent」は無効のままでもOK。)
screenshot

次にファイアウォールの設定を確認します。
ファイアウォールの「受信の規則」で「OpenSSH SSH Server (sshd)」の規則が有効になっていることを確認します。
無効になっている場合は、有効にします。
screenshot


パスワード認証でSSH接続する

鍵認証でSSH接続する前に、パスワード認証で接続してみます。
パスワード認証は標準で許可されているので、まずはパスワード認証できるか確認します。

アクセスするユーザアカウントの作成

SSHでアクセスするユーザアカウントを、SSHサーバが稼働しているPCに作成します。
ここでは例としてユーザ「sshtest」を作成しています。
screenshot

パスワード認証でSSH接続する

コマンドプロンプトを起動します。
下記のコマンドでSSHサーバに接続します。

ssh <SSHサーバ上に作成したユーザ名>@<SSHサーバのFQNDまたはIPアドレス>
ここでは、下記コマンドを実行します。SSHサーバ上で、SSHクライアントを起動して、自身のSSHサーバに接続できるかを試しています。
ssh sshtest@localhost
実行結果
screenshot

コマンドを実行すると、そのSSHサーバに初めて接続するときは、下記のメッセージが表示されます。
Are you sure you want to continue connecting ?
「yes」を入力するとSSHサーバの情報が登録され、次回から表示されなくなります。
その後、「sshtest@localhost's password:」とパスワードが聞かれますので、パスワードを入力します。
ログインに成功すると、コマンドプロンプトが下記のような画面に切り替わります。
screenshot

鍵認証(Ed25519)でSSH接続する

鍵認証でSSH接続してみます。

ユーザーキーの作成

SSHサーバにアクセスするユーザアカウントは、先ほどパスワード認証で作成したユーザ「sshtest」を使用します。
ユーザ「sshtest」が認証に使用する使用する鍵を作成します。
※鍵生成のコマンドを実行すると、実行しているユーザのフォルダ内に生成されます。すでに鍵がある場合は上書きされますので注意してください。
※鍵の生成は任意のユーザで実施して構いません。後から鍵のファイルを移動できます。

鍵を生成するには、PowerShellを起動して、下記のコマンドを実行します。

ssh-keygen -t ed25519
コマンドを実行すると「Enter passphrase (empty for no passphrase):」と表示され、秘密鍵を保護するためのパスフレーズが聞かれます。
一部のSSHクライアントでは、空のパスフレーズに対応していないようですので、適当な文字列を入力しておきます。
実行結果
screenshot

塗りつぶしている箇所には、「C:\\Users\」の後ろはコマンドを実行したユーザ名が表示されます。
「SHA256:」の後ろにはハッシュが表示され、その後ろには「ユーザ名@ホスト名」が入表示されます。

これで鍵が生成されました。
鍵ファイルの保存場所ですが、コマンドを実行したユーザが「aaa」の場合は、フォルダ「C:\Users\aaa\.ssh」に保存されています。
※ファイル「C:\Users\aaa\.ssh\id_ed25519」は秘密鍵のファイル。

生成した秘密鍵を使用してユーザ「sshtest」としてログインしたいので、
生成した公開鍵ファイル「C:\Users\aaa\.ssh\id_ed25519.pub」を、SSHサーバのユーザ「sshtest」のフォルダにコピーします。
このとき、ファイル名を「authorized_keys」に変更します。
・生成した公開鍵ファイルのパス
 C:\Users\aaa\.ssh\id_ed25519.pub
 ↓ コピーする
・SSHサーバ上での公開鍵ファイルのパス
 C:\Users\sshtest\.ssh\authorized_keys
※ユーザフォルダを変更しているときは、環境に併せてパスを読み替えてください。


鍵ファイルのアクセス権の設定

ユーザ「sshtest」のSSHサーバ上での公開鍵ファイル「authorized_keys」のアクセス権を変更します。
フィアルへのアクセス権は下記ユーザのみに限定します。他のユーザが含まれているときは、そのユーザのアクセス権を削除します。

 ・SYSTEM
 ・Administrators
 ・sshtest

ファイルの所有者をユーザ「sshtest」に変更します。
screenshot

鍵ファイルへのアクセス権が適切で無い場合は、SSH接続に失敗します。
後述のSSHサーバサービスのログ出力で確認すると、下記のログが記録されます。

Bad owner on C:/Users/sshtest/.ssh/authorized_keys

鍵認証でSSH接続する

コマンドプロンプトを起動します。
下記のコマンドでSSHサーバに接続します。

ssh -i <秘密鍵ファイルのパス> <接続ユーザ名>@<SSHサーバ>
ここでは、下記コマンドを実行します。
SSHサーバ上で、SSHクライアントを起動して、自身のSSHサーバに接続できるかを試しています。
※秘密鍵のファイル名は「id_ed25519」から「id_ed25519_sshtest」に変更しています。
ssh -i C:\Users\aaa\.ssh\id_ed25519_sshtest sshtest@127.0.0.1
実行結果
screenshot

コマンドを実行すると、パスフレーズが聞かれますので、鍵生成時に入力したパスフレーズを入力します。
ログインに成功すると、パスワード認証と同じように、コマンドプロンプトが下記のような画面に切り替わります。
screenshot


接続できないときは?

SSHサーバのログ出力をして原因を特定しましょう。
SSHサーバの設定ファイルは下記になります。

C:\ProgramData\ssh\sshd_config
ファイルの20行目付近に下記のコメントがあります。
# Logging
#SyslogFacility AUTH
#LogLevel INFO
その下に下記を追加して、サービス「OpenSSH SSH Server」を再起動します。
SyslogFacility LOCAL0 LogLevel Debug3
ログが「C:\ProgramData\ssh\logs\sshd.log」に記録されますので、ログから原因を調査します。


設定のカスタマイズ

SSH接続を許可するユーザを限定したい場合や、鍵認証のみ許可してパスワード認証をさせたくない場合などの設定は、SSHの設定ファイル「C:\ProgramData\ssh\sshd_config」を変更します。
パスワード認証をさせたくない場合は、設定ファイルの下記「#PasswordAuthentication yes」の箇所を「PasswordAuthentication no」に変更します。

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no

接続を許可するユーザを設定するときは、「AllowUsers <ユーザ名>」を追加します。

設定ファイルの記述の仕方については、下記が参考になります。
・Windows Server および Windows 用 OpenSSH サーバーの構成
 https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_server_configuration



これで、Windows 11 ProでOpenSSHの鍵認証を設定できました。



ページのトップへ戻る