Android 使用設(shè)備管理策略增強安全性

2018-08-02 18:30 更新

編寫:craftsmanBai - http://z1ng.net - 原文: http://developer.android.com/training/enterprise/device-management-policy.html

Android 2.2(API Level 8)之后,Android平臺通過設(shè)備管理API提供系統(tǒng)級的設(shè)備管理能力。

在這一小節(jié)中,你將學(xué)到如何通過使用設(shè)備管理策略創(chuàng)建安全敏感的應(yīng)用程序。比如某應(yīng)用可被配置為:在給用戶顯示受保護的內(nèi)容之前,確保已設(shè)置一個足夠強度的鎖屏密碼。

定義并聲明你的策略

首先,你需要定義多種在功能層面提供支持的策略。這些策略可以包括屏幕鎖密碼強度、密碼過期時間以及加密等等方面。

你須在res/xml/device_admin.xml中聲明選擇的策略集,它將被應(yīng)用強制實行。在Android manifest也需要引用聲明的策略集。

每個聲明的策略對應(yīng)DevicePolicyManager中一些相關(guān)設(shè)備的策略方法(例如定義最小密碼長度或最少大寫字母字符數(shù))。如果一個應(yīng)用嘗試調(diào)用XML中沒有對應(yīng)策略的方法,程序在會運行時拋出一個SecurityException異常。

如果應(yīng)用程序試圖管理其他策略,那么強制鎖force-lock之類的其他權(quán)限就會發(fā)揮作用。正如你將看到的,作為設(shè)備管理權(quán)限激活過程的一部分,聲明策略的列表會在系統(tǒng)屏幕上顯示給用戶。 如下代碼片段在res/xml/device_admin.xml中聲明了密碼限制策略:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <limit-password />
    </uses-policies>
</device-admin>

在Android manifest引用XML策略聲明:

<receiver android:name=".Policy$PolicyAdmin"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
        android:resource="@xml/device_admin" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

創(chuàng)建一個設(shè)備管理接受端

創(chuàng)建一個設(shè)備管理廣播接收端(broadcast receiver),可以接收到與你聲明的策略有關(guān)的事件通知。也可以對應(yīng)用程序有選擇地重寫回調(diào)函數(shù)。

在同樣的應(yīng)用程序(Device Admin)中,當(dāng)設(shè)備管理(device administrator)權(quán)限被用戶設(shè)為禁用時,已配置好的策略就會從共享偏好設(shè)置(shared preference)中擦除。

你應(yīng)該考慮實現(xiàn)與你的應(yīng)用業(yè)務(wù)邏輯相關(guān)的策略。例如,你的應(yīng)用可以采取一些措施來降低安全風(fēng)險,如:刪除設(shè)備上的敏感數(shù)據(jù),禁用遠程同步,對管理員的通知提醒等等。

為了讓廣播接收端能夠正常工作,請務(wù)必在Android manifest中注冊下面代碼片段所示內(nèi)容。

<receiver android:name=".Policy$PolicyAdmin"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
        android:resource="@xml/device_admin" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

激活設(shè)備管理器

在執(zhí)行任何策略之前,用戶需要手動將程序激活為具有設(shè)備管理權(quán)限,下面的程序片段顯示了如何觸發(fā)設(shè)置框以便讓用戶為你的程序激活權(quán)限。

通過指定EXTRA_ADD_EXPLANATION給出明確的說明信息,以告知用戶為應(yīng)用程序激活設(shè)備管理權(quán)限的好處。

if (!mPolicy.isAdminActive()) {

    Intent activateDeviceAdminIntent =
        new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_DEVICE_ADMIN,
        mPolicy.getPolicyAdmin());

    // It is good practice to include the optional explanation text to
    // explain to user why the application is requesting to be a device
    // administrator. The system will display this message on the activation
    // screen.
    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_ADD_EXPLANATION,
        getResources().getString(R.string.device_admin_activation_message));

    startActivityForResult(activateDeviceAdminIntent,
        REQ_ACTIVATE_DEVICE_ADMIN);
}

如果用戶選擇"Activate",程序就會獲取設(shè)備管理員權(quán)限并可以開始配置和執(zhí)行策略。 當(dāng)然,程序也需要做好處理用戶選擇放棄激活的準備,比如用戶點擊了“取消”按鈕,返回鍵或者HOME鍵的情況。因此,如果有必要的話,策略設(shè)置中的onResume())方法需要加入重新評估的邏輯判斷代碼,以便將設(shè)備管理激活選項展示給用戶。

實施設(shè)備策略控制

在設(shè)備管理權(quán)限成功激活后,程序就會根據(jù)請求的策略來配置設(shè)備策略管理器。要牢記,新策略會被添加到每個版本的Android中。所以你需要在程序中做好平臺版本的檢測,以便新策略能被老版本平臺很好的支持。例如,“密碼中含有的最少大寫字符數(shù)”這個安全策略只有在高于API Level 11(Honeycomb)的平臺才被支持,以下代碼則演示了如何在運行時檢查版本:

DevicePolicyManager mDPM = (DevicePolicyManager)
        context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName mPolicyAdmin = new ComponentName(context, PolicyAdmin.class);
...
mDPM.setPasswordQuality(mPolicyAdmin, PASSWORD_QUALITY_VALUES[mPasswordQuality]);
mDPM.setPasswordMinimumLength(mPolicyAdmin, mPasswordLength);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    mDPM.setPasswordMinimumUpperCase(mPolicyAdmin, mPasswordMinUpperCase);
}

這樣程序就可以執(zhí)行策略了。當(dāng)程序無法訪問正確的鎖屏密碼的時候,通過設(shè)備策略管理器(Device Policy Manager)API可以判斷當(dāng)前密碼是否適用于請求的策略。如果當(dāng)前鎖屏密碼滿足策略,設(shè)備管理API不會采取糾正措施。明確地啟動設(shè)置程序中的系統(tǒng)密碼更改界面是應(yīng)用程序的責(zé)任。例如:

if (!mDPM.isActivePasswordSufficient()) {
    ...
    // Triggers password change screen in Settings.
    Intent intent =
        new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
    startActivity(intent);
}

一般來說,用戶可以從可用的鎖屏機制中任選一個,例如“無”、“圖案”、“PIN碼”(數(shù)字)或密碼(字母數(shù)字)。當(dāng)一個密碼策略配置好后,那些比已定義密碼策略弱的密碼會被禁用。比如,如果配置了密碼級別為“Numeric”,那么用戶只可以選擇PIN碼(數(shù)字)或者密碼(字母數(shù)字)。

一旦設(shè)備通過設(shè)置適當(dāng)?shù)逆i屏密碼處于被保護的狀態(tài),應(yīng)用程序便允許訪問受保護的內(nèi)容。

if (!mDPM.isAdminActive(..)) {
    // Activates device administrator.
    ...
} else if (!mDPM.isActivePasswordSufficient()) {
    // Launches password set-up screen in Settings.
    ...
} else {
    // Grants access to secure content.
    ...
    startActivity(new Intent(context, SecureActivity.class));
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號