fu7mu4’s diary

はてなダイアリーから移転しました。

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

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

Microsoft のOpenSSH が入っているWindowsLinux の 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-idWindows 向けには動作しないようです。

2-1. 一般ユーザー

ssh-copy-id は動作しないのですがすることは同じ。

Win-server の一般ユーザー username に公開鍵をデプロイするには、そのユーザーのホームディレクトリに.ssh を作成して、authorized_keys ファイルに追加する。

まず、Linux から Win-serverusername として 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