AndroidでSafetyNetを使用してアプリチェックを有効にする

このページでは、組み込みの SafetyNet プロバイダーを使用して、Android アプリで App Check を有効にする方法を示します。 App Check を有効にすると、アプリのみがプロジェクトの Firebase リソースにアクセスできるようになります。この機能の概要を参照してください。

独自のカスタム プロバイダーで App Check を使用する場合は、「カスタム App Check プロバイダーを実装する」を参照してください。

1. Firebase プロジェクトをセットアップする

  1. まだ行っていない場合は、Firebase を Android プロジェクトに追加します

  2. Firebase コンソールのApp Checkセクションで、App Check を使用するアプリを SafetyNet プロバイダーに登録します。アプリの署名証明書の SHA-256 フィンガープリントを提供する必要があります。

    通常、プロジェクトのすべてのアプリを登録する必要があります。これは、Firebase プロダクトの適用を有効にすると、登録されたアプリのみがプロダクトのバックエンド リソースにアクセスできるようになるためです。

  3. オプション: アプリの登録設定で、プロバイダーによって発行された App Check トークンのカスタム Time-to-Live (TTL) を設定します。 TTL は 30 分から 7 日間の任意の値に設定できます。この値を変更するときは、次のトレードオフに注意してください。

    • セキュリティ: TTL を短くすると、漏洩または傍受されたトークンが攻撃者によって悪用される可能性があるウィンドウが減少するため、セキュリティが強化されます。
    • パフォーマンス: TTL が短いほど、アプリはより頻繁に構成証明を実行します。アプリの構成証明プロセスは、実行されるたびにネットワーク リクエストに待機時間を追加するため、短い TTL はアプリのパフォーマンスに影響を与える可能性があります。
    • クォータとコスト: TTL を短くし、再認証を頻繁に行うと、クォータがより早く枯渇します。また、有料サービスの場合は、より多くのコストがかかる可能性があります。割り当てと制限を参照してください。

    デフォルトの TTL である1 時間は、ほとんどのアプリにとって妥当です。 App Check ライブラリは、TTL 期間の約半分でトークンを更新することに注意してください。

2. App Check ライブラリをアプリに追加する

モジュール (アプリ レベル) の Gradle ファイル (通常はapp/build.gradle ) で、App Check Android ライブラリの依存関係を宣言します。

Java

dependencies {
    implementation 'com.google.firebase:firebase-appcheck-safetynet:16.0.0'
}

Kotlin+KTX

dependencies {
    implementation 'com.google.firebase:firebase-appcheck-safetynet:16.0.0'
}

3.アプリチェックの初期化

次の初期化コードをアプリに追加して、他の Firebase SDK を使用する前にアプリが実行されるようにします。

Java

FirebaseApp.initializeApp(/*context=*/ this);
FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
firebaseAppCheck.installAppCheckProviderFactory(
        SafetyNetAppCheckProviderFactory.getInstance());

Kotlin+KTX

FirebaseApp.initializeApp(/*context=*/this)
val firebaseAppCheck = FirebaseAppCheck.getInstance()
firebaseAppCheck.installAppCheckProviderFactory(
    SafetyNetAppCheckProviderFactory.getInstance()
)

App Check ライブラリがアプリにインストールされたら、更新されたアプリのユーザーへの配布を開始します。

更新されたクライアント アプリは、Firebase へのすべてのリクエストとともに App Check トークンの送信を開始しますが、Firebase コンソールの App Check セクションで適用を有効にするまで、Firebase 製品ではトークンが有効である必要はありません。詳細については、次の 2 つのセクションを参照してください。

4. リクエストの指標を監視する

更新したアプリがユーザーの手に渡るようになったので、使用する Firebase プロダクトに対して App Check の適用を有効にできます。ただし、その前に、既存の正当なユーザーが混乱しないことを確認する必要があります。

Realtime Database、Cloud Firestore、Cloud Storage

Realtime Database、Cloud Firestore、および Cloud Storage についてこの決定を行うために使用できる重要なツールは、App Check リクエスト メトリック画面です。

