Window に Linux から公開鍵認証方式でsshやscpを実行したい
この記事は、私のブログなんだこれはでアクセスの多かった記事をリライトしたものです。
Microsoft のOpenSSH が入っているWindows に Linux の OpenSSH から公開鍵認証方式で ssh や scp したい。
Microsoft のWindowsには OpenSSHがデフォルトではいっているらしいので、Linuxからssh接続を試してみた
TL;DR
Microsoftの公開しているドキュメントを参考にしてやってできた。
次に注意すること。
-
sshd-config
の場所が非標準 .. Windows Configurations in sshd_config/OpenSSH Server configuration for Windows Server and Windows -
ssh-copy-id
は Windowsでは使えない - 一般ユーザーと管理者で公開鍵の場所が異なる .. 公開キーのデプロイ/OpenSSH キーの管理
- 管理者の公開鍵の設定にはACLの設定が必要 .. 管理ユーザー/OpenSSH キーの管理
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
に公開鍵をデプロイするには、次のことを行う。
- そのユーザーのホームフォルダ(おそらく
C:¥Users¥username
)に.ssh
フォルダを作成して、 -
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
に鍵を追加する。
authorized_keys
ファイルに公開鍵を追加
Linuxから Win-server上の.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 を設定する必要がある
administrators_authorized_keys
ファイルに公開鍵を追加
Linux から 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
くだらない誤記があったので修正