機密データにアクセスする必要性の判断

アプリの権限は、以下に対するアクセスを保護してユーザーのプライバシーをサポートするのに役立ちます。

  • 制限付きデータ(システム状態やユーザーの連絡先情報など)
  • 制限付きアクション(ペア設定したデバイスへの接続や録音など)

このページでは、Android の権限の仕組み(権限を使用するための大まかなワークフロー、各種権限の詳細、アプリでの権限の使用に関するおすすめの方法など)について概説します。他のページでは、アプリの権限のリクエストを最小限に抑える方法、権限を宣言する方法、実行時の権限をリクエストする方法、他のアプリがアプリのコンポーネントと連携する方法を制限する方法について説明します。

Android アプリの権限の全一覧については、権限 API リファレンスのページをご覧ください。

権限のワークフローを示すサンプルアプリを確認するには、GitHub の Android 権限のサンプル リポジトリにアクセスしてください。

権限を使用するためのワークフロー

アプリが制限付きのデータやアクションへのアクセスを必要とする機能を提供する場合は、権限の宣言を必要とすることなく、情報の取得やアクションの実行ができるかどうかを判断します。権限の宣言をしなくても、写真の撮影、メディア再生の一時停止、関連性の高い広告の掲載など、アプリのさまざまなユースケースに対応できます。

ユースケースに対応するために、アプリが制限付きデータにアクセスするか、制限付きアクションを実行する必要がある場合は、適切な権限を宣言します。一部の権限(インストール時の権限)は、アプリのインストール時に自動的に付与されます。他の権限(実行時の権限)を使用するには、アプリが実行時にその権限をリクエストする必要があります。

図 1 は、アプリの権限を使用するためのワークフローを示しています。

図 1. Android で権限を使用するための大まかなワークフロー。

権限の種類

Android では、権限をいくつかの種類(インストール時の権限、実行時の権限、特別な権限など)に分類しています。権限の種類はそれぞれ、アプリにその権限が付与されたときにアクセスできる制限付きデータの範囲と、実行できる制限付きアクションの範囲を表します。各権限の保護レベルは権限の種類に基づいており、権限 API リファレンス ページで確認できます。

インストール時の権限

左側の画像は、アプリのインストール時の権限のリストを示しています。右側の画像は、許可と拒否の 2 つのオプションを含むポップアップ ダイアログを示しています。
図 2. アプリストアに表示される、アプリのインストール時の権限のリスト。

インストール時の権限により、アプリは制限付きデータへのアクセスを制限されたり、システムや他のアプリにほとんど影響を与えない制限付きアクションを実行できるようになったりします。アプリでインストール時の権限を宣言すると、図 2 に示すように、アプリストアでユーザーがアプリの詳細ページを開いたときに、インストール時の権限に関するお知らせが表示されます。ユーザーがアプリをインストールすると、自動的にアプリに権限が付与されます。

Android には、標準の権限や署名権限など、インストール時の権限のサブタイプがいくつか含まれています。

標準の権限

標準の権限により、アプリのサンドボックス外のデータとアクションにアクセスできるようになりますが、ユーザーのプライバシーや他のアプリのオペレーションへのリスクはほとんどありません。

標準の権限には normal の保護レベルが割り当てられます。

署名権限

署名権限は、権限を定義しているアプリまたは OS と同じ証明書でアプリが署名されている場合にのみ付与されます。

自動入力サービスや VPN サービスなどの特権サービスを実装するアプリでも署名権限は使用されます。これらのアプリには、システムだけがサービスにバインドできるように、サービス バインディングの署名権限が必要です。

署名権限には signature の保護レベルが割り当てられます。

実行時の権限

許可と拒否の 2 つのオプションを含むポップアップ ダイアログ
図 3. アプリが実行時の権限をリクエストしたときに表示されるシステム権限のプロンプト。

実行時の権限(危険な権限)により、アプリに制限付きデータに対する追加のアクセス権が付与されるほか、アプリがシステムやその他のアプリに大きな影響を与える制限付きアクションを実行できるようになります。そのため、制限付きデータにアクセスしたり、制限付きアクションを行ったりするには、事前にアプリで実行時の権限をリクエストする必要があります。これらの権限がすでに付与されているとは限りません。これらの権限を確認し、必要に応じてアクセスする前にリクエストしてください。

