長らくコンピューターマニアの領分だった2段階認証(2FA)ですが、ここ数年、ようやく日常的な話題として上がるようになってきました。しかし、そのほとんどが、SMS経由で送られるワンタイムパスワードを使った2段階認証の話に留まっています。悲しいことに、これがいちばん信頼できる選択肢というわけではないのです。理由はいくつかあります。
- ロック画面上に通知を表示する設定になっている場合、SMSで送信されたパスワードは簡単にのぞき見られてしまいます。
- 通知をオフにしてあっても、SIMカードを別のスマートフォンに移し替えられてしまった場合、移し替えた先のスマートフォンで、パスワードの書かれたSMSメッセージが見られてしまいます。
- スマートフォン内に潜むトロイの木馬に、パスワードが書かれたSMSメッセージを傍受される可能性があります。
- 犯罪者がさまざまな不正手段(説得する、賄賂を渡すなど)を使って、携帯電話販売店から標的の人の電話番号が入った新しいSIMカードを手に入れる可能性があります。SMSメッセージはこのカードに届くようになり、標的となった人の電話はネットワークから切り離されます。
- SMSメッセージの送信に使用されるSS7プロトコルの基本的な欠陥を突いて、パスワードの書かれたメッセージを傍受することができます(英語記事)。
注意したいのは、前述のSMSパスワードを盗む方法(SS7の悪用)のうち、技術レベルが最も高くて多くの労力を必要とする方法でさえ、すでに実際に使用されているという事実です。犯罪者にしてみれば、それ以外の方法は日常業務にすぎません。したがって、ここで取り扱うのは仮定の話ではなく、差し迫った脅威なのです。
概して、SMSで送信されるパスワードはそれほど安全ではありません。大いに心許ない場合もあります。そこで、2段階認証については代替手段を探してみることに意味がある…というのが今回の話題です。
紙またはファイルに保存されたワンタイムコード
SMSを使ったワンタイムパスワードに代わる最もシンプルな方法は、あらかじめ準備したワンタイムパスワードを使う方法です。特に、それほど頻繁にログインしないサービスの場合には、悪くない選択肢です。Facebookの場合にも、特に代替策として使えそうです。
使い方は単純明快です。利用者からリクエストすると、サービス側で10個ほどのワンタイムコードを生成して画面に表示してくれるので、これらのコードを印刷するなり書き写すなりして、安全なところにしまっておきましょう。今後、ログインの認証にはこのコードを使用します。パスワード管理ツールに暗号化して保存するという方法もあります。
コードを物理的に保存するか、デジタル形式で保存するかはそれほど重要でありません。肝心なのは、これらのコードを紛失しないこと、そして、盗まれないことです。
2段階認証用のアプリ
1回だけ生成された1度限りのコードセットには、1つ欠点があります。コードはいずれ使い尽くされるので、使えるコードがないことに最悪のタイミングで気付くようなこともあり得ます。幸いなことに、もっと良い方法があります。サイズが小さくて大抵は使い方もシンプルな認証アプリを使って、その場でワンタイムコードを生成するのです。
2段階認証アプリの仕組み
2段階認証アプリの使い方はとても簡単です。基本的には、以下のような流れです。
- スマートフォンに認証用アプリをインストールします。
- このアプリを使用してログインしたいサービスの、セキュリティ設定を開きます。
- [2段階認証プロセス](またはそれに相当する項目)を選択します。QRコードが表示されます。
- 認証アプリでQRコードをスキャンします。アプリは、30秒おきに新しいワンタイムコードを生成するようになります。
QRコードは、キー(利用者とサーバーだけが知っているもの)と、30秒単位に切り上げられた現在時刻に基づいて作成されます。このキーと時刻は利用者側とサービス側で同じですから、コードは同期して生成されます。このアルゴリズムはOATH TOTP(Time-based One-Time Password)と呼ばれており、認証アプリの圧倒的多数で使用されています。
もう1つ、OATH HOTP(HMAC-based One-Time Password)というアルゴリズムもあります。このアルゴリズムは、現在時刻を使う代わりに、新しいコードを作るたびに1つずつ増えるカウンターを使用します。しかし、実生活でHTOPにお目にかかることはほとんどありません。HOTPの場合、アプリ側とサービス側で同期させながらコードを生成するのが複雑なためです。簡単に言うと、カウンターのタイミングが悪いと両側でずれが生じ、ワンタイムパスワードが機能しなくなるというリスクが少なからずあるのです。
したがって、OATH TOTPが事実上の業界標準であると考えていいでしょう。もっとも、開発者が仕様書(英語)で主張しているように、正式には標準でさえありませんが。
2段階認証アプリとサービスの互換性
2段階認証アプリのほとんどは同じアルゴリズムを使っているので、認証アプリに対応しているサービスであればどれでも使用できます。好きなものを選んでください。
もちろん、何にでも例外はあります。一部のサービスは、何らかの内部的都合により、自サービスでしか機能しない独自の2段階認証アプリを開発しています。それだけでなく、サービス自体も、そのサービスの専用アプリ以外の認証アプリとは連携しません。
特に大手ビデオゲームメーカーのサービスがそうです。たとえば、Blizzard Authenticator、Steamガードが組み込まれたSteamモバイル、Wargaming Authなどは、サードパーティーのアプリやサービスとの互換性を持ちません。これらのゲーミングプラットフォームで使用できるのは、それぞれ専用に用意されたアプリだけです。
Adobeもこの変わった方針をとっていて、Adobe AuthenticatorはAdobeIDアカウントにしか使えません。しかし、AdobeIDの認証に他の認証アプリを使用できるので、専用のアプリがなぜ必要なのかは不明です。
いずれにせよ、一般的には、2段階認証アプリの選択が利用者に任されている場合がほとんどです。また、ある会社が自社サービス専用の認証アプリを突然リリースした場合でも、自社サービスのアカウントだけでなく他のサービスのアカウントを保護するためにも使えるようになっていることがほとんどです。
ですから、基本機能以外に何ができるかを見て、一番気に入った認証アプリを選択してください。
2段階認証に最適なアプリ
2段階認証アプリには、驚くほどたくさんの種類があります。Google PlayやApp Storeで「authenticator」を検索してみれば、一目瞭然です。とはいえ、最初に目についたアプリをインストールするのはお勧めしません。もっと安全性の高いものがあるかもしれませんから。あなたは、自分のアカウントへアクセスするための鍵を、アプリに預けようとしているのです(当然ながらアプリはあなたのパスワードを知りませんが、パスワードが漏洩しやすいという前提で2段階認証を追加するわけですから)。一般には、信頼ある大手企業の開発者が作ったアプリを選択するといいでしょう。
このようなアプリの基本機能はどれも同じで、同一のアルゴリズムを使ってワンタイムコードを作っています。中には、それ以外に魅力的な機能やインターフェイスを持っている2段階認証アプリもあります。ここでは、特に興味深いアプリをいくつか紹介します。
1. Google Authenticator
さまざまな人が評価しているように、世の中に出回っている2段階認証アプリの中で最も使いやすいのがGoogle Authenticatorです。このアプリには設定もありません。このアプリでできるのは、新しいトークン(個々のアカウントに対応したコードジェネレーターのこと)を追加することと、既存のトークンを削除することだけ。コードは、タップするだけでコピーされます。
しかし、こういった簡潔さには短所もあります。インターフェイスに気に入らないところがあったり、他の機能が欲しいと思ったりした場合には、他の認証アプリをインストールするしかありません。
+ 非常に使いやすい
2. Duo Mobile
Duo Mobileも、極めてユーザーフレンドリーなアプリです。必要最低限の機能を備え、追加設定が必要ないという点ではGoogle Authenticatorと同じですが、Google Authenticatorより優れた点が1つあります。Duo Mobileの場合、コードを表示しないように初期設定されているのです。コードが表示されるようにするには、目的のトークンをタップする必要があります。認証アプリを開くたびに全アカウントのコードが表示されるのを好まない方には(私もそうです)、Duo Mobileのこの機能が向いています。
+ 初期設定で、コードが表示されないようになっている
3. Microsoft Authenticator
Microsoftも、必要最低限の機能のみを備えた認証アプリを提供するという実用本位のアプローチをとっています。そうは言うものの、Microsoft AuthenticatorはGoogle Authenticatorよりも機能が目に見えて豊富です。まず、すべてのコードが表示される初期設定になっていますが、トークンごとに非表示に設定できます。
また、Microsoft Authenticatorを利用すると、Microsoftアカウントへ簡単にサインインできます。パスワードを入力し、認証アプリのボタンをタップするだけでOKです。ワンタイムコードを入力する必要はありません。
+ コードを非表示に設定できる
+ Microsoftアカウントにサインインするための追加機能がある
4. FreeOTP
Red Hatが開発したこのアプリ、お勧めする理由は4つあります。まずは、オープンソースのアプリであること。2つめに、今回紹介するアプリの中で最も軽いこと。iOSバージョンはわずか750KBです(シンプルに徹したGoogle Authenticatorでもほぼ14MB、次にご紹介するAuthyは44MBもあります)。
3つめは、コードは既定で非表示になっていて、トークンをタップした場合にのみ表示されること。最後に、必要であればトークンをとても柔軟に手作業で設定できること。もちろん、QRコードをスキャンするというおなじみの方法でもトークンを作成できます。
+ 初期設定で、コードが表示されないようになっている
+ 必要な容量はわずか750KB
+ オープンソースである
+ トークンを手作業で作成すれば、最大限の設定ができる
5. Authy
対応プラットフォーム: Android、iOS、Windows(英語)、macOS(英語)、Chrome
Authyは、2段階認証アプリの中で最も多機能です。一番の長所は、すべてのトークンがクラウドに格納されるところです。このため、どのデバイスからでもトークンにアクセスできますし、新しいデバイスへの移行も簡単です。また、サービスごとに2段階認証アプリを立ち上げ直す必要がなく、既存のトークンを継続的に使うことが可能です。
クラウドに上げたトークンは、利用者が指定したパスワードに基づくキーで暗号化されます。つまり、データは安全に格納されていて、簡単には盗まれません。また、アプリへのログイン用のPIN(暗証番号)も設定できます。指紋スキャナーのあるスマートフォンならば、アプリを指紋認証で保護することも可能です。
Authyの一番の短所は、携帯電話番号に紐づけられたアカウントを設定しなければならないところです。こうしないと、アプリは機能しません。
+ トークンがクラウドに格納されるので、自分の持っているどのデバイスからでも使用できる
+ 同じ理由で、他のデバイスへの移行が非常に簡単である
+ アプリへのログインはPINまたは指紋認証で保護される
+ 画面には最後に使用したトークンのコードのみ表示される
+ 他のアプリとは異なり、AndroidとiOSだけでなく、WindowsやmacOS、Chromeもサポートしている
− 電話番号に紐づけられたAuthyアカウントがなければ動作しない
6. Yandex.Key
私見ですが、Yandex.Keyを最高の2段階認証アプリにしているのはそのコンセプトだと思います。登録が必要ないので、Google Authenticatorと同じくらい簡単に使い始められます。設定するのが苦にならない人向けには、さまざまな追加機能が用意されています。
Yandex.KeyはPIN(暗証番号)または指紋認証でロックできます。また、Yandexクラウド内にトークンのバックアップコピーを作成してパスワード保護をかけ(この段階では電話番号が必要です)、自分の使いたい端末で復元することができます。同様に、新しいデバイスへの移行が必要になった場合には、そのデバイスへトークンを移すことが可能です。
Yandex.Keyでは、Google AuthenticatorのシンプルさとAuthyの幅広い機能性を、自分の好みに応じて組み合わせることができます。唯一の欠点は、トークンの数が多いとインターフェイスが使いにくくなるところです。
+ 必要最低限の機能で使い始めて、後から拡張機能を設定できる
+ トークンのバックアップコピーをクラウド上に作成できるので、複数デバイスでの使用や新しいデバイスへの移行ができる
+ アプリへのログインは、暗証番号または指紋認証で保護される
+ 画面には、最後に使用したトークンのコードのみが表示される
+ Yandexアカウントのパスワードの代わりになる
− トークンの数が多い場合、必要なものを簡単に探せない
FIDO U2F準拠セキュリティキー:YubiKeyなど
ワンタイムコード生成アプリでは頼りなくてつかみどころがない感じがする、何かもっと堅牢で安心できるもの、たとえば、文字通りポケットに入れられる鍵のようなものでアカウントをロックしてくれるものが欲しい…。そんな場合は、U2F(Universal 2nd Factor)標準に基づいてFIDO Allianceが開発したセキュリティキーで決まりです。
FIDO U2Fセキュリティキーの仕組み
U2F準拠のセキュリティキーがセキュリティのスペシャリストたちに気に入られているのは、使う側から見て非常にシンプルな仕組みであることが主な理由です。U2Fセキュリティキーをデバイスに接続し、このセキュリティキーに対応しているサービスに登録するだけで使い始めることができます。ここまで、クリック数回で済んでしまいます。
サービスへのログインを承認するには、ログインに使ったデバイスにU2Fセキュリティキーを接続し、セキュリティキーのボタンにタッチします(デバイスによっては、暗証番号または指紋のスキャンが要求されることもありますが、これは追加の機能です)。以上、これだけです。複雑な設定や無意味で長い文字列の入力など、「暗号化」という言葉につきものの操作は必要ありません。
とはいえ、シンプルな操作の裏では、まさに最先端の暗号化技術が使われています。セキュリティキーをサービスに登録すると、1組の暗号鍵(秘密鍵と公開鍵)が作成され、公開鍵はサーバーに、秘密鍵はセキュアエレメントチップに格納されます。このチップこそU2Fセキュリティキーの心臓部です。
秘密鍵はログイン確認の暗号化に用いられます。暗号化されたログイン確認はサーバーに渡され、公開鍵を使って復号されます。正規の利用者になりすました人が違う秘密鍵を使ってログイン確認を暗号化して送ったとしても、公開鍵による復号結果は単に意味不明な文字列となり、アカウントへのアクセスは許可されません。
市販されているU2Fデバイスの種類
最も有名で手に入りやすいU2Fセキュリティキーは、Yubicoが開発したYubiKeyです。同社はU2F方式の先陣を切っていましたが、この方式をオープン化する判断を下し、FIDOアライアンスを設立しました。標準がオープンであるために、利用者の選択肢も制限されません。さまざまな企業がU2F対応デバイスを生産、販売しており、オンラインストアではさまざまなモデルが販売されています。
たとえばGoogleは先日、「Titan Security Key」を発表しました。これはFeitian Technologies(Yubicoに次ぐ業界第2位のU2Fセキュリティキーメーカー)が開発したセキュリティキーに、Googleが開発した独自のファームウェアを搭載したものです。
もちろん、U2F標準に準拠したセキュリティキーならどれでも、U2F標準に準拠したサービスで問題なく使えます。しかし、アプリの場合とは違う点もあります。一番の違いは、セキュリティキーが対応しているインターフェイスで、セキュリティキーを使えるデバイスはこれに左右されます。
USB:PCへの接続用(ドライバーをインストールしなくてもセキュリティキーを使えるので、OSはWindows、Mac、Linuxのどれでも問題ありません)。一般的なUSB-A用に加えて、USB-C用のセキュリティキーもあります。
NFC:Androidスマートフォンやタブレットでの使用に必要です。
Bluetooth:NFCに対応していないモバイルデバイス用。たとえば、iPhoneにはBluetooth対応のセキュリティキーが必要です。現在はiOSでもNFCを使えるようになりましたが(昨年まではApple Payでしか使えませんでした)、U2F対応アプリの開発でこの機能が活かされているケースはまだ少数です。なお、Bluetooth対応セキュリティキーには、充電が必要である、接続に時間がかかるなどの短所もあります。
U2FセキュリティキーのベーシックモデルはU2Fのみに対応していることが多く、価格は10~20ドルです。上位モデル(20~50ドル)はスマートカードの機能も持ち、ワンタイムパスワード(OATH TOTPおよびHOTP)の生成、PGP暗号化キーの生成と格納が可能で、WindowsやmacOS、Linuxなどへのログインに使用できます。
どれを選ぶ? SMS、アプリ、それともYubiKey?
2段階認証には何を選べばいいのでしょうか?この質問に、一言では答えられません。サービスごとに使用できる2段階認証はさまざまですし、またさまざまに組み合わせて使うことができます。たとえば、最も重要なアカウント(その他アカウントにひも付いているメールアカウントなど)の場合は徹底的な保護が必要ですから、U2F準拠のセキュリティキーでロックし、その他の2段階認証オプションすべてを使えないようにブロックすれば、このセキュリティキーがないと誰もこのアカウントにアクセスできないようになります。
1つのアカウントに2つのセキュリティキーをひも付けるのもいいでしょう。車のキーのように、1つをいつもポケットに入れておいて、もう1つはマスターキーを紛失したときに備えて安全な場所に保管しておきます。また、違うタイプの2段階認証を併用することもできます。たとえば、スマートフォンの2段階認証アプリをメインにして、バックアップ用にはU2Fセキュリティキーまたは紙にメモしたワンタイムパスワードを使用するなどです。
いずれにしろ大切なのは、可能ならばできるだけSMSベースのワンタイムパスワードを使わないようにすることです。