📱

【Identity Platform 活用】③ セキュリティ強化のための多要素認証導入ガイド

2025/01/22に公開

1. はじめに

こんにちは、クラウドエース第三開発部の秋庭です。
前回の記事では、OIDC や SAML 認証を利用し、多様な認証方法に対応する方法をご紹介しました。今回は Identity Platform の多要素認証についてご紹介できればと思います。

前回の記事はこちらになります。
https://zenn.dev/cloud_ace/articles/9b47b0dab6d3ab

今日のユーザー認証において、セキュリティの強化は重要な観点です。セキュリティ強化の手段の一つである多要素認証を Identity Platform で利用する方法、注意点について解説します。

以下の点については今回の記事で取り扱いませんので、ご了承ください。

2. 用語

以下に今回の記事で扱う、用語について記載します。

  • 多要素認証
    • ユーザーがシステムにアクセスする際に、複数の異なる認証要素(例:パスワード、SMS コード、認証アプリのトークン)を組み合わせて認証を行うことで、セキュリティを強化する手法です。これにより、単一の認証情報が漏洩しても不正アクセスを防ぐことができます。
  • TOTP(Time-based One-Time Password)
    • 一定時間ごとに生成される一時的なパスワードで、認証アプリ(例:Google Authenticator、Microsoft Authenticator)などを使用して生成されます。ユーザーはこのパスワードを入力することで、追加の認証要素として利用します。

3. SMS 多要素認証の設定方法

SMS 多要素認証の有効化

SMS 多要素認証を有効化する最も簡単な方法は、Identity Platform コンソールから有効化する方法です。

テナント、もしくはプロジェクトを選択し、有効化を行うとユーザーに多要素認証を登録できるようになります。

ユーザーに SMS 多要素認証を登録する

ユーザーに SMS 多要素認証を登録します。
この操作は Web SDK (クライアントサイド)のみで完結できます。

SDK については以下をご確認ください。
https://zenn.dev/cloud_ace/articles/6d8d1502d3c90f#2.-用語

Admin SDK でもこの作業は実施できます。
多要素ユーザーをプログラムによって管理する  |  Identity Platform Documentation  |  Google Cloud

以下のページを参考に、SMS 多要素認証を Web アプリケーションに追加します。
第 2 要素の登録  |  Identity Platform Documentation  |  Google Cloud

大きな流れは以下です。

  1. Web アプリケーションはユーザーの再認証を行う
  2. Web アプリケーションはユーザーが入力した電話番号に確認コードを送信する
  3. ユーザーは確認コードを Web アプリケーションに入力し、検証することで登録が完了する

アプリケーションとの統合

実際の動作を確認します。

  1. ログイン(再認証)の実施
  2. 登録する電話番号の入力

  1. 確認コードの入力

どのように登録されたか、以下 API よりユーザー情報を取得して確認してみます。
Method: projects.tenants.accounts.lookup  |  Identity Platform Documentation  |  Google Cloud

公式ドキュメントに従ったので、表示名が My personal phone number となった電話番号が登録されていることが確認できました。

// mfaInfo のみ抜粋
"mfaInfo": [
  {
    "phoneInfo": "+81******6815",
    "mfaEnrollmentId": "72151708-5f3c-4069-8321-0603162e3b25",
    "displayName": "My personal phone number",
    "enrolledAt": "2025-01-20T08:17:06.613176Z"
  }
],

ログイン時に SMS 多要素認証を実施する

以下のページを参考にログイン時に多要素認証を要求します。
第 2 要素でのユーザーのログイン  |  Identity Platform Documentation  |  Google Cloud

大きな流れは以下です。

  1. 第 1 要素(メールパスワード、ID プロバイダ等)での Web アプリケーションへのログイン
  2. ユーザーに第 2 要素が登録されている場合、Web アプリケーションでは auth/multi-factor-auth-required エラーが発生するので、確認コードをユーザーに送信するよう分岐する
  3. ユーザーは送られた確認コードを Web アプリケーションに入力し、検証することでログインが完了する

アプリケーションとの統合

実装の動作を確認します。

  1. 第 1 要素でのログイン

第 1 要素(メールアドレス・パスワード)でログインを行います。

ユーザーには第 2 要素が登録されているので、auth/multi-factor-auth-required エラーが発生します。
登録されている電話番号に確認コードが送信されます。

phone は SMS 多要素認証の factorId にあたります。

  1. 確認コードの入力

ユーザーに確認コードが送られます。

ユーザーは確認コードを入力し、Web アプリケーション(Web SDK)は認証を完了します。

参考
第 2 要素でのユーザーのログイン  |  Identity Platform Documentation  |  Google Cloud

その他の SMS 多要素認証の設定

  • リージョン設定

SMS でコード送信を有効にする地域を設定することでセキュリティを向上できます。
許可リスト、もしくは不許可リストを指定する形で設定が可能です。

プロジェクト直下に対しては Firebase コンソールから設定が可能ですが、テナントごとの設定はできません。
Identity Platform コンソールからもできないため、REST API や Admin SDK で設定する必要があります。

参考
Method: projects.tenants.patch  |  Identity Platform Documentation  |  Google Cloud

4. TOTP 多要素認証の設定方法

TOTP 多要素認証は SMS 多要素認証とは異なり、コンソールから設定できません。
REST API、もしくは Node.js Admin SDK を使用する必要があります。

REST API の場合、以下ドキュメントの内容に従うことでテナントに対して TOTP 多要素認証を有効化することができます。
テナントレベルで TOTP MFA を有効にする  |  Identity Platform Documentation  |  Google Cloud

