no7.space
🔑

1Password の SSH Agent を使う

パスワードマネージャの 1Password は、パスワードだけでなく、SSH キーなんかも管理することができます。
そして、この機能と、1Password に搭載された SSH Agent を使うことで、より安全に SSH することができるようになります。

ちなみにわたしが 1Password ユーザーなので、1Password で紹介していますが、Keeper とかにも似たような機能があるらしいです。

SSH Agent とは

SSH の秘密鍵を安全に管理し、認証のたびに鍵に設定したパスフレーズを入力する手間を省くことができるようにする仕組みのことです。

一般的に、秘密鍵を保護するために鍵にはパスフレーズを設定することが多いですが、これだと SSH 接続するたびにパスフレーズを入力する必要があります。
デプロイ作業とかならログインするときだけかもしれませんが、git push のたびに入力するのは面倒ですよね。
なにより何度も入力することになるパスフレーズってのはだんだんと入力をらくするために簡単なもの、使いまわしたものになりがちです。

そこで、Agent を使ってその面倒な処理を省略できるようにするってのが、SSH Agent の役割です。
通常の SSH Agent は、ssh-add コマンドで鍵を追加する際に、一度だけ鍵のパスフレーズを入力します。
以降、SSH 接続をする際は、Agent が自動的に認証をやってくれるので、ユーザーは鍵のパスフレーズを入力しないで済むようになります。

一方で、Agent は鍵の情報を、揮発性メモリ上に保持します。なので、システムを再起動したりすると消えてしまうので、再起動後は毎回登録が必要になります。
が、その代わり、セキュリティは向上します。

わたしは面倒くさがってこれを自動登録するシェルスクリプトを書いていました。

#!/bin/sh
keyTypes=('rsa' 'ecdsa' 'ed25519')

DIR=$HOME/.ssh

for key in ${keyTypes[@]}; do
    for file in `find $DIR -name "*_$key"`; do
        ssh-add $file > /dev/null 2>&1
    done
done

これをシェル起動時に呼び出すことで一気に登録してしまおうという作戦です。
尚、パスフレーズが必要な場合はそこで詰まるため、鍵にパスフレーズを設定してる場合は使えませんので、スクリプトは残ってるけどほぼ機能してませんw

1Password の SSH Agent とは

1Password の SSH Agent は、この ssh-agent の代わりとして動いてくれる機能です。
これを使うと主に3つのメリットを得ることができます

1. SSHする際に生体認証が使える

SSH Agent は、ssh-add する際にパスフレーズを一度入れておけばそれ以降はパスフレーズが不要になると書きましたが、
逆に言うと Agent に入ってる状態の鍵は、それ以降パスフレーズ無しで使用できちゃう、ってことになりますよね。

そこで、SSH Agent を 1Password のものにかえると、Agent が認証処理を行う際に、1Password の認証を通す必要があります。
1Password はアプリのロック解除などに指紋認証とか、スマートウォッチによるロック解除が使えますのでこれで認証することで安全に SSH できるようになります。

要は、今までパスフレーズを入力していたのから、指紋認証で SSH できるようになるということです。

2. 鍵自体を 1Password で管理できるようになる

片割れだけだと機能しないとはいえ、鍵ファイルをそのまま ~/.ssh におきっぱなしでの運用が基本だったわけなのですが、
そもそも鍵ファイル自体を 1Password に登録することで、鍵ファイル自体をセキュアに管理できるようになります。

あと、1Password 上の各種パスワード同様、独自の名前やタグをつけて管理できるため、単純に管理が楽になります。

Watchtower の機能の一部として、~/.ssh からインポートする仕組みなんかもあるので、移行はさほど難しくなさそうです。

もちろん必要に応じて、1Password から鍵をファイルにエクスポートすることもできます。

3. 鍵を安全に共有できる

1Password アカウント上に保存されるということは、別のマシンにインストールしてログインした 1Password から安全に読み出せるということでもあるので、複数マシンで安全に鍵を共有することができます。鍵が更新された場合も自動的にアップデートされるとおもうので一部の端末で更新漏れててログインできないみたいなことも防げるはず。

グループでの共有も可能ぽいので、チームで作業する場合にも安心ですね

設定してみる

ここからは実際に 1Password の SSH Agent を設定してみます。

Agent の有効化

1Password の Agent を使うには、1Password Developer の SSH Agent を有効にします。
設定開発者SSHエージェントSSHエージェントを使用にチェックを入れればOKです。

つぎに、~/.ssh/config を編集します。

エージェントを有効にした時点で、これをコピペしろって指示が出てくるはずなので、そのままコピペします。

これにより、SSHする際の Agent が今まで使っていたものから、1Password のものに変更されます。

鍵を登録する

実際に鍵ファイルを 1Password に登録します。
やり方としては2パターンあります。

1つは、「新規アイテム」から追加する方法、もう1つは、Watchtower でインポートする方法です。

新規アイテムとして登録する

1Password メインウィンドウの右上にある「新規アイテム」をクリックします
「ログイン」とか「セキュアノート」とか並んでるのですが、SSH は隠れてるので「詳細を表示する」をクリックします。

詳細をクリックするはデフォルトボタン群の下にテキストで表示されます

すると、「SSHキー」というボタンが出てくるのでそれをクリックします。

詳細表示で追加されるボタンの左上に SSH キーというボタンが追加されます

出てきたウィンドウから鍵ファイルを登録します。やり方は4つあって、

  1. 「秘密鍵ファイルをここにドラッグ」という部分に秘密鍵ファイルを DnD します
  2. 「新しい鍵を生成」で、ここで鍵を新たに作る
  3. 「キーファイルを読み込む」でファイルを開くダイアログから鍵ファイルを選択
  4. 「クリップボードから鍵を貼り付け」で、鍵の中身をコピーした状態からインポート

メインの使い方は1を想定されているのか、2以降の方法は「+秘密鍵を追加」というボタンを押したときに初めて表示されます

既存の鍵をインポートする

Watchtower で鍵をインポートすることもできます。

  1. サイドバーの「開発者」をクリック
  2. 「Watchtower」の「Watchtowerを表示」をクリック
  3. 自動的に ~/.ssh フォルダをチェックして鍵ファイルを確認して一覧にしてくれる
  4. インポートしたい鍵の横の「インポート」ボタンをクリックしてインポートする

実際に接続してみる

今回は、GitHub 用の SSH 鍵を設定したので、GitHub から Pull してみます。

1Password アクセスリクエストというダイアログが表示され、認証待機状態となっている図

わたしは Apple Watch でのロック解除を許可してるのでこんな表示になり、Watch 側でボタンを押して認証することができました。
もちろん Mac の TouchID とかでも認証できます。