安全防護機制信號

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

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

    信任中介服務可存取 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