【Windows】OpenSSH Authentication Agentを使用する

普段、開発したコードを本番環境に上げるのに、VSCodeのSFTPを使用していますが、.htaccessなど、ローカルと本番でコードが違うファイルにはこの方法が使えません。

その場合、該当ファイルを別ディレクトリで管理してFTPで上げるか、SSH接続してエディタで直接編集するかで対処してきました。基本的には後者が多いですが、そのときに面倒なのがSSH接続時のパスフレーズ入力です。

今回は、そんな面倒な作業を省略するため、WindowsのSSH-Agentを使用する方法をまとめていきます。この記事の設定が済むと、VSCodeのRemote SSHでもパスフレーズの入力の手間が省けるので、大変便利です。

環境
Windows
10 Home (20H2)

OpenSSH Authentication Agent (サービス) 有効化

初期状態ではサービスが有効化されていないので、有効化とOS起動時に自動スタートするよう設定します。
管理者権限でPowerShellを起動します。

# スタートアップで自動起動
> Set-Service -StartupType Automatic ssh-agent
# ssh-agent(サービス)の起動
> Start-Service ssh-agent

これ以降、PowerShellは管理者権限でなくても大丈夫です。

有効化の確認

> Get-Service ssh-agent

Status   Name               DisplayName
------   ----               -----------
Running  ssh-agent          OpenSSH Authentication Agent


> ssh-add --help

unknown option -- -
usage: ssh-add [options] [file ...]
Options:
  -l          List fingerprints of all identities.
  -E hash     Specify hash algorithm used for fingerprints.
  -L          List public key parameters of all identities.
  -k          Load only keys and not certificates.
  -c          Require confirmation to sign using identities
  -m minleft  Maxsign is only changed if less than minleft are left (for XMSS)
  -M maxsign  Maximum number of signatures allowed (for XMSS)
  -t life     Set lifetime (in seconds) when adding identities.
  -d          Delete identity.
  -D          Delete all identities.
  -x          Lock agent.
  -X          Unlock agent.
  -s pkcs11   Add keys from PKCS#11 provider.
  -e pkcs11   Remove keys provided by PKCS#11 provider.
  -T pubkey   Test if ssh-agent can access matching private key.
  -q          Be quiet after a successful operation.
  -v          Be more verbose.

鍵を作成する

> pwd
C:\Users\<name>\.ssh

# 公開鍵 & 秘密鍵 作成
> ssh-keygen -t ed25519 -N 'passphrase' -C '""' -f id_ed25519_server

# 確認
> ls
    ディレクトリ: C:\Users\<name>\.ssh

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2022/01/01     12:00            xxx id_ed25519_server
-a----        2022/01/01     12:00            xxx id_ed25519_server.pub
option 解説
-t 暗号化形式。 「rsa(デフォルト)」「dsa」「ecdsa」「ed25519」
-N パスフレーズ
-C コメント。「'""'」でコメント無し。デフォルトは「ユーザー名@デバイス名(PC名)」
-f ファイル名

全オプションの確認

> ssh-keygen --help

usage: ssh-keygen [-q] [-b bits] [-C comment] [-f output_keyfile] [-m format]
                  [-N new_passphrase] [-t dsa | ecdsa | ed25519 | rsa]
       ssh-keygen -p [-f keyfile] [-m format] [-N new_passphrase]
                   [-P old_passphrase]
       ssh-keygen -i [-f input_keyfile] [-m key_format]
       ssh-keygen -e [-f input_keyfile] [-m key_format]
       ssh-keygen -y [-f input_keyfile]
       ssh-keygen -c [-C comment] [-f keyfile] [-P passphrase]
       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
       ssh-keygen -B [-f input_keyfile]
       ssh-keygen -D pkcs11
       ssh-keygen -F hostname [-lv] [-f known_hosts_file]
       ssh-keygen -H [-f known_hosts_file]
       ssh-keygen -R hostname [-f known_hosts_file]
       ssh-keygen -r hostname [-g] [-f input_keyfile]
       ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
       ssh-keygen -f input_file -T output_file [-v] [-a rounds] [-J num_lines]
                  [-j start_line] [-K checkpt] [-W generator]
       ssh-keygen -I certificate_identity -s ca_key [-hU] [-D pkcs11_provider]
                  [-n principals] [-O option] [-V validity_interval]
                  [-z serial_number] file ...
       ssh-keygen -L [-f input_keyfile]
       ssh-keygen -A [-f prefix_path]
       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
                  file ...
       ssh-keygen -Q -f krl_file file ...
       ssh-keygen -Y check-novalidate -n namespace -s signature_file
       ssh-keygen -Y sign -f key_file -n namespace file ...
       ssh-keygen -Y verify -f allowed_signers_file -I signer_identity
                -n namespace -s signature_file [-r revocation_file]

