こんにちは、先日娘をお風呂に入れてると自分の足を見ながら「親指、人差し指・・足の指も手の指と名前一緒だね!」というのでちゃんと名前覚えたのかと感心していたら「けど、足の指で人を指ささないよねー」と言ってきて、言葉の意味も理解してることに驚いた木村です。
本日は、2022/3/15にβ機能としてリリースされた、1passwordのssh-agent機能を試したのでそれについて書こうと思います。
ssh-agentとは
ssh-agentは、公開鍵認証で使われる認証鍵を保持するプログラムです。単に保持するだけではなく、sshにはssh agent forwardingという機能があり、「sshで接続した先からさらにssh接続するとき、最初のローカルマシンのssh-agentから安全に秘密鍵を取得して認証に利用する」ということができます。
言葉で書くとちょっと分かりにくいのですが、例として、ローカルマシンから踏み台サーバ(server1)にsshして、そこから運用サーバ(server2)にsshするような場合を考えます。いずれも認証は公開鍵方式を用いるものとします。
もし、ssh-agentを使わない場合は以下のように行うことになります。
- server1の秘密鍵(secret1)をローカルマシンに保存する
- server2の秘密鍵(secret2)をserver1に保存する
- ローカルマシンから、secret1を利用してserver1にsshする
% ssh -i secret1 user@server1
- secret2を用いてserver2にsshする
% ssh -i secret2 user@server2
この場合、secret2が踏み台としてDMZに配置されたserver1に保存してあることになり、ちょっと不安ですね。できれば踏み台サーバには重要な情報は置かないようにしたいです。
こういうときに使うのがssh-agentです。以下のように利用します。
- secret1とsecret2をローカルマシンに保存する
- server1のsshdの設定(
/etc/ssh/sshd_config
など)でAllowAgentForwarding yes
とする - ローカルマシンでssh-agentを起動する。macやlinuxの場合、作業するターミナルで以下を実行する。windowsの場合は「サービス」から「OpenSSH Authentication Agent」を起動する。
% eval `ssh-agent`
- ssh-agentにsecret1とsecret2を登録する
% ssh-add secret1 secret2
- server1にログインする。ssh agent forwardingをするため、
-A
オプションを付ける(~/.ssh/config
でForwardAgent yes
を設定すると-A
オプションは不要)
% ssh -A user@server1
- server2にログインする
% ssh user@server2
server2に入るための機密情報がローカルマシンにだけ保存されているため、安全にアクセスすることができます。
1passwordのssh-agent機能を利用する
2022/3/17現在、1passwordのssh-agent機能はバージョン8系でのみ動きます。macの場合はこちらからベータ版をダウンロードしてください。
1passwordの設定をする
Windowsの場合はWindows Helloとの連携をONにする必要があります。「Settings」→「Security」→「Unlock using Windows Hello」にチェックを入れます。
次に、Windowsであれば「Settings」→「Developer」で「Use the SSH agent」にチェックを入れます。
Macの場合は「Preferences」→「Developer」で「Use the SSH agent」にチェックを入れます。また、「Copy Snippet」ボタンを押して、sshの設定情報をコピーしておきます。
sshの設定
sshの設定を行います。私の手元のWindowsのopenssh(Windows 11(21H2)のOpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2)だと何もしなくても動いたのですが、うまく動かない場合はC:\users\(ユーザ名)\.ssh\config
ファイルをテキストエディッタで開き、以下の内容を書きます。
Host * IdentityAgent "\\.\pipe\openssh-ssh-agent" ForwardAgent yes
Macの場合は~/.ssh/config
ファイルをテキストエディッタで開き、先ほどコピーしておいたSnippetを貼り付けます。ForwardAgent yes
も追加しておきましょう。
Host * IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock" ForwardAgent yes
Macの場合はファイルのパーミッションも変更しておきます。
% chmod 700 ~/.ssh % chmod 600 ~/.ssh/config
Macの場合は、ssh-agentの設定を~/.bash_profile
などに追加しておきましょう。
export SSH_AUTH_SOCK=~/Library/Group\ Containers/2BUA8C4S2C.com.1password/t/agent.sock
秘密鍵のインポートと確認
秘密鍵を1passwordにインポートします。「New Item」→「SSH Key」を選択し、秘密鍵のファイルをドラッグ&ドロップします。
インポートできたか、以下のコマンドで確認します。
% ssh-add -l 2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx SSH Key-private (RSA)
登録した秘密鍵のfingerprintが表示されれば設定成功です。実際にsshして試してみましょう。sshする際、初回は1passwordの認証画面が表示されます。
Windowsでgitのssh認証で使う場合の注意点
gitを使う場合、github等のssh認証にもこのssh-agent機能は利用できます。ただし、Windowsでgit for windowsを使う場合、内蔵のsshではなくWindowsのopensshを使うように設定する必要があります。
C:\users\(ユーザ名)\.gitconfig
に以下を追記します。
[core] sshCommand = C:/Windows/System32/OpenSSH/ssh.exe
まとめ
ssh-agentを使うことで、sshの認証に使う秘密鍵をあちこちに置かず、ローカルマシンだけに保管して安全に利用することができます。
そして、1passwordのssh-agent機能を利用するで秘密鍵をさらに安全に管理することができます。また、複数のマシンやアカウント間で共有することも安全に行うことができるようになります。現在はベータ版の機能ですが、いずれ近いうちに正式な機能になるのではないかと楽しみにしています。
皆さんの参考になれば幸いです。