curl -X PATCH "https://identitytoolkit.googleapis.com/v2/projects/PROJECT_ID/tenants/TENANT_ID?updateMask=mfaConfig" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    -d \
    '{
        "mfaConfig": {
          "providerConfigs": [{
            "totpProviderConfig": {
              "adjacentIntervals": NUM_ADJ_INTERVALS
            }
          }]
       }
    }'

API リファレンスのページから、Try this method 経由で実行や curl コマンドの生成を行うことも可能です。
Method: projects.tenants.patch  |  Identity Platform Documentation  |  Google Cloud

ユーザーに TOTP 多要素認証を登録する

ユーザーに TOTP 多要素認証を登録します。
この操作は Web SDK (クライアントサイド)のみで完結できます。

大きな流れとしては以下です。

  1. Web アプリケーションはユーザーの再認証を行う
  2. Web アプリケーションは TOTP 登録用の QR コードを表示する
  3. ユーザーは TOTP に対応したアプリケーション (Google Authenticator や Microsoft Authenticator 等) で QR コードをスキャンし、登録を行う
  4. ユーザーは Web アプリケーションに確認コードを入力し、検証することで登録を完了させる。

以下のドキュメントを参考に、Web アプリケーションに TOTP 多要素認証を追加する処理を作成します。
TOTP MFA にユーザーを登録する  |  Identity Platform Documentation  |  Google Cloud

ドキュメントに記載されている以下のコードの、url を任意の QR コードライブラリを使用して QR コードとして表示するようにします。

import {
    multiFactor,
    TotpMultiFactorGenerator,
    TotpSecret
} from "firebase/auth";

multiFactorSession = await multiFactor(activeUser()).getSession();
totpSecret = await TotpMultiFactorGenerator.generateSecret(
    multiFactorSession
);

// Display this URL as a QR code.
const url = totpSecret.generateQrCodeUrl( <user account id> , <app name> );

// Ask the user for the verification code from the OTP app by scanning the QR
// code.
const multiFactorAssertion = TotpMultiFactorGenerator.assertionForEnrollment(
    totpSecret,
    verificationCode
);

// Finalize the enrollment.
return multiFactor(user).enroll(multiFactorAssertion, mfaDisplayName);

アプリケーションとの統合

実際の動作を確認してみます。

  1. Web アプリケーションはユーザーの再認証を行う
  2. Web アプリケーションは TOTP 登録用の QR コードを表示する
  3. ユーザーは TOTP に対応したアプリケーション (Google Authenticator や Microsoft Authenticator) で QR コードをスキャンし、登録を行う

今回は Google Authenticator を使用し、表示した QR コードの表示をスキャンして登録を行います。

  1. ユーザーは表示されているワンタイムパスワードを Web アプリケーションに入力し、検証することで登録を完了させる。

ログイン時に TOTP 多要素認証を実施する

以下のページを参考にログイン時に多要素認証を要求します。
第 2 要素を使用してユーザー ログインを行う  |  Identity Platform Documentation  |  Google Cloud

大きな流れは SMS 多要素認証の時と同様になります。

アプリケーションとの統合

実装の動作を確認します。

  1. 第 1 要素でのログイン

第 1 要素(メールアドレス・パスワード)でログインを行います。

ユーザーには第 2 要素が登録されているので、auth/multi-factor-auth-required エラーが発生します。

  1. ワンタイムパスワードの入力

ユーザーは TOTP アプリケーションに表示されているワンタイムパスワードを Web アプリケーションに入力します。

Web アプリケーション(Web SDK)はワンタイムパスワードを検証し、認証を完了します。

参考
第 2 要素を使用してユーザー ログインを行う  |  Identity Platform Documentation  |  Google Cloud

4. 登録された第 2 要素の解除

登録されている第 2 要素は Web SDK、Node.js Admin SDK のどちらからでも削除が可能です。
Web SDK から行う場合、事前にユーザーの再認証が必要になります。

参考
TOTP MFA の登録を解除する  |  Identity Platform Documentation  |  Google Cloud
第 2 要素を削除する  |  Identity Platform Documentation  |  Google Cloud

5. Identity Platform での多要素認証の注意点

多要素認証を導入する際に注意・確認すべき点について以下に記載します。

複数の多要素認証の登録の推奨

ユーザーが第 2 要素にアクセスする手段を失った場合、ユーザーがアプリケーションからロックアウトされます。
このケースのリカバリをアプリケーション側で行うコストは大きいため、ユーザーには複数の第 2 要素を登録してもらうことが推奨されます。

多要素認証の登録時には、アカウントのメールアドレスが認証されている必要がある

sendEmailVerification()verifyBeforeUpdateEmail() を使用してメールアドレスを認証します。

SMS 送信の料金

SMS での確認コードの送信には料金がかかります。

参考
料金  |  Identity Platform  |  Google Cloud

SMS の料金は地域によって大きく差があり、意図しない高額な請求を発生させないためにも、本記事内で記載したように SMS のリージョン設定が推奨されます。

多要素認証を追加した際の自動送信メール

ユーザーが第 2 要素の登録を行うと、認証済のメールアドレスに以下のようなメールが届きます。

ユーザーはメールに添付されたリンクにアクセスすることで第 2 要素の登録解除が行え、不正な第 2 要素の追加を取り消すことができます。
このメールは、セキュリティ上の理由からメッセージ本文のカスタマイズ・配信の停止ができません。

6. まとめ

Identity Platform を利用して、SMS や TOTP 多要素認証をアプリケーションに追加する方法について確認しました。
IDaaS に多要素認証を求める場合、Identity Platform は選択肢になり得ます。

この記事が、IDaaS 導入の際の検討の一助になれば幸いです。
ここまで読んで頂き、ありがとうございました。


Identity Platform 関連記事

https://zenn.dev/cloud_ace/articles/6d8d1502d3c90f
https://zenn.dev/cloud_ace/articles/9b47b0dab6d3ab

Discussion