アプリが実行時の権限をリクエストすると、図 3 に示すように、実行時の権限のプロンプトが表示されます。

実行時の権限の多くは、非公開のユーザーデータ(機密情報を含む可能性のある特別なタイプの制限付きデータ)にアクセスします。非公開のユーザーデータの例としては、位置情報や連絡先情報などがあります。

マイクとカメラからは、特に機密性の高い情報にアクセスできます。そのため、アプリがこのような情報にアクセスする理由を説明できるようになっています。

実行時の権限には dangerous の保護レベルが割り当てられます。

特別な権限

特別な権限は、特定のアプリ操作に対応します。特別な権限を定義できるのは、プラットフォームと OEM だけです。また、プラットフォームと OEM は通常、特に強力なアクション(他のアプリの上に重ねて描画するなど)に対するアクセスを保護する必要がある場合に、特別な権限を定義します。

システム設定の [特別なアプリアクセス] ページには、ユーザーによる切り替えが可能な一連の操作が含まれています。これらの操作の多くは、特別な権限として実装されています。

特別な権限をリクエストする方法の詳細をご確認ください。

特別な権限には appop の保護レベルが割り当てられます。

権限グループ

権限は権限グループに属します。権限グループは、論理的に関連する一連の権限で構成されています。たとえば、SMS メッセージを送信する権限と受信する権限は、どちらもアプリによる SMS の操作に関連するため、同じグループに属することがあります。

権限グループは、アプリが密接に関連する権限をリクエストしたときに、ユーザーに表示されるシステム ダイアログの数を最小限に抑えるために役立ちます。アプリに権限を付与するように求めるプロンプトがユーザーに表示された場合、同じグループに属する権限が同じインターフェースに表示されます。ただし、権限は予告なくグループを変更することがあるため、特定の権限が必ずしも他の権限とグループ化されているわけではありません。

ベスト プラクティス

アプリの権限は、システムのセキュリティ機能を基盤として、Android がユーザーのプライバシーに関連する次の目標をサポートするのを支援します。

  • 管理: ユーザーは、アプリと共有するデータを管理できます。
  • 透明性: ユーザーは、アプリが使用するデータと、アプリがそのデータにアクセスする理由を把握できます。
  • データの最小化: アプリは、ユーザーが呼び出す特定のタスクやアクションに必要なデータにのみアクセスして使用します。

このセクションでは、アプリで権限を効果的に使用するためのおすすめの方法をいくつか紹介します。Android で権限を使用する方法について詳しくは、アプリの権限に関するおすすめの設定のページをご覧ください。

最小限の権限をリクエストする

ユーザーがアプリ内で特定のアクションを要求したとき、アプリはそのアクションを完了するために必要な権限のみをリクエストする必要があります。権限の使用方法によっては、機密情報にアクセスせずにアプリのユースケースに対応できる別の方法を使用できる場合があります。

実行時の権限を特定のアクションに関連付ける

権限のリクエストを、可能な限りアプリのユースケースのフローの遅い段階で行うようにします。たとえば、ユーザーが他のユーザーに音声メッセージを送信できるアプリの場合、ユーザーがメッセージ画面に移動し、[音声メッセージを送信] ボタンを押すまで待機します。ユーザーがボタンを押した後で、アプリはマイクへのアクセスをリクエストできます。

アプリの依存関係を考慮する

ライブラリを追加すると、そのライブラリが必要とする権限も継承します。それぞれの依存関係が必要とする権限と、その権限の用途に注意してください。

透明性を確保する

権限をリクエストするときは、アクセスする対象、アクセスの理由、権限が拒否された場合に影響を受ける機能を明確にし、ユーザーが十分な情報に基づいて判断できるようにする必要があります。

システム アクセスは明示的に行う

機密データやハードウェア(カメラやマイクなど)にアクセスするとき、まだシステムでこうしたアクセスに関する通知が行われていない場合は、アプリ内で継続的に通知をするようにします。これにより、ユーザーはアプリが制限付きデータにアクセスしたり、制限付きアクションを実行したりするタイミングを正確に把握できます。

システム コンポーネント内の権限

権限の目的はシステム機能を要求することだけではありません。他のアプリとの連携を制限する方法についてのページで説明したように、アプリのシステム コンポーネントは、アプリが連携できる対象アプリを制限できます。