零信任信號

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

功能 說明 全代管裝置 公司裝置的工作資料夾 個人擁有裝置的工作資料夾 (自攜裝置) 未受管理的裝置
Play Integrity API 信任代理程式可擷取下列信號:
  • 裝置完整性
  • 應用程式完整性
  • Play 授權詳細資料
  • 環境詳細資料,包括新的 Play 安全防護判定結果
  • 安全硬體提出 / 金鑰認證 信任的代理程式可以驗證自己的 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 僅限工作資料夾資訊存取權

    信任代理程式可以存取 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