Go製になってWindowsでも使えるようになったKryptonの紹介
SSH/U2F認証をスマホで代行する「Krypton」というツールが便利でとても気に入っています。その使い方と良さをご紹介します!
以前は「Kryptonite」という名前でSSH認証の代行の仕組みだけをサポートしていましたが、現在は「Krypton」という名称でU2F認証の代行をメインにおいているようです。
オープンソースでZeroTrustインフラにおいてセキュアを保つ仕掛けがウリで、一昨年Akamaiに吸収されました。
機能
一般ユーザー向け
- U2F認証代行
開発者向け
- SSH公開鍵認証代行
- Gitのコミット署名代行
いずれも、「秘密鍵で署名をする機能」の応用です。
概念的にはU2Fドングル内にあるセキュアチップと呼ばれる「耐タンパー性の秘密鍵保持・署名ハードウェア」と同じものをスマホで実現するとこんなに便利になるよ!っていう仕組みです。
ここで紹介するのは主に開発者向け機能です。その概要やインストール方法は以下のページにまとまっています。
インストールの注意点
スマホアプリは必ずインストールが必要です。
macOSのSafariユーザーがU2F認証を利用したい場合はKryptonデスクトップアプリのインストールが必要です。(ストア経由でないSafari拡張のインストール方法が特殊なため)
以下のコマンドラインツールのインストールが使えるのはmacOSかLinuxかWSLです。
curl https://krypt.co/kr | sh
Windowsユーザーは以下のページにあるビルド済みバイナリ群をPATHの通った場所に展開します。(公式のビルドではありません)
追記:Chocolateyでインストール
@tomo_masakura さんより耳寄りな情報!
Windows版はChocolatey経由でインストールできるとのこと。
choco install krypton-cli
scoopで探したらありませんでした・・・。
kr pair
kr pair
コマンドにてペアリング用QRコードがターミナルに表示されます。
ターミナルウインドウを大きくするか、フォントを小さくするなどしてQRコード全体が見えるようにします。その後、スマホアプリのペア操作からカメラでこのコードを読み取ることでセットアップされます。
macOS/Linux/WSLの場合の$HOME/.ssh/configに追記される内容
# Added by Krypton
Host *
IdentityAgent ~/.kr/krd-agent.sock
ProxyCommand /usr/bin/krssh %h %p
IdentityFile ~/.ssh/id_krypton
IdentityFile ~/.ssh/id_ed25519
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_ecdsa
IdentityFile ~/.ssh/id_dsa
Windowsの場合の$HOME/.ssh/configに追記される内容
# Added by Krypton
Host *
IdentityAgent \\.\pipe\krd-agent
ProxyCommand C:\Users\nobo\go\bin\krssh.exe %h %p
sshコマンドの代わりにkrsshコマンドを使うような設定になっています。
SSH認証の流れ
例えばgithubの疎通テストでは以下のような動作例になります
$ ssh -T git@github.com
Krypton ▶ Restarting krd...
Krypton ▶ Requesting SSH authentication from phone
Krypton ▶ Phone approval required. Respond using the Krypton app
Krypton ▶ Success. Request Allowed ✔
Hi nobonobo! You've successfully authenticated, but GitHub does not provide shell access.
上記は以下のような流れです。
- sshコマンドから上記のconfigによりkrsshがkrdの死活をみてkrdをリスタート
- スマホ経由のSSH公開鍵認証を開始ー>スマホに承認要求通知が出るのでそれに承認する
- 承認を受信
- 認証を通過
- SSH通信開始
2.のところの待機は30秒~1分くらいでタイムアウトしてしまうので速やかにスマホで承認しましょう。
SSH公開鍵認証のしくみ
- 一般的にセキュアな秘密鍵の運用はPC環境ごとに生成し、オンラインに秘密鍵をさらさない使い方が推奨されます。
- そのため、通常は環境を作るたびに秘密鍵を生成し、SSHサーバーに新しい公開鍵を設定して回るという手間がかかります。
- もちろん、Windows環境とWSL環境もVM環境も別々のカギを使うことが推奨されるわけです。
- Kryptonではスマホ内に生成されたただ一つの秘密鍵を使いまわすため、PC環境の再構築や増設などでも新たに秘密鍵を作ることなくSSHサーバーに新たに公開鍵を設定して回る必要がありません。
- また、PCやスマホに生成した秘密鍵は漏洩を気にして暗号化するのが一般的です。その暗号化を解く方法というのは何らかの形で必要なんですが、これを毎回手入力のパスフレーズで解くわけにもいかず、ふつうはSSH-AGENTをインストールしてSSH-AGENTに初回のパスフレーズ入力の後の秘密鍵をメモリに保持してもらい、署名作業を代行してもらうという仕組み。
- このSSH-AGENTの代わりにkrdというデーモンが用意されていて、署名作業代行を「krd-クラウド-スマホアプリ」の3者連携によって行うという仕組み。
- krsshというSSH代行コマンドはkrdの死活をみてkrdを再起動してからsshコマンドを起動するだけ。
- krdエージェントはid_kryptonというアイデンティティで認証要求があれば、クラウド経由の認証にトライします。それ以外は通常のSSH-AGENT互換の挙動をとるということだと思います。
- スマホには秘密鍵がセキュアなストレージに保存されるわけですが、スマホをアンロックすることでその秘密鍵を利用した署名処理が実行可能になります。
このツールの既知の問題
VSCodeを開くとスマホ通知がひっきりなしに来る
VisualStudioCodeのGitサポート機能を使う場合、定期的なGitアクセスのたびにスマホに通知が来る状態になります。
以下のパラメータをfalseにすることが推奨されています。
"git.autofetch": false
スマホの紛失対策
Kryptonの秘密鍵をバックアップする方法はありません。それは紛失先で秘密鍵を取り出すことができないことを担保するためでもあります。紛失対策は従来のSSH秘密鍵と同じく、予備のスマホを用意して複数のデバイスに権限を許可しておき、SSHサーバーに登録する公開鍵を複数エントリ追加しておくことです。
このあたりの解説はここにあります。
まとめ
- PGP機能はまだ使っていませんが、GitコミットにPGP署名を付与できるんじゃないかな。
- 新しくOS環境を構築しても秘密鍵を新たに作る必要がなくなります。
- SSH-AGENTのセットアップが不要になります。
- 秘密鍵の暗号化解除はスマホのアンロックで行うので別途パスフレーズを設定したり入力したりする必要がありません。
- 秘密鍵の保存場所はスマホのセキュアストレージなので操作や分解等でその秘密鍵を取り出すことは困難になっています。
- スマホの一般的なロックポリシーがあればスマホの紛失・盗難からSSHサーバーへのなりすましログインも困難になっています。
- 以上の安全な鍵管理が新しいOS環境作る->krインストール->kr pairとするだけで構築できます。
- Akamaiさんに吸収されてから開発は停滞気味(おそらくプロプラ版がでる)。
- オープンソース版は途中からRust製デーモンをGoに作り直しました。
- これによりビルド時間が数十分の一に短縮&Windowsフォークが生まれました(こういう性質がGoの良さでもある)。
- 今後はオープンソース版のフォークが細々とメンテされていくのかなぁ。
Discussion