3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

パスワード系は 1Password に登録しているのですが SSH の鍵はなんとなく面倒でファイルでローカルに置いたままでした。しかし、バックアップを取るのも面倒だし 1Password で管理しようかなという気になりました。せっかくお金も払っているのだし使えるものは使おうかと。

(家族間でパスワードなどの共有をするために 1Password の Family プランを利用していますが円安がつらいです。次の更新までには Apple か Google の機能で代替できないかなと思っているのに利用の幅を広めてしまってはダメなのでは...)

公式ドキュメント

公式ドキュメントに書かれていますのでこのとおりにやるだけです :sweat_smile:

OpenSSH の SSH Agent が起動しないようにする

競合するため OpenSSH の SSH Agent が停止されていること、自動起動しないようになっていることを確認します。

Windows + R から services.msc を実行する

ファイル名を指定して実行

OpenSSH Authentication Agent を探して自動起動が無効になっていること、起動していないことを確認する。

OpenSSH Authentication Agent のプロパティ

1Password の SSH エージェントを有効にする

開発者メニューで「SSHエージェントを使用」にチェックを入れるだけです。

開発者メニュー

これだけです。

Windows 側の ssh.exe で 1Password に登録したキーペアを利用できるようになっています。

秘密鍵をインポートする

公開鍵は秘密鍵から生成可能なので秘密鍵だけドラッグ&ドロップすれば登録できます。「秘密鍵を追加」から新規作成も可能。

秘密鍵のインポート

鍵が登録された状態でコマンドプロンプトや PowerShell ターミナルから ssh-add -l コマンドを実行すると登録されている鍵の一覧が表示されます。

WSL の Linux からのアクセス方法

WSL では Interop 機能がデフォルトで有効になっており PATH 環境変数に Windows 側の %PATH% の値も追加されていて ssh.exessh-add.exe がそのまま実行可能になっています。

ssh-add.exe -l
ssh.exe -T git@github.com

ターミナルの操作であれば alias を設定すれば ssh で ssh.exe を実行することができるようになります。

alias ssh=ssh.exe

ただし、これは alias 設定された shell で利用可能なだけで、shell script の中であったり別のプロセスから実行される場合は効果がありません。Git に SSH でアクセスする場合は次のようにして ssh.exe を使うように設定することが可能です。

git config --global core.sshCommand ssh.exe

これでおおむね困ることはなさそうですが、Linux 側の ssh コマンドとの違いとして ~/.ssh/config が使われず、Windows 側の %USERPROFILE%\.ssh\config が使われます。 この場合、ProxyCommand に指定したコマンドがどう実行されるのかが良くわかりません。

次のように bash を挟むとどういう仕組みなのか bash は WSL の Linux 環境に入るようです、コマンドプロンプトや PowerShell ターミナルの中で bash コマンドを実行すると WSL の Linux 環境に入ります。Git Bash とは違うようです。

ProxyCommand bash -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

環境変数の問題とか面倒なのでこういうケースでは Linux 側の ssh を使いたいかもしれません。

では、そのためにはどうするか?

npiperelay と socat で Linux の ssh からアクセス可能にする

Linux の OpenSSH では ssh-agent が Listen している Unix Domain Socket の path を SSH_AUTH_SOCK という環境変数に設定することで ssh がその socket 経由でやり取りするのですが、Windows の ssh では Windows 独自の Named Pipe が使われるようになっており、Linux の ssh から直接やりとりすることができません。

そこで socat が Unix Domain Socket を Listen し、アクセスがあれば npiperelay.exe を実行するという構成とすると良いようです。

npiperelay のインストール

これは Go で書かれていますが Windows 用のバイナリを実行します。

curl -LO https://github.com/jstarks/npiperelay/releases/download/v0.1.0/npiperelay_windows_amd64.zip
unzip npiperelay_windows_amd64.zip
mkdir /mnt/c/Users/ytera/bin
cp npiperelay.exe /mnt/c/Users/ytera/bin/
$ /mnt/c/Users/ytera/bin/npiperelay.exe
Usage of npiperelay.exe:
  -ei
        terminate on EOF reading from stdin, even if there is more data to write
  -ep
        terminate on EOF reading from the pipe, even if there is more data to write
  -p    poll until the the named pipe exists
  -s    send a 0-byte message to the pipe after EOF on stdin
  -v    verbose output on stderr

socat のインストール

sudo apt install socat

socat の実行

socat \
  unix-listen:"$HOME/.ssh/agent.sock",fork,mode=600 \
  exec:"/mnt/c/Users/ytera/bin/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent"

一つ目の引数が Listen 側の設定、二つ目の引数が転送先の設定になります。

export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock

これで Linux 側の ssh コマンドを使っても 1Password の ssh-agent を利用することができます。

でもまあひとまず ssh.exe でいっかな。ProxyCommand を使う必要がでて困ることがあったら考えよう。

1Password CLI

おまけ。1Password の CLI (op.exe) も使えるようにしよう。

winget install 1password-cli

これで同様に Linux 側から op.exe を実行可能になるので alias op=op.exe として

$ op --version
2.31.1
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?