Android には、管理者がデバイスのセキュリティ対策を判断するために使用できるさまざまなデバイス シグナルが用意されています。ゼロトラスト セキュリティ モデルでは、これらのシグナルを使用して、デバイスに企業情報へのアクセスを許可するかどうかを評価します。
機能 | 説明 | 完全管理対象デバイス | 会社所有デバイス上の仕事用プロファイル | 個人所有デバイス(BYOD)上の仕事用プロファイル | 管理対象外のデバイス |
---|---|---|---|---|---|
Play Integrity API | トラスト ブローカーは、次のシグナルを取得できます。 |
はい | ○ | ○ | はい |
安全なハードウェアの存在 / キーの証明書 | トラスト ブローカーは、PKI 認証情報が生成され、安全なハードウェアに保存されていることを確認できます。 | はい | ○ | ○ | はい |
デバイス プロパティの証明 | 鍵構成証明の一部として、デバイスのプロパティを構成証明レコードの一部として含めることができます。 | はい | ○ | ○ | はい |
デバイスのセキュリティ パッチレベル | トラスト ブローカーは OS セキュリティ パッチレベルを検証できます | はい | ○ | ○ | はい |
デバイスに保留中の OTA があるか | 信頼ブローカーは、保留中のデバイス OS アップデートがあるかどうかを確認できます。 | はい | ○ | ○ | なし |
Mainline セキュリティ パッチレベル | 信頼ブローカーは、インストールされている Mainline トレインのセキュリティ パッチレベルを読み取ることができます。 | はい | ○ | ○ | はい |
登録固有の ID | トラスト ブローカーは、その企業に固有の一意のデバイス ID にアクセスできます。この ID は、仕事用プロファイルの再作成やデバイスの出荷時の設定へのリセット後も保持されます。 | はい | ○ | ○ | なし |
管理状態(および管理アプリ) | 信頼ブローカーは、これを使用してデバイスが管理されているかどうかを判断できます。 | はい | ○ | ○ | なし |
ディスク暗号化 | トラスト ブローカーは、デバイスが暗号化されているかどうかを確認できます(Android 8 のサポートが必要な場合) | はい | ○ | ○ | はい |
OS バージョン | 信頼ブローカーは、デバイスの OS バージョンを確認し、特定のバージョンを超えていることを確認できます。 | はい | ○ | ○ | はい |
ネットワークの状態にアクセスする(ネットワークの状態と Wi-Fi の状態) | 信頼ブローカーは、アクティブなネットワークの状態(モバイルと Wi-Fi)に関する情報を取得できます。 | はい | ○ | ○ | はい |
Wi-Fi の状態にアクセスする(Android 11 以前、Android 12 以降はコールバックとオンデマンドの両方のアプローチをサポート) | 信頼ブローカーは、アクティブな Wi-Fi ネットワークに関する情報を取得できます | はい | ○ | ○ | はい |
プロキシ設定 | 信頼ブローカーは、現在のデフォルトの HTTP プロキシ設定に関する情報を取得できます。 | はい | ○ | ○ | はい |
画面ロックの品質チェック | 信頼ブローカーは、アクセスを許可する前に、デバイスに一定の品質の画面ロックが設定されていることを確認できます。 | はい | ○ | ○ | はい |
開発者向けオプションが有効になっている | 開発者向けオプションが有効になっているデバイスは、攻撃対象領域が広いデバイスとして信頼ブローカーによって識別される | はい | ○ | ○ | はい |
TLS を介した DNS が有効になっているか | 信頼ブローカーは、これを利用してプライベート DNS モードが有効になっていることを確認できます。 | はい | ○ | ○ | はい |
SafetyNet セーフ ブラウジング | 信頼ブローカーは、特定の URL が Google によって既知の脅威に分類されているかどうかを判断できます。 | はい | ○ | ○ | はい |
外部メディアがマウントされている | 外部ストレージがマウントされたときに信頼ブローカーに通知できます | はい | ○ | ○ | はい |
UsageStatsManager | 信頼ブローカーは個々のアプリの使用パターンを調査できます | はい | ○ | はい | ○1 |
セキュリティ ロギング | トラスト ブローカーは、コンテキスト エンジンの一部としてこのデータを活用して、コンプライアンスを確保し、動作ベースのフィンガープリントを作成できます。 | はい | ○2 | ○2 | なし |
ネットワーク ロギング | トラスト ブローカーは、コンテキスト エンジンの一部としてこのデータを活用して、コンプライアンスを確保し、動作ベースのフィンガープリントを作成できます。 | はい | ○2 | ○2 | なし |
NetworkStatsManager | 信頼ブローカーは、特定の時間間隔でアプリのネットワーク使用量をクエリできます。 | はい | はい | ○2 | ○1 |
パッケージの公開設定(デバイス上のすべてのアプリを一覧表示) | 信頼ブローカーは、デバイスにインストールされているアプリをクエリできます | はい | ○3 | ○3 | はい |
スマートフォンの状態を読み取る | 信頼ブローカーは、モバイル ネットワーク情報、進行中の通話のステータス、デバイスに登録されている PhoneAccount のリストを取得できます。 | はい | ○ | ○ | はい |
デバイスが最後に再起動された日時 | トラスト ブローカーはシステムの稼働時間を取得できます | はい | ○ | ○ | はい |
アカウントを取得する | 信頼ブローカーは、これを利用してアカウント サービスのアカウント リストにアクセスできます。 | はい | ○3 | ○3 | ○1 |
バッテリー レベルの大きな変化を監視する | 信頼ブローカーはバッテリー レベルの大きな変化を監視できる | はい | ○ | ○ | はい |
位置情報(精密、おおよその位置情報など) | トラスト ブローカーがデバイスの物理的な位置情報にアクセスできる | はい | はい | ○1 | ○1 |
1 ユーザーの同意を得ている
2 仕事用プロファイルのみ
3 アクセスは仕事用プロファイルの情報に限定される
Mainline バージョンを取得する
信頼ブローカーは、com.google.android.modulemetadata
モジュールの PackageInfo にアクセスし、そこから versionName
を取得できます。
private fun mainlineVersion(context: Context): String? {
val moduleProvider = "com.google.android.modulemetadata"
return try {
val pm = context.packageManager
val packageInfo = pm.getPackageInfo(moduleProvider, 0)
packageInfo.versionName
} catch (e: PackageManager.NameNotFoundException) {
null
}
}
返された文字列を SimpleDateFormat
クラスを使用して Date
オブジェクトに解析できます。
private val VERSION_NAME_DATE_PATTERNS = Arrays.asList(
"yyyy-MM-dd",
"yyyy-MM"
)
private fun parseDateFromVersionName(text: String): Date? {
for (pattern in VERSION_NAME_DATE_PATTERNS) {
try {
val simpleDateFormat = SimpleDateFormat(
pattern,
Locale.getDefault()
)
simpleDateFormat.timeZone = TimeZone.getDefault()
return simpleDateFormat.parse(text)
} catch (e: ParseException) {
// ignore and try next pattern
}
}
return null
}
Android 11 以降では、Android のパッケージの公開設定を満たすために、AndroidManifest.xml
ファイルにクエリ宣言を追加する必要があります。
<manifest package="com.example.game"> <queries> <package android:name="com.google.android.modulemetadata" /> </queries> ... </manifest>
管理ステータスを取得する
信頼ブローカーは、これらのメソッドを使用して、デバイスが管理モードにあるかどうか、およびどの管理モードがアクティブになっているかを確認できます。
デバイス管理を確認する
getActiveAdmins() を使用して、デバイスが管理対象かどうかを確認します。このメソッドが null
を返す場合、デバイスは管理対象外です。
完全管理対象デバイスを確認する
isDeviceOwnerApp()
を使用して、デバイスが完全管理対象かどうかを確認します。
会社所有デバイスで仕事用プロファイルがあるかどうかを確認する
isOrganizationOwnedDeviceWithManagedProfile()
を使用して、デバイスが会社所有デバイスの仕事用プロファイル管理モードを使用しているかどうかを確認する
個人所有デバイスに仕事用プロファイルがあるかどうかを確認する
isProfileOwnerApp()
を使用して、アプリが仕事用プロファイル内で実行されているかどうかを確認し、isOrganizationOwnedDeviceWithManagedProfile()
が false
を返すことを確認します。