📚

Window に Linux から公開鍵認証方式でsshやscpを実行したい

2023/04/09に公開

この記事は、私のブログなんだこれはでアクセスの多かった記事をリライトしたものです。

Microsoft のOpenSSH が入っているWindows に Linux の OpenSSH から公開鍵認証方式で ssh や scp したい。

Microsoft のWindowsには OpenSSHがデフォルトではいっているらしいので、Linuxからssh接続を試してみた

TL;DR

Microsoftの公開しているドキュメントを参考にしてやってできた。
次に注意すること。

Windows の前提

  • Windows 10 (11?)または Windows Server
  • 外部(Linux)からSSHログインしたい
  • 設定を変更するため管理者権限のあるアカウントがある
  • 仮でWindows ホスト名は Win-server とする

Linux の前提

  • OpenSSHがはいっていること

作業概要

Windowsでsshd_configを編集して公開鍵認証方式を有効にする

MicrosoftのドキュメントのWindows Configurations in sshd_config/OpenSSH Server configuration for Windows Server and Windows によると、Windows 用の sshd_config は %programdata%\ssh\sshd_config (または、C:\ProgramData\ssh\sshd_config) らしい。

Win-server に管理者権限でログインして、このファイルを編集する必要がある。該当ファイルを別のフォルダにコピーして、ファイルを編集しそのファイルを元のフォルダに戻すとよい。

なお編集は次の箇所のコメントを外すだけである。

#PubkeyAuthentication yes

次のようになればOK

PubkeyAuthentication yes

Windows で OpenSSH のサービスの再起動

OpenSSH の設定ファイルsshd_configを読み込ませるには、OpenSSH サービスを再起動する必要がある。

コントロールパネルから再起動することもできますし、PowerShell からも再起動できるらしい。
サービスの再起動の方法については省略する。

Linux で接続用のsshの公開鍵と秘密鍵を作成する

OpenSSH の公開鍵と秘密鍵を用意する。 基本的には既存のものを使いまわさない方がいい ので新しく作成する。

暗号方式としては、ed25519方式が推奨されているが、状況によってはキー長などを考慮すればRSAでもよいだろう。

Linux でのsshの公開鍵と秘密鍵を作成する方法はどこにでもあるのでここには書かない。例えば ArchlinuxのSSH 鍵のペアを生成を参考にするといいかもしれない。

ed25519 方式の暗号鍵なら次のコマンドを実行する。

ssh-keygen -t ed25519

RSA方式の暗号鍵なら 4096 ビット長の鍵にしておいた方が安心なので次のコマンドで作成する。

ssh-keygen -t rsa -b 4096

Windows に公開鍵をデプロイ

Win-serverに公開鍵を登録したい。しかし、Microsoftドキュメントの 公開キーのデプロイ/OpenSSH キーの管理 によると、Windows ではそのアカウントが管理者権限か一般のアカウントかで鍵を登録するファイルが異なる。つまり sshで接続するときのWindows アカウントの種類で異なる。

  • 一般ユーザー
  • 管理者権限のユーザー

なお、読者ならご存じだと思うが、Linuxなどの環境では、公開鍵をいいかんじにデプロイする ssh-copy-id というユーティリティがあるが、Windows では動作しない。

Linux から Win-serverへ一般ユーザーで接続する

ssh-copy-id というユーティリティが、Windows では動作しないので、このユーティリティが行うことをそのまま実行するだけでよい。

Win-server の一般ユーザー username に公開鍵をデプロイするには、次のことを行う。

  1. そのユーザーのホームフォルダ(おそらく C:¥Users¥username)に .ssh フォルダを作成して、
  2. authorized_keys ファイルに公開鍵を追加する。

Linuxから Win-server上に.ssh フォルダ作成

まず、Linux から Win-server に username として ssh でログインして、ユーザーのホームディレクトリに .ssh をディレクトリを作成するコマンドである。ここでは、設定が完了できていないので、パスワードログインを行う。また接続試験も兼ねていると考えてください。

なお、Windows はパス区切り文字は通常¥だが /でも代用できる。Linux では \ が特殊文字と扱われるので避けた方が楽と考える。

ssh username@Win-server mkdir "C:/Users/username/.ssh"

※ 要Win-serverのusernameのパスワード

  • C:¥Users¥username¥.ssh フォルダが存在していた場合は、エラーになる。
  • C:¥Users¥username¥.ssh フォルダが存在していなかった場合は、エラーにならず、フォルダが作成される。

C:¥Users¥username¥.ssh フォルダが存在していたか、作成できた場合、authorized_keysに鍵を追加する。

Linuxから Win-server上のauthorized_keys ファイルに公開鍵を追加

.sshフォルダを作成した後に、その中に authorized_keysファイルを作成して、公開鍵を追加する。今回は追加というが、既に作成されていないものとして単純にコピーすることとした。

Linux で作成した公開鍵が ~/.ssh/id_ed25519.pub だったとして次のコマンドを実行する。

設定が完了できていないので、パスワードの入力が必要。

scp ~/.ssh/id_ed25519.pub username@Win-server:C:/Users/username/.ssh/authorized_keys

Linux から Win-serverへ管理者権限のユーザーで接続する

Microsoft ドキュメントの 管理ユーザー/OpenSSH キーの管理 によると、次の二つが必要。

  • 管理者のアカウントの公開鍵は、C:\ProgramData\ssh\ に作成した、administrators_authorized_keys ファイルに公開鍵を登録する
  • ACL を設定する必要がある

Linux から administrators_authorized_keys ファイルに公開鍵を追加

C:\ProgramData\sshフォルダはすでに存在していることがわかっているので、administrators_authorized_keys ファイルに Linux から公開鍵をコピーするだけとした。

ここでは、Win-serverのアカウントはusername とし、Linux で作成した公開鍵が ~/.ssh/id_ed25519.pub だったとして次のコマンドを実行する。

scp ~/.ssh/id_ed25519.pub username@Win-server:C:/ProgramData/ssh/administrators_authorized_keys

Linux から ACL の設定をする

ファイルを登録したら、ACL (アクセス制御リスト)をコマンドで設定する。

ssh username@Win-server icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

通信確認

これらの手順で公開鍵認証方式で、Linux から Win-server に接続できるようになったはずである。
確認のために、sshで Linuxから Win-serverへファイルを送信するなどして確認しよう。パスワードではなく、パスフレーズが求められるかもしれない。うまくいけば、~/.ssh/config などの作成も検討しよう。

scp -i ~/.ssh/id_ed25519 test username@Win-server:test

Discussion