零信任信號

Android 提供多種裝置信號,可供管理員用來判斷裝置的安全防護機制。在零信任安全性模型中,這些信號可用於評估裝置是否應獲准存取公司資訊。

功能 說明 全代管裝置 公司擁有裝置上的工作資料夾 個人裝置上的工作資料夾 (自攜裝置) 未管理的裝置
Play Integrity API 信任中介服務可擷取下列信號:
  • 裝置完整性
  • 應用程式完整性
  • Play 授權詳細資料
  • 環境詳細資料,包括新的 Play 安全防護判定結果
  • 安全 硬體展示 / 金鑰認證 信任代理程式可以驗證是否已產生 PKI 憑證 並儲存在安全的硬體中
    裝置 屬性認證 做為金鑰認證的一部分,可以納入裝置屬性 驗證記錄
    裝置安全性修補程式等級 信任代理程式可以驗證 OS 安全性修補程式等級
    裝置是否有待處理的 OTA 更新 信任代理程式可以檢查是否有待處理的裝置 OS 更新 可供使用 不適用
    Mainline 安全性修補程式等級 信任代理程式可讀取已安裝項目的安全性修補程式等級 主線列車
    註冊 特定 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 信任代理程式可以在指定時間內查詢應用程式的網路用量 間隔 2 1
    套件瀏覽權限 (列出裝置上的所有應用程式) 信任中介服務可查詢裝置上安裝的應用程式 3 3
    讀取手機狀態 信任代理程式可取得行動網路資訊,以及任何進行中的狀態 呼叫和 PhoneAccount 清單 已註冊裝置
    裝置上次重新啟動時間 信任代理程式可以取得系統運作時間
    取得帳戶 信任代理程式可利用這個憑證存取 帳戶服務 3 3 1
    監控電池電量是否有重大變化 信任代理程式可監控電池電量的重大變化
    位置 (精細、粗略等...) 信任代管服務可存取裝置的實際位置 1 1

    1 徵得使用者同意

    2 僅限工作資料夾

    3 只有工作資料夾的資訊存取權

    信任代管服務可以存取 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
            }
    }
    

    您可以使用Date SimpleDateFormat 類別:

    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