ブロードバンドタワー國武です。
Facebook を眺めていると、知り合いで Kryptonite についてシェアしている人が多かったので、少し試してみました。
Kryptonite は iPhoneやAndroid用のアプリケーションで、ssh の秘密鍵の生成とその保存が可能となります。これにより、作業用PCなどに秘密鍵を置くことなく、公開鍵暗号方式による ssh ログインを可能とするツールです。
Kryptonite
https://krypt.co/
今回の記事では、iPhone へのインストールと鍵の生成と、KryptoniteとMac を使って、実際にサーバへsshでログインまでを取り上げたいと思います。
目次
iPhone アプリのインストール
iPhone での導入は簡単です。App Store からインストールするだけで、ssh用の秘密鍵の生成を始められます。
なお、生成する鍵のタイプは RSA(4096-bit)以外に Ed25519 が選べます。これは上記画面の右下をクリックすることで切替可能です。生成する鍵のタイプを選択したら “GENERATE KEY PAIR” を押します。
暫く待つと、公開鍵および秘密鍵が生成されます。
次に、メール・アドレスを入力させる画面に移りますが、これはだれの鍵なのかが識別できればいいだけなので、適当に入力しても問題ないです。
こんな感じで公開鍵の後ろにつくだけです。
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL1le6FijE86Rb8NynAY8+88rgclnoBIMLswjDk7tXKJ koichi@example.jp
krコマンドのインストール
次に、iPhone に保存された秘密鍵を使った認証を行なうために、ssh client 側にもツールの導入が必要となります。それが kr コマンドです。krコマンドは Go言語によって記述されており、MacOSX や Linux の主要なディストリビューションに対応しています(Windows は未サポートのようです)
iPhone の画面には、MacOSX 側でのインストール方法が表示されています。ここでは、
- curl & sh
- npm
- brew
でのインストール方法が選べますが、せっかくなので brew でインストールすることにします。
上記で表示されたように、MacOSX のターミナル画面で
$ brew install kryptco/tap/kr
と入力することでインストールができます
なおkr コマンド(Go言語で書かれています)と共に ~/.ssh/config に必要な設定が入ります。
id_kryptonite 以外は、もともと私が作った鍵ペアですね。次に、
$ kr pair
とすると、QRコードがターミナルに表示されます。iPhone側のアプリで “Allow Camera Access” をクリックし、このQRコードを撮影することで、Mac と iPhone のペアリングが行われます。
正常にペアリングが行われると、 ~/.ssh ディレクトリ内に秘密鍵がなく、id_kryptonite.pub のみが置かれていることが確認できるかと思います。
実際に使ってみる
とりあえず実際に使ってみたい!という人は 上記画面で書かれているように、
$ ssh me.krypto.co
とすることで、実際に iPhone 側の秘密鍵を用いた認証が試せます。実際に ssh してみると
のように iPhone 側でメニューがポップアップするので、 Reject以外を押せば認証が成功したことがわかるでしょう。認証時、秘密鍵が必要となる処理を iPhone 側で行い、その結果をクライアント側に返すだけとなりますので、その処理において秘密鍵は iPhone から外にコピーされることはありません。このあたりは Gnuk を知っている方は、Gnuk をイメージしてもらえればわかりやすいでしょうか。
また 、iTunes で “iPhoneのバックアップを暗号化” を選択した状態でバックアップを取ったとしても、iOS の keychain でkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly が設定されているそうで、他のデバイスに復元することはできません。また、現時点でKryptoniteはバックアップをサポートしていない旨、FAQに記載されています。
その他、アーキテクチャの詳細を知りたい方は、開発者の方がブログで解説されているので、確認されると良いかもしれません。
なお実際のサーバへのアクセスに利用する際には、通常と同じく
$ ssh-copy-id -f -i ~/.ssh/id_kryptonite.pub ssh-server.example.jp
のように公開鍵をコピーしておきます。作業としてはこれだけです。以前
CentOS7 の sshd に Google Authenticator を仕掛けてみる
の記事で取り上げた Google Authenticator のように、サーバ側での設定変更は不要です。つまり手元の設定変更だけで、2要素認証の運用を始められることになります。ただし、逆に言えば利用を強制もできないわけで、若干悩ましくもあるでしょうか。ともあれ、手元に秘密鍵がないわけですから、安全度は高められそうです。
なお、ここまで読んだ方はお気づきかもしれませんが鍵は1つしか生成できません。つまり「基本的には Ed25519 を使いたいんだけど、古いサーバ用に RSA も作っておきたい」といった要望には現時点では答えられないことになります。ただ、複数の鍵を管理したいというリクエストは挙がっているようですので、そのうち実装されるかもしれません。
秘密鍵の削除
iPhone の Kryptonite 画面を見ると
のように、右上にゴミ箱アイコンがあるかと思います。これをクリックすることで秘密鍵の削除を行なうことができますが、実際の削除の前には
のように警告と確認が出るので、誤って消すことはないでしょう。万が一消してしまっても再度生成すればOKです(kr pair でのペアリングのやり直しだとか、サーバへ公開鍵の再配布をしなければいけないといった問題はありますが)
その他
Kryptonite は非常に完成度が高く、またそのソースコードが github.com 上で公開されています。さらには商用版もあり
- Audit Logging
- Host Verification
- Two-Person Rule
- LDAP/Active Directory
- Public Key Dashboard
- メール、チャットや電話によるサポート
などの機能が有償にて提供されているようです。
https://krypt.co/pricing/
ちなみにサーバにログインする際に
- Allow once
- Allow for 3 hours
- Reject
が選べますが、”Allow for 3 hours” をクリックすると、そのログインしようとしていたサーバへ 3時間、都度 POPアップで許可をクリックしなくてもいい……という意味ではなく、ペアリングしているクライアント(Workstation) からのリクエストは、3時間は無条件で許可するね、という意味なので、若干注意が必要です(別のサーバにログインしようとすると、再度聞かれることはありません。Ansible などで大量のサーバを管理する場合などを考えると、こちらの方が動作としては好ましそうですね)
また Kryptonite は、個人やログインサーバを特定しない(記録しない)形で、統計情報を取得しているとのことで、Google Analytics, AWSのMobile Analytics, SQS/SNS との通信が発生しているようです(ある程度設定で無効化できるようですが)。ではこれらのサービスが落ちてる時、サーバへのログインができなくなるのか?と言われたら、そういったことはなく、iPhone とクライアント(Workstation)との間の bluetooth 通信が切れてない限りは、問題なくログインできます。
それすらも切れてしまった場合には、クライアントのローカルに保存されている他の鍵ペアがあればそれを利用するようにフォールバックします。なかなかよく考えられていますね!
ただ、完全に秘密鍵をローカルに保存しない!というルールにするなら、冗長化を考えるとiPhone をもう1台買う!か、Gnuk などとの併用とかがいいかもしれません。Gnuk については、そのうち取り上げさせて頂ければと考えています。
本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。