製品の App Check リクエスト メトリックを表示するには、Firebase コンソールのApp Checkセクションを開きます。例えば:

App Check メトリクス ページのスクリーンショット

各製品のリクエスト メトリックは、次の 4 つのカテゴリに分類されます。

  • 検証済みのリクエストは、有効な App Check トークンを持つリクエストです。 App Check の実施を有効にすると、このカテゴリのリクエストのみが成功します。

  • 古いクライアント要求は、App Check トークンが欠落している要求です。これらのリクエストは、App Check がアプリに含まれる前の古いバージョンの Firebase SDK からのものである可能性があります。

  • 不明なオリジンリクエストは、App Check トークンが欠落しており、Firebase SDK から送信されたようには見えません。これらは、盗まれた API キーを使用して作成されたリクエスト、または Firebase SDK を使用せずに作成された偽造リクエストによるものである可能性があります。

  • 無効なリクエストとは、無効な App Check トークンを持つリクエストです。これは、アプリになりすまそうとする認証されていないクライアントからのもの、またはエミュレートされた環境からのものである可能性があります。

アプリのこれらのカテゴリの分布は、適用を有効にすることを決定したときに通知する必要があります。以下にいくつかのガイドラインを示します。

  • 最近のリクエストのほとんどすべてが確認済みのクライアントからのものである場合は、適用を有効にしてバックエンド リソースの保護を開始することを検討してください。

  • 最近のリクエストの大部分が古い可能性のあるクライアントからのものである場合、ユーザーの混乱を避けるために、適用を有効にする前に、より多くのユーザーがアプリを更新するのを待つことを検討してください。リリースされたアプリに App Check を適用すると、App Check SDK と統合されていない以前のアプリ バージョンが壊れます。

  • アプリがまだ起動していない場合は、古いクライアントが使用されていないため、すぐに App Check の適用を有効にする必要があります。

クラウド機能

Cloud Functions の場合、関数のログを調べることで App Check 指標を取得できます。呼び出し可能な関数を呼び出すたびに、次の例のような構造化されたログ エントリが出力されます。

{
  "severity": "INFO",    // INFO, WARNING, or ERROR
  "logging.googleapis.com/labels": {"firebase-log-type": "callable-request-verification"},
  "jsonPayload": {
    "message": "Callable header verifications passed.",
    "verifications": {
      // ...
      "app": "MISSING",  // VALID, INVALID, or MISSING
    }
  }
}

次の指標フィルタを使用してログベースのカウンタ指標を作成することにより、Google Cloud Console でこれらの指標を分析できます。

resource.type="cloud_function"
resource.labels.function_name="YOUR_CLOUD_FUNCTION"
resource.labels.region="us-central1"
labels.firebase-log-type="callable-request-verification"

フィールドjsonPayload.verifications.appCheckを使用してメトリクスにラベルを付けます。

5.強制を有効にする

適用を有効にするには、以下の各製品の手順に従ってください。製品の適用を有効にすると、その製品に対する未確認のリクエストはすべて拒否されます。

Realtime Database、Cloud Firestore、Cloud Storage

Realtime Database、Cloud Firestore (iOS および Android)、Cloud Storage の適用を有効にするには:

  1. Firebase コンソールのApp Checkセクションを開きます。

  2. 適用を有効にする製品のメトリック ビューを展開します。

  3. [強制]をクリックして、選択内容を確認します。

強制を有効にしてから有効になるまで、最大 15 分かかる場合があることに注意してください。

クラウド機能

Cloud Functions の App Check 実施を有効にする を参照してください。

次のステップ

アプリを App Check に登録した後、開発中のエミュレーターや継続的インテグレーション (CI) 環境など、App Check が通常は有効と分類しない環境でアプリを実行する場合は、次のことができます。実際の構成証明プロバイダーの代わりに App Check デバッグ プロバイダーを使用するアプリのデバッグ ビルドを作成します。

Android のデバッグ プロバイダで App Check を使用する を参照してください。