Googleの二段階認証にセキュリティキーを使う

Googleの認証がいよいよ2段階認証として[セキュリティキーをサポート](https://support.google.com/accounts/answer/6103523?hl=ja)するようになった。
従来の2段階認証では[グーグル認証システム](https://support.google.com/accounts/answer/1066447?hl=ja)などが生成する6桁のOpen Authenticationワンタイムパスワード(OATH OTP)を利用していたが、新たに[FIDO Universal 2nd Factor](https://sites.google.com/site/oauthgoog/gnubby)(U2F)に準拠したハードウェアトークンを利用できるようになったのである。

早速試してみたので報告したい。

# 背景
U2Fは2段階認証にさらなる安全性と簡便性をもたらすことになる。

まずは簡便性について。OTPでは6桁の数字を制限時間以内に手で打ち込まねばならなかったが、U2FではUSBポートに挿さったトークンをタップするだけなので簡単である。ただしこれについてはOTPでも簡単にする方法はいくらでも考えられるので、必ずしもU2F特有とは言えないであろう。

重要なのはセキュリティである。OTPは確かにリプレイ攻撃を防いでくれるものの、フィッシングや[ウィルス](http://www.securebrain.co.jp/about/news/2014/05/netbank-otp.html)によって中間者攻撃をされるケースには無力である。またグーグル認証システムを初めとするスマートフォンアプリを用いたOTP生成機に関して言えば、OTPのシードをローカルに保存しているのでスマートフォンのセキュリティホールを突かれるとシードを盗まれる可能性もあった。
これに対してU2Fでは耐タンパー性を備えるハードウェアを用いてサーバー側と公開鍵認証を交わすので、これらの弱点を克服できる。

# 必要なもの

* FIDO U2F対応トークン
  * 本節で詳述する
* Googleアカウント
  * 二段階認証が有効になっている必要がある。
* Google Chrome
  * ウェブページ上でU2Fを処理するのにGoogle Chrome 38以降が必要である。
    FIDO U2Fの仕様はオープンだしMicrosoftもFIDO allicanceのメンバーなのでそのうちIEでも対応するんじゃないかと思うのだが、現在のところは対応していない。MozillaもBugzillaに[エントリが上がっている](https://bugzilla.mozilla.org/show_bug.cgi?id=1065729)状態で未対応だ。

さて、肝心のハードウェアだが、Googleのサポートに合わせてYubico社が早速[U2F対応のトークンを売り出した](
https://www.yubico.com/2014/10/google-releases-support-fido-u2f-security-key/)。本稿ではこれを利用する。

## Yubico製品ラインナップ

Yubicoは[いくつかのハードウェアトークン製品を売り出している](https://www.yubico.com/products/yubikey-hardware/)が、U2Fを使うためには「FIDO U2F Ready」と書いてあるものを選ぶ必要がある。現在の所「Yubikey Premium Neo」「Yubikey Premium Neo-n」および「FIDO U2F Special Security Key」がそれにあたる。

いずれも特別なドライバソフトウェアみたいなものは不要で、一般的なOSであればただUSBポートに挿すだけでOTPなりU2Fなりに利用できる。

### FIDO U2F Special Security Key
FIDO U2Fに特化した製品。USBメモリサイズである

### Yubikey Premium Neo
Special Security Keyと同じサイズだが、U2Fに加えてYubikey OTP(注:OATH OTPとは違う)やSmartcard, NFCサポートなどいろいろな機能を設定できるようになっている。

![IMG_20141026_174528.jpg](https://qiita-image-store.s3.amazonaws.com/0/1806/0e1c96a9-75c4-af14-9330-a92df24a9ffd.jpeg)


写真はPremium Neoと単３乾電池(比較)

### Yubikey Premium Neo-n
NFCサポートなどいくつかの機能がない以外は概ね、Premium Neoとは大きさだけの違い。

![IMG_20141026_174516.jpg](https://qiita-image-store.s3.amazonaws.com/0/1806/82207256-2678-1465-4865-25aca9606013.jpeg)

USBポートに入れると頭だけ露出する
![IMG_20141026_174606.jpg](https://qiita-image-store.s3.amazonaws.com/0/1806/3d27933a-a758-2fcd-044a-d510ea8f1110.jpeg)


## 製品選択
* U2Fだけを使いたいなら「Sepecial Security Key」が安くて($18)良い選択肢だ
* U2Fの他にOTPや他の機能を使うにはPremium NeoやPremium Neo-Nが必要となる
* USBポートを一個占有しても構わないのであれば、小型であるPremium Neo-NをUSBポートに挿したままにしておくと紛失する心配がないという利点はある。高いが。($60)

~~残念ながら現在のところはU2FとOTPは同時には利用できず、どちらかを選択するようにハードウェアを設定しなければならない。将来はサポートされるのかもしれないが、その場合でも現在売っているハードウェアが対応するのかどうかは不明である。Yubikeyはセキュリティのためファームウェアの更新ができないようになっているので、対応しないかもしれない。~~
追記: 現在は同時利用できるようになった

~~このことを考えると、smartcard(CCID)機能を同時利用したいのでない限り、「Sepecial Security Key」が安くて($18)良い選択肢だろう。~~
~~筆者はこのへんを知らずにPremium NeoおよびPremium Neo-nを買ったので、以下の説明はそれに基づく。~~

## 購入

Amazon.comでも売っているものの発送先はUSおよびカナダのみと書いてある。よって日本で購入する場合はYubico社の[オンラインストア](https://store.yubico.com//)から直接購入することになる。

製品はオーダーしてから数日で到着した。Yubicoの他の製品では発送方法としてair mail(7-14日, 数ドル)とDHL Express (4-6日, 数十ドル)を選択できたのだが、今回はなんか知らんがDHLしか選べなかったので否応なく早く着いたのである。一度に数個頼んだのでair mailは無理だったのだろうか。


# 設定と登録

Premium NeoやPremium Neo-nの場合は、ハードウェア機能としてはOTP, CCID, U2Fに対応してるものの初期状態ではOTPのみ利用するように設定されている。よってU2Fを使うには設定を直さねばならない。先にも書いたがOTPとU2Fは現在は両立できない。

Special Security KeyはあらかじめU2Fモードで固定されていると思われるので、おそらく下記の設定手順は不要であろう。

## U2Fモード設定
[マニュアル](https://www.yubico.com/wp-content/uploads/2014/10/How-to-unlock-U2F-on-your-YubiKey-NEO.pdf)に書いてある手順で設定する。Windows, Mac OS XまたはLinuxの動いているパソコンが必要となる。

1. マニュアルに書いてあるURLからYubikey NEO Managerをダウンロード、インストールする
2. Yubikey NEO Managerを起動する
3. YubikeyをUSBポートに挿す
4. 「Change Connection Mode」ボタンをクリックする
5. 表示されるダイアログ内で「U2F」にチェックを入れて「OK」を押す
6. YubikeyをUSBポートから引き抜く

以上でU2Fが有効になる。

## Googleアカウントへの登録
詳しくはグーグルの[ヘルプページ](https://support.google.com/accounts/answer/6103534?hl=ja)が分かりやすい。

1. 「[セキュリティキーの追加](https://security.google.com/settings/security/securitykey/add)」ページに行く。<br>
   ![スクリーンショット 2014-10-26 18.30.22.png](https://qiita-image-store.s3.amazonaws.com/0/1806/e3d271a2-b1eb-4b06-13c4-ef658ee765ae.png)
2. 既にセキュリティキー(今回はYubikey)がUSBポートに挿さっている場合は一度引き抜く
3. 「登録」ボタンを押す
4. セキュリティキーをUSBポートに挿す
5. セキュリティキーをタップする。
   * Yubikey Premium Neo-Nの場合はUSBポートから僅かに飛び出ている頭の部分を触れば良い。
   * Premium NeoやSpecial Security Keyのは場合は丸い金属部分を触れば良い。
6. 「登録完了」の旨表示される<br>
   ![スクリーンショット 2014-10-26 18.30.53.png](https://qiita-image-store.s3.amazonaws.com/0/1806/e520f219-17de-e414-2b45-796ef19cbedb.png)

以上で登録完了である。次回からはログイン時にはOTP入力の替わりにセキュリティキーを挿入してタップするように促されるので、そのようにすれば良い。

![スクリーンショット 2014-10-26 18.29.11.png](https://qiita-image-store.s3.amazonaws.com/0/1806/687940bc-3e08-eacb-3da1-3e91815085e2.png)


ちなみに、１つのアカウントに好きなだけの数のセキュリティキーを登録できるし、またセキュリティキー非対応の環境でログインする際は従来型のOTPにフォールバックもできる。


# 感想と展望

FIDO U2Fは簡単だし安心である。登録はスムースにできたし、複数のセキュリティキーを登録して安全なところに保管しておけば、それらを全部なくす可能性はGoogle認証システムをインストールした携帯をなくす可能性よりもずっと低い。

それから、今後Google以外のサービスでも使われると考えられる。FIDO allianceにはPaypalやMicrosoftの名前もある(https://fidoalliance.org/membership/members
)ので、これらのサービスが対応するのは時間の問題であろう。
またプロトコルはオープンだし[オープンソースなリファレンス実装](https://github.com/google/u2f-ref-code)もあるので、FIDOメンバー以外のサービスが対応することも期待できる。個人的にはHerokuとかEvernoteとかに対応して欲しい。

----
Disclaimer この記事は個人的なものです｡ここで述べられていることは私の個人的な意見に基づくものであり､私の雇用者には関係はありません｡