ssh-agent に秘密鍵を登録

鍵ペアの作成できたので、秘密鍵をSSHエージェントに登録します。

キー登録

> pwd
C:\Users\<name>\.ssh

# 秘密鍵をエージェントに登録
> ssh-add id_ed25519_server

# パスフレーズ入力
Enter passphrase for id_ed25519_server:
Identity added: id_ed25519_server (id_ed25519_server)

登録キー確認

> ssh-add -l
256 SHA256:+XXXXXXXXXX.... id_ed25519_server (ED25519)

登録キー削除

> ssh-add -D
All identities removed.

> ssh-add -l
The agent has no identities.

以上で設定は完了(キーを削除した場合は再登録が必要)です。あとは、いつも通りSSH接続するだけです。

.ssh/config 作成

さて、パスフレーズ入力は省けましたが、SSH接続時に長いコマンドを打つのも面倒なので、.ssh/configファイルを作成します。私はエックスサーバーを使用していますので、その場合の例になります。

C:\Users\name\.ssh\config
Host xserver
    HostName sv111.xserver.jp
    User server_id
    Port 10022
    IdentityFile C:/Users/<name>/.ssh/id_ed25519_server
    PreferredAuthentications publickey
    IdentitiesOnly yes
    ServerAliveInterval 60

ファイル作成後は、ターミナルでssh xserverと入力するだけで、SSH接続が可能になります。(接続先に公開鍵を登録後)

エックスサーバーに公開鍵を登録する

最後に、今回作成した公開鍵(id_ed25519_server.pub)をエックスサーバーに登録します。

公開鍵をクリップボードにコピー

> pwd
C:\Users\<name>\.ssh

> Get-Content id_ed25519_server.pub | Set-Clipboard

公開キーをサーバーに登録

公開キーの登録手順は公式サイトに詳しいです。

サーバーパネルで作成した秘密鍵について

エックスサーバーのサーバーパネルでも秘密鍵が作成できますが、その鍵を使用してのSSH接続では、今回の手順を踏んでもパスフレーズ入力を省略することができませんでした。

SSH接続する

それでは準備が整ったのでSSH接続してみます。

> ssh xserver

# 初接続時は接続有無の確認
The authenticity of host '[sv111.xserver.jp]:10022 ([]:10022)' can't be established.
...
Are you sure you want to continue connecting (yes/no/[fingerprint])? <yes>
Warning: Permanently added ... to the list of known hosts.

[server_id@sv111 ~]$ pwd
/home/server_id

無事にパスフレーズ入力無しで接続できました。

登録鍵の保存場所と保存期間

エージェントに登録した鍵の扱いはどうなっているのか調べてみました。

保存場所

OpenSSH キーの管理によると、Windows ログインに関連付けられている Windows セキュリティ コンテキスト内に秘密キーを安全に格納とありましたが、私の知識ではそれ以上のことは分かりませんでした。

また、同ページに、秘密キーを ssh-agent に追加した "後"、セキュリティで保護された場所にバックアップしてから、ローカル システムから削除することを強くお勧めします。と、ありました。

保存期間

OpenSSH Authentication Agentの再起動、OSの再起動を行っても、ssh-add xxxで登録した秘密鍵はクリアされないまま残っていました。PCを1人で使用するには問題ありませんが、セキュリティ的に少し不安です。その場合は、使用後に登録キーを削除するか、エージェントに秘密鍵を登録する際に保存期間を指定します。

保存期間を指定

-t オプションを使用します。数値は秒になります。

> ssh-add id_ed25519_server -t 3600

KeePassXCのSSHエージェントで鍵の登録と削除をする

PowerShellでSSHエージェントの鍵の管理をしてきましたが、パスワードマネージャーのKeePassXCでも同じことができます。利点として、KeePassXCのデータベースを開いたときにエージェントに鍵を登録、データベースを閉じたときに鍵を削除してくれるので、さきほどの作業が不要になります。使用手順はこちらの記事を参考にさせていただきました。

おわりに

VSCodeのRemote SSH使用時のパスコード入力のストレスから解放されてすっきりしました。KeePassXCを利用している人は、SSHエージェントを使用しての管理がとても便利なのでお勧めです。