2015年のmixiグループアドベントカレンダー 15日目を担当します。今さら聞けない2段階認証の話いろいろについて書いてみます(初歩的、おさらいといった感じで、あんまり突っ込んだ話はありません)。そのうち気が向いたら実装面での解説を追加するかもしれません。

2段階認証とは(ざっくりと)

 ここ数年、2段階認証(2要素認証、Two Factor Authencication)に対応したサービスがどんどん増えてきています。2段階認証は、IDとパスワードだけでなく、ユーザー専用のコード(数値)を入力することでセキュリティを強化するというもの。  ユーザー専用のコードは、音声電話やSMSによって提供されたり、ソフトウェアトークンによって提供されるもの(スマホアプリなど)、ハードウェアトークンによって提供されるもの(例えばYubiKeyなど)があります。  ここで紹介するソフトウェアトークンというものは、スマートフォンアプリとして提供され、サービス側が提供するQRコードをカメラで読み取ることで登録でき、一定時間が経過するごとに新しいコードを生成されます。ユーザーは、サービスへログインするときにその時表示されているコードを入力し、サーバ側がそれを照合することで認証を行います。

2段階認証対応サービス

https://twofactorauth.org/ に2段階認証に対応した様々なサービスが掲載されています(主に海外サービス)。お使いのサービスで対応しているものがあれば設定したほうが良いかもしれません。

国内でも人気のサービス

他にも多数のサービスが2段階認証に対応しています。

代表的なソフトウェアトークン

Google Authenticator

https://support.google.com/accounts/answer/1066447?hl=ja

Googleが提供。最も使われているソフトウェアトークンかもしれません。 iOS, Android 向けのアプリが提供されています。 アプリをインストールした端末が故障してしまったor紛失してしまい、コードの生成ができなくなってしまったといった事例をよく聞きます。バックアップの手段についてよく検討する必要がありそうです。

1Password

https://agilebits.com/onepassword

2段階認証に限らず、サイトごとのID、パスワードなどを管理するソフトウェア。 マルチデバイス(iOS, Android)、マルチプラットフォーム(Windows, Mac)に対応しています。Mac版はApp Storeでも提供されています(Mac App Store版でないとiCloud同期ができません)。有料ですが人気のあるソフトウェアです。 iCloudやDropboxで同期ができるのでマルチデバイスで同じデータを使えるのが便利。 最近、MacやWindows上でもコードが参照、コピーできるようになり便利になりました。

Authy

https://www.authy.com/

2段階認証専用のソフトウェア。こちらもマルチデバイス(iOS, Android)、マルチプラットフォーム(ChromeアプリとしてWindows, Mac, Linux)対応。 スマートフォン以外にChromeアプリでコードを参照、コピーできるので便利。 APIにも対応し、WordPressSSHのログイン時にAuthyと連携させる機能もあります。

他のソフトウェア

私は使ったことがないのですが、以下のアプリもありました。

IIJ Smart Key

http://www.iij.ad.jp/smartkey/

iOS, Android対応

HDE OTP Generator

https://www.hde.co.jp/otp/ja/

iOSのみ対応?

Yahoo! JAPAN ワンタイムパスワード

http://id.yahoo.co.jp/security/otp.html

iOS, Android対応。

番外編: U2F (FIDO Universal 2nd Factor)

 こちらはソフトウェアではなくハードウェアのトークンですが、U2Fと呼ばれるプロトコルに対応したサービスが徐々に増えてきています。  U2F対応のUSBトークンはAmazonなどで購入することができます(数千円程度)。  パスワードやコードを入力する必要がなく、USBを差し込み、触れるだけで認証が済むといった便利なものです。対応するブラウザは現時点ではChromeのみ(各種OS対応)のようです。

U2F対応のサービス

参考

SSHで2段階認証を使う

Google Authenticator OpenSource https://github.com/google/google-authenticator

Authy https://www.authy.com/integrations/ssh/

U2Fを使う方法 https://developers.yubico.com/pam-u2f/

いずれもPAMモジュールとして提供されます。

2段階認証のアルゴリズム

回数ベースのHOTPと呼ばれるもの(RFC4226) http://tools.ietf.org/html/rfc4226

時刻ベースのTOTPと呼ばれるもの(RFC6238) http://tools.ietf.org/html/rfc6238

の2種類があるようです(他にももしあればお知らせください)。 アルゴリズムの詳細についてここでは詳しく触れません。

参考記事

2要素認証のTOTPとHOTP、どちらがより安全か? http://blog.ohgaki.net/2fa-totp-hotp-which-is-safer

Googleアカウントのセキュリティを最大限に高めるUSBキー「FIDO U2F SECURITY KEY」 http://k-tai.impress.co.jp/docs/column/todays_goods/20141105_674268.html

RFC6238 Time-based One-time Password Algorithm (TOTP)の仕組みのメモ http://qiita.com/shrkw/items/426a7f1a59f42e0bd523

2段階認証はAuthyが便利 http://dev.classmethod.jp/cloud/aws/authy/

次のエントリ

明日は @punchdrunker さんによる「いまから30分以内にAndroidアプリでPUSH通知を実装しろと言われた時に読む記事」となります。よろしくお願いします。