Android 提供多種裝置信號,管理員可用來判斷裝置的安全防護機制。在零信任安全性模型中,這些信號可用於評估裝置是否應獲准存取公司資訊。
功能 | 說明 | 全代管裝置 | 公司裝置上的工作資料夾 | 個人裝置上的 Work Profile (BYOD) | 未管理的裝置 |
---|---|---|---|---|---|
Play Integrity API | 信任中介服務可擷取下列信號:
|
是 | 是 | 是 | 是 |
安全硬體存在 / 金鑰認證 | 信任代管服務可驗證 PKI 憑證是否已產生並儲存在安全硬體中 | 是 | 是 | 是 | 是 |
裝置屬性認證 | 在金鑰認證程序中,裝置屬性可納入認證記錄 | 是 | 是 | 是 | 是 |
裝置安全性修補程式等級 | 信任中介服務可驗證作業系統安全性修補程式等級 | 是 | 是 | 是 | 是 |
裝置是否有待處理的 OTA 更新 | 信任中介服務可檢查是否有待安裝的裝置 OS 更新 | 是 | 是 | 是 | 無 |
主線安全性修補程式等級 | 信任仲介可讀取已安裝主線程群組的安全性修補程式等級 | 是 | 是 | 是 | 是 |
註冊專屬 ID | 信任中介服務可存取該企業專屬的裝置 ID。這個 ID 會在工作資料夾重新建立及裝置恢復原廠設定後保留 | 是 | 是 | 是 | 無 |
管理狀態 (和管理應用程式) | 信任中介服務可利用這項資訊判斷裝置是否受管理 | 是 | 是 | 是 | 無 |
磁碟加密 | 信任中介服務可檢查裝置是否已加密 (如果需要 Android 8 支援) | 是 | 是 | 是 | 是 |
OS 版本 | 信任中介服務可檢查裝置 OS 版本,並確認該版本是否超過特定版本 | 是 | 是 | 是 | 是 |
存取網路狀態 (網路狀態和 Wi-Fi 狀態) | 信任中介服務可取得目前網路狀態 (行動網路和 Wi-Fi) 的相關資訊 | 是 | 是 | 是 | 是 |
存取 Wi-Fi 狀態 (Android 11 以下版本,Android 12 以上版本同時支援回呼或隨選方法) | 信任代管服務可取得目前 Wi-Fi 網路的相關資訊 | 是 | 是 | 是 | 是 |
Proxy 設定 | 信任中介服務可取得目前預設 HTTP Proxy 設定的相關資訊。 | 是 | 是 | 是 | 是 |
螢幕鎖定品質檢查 | 信任代管服務可確保裝置在授予存取權之前,已設定特定品質的螢幕鎖定 | 是 | 是 | 是 | 是 |
已啟用開發人員選項 | 信任中介服務可在啟用開發人員選項時,將裝置視為具有更廣泛的攻擊途徑 | 是 | 是 | 是 | 是 |
是否已啟用 DNS over TLS | 信任代管服務可利用這項功能,確保已啟用私人 DNS 模式 | 是 | 是 | 是 | 是 |
SafetyNet 安全瀏覽 | 信任中介服務可判斷 Google 是否已將特定網址歸類為已知的威脅。 | 是 | 是 | 是 | 是 |
外接媒體已掛載 | 在掛載外部儲存空間時,信任中介服務可收到通知 | 是 | 是 | 是 | 是 |
UsageStatsManager | 信任代管服務可研究個別應用程式的使用模式 | 是 | 是 | 是 | 是1 |
安全性記錄 | 信任仲介業者可以將這項資料用於其內容參照引擎,確保遵循規定並建立行為指紋 | 是 | 是2 | 是2 | 無 |
網路記錄 | 信任仲介業者可以將這項資料用於其內容參照引擎,確保遵循規定並建立行為指紋 | 是 | 是2 | 是2 | 無 |
NetworkStatsManager | Trust 中介服務可在指定時間間隔內查詢應用程式的網路用量 | 是 | 是 | 是2 | 是1 |
套件瀏覽權限 (列出裝置上的所有應用程式) | 信任中介服務可查詢裝置上安裝的應用程式 | 是 | 是3 | 是3 | 是 |
讀取手機狀態 | 信任中介服務可取得行動網路資訊、進行中通話的狀態,以及裝置上註冊的 PhoneAccount 清單 | 是 | 是 | 是 | 是 |
裝置上次重新啟動時間 | Trust 中介服務可取得系統正常運作時間 | 是 | 是 | 是 | 是 |
Get Accounts | 信任代理程式可利用這項權限存取帳戶服務中的帳戶清單 | 是 | 是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
。