Window に Linux から公開鍵認証方式でsshやscpを実行したい
Microsoft のOpenSSH が入っているWindows に Linux の OpenSSH から公開鍵認証方式で ssh や scp したい。
Windows の前提
- Windows 10または Windows Server
- 外部からSSH ログインができる
- その際の認証方式はパスワード認証
- 設定を変更するため管理者権限のあるアカウントがある
- 仮でWindows ホスト名は Win-server とする
Windows での作業
1. 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
2. OpenSSH のサービスの再起動
OpenSSH の設定ファイルsshd_config
を読み込ませるには、OpenSSH サービスを再起動する必要がある。
コントロールパネルから再起動することもできますし、PowerShell からも再起動できるようです。
Linux での作業
1. sshの公開鍵と秘密鍵を作成する
OpenSSH の公開鍵と秘密鍵を用意する。基本的には既存のものを使いまわさない方がいいので作成することになる。
暗号方式としては、ed25519
方式が推奨されているが、RSA
でもよいだろう。
ed25519
方式の暗号鍵なら次のコマンドを実行する。
ssh-keygen -t ed25519
RSA
方式の暗号鍵なら 4096 ビット長の鍵にしておいた方が安心なので次のコマンドで作成する。
ssh-keygen -t rsa -b 4096
2. Windows に公開鍵をデプロイ
Win-server
に公開鍵を登録したい。しかし、Microsoftドキュメントの 公開キーのデプロイ/OpenSSH キーの管理 によると、Windows ではそのアカウントが管理者権限か一般のアカウントかで鍵を登録するファイルが異なるそうだ。
なお、ssh-copy-id
はWindows 向けには動作しないようです。
2-1. 一般ユーザー
ssh-copy-id
は動作しないのですがすることは同じ。
Win-server
の一般ユーザー username
に公開鍵をデプロイするには、そのユーザーのホームディレクトリに.ssh
を作成して、authorized_keys
ファイルに追加する。
まず、Linux から Win-server
に username
として ssh でログインして、ユーザーのホームディレクトリに .ssh
をディレクトリを作成する。Windows はパス区切り文字には/
でも代用できる。Linux では\
が特殊文字と扱われるので避けてみる
設定が完了できていないので、パスワードの入力が必要。
ssh username@Win-server mkdir "C:/Users/username/.ssh"
ディレクトリが存在していた場合は、エラーになります。
エラーにならなかった場合
ディレクトリを作成したら、その中に authorized_keys
を作成して、公開鍵を追加する。
Linux で作成した公開鍵が ~/.ssh/id_ed25519.pub
だったとして次のコマンドを実行する。
設定が完了できていないので、パスワードの入力が必要。
scp ~/.ssh/id_ed25519.pub username@Win-server:C:/Users/username/.ssh/authorized_keys
エラーになった場合
エラーになった場合は、ディレクトリが存在していたのかもしれません。dir コマンドなどで中身を確認するといい。
ssh username@Win-server dir "C:/Users/username/.ssh"
authorized_keys
ファイルがあれば、scp コマンドでファイルを取得して Linux 上で確認しよう。
2-2. 管理者権限のユーザー
Microsoft ドキュメント管理ユーザー/OpenSSH キーの管理 によると、管理者のアカウントの場合は、C:\ProgramData\ssh\
に作成した、administrators_authorized_keys
ファイルに公開鍵を登録する必要がある。
C:\ProgramData\ssh
はすでに存在していることがわかっているので、administrators_authorized_keys
ファイルに Linux から公開鍵をコピーすればいい。また、Windows ならではなだが ACL を設定する必要がある。
ここでは、Win-server
のアカウントはusername
とし、Linux で作成した公開鍵が ~/.ssh/id_ed25519.pub
だったとして次のコマンドを実行する。
scp ~/.ssh/id_ed25519.pub username@Win-server:C:/ProgramData/ssh/administrators_authorized_keys
ファイルを登録したら、ACL を設定する。
ssh username@Win-server icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
3. 確認
Linux から Windows にファイルを送信するなどして確認する。うまくいけば、~/.ssh/config
などの作成も検討しよう。
scp -i ~/.ssh/id_ed25519 test username@Win-server:test