認証アプリ「Authy」の安全性を危惧する声。何が問題なのか。Authyに登録したトークンをエクスポートして移行する方法
最近驚いたのですが、どうもセキュリティ・プライバシーを重視する人たちは Twilio Authy から他のワンタイムパスワード(TOTP [Time-based One Time Password])ツールに移行しているようです。
TOTPは多要素認証としてよく使われるようになってきています。Google は2要素認証(2段階認証)によってアカウントへの侵入が50%減ったと報告しています。
Making you safer with 2SV - Google Blog
Last year, we accelerated our journey to eliminating password threats by starting to auto-enroll users in 2-Step Verification (2SV), giving people an extra layer of protection when cyber criminals try to hack into their accounts, by requiring a second form of verification beyond the password. Since last year’s initiative, we’ve successfully auto-enabled 2SV for over 150 million people, and we've also required it for over 2 million of our YouTube creators. As a result of this effort, we have seen a 50% decrease in accounts being compromised among those users.
以前はワンタイムパスワードのアプリなら「Authyが便利だよね」という流れだったと思うのですが、このアプリが支配的になったあたりから脱 Authy の流れがあります。
なぜ Authy から移行しようとする人が増えているのでしょうか。
目次
Authy のどこが問題なのか
- クローズドソースである。Authy がしっかりセキュリティ対策を行っていること、悪いことをしていないことを信じるしかない
- アカウントを作るときに個人情報(電話番号など)が必要である
- クラウドにデータが保管され、データを自分でフルコントロールできない
- クラウドサーバーにデータを置くことによるリスクがある
- Authy 自体の認証がSMSである。SMSによる認証は突破されてしまう事例が多い。また、スマホが壊れるなどSMSを受信できないとログイン不可能
- Authy でしか使えないTOTP認証を採用しているサービスがある
- アプリを使うのにインターネット通信が必要
- トークンをエクスポートできない。他のTOTPアプリに移行できない
最近は FOSS(Free Open Source Software)の方が安心できるという共通認識があります。
たとえ自分でソースコードをチェックできなくてもソースをチェックしてくれる人はいるでしょうから、オープンソースの方が透明性は遙かに高いです。何かあったときにもチェックできますし。
私も Authy を使っていたのですが、ずっと気になっていたのはアカウントを電話番号で管理していること。
自分のアカウントへのログインに必要委なのがメールアドレスではないので、今使っている電話番号を変えたら困ることになります。
データがメールアドレスに紐付けされないというのは防衛策としては良いポイントではあるのですが、そもそもメールアドレスにも紐付けしなくていいはずです。
さらに電話番号が主体になっていることによってアカウントへのログインがSMS認証なので、突破される可能性があります。
SMS認証で二要素認証にしていたのに第三者にログインされてしまったという事件をよく見かけます。
また、スマホやSIMカードが壊れるなどしてSMSを受信できない時もログインできません。
では Authy から移行しようと考えた時、Authy には大きな欠点があり、登録したトークンがエクスポートできません。
これによって、Authy から他のアプリに移行するのがものすごく大変です。大変になるようにデザインされています。
なぜエクスポートできないのかという疑問に対して Authy は次のように答えています。
Export or Import Tokens in the Authy app – Authy
In order to maintain security for our users, the Authy application does not allow importing or exporting 2FA account tokens.
TOTP トークンは重要なデータですから、扱いが難しいのは分かります。しかしおそらく囲い込みの戦略によるものです。Authy にしか対応していないトークンもありますから。
セキュリティ・プライバシーを重視したTOTP用のアプリ
今は Android 向けには「Aegis」「andOTP」というアプリがセキュリティ的に良いとおすすめされることが多いです。
iOS 向けには「Raivo OTP」「Tofu」が良いとのこと。
これらはオープンソースで、トークンをローカルやオンラインストレージにバックアップでき、自分が好きなようにコントロールできます。
どれも UI が Authy よりも視認性に優れています。
Root権限を取得してあればAuthyのトークンのエクスポートが楽なのだが…
さて、Authy 以外のTOTP用アプリを使いたいところなのですが、Authy はエクスポート機能がないため、トークンの移行が大変です。
「Aegis」は優秀で、デバイスの Root 権限を取ってあれば簡単に Authy アプリのデータをインポートしてこれます。
Steam Authenticator の TOTP にも対応しているらしく、とても便利そうです。
しかし、Root を取得していない人の方が多いでしょう。
私も Root を取った方が手順が簡単そうだと思ったのですが、そもそも Root を取るための方法が煩雑です。
Android 端末では「Kingo Root」という簡単に Root を取れるらしいツールが検索すると出てきますが、少し調べると中身は怪しく、Root を取れる代わりに端末のデータが送信されるとのこと。
何をインストールされるか分かりませんのでこのツールは使わない方が良さそうです。
また Root を取得すると Root を取得したゆえの脆弱性が発生してしまうため、より一層セキュリティに気を遣わねばなりません。
ここでは Root を取得しない方向で行きます。
Root権限を取得していない状態で、Authyからトークンのエクスポートをする
トークンのエクスポートをしたい人は登録してあるトークンの数が多い人です。登録してあるトークンの数が1つか2つの人は、そのトークンを発行しているサイトでもう一度2FAの設定を新しいアプリで行う方が楽です。
しかし数が多いとその作業は大変すぎます。
Root権限を持たない状態でのエクスポートは Authy では普通はできないのですが、調べてみると1つだけ方法があります。Guillaume Boudreau 氏が説明してくれています。
この方法だと Authy にしか対応していないトークンも他のアプリで使えるようになります。
こちらの方法を頼りにやってみたところ、うまくいきました。本当に感謝しています。
なお、この方法が将来的にも使えるか分かりません。以前 Authy は Chrome の拡張機能を公開しており、それを利用してもっと簡単にエクスポートができたようなのですが、その拡張機能は開発中止になっています。
この方法も Authy 側が何か対策を採ると使えない方法になってしまいますので、今すぐではなくても将来的に Authy から抜け出したい人は早めにエクスポートをしておいた方が良いです。
トークンは2つのアプリに登録しても問題ありません。Authy と他のTOTPアプリを平行して使うのも手です。
簡単な手順を書きますと、
- Authy Desktop で Win/Mac/Linux からログイン
- デバッグモードにして起動する(パラメータに "--remote-debugging-port=5858" を追加)
- http://localhost:5858 にアクセスし、ブラウザでアプリと通信する
- ブラウザのコンソールにコマンドを入力し、データをエクスポートする
という手順です。
実際にデバッグモードでアプリと通信している状態のスクリーンショット。
手順では「Chrome で開く」と書かれていますが、私は Firefox でやりました。
コンソールでコマンドをコピペして実行すると、トークンの数だけQRコードが表示されます。
注意点としては、Authy Desktop でログインした後、登録してあるトークン(Authy アプリ内では "アカウント" と呼ばれている)を表示するため、設定したパスワードを入力してトークンが見られる状態にしておく必要があります。
私はこれをやっておかなかったので Secret が全て null でした。Secret が null だと失敗です。
TOTP は Secret の値を元に発行され、null だと "null" 用のワンタイムパスワードが表示されてしまいます。全てのワンタイムパスワードが同じ数値だったので気付きました。
null と表示されてしまった人は一度 Authy Desktop でパスワードを入力してからアプリを終了させ、再度試してください。
トークンなどをJSONファイルに出力することもできますが、TOTPアプリによって読み込めるファイルの構造がまちまちで、たぶんそのままでは読み込めないです。
私は「Aegis」で試してみたのですが、構造が悪いようで読み込めませんでした。どういう構造にすれば良いのか調べたのですが見つけられず、自分で整形するのは諦めました。
私が移行したいトークンは20個以内だったので、QRコードをその数だけ「Aegis」にカメラで読み込ませてトークンを移行しました。
カメラでQRコードを読み取るのは少し手間ではありますが、それぞれのサイトでトークンを再発行するのに比べたら随分楽に済みました。
それに最悪 Secret さえ分かれば良いのです。それさえ分かっていればTOTPとして使えます。
Guillaume Boudreau 氏に本当に感謝です。
Authy から抜け出せました。