AWSの多要素認証に1passwordが使えたけど使っちゃダメだと思った話

1passwordのアイテム編集画面で、フィールドタイプを眺めててふと思った。「ワンタイムパスワードってあるけど、これ、AWSで多要素認証するときの『仮想MFAデバイス』に使えるのでは」と。結論から言えば、使えた。快適。でもこれは多分「人をダメにするナントカ」的な快適さだ。やっちゃいけないやつだ。

# AWSの多要素認証

AWSでは、AWSアカウントの管理者であるrootユーザー（メールアドレスでログインする人）と、利用者であるIAMユーザー（ユーザーIDでログインする人）のどちらでも、多要素認証（MFA：Multi-Factor Authentication）を設定して認証を強化できる。

* 認証方法はパスワード認証＋ワンタイムパスワード（当人が知っていること＋当人が持っているもの）
* ワンタイムパスワードの生成には、専用のデバイスであるU2FセキュリティキーやハードウェアMFAデバイス、スマホアプリである仮想MFAデバイスのどちらかが使える
* [SMSによる認証](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_sms.html)もプレビュー提供されていたものの「間もなく(略)サポートを終了します。新規のお客様が、この機能をプレビューすることはできません」。

利用できるスマホアプリは「[IAM - Multi-factor Authentication](https://aws.amazon.com/jp/iam/features/mfa/?audit=2019q1)」の「Virtual MFA Applications」にまとめられていて、現時点ではAuthy、Duo Mobile、LastPass Authenticator、Microsoft Authenticator、Google Authenticatorがリストアップされていた。

僕は当初、自分のiPhoneに[Google Authenticator](https://apps.apple.com/us/app/google-authenticator/id388497605)をインストールし、[IAM ユーザーの仮想 MFA デバイスの有効化](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html#enable-virt-mfa-for-iam-user)を行って、2段階認証でAWSにログインできることを確認した。

# 1passwordによるMFA

1passwordに記録していたIAMユーザー情報を修正していて、ふとフィールドタイプに「ワンタイムパスワード」があるのが気になった。AWS側では、仮想MFAデバイスの要件として次のように書いている。

> 電話や他のデバイスを仮想多要素認証 (MFA) デバイスとして使用できます。これを行うには、標準ベースの TOTP (時刻ベースのワンタイムパスワード) アルゴリズムである RFC 6238 に準拠するモバイルアプリをインストールします。これらのアプリは、6 桁の認証コードを生成します。
>（[仮想 Multi-Factor Authentication (MFA) デバイスの有効化 (コンソール) - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html)）

1passwordのワンタイムパスワード機能は、リリース時のブログエントリーを見るとTOTPであるらしい。

> 1Password 5.2 for iOS and 1Password 4.1.0.538 for Windows are out, and they provide support for using Time-based One Time Passwords (TOTP) in your Logins
> （[TOTP for 1Password users | 1Password](https://blog.1password.com/totp-for-1password-users/)）

これ、もしかして1passwordも使えるのでは、と思って試してみた。1password登録されたIAMユーザー情報にワンタイムパスワードフィールドを追加するとして、手順は「[仮想 Multi-Factor Authentication (MFA) デバイスの有効化 (コンソール)](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html)」を1password用に編集すると、こうなる。

1. AWS マネジメントコンソール にサインインし、[IAM コンソール](https://console.aws.amazon.com/iam/)を開きます。
2. ナビゲーションペインで [ユーザー] を選択します。
3. [ユーザー名] リストから対象の MFA ユーザーの名前を選択します。
4. [Security credentials] タブを選択します。[Assigned MFA device (割り当て済み MFA デバイス)] の横で、[管理] を選択します。
5. [MFA デバイスの管理] ウィザードで、[仮想 MFA デバイス]、[Continue (続行)] の順に選択します。
6. 1passwordを開きます。IAMユーザー情報を登録したアイテムを開き、編集状態にします。ユーザーIDやパスワードのフィールドの下に、新しいフィールドを追加し、「ワンタイムパスワード」タイプを選びます。
7. AWSの[MFA デバイスの管理] ウィザードで [手動設定のシークレットキーを表示] を選択し、1passwordに追加した「ワンタイムパスワード」フィールドに入力し、保存します。
8. [MFA デバイスの管理] ウィザードの [MFA code 1 (MFA コード 1)] ボックスに、1passwordに表示されているワンタイムパスワード(6桁の数字)を入力します。デバイスが新しいワンタイムパススワードを生成するまで待ちます (最長 30 秒)。生成されたら [MFA code 2 (MFA コード 2)] ボックスに 2 つ目のワンタイムパススワードを入力します。[Assign MFA (MFA の割り当て)] を選択します。

これで1passwordでワンタイムパスワードを生成できるようになり、AWS側も多要素認証でログインできるようになった。実際にログインしてみると、通常時のIDとパスワードと同様に、ワンタイムパスワードも自動（または半自動）入力されるようになる。ログインがとても簡単、快適になる。

# でもMFAで1password使っちゃダメかもと思う

Windows上の1passwordでワンタイムパスワードのフィールドを追加して、その後iPhone上の1passwordを見てみると、当然だけどデータは同期されワンタイムパスワードのフィールドが出てきた。iPhone上でAWSのコンソールにログインしたところ、こちらでも多要素認証でうまく認証された。すごく便利。でもこれはよくないことかもしれない。僕は「[仮想 MFA デバイスの交換または更新](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html#replace-virt-mfa)」を参照して、1passwordを無効化し、Google Authenticatorを登録しなおした。

Windows（具体的には社有のSurface Pro）上の1passwordとiPhone上の1passwordの両方でMFAの二段階目をクリアできたということは、もうこの2段階目は特定のデバイスを持っていることに依存しないということだ。僕のIDで他のデバイスに1passwordをインストールすることができれば、さらにそのデバイスでも2段階目をクリアできる。**「AWSのパスワード」と「特定のスマホ（デバイス）」ではなく、「AWSのパスワード」と「1passwordのマスターパスワード」でAWSにログインできてしまう。**

MFA（多要素認証）で求められるのは「多段階」ということではない。知識、所有物、生体情報のうち2種類以上の要素を組合わせて使うことだ。**「AWSのパスワード」と「1passwordのマスターパスワード」では、どちらも「知識」だから1種類の要素しか使っていない。これは多段階認証ではあっても多要素認証ではない。**僕が複数のデバイスで使えるワンタイムパスワード生成アプリを選んでしまったから、そうなっちゃったのだ。求められているのがワンタイムパスワードだけなら1passwordを活用すべきだけど、MFAなら1passwordを組み合わせちゃいけなかった。

古い話だけど「[タスポ（taspo）](https://www.taspo.jp/)」の運用が開始された頃に自販機にタスポを添付した店主がいて、「財務省の福岡の出先や日本たばこ産業から『なるべくやめてほしい』と電話などで注意を受けたというが、店主は『法律違反ではないはず』と、撤去の意向はない」と報じられた。同じようにAWSの多要素認証化も、導入時には「設定しました」「これからはMFA必須です」だけでは、僕のように快適だけどMFAを台無しにする組み合わせを選択しちゃうかもしれない。なんでMFAを導入するのかとかMFAってなんのことなのかとか、認識と思いを共有しないとコケそうだ。

# 参照

* [AWS での多エレメント認証 (MFA) の使用 - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html)
* [仮想 Multi-Factor Authentication (MFA) デバイスの有効化 (コンソール) - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html)
* [IAM - Multi-factor Authentication](https://aws.amazon.com/jp/iam/features/mfa/?audit=2019q1)
* [プレビュー – SMS テキストメッセージ MFA デバイスの有効化 - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_sms.html)