Android 提供多種裝置信號,可協助管理員判斷裝置的安全防護機制。在零信任安全性模型中,這些信號會用於評估是否應允許裝置存取公司資訊。
功能 | 說明 | 全代管裝置 | 公司裝置的工作資料夾 | 個人擁有裝置的工作資料夾 (自攜裝置) | 未受管理的裝置 |
---|---|---|---|---|---|
Play Integrity API | 信任代理程式可擷取下列信號:
|
可 | 是 | 是 | 可 |
安全硬體提出 / 金鑰認證 | 信任的代理程式可以驗證自己的 PKI 憑證是否已產生 並儲存在安全的硬體中 | 可 | 是 | 是 | 可 |
裝置屬性認證 | 在金鑰認證中,裝置屬性可以納入認證記錄中 | 可 | 是 | 是 | 可 |
裝置安全性修補程式等級 | 信任代理程式可驗證 OS 安全性修補程式等級 | 可 | 是 | 是 | 可 |
裝置是否有待處理的 OTA 設定 | 信任代理程式可以檢查是否有可用的裝置 OS 更新 | 可 | 是 | 可 | 無 |
主要安全性修補程式等級 | 信任代理程式可讀取已安裝主線訓練的安全性修補程式等級 | 可 | 是 | 是 | 可 |
註冊專屬 ID | 信任代理程式可以存取該企業專屬的裝置 ID。這個 ID 在重新建立工作資料夾及恢復原廠設定後仍會保留 | 可 | 是 | 可 | 無 |
管理狀態 (及管理應用程式) | 信任代理程式可據此判斷裝置是否受到管理 | 可 | 是 | 可 | 無 |
磁碟加密 | 信任代理程式可檢查裝置是否已加密 (如果需要 Android 8 支援) | 可 | 是 | 是 | 可 |
OS 版本 | 信任代理程式可檢查裝置 OS 版本,並確認其超過特定版本 | 可 | 是 | 是 | 可 |
存取網路狀態 (網路狀態和 Wi-Fi 狀態) | 信任的代理程式可以取得有效網路狀態 (行動網路和 Wi-Fi) 的相關資訊 | 可 | 是 | 是 | 可 |
存取 Wi-Fi 狀態 (Android 11 以下版本,Android 12 以上版本支援回呼或隨選方法) | 信任的代理程式可以取得有效 Wi-Fi 網路的相關資訊 | 可 | 是 | 是 | 可 |
Proxy 設定 | 信任代理程式可以取得目前預設 HTTP Proxy 設定的相關資訊。 | 可 | 是 | 是 | 可 |
螢幕鎖定品質檢查 | 信任代理程式可以確保裝置在授予存取權前,必須先設定特定品質的螢幕鎖定品質 | 可 | 是 | 是 | 可 |
已啟用開發人員選項 | 啟用開發人員選項後,信任代理程式可以將裝置視為具有範圍更廣的攻擊介面 | 可 | 是 | 是 | 可 |
已啟用透過 TLS 執行 DNS | 信任代理程式可利用這項資訊確保私人 DNS 模式已啟用 | 可 | 是 | 是 | 可 |
SafetyNet 安全瀏覽 | 信任代理程式可以判斷 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 以上版本,您必須在 AndroidManifest.xml
檔案中新增查詢宣告,以符合 Android 的套件瀏覽權限:
<manifest package="com.example.game"> <queries> <package android:name="com.google.android.modulemetadata" /> </queries> ... </manifest>
擷取管理狀態
信任代理程式可以使用這些方法,確認裝置是否處於管理模式,以及啟用的管理模式。
檢查裝置管理服務
使用 getActiveAdmins() 檢查裝置是否在管理中。如果這個方法傳回 null
,則裝置未受管理。
檢查是否有全代管裝置
使用 isDeviceOwnerApp()
檢查裝置是否受到全代管。
檢查公司裝置上的工作資料夾
使用 isOrganizationOwnedDeviceWithManagedProfile()
檢查裝置是否在公司擁有的裝置上使用工作資料夾管理模式
檢查個人裝置的工作資料夾
使用 isProfileOwnerApp() 檢查裝置是否設有工作資料夾,並驗證 isOrganizationOwnedDeviceWithManagedProfile()
是否傳回 false
。