Tăng cường bảo mật bằng các chính sách quản lý thiết bị

Ngừng quản trị viên thiết bị. Một số chính sách quản trị đã được đánh dấu là không dùng nữa khi được gọi của quản trị viên thiết bị. Để tìm hiểu thêm và xem các cách di chuyển, hãy xem Quản trị viên thiết bị không dùng nữa.

Kể từ Android 2.2 (API cấp 8), nền tảng Android sẽ cung cấp tính năng quản lý thiết bị ở cấp hệ thống thông qua các API Quản trị thiết bị.

Trong bài học này, bạn sẽ tìm hiểu cách tạo một ứng dụng nhận biết bảo mật giúp quản lý quyền truy cập vào nội dung của mình bằng cách thực thi các chính sách quản lý thiết bị. Cụ thể, bạn có thể định cấu hình ứng dụng sao cho đảm bảo thiết lập mật khẩu khoá màn hình có đủ độ mạnh trước khi hiển thị nội dung bị hạn chế đối với người dùng.

Định nghĩa và khai báo chính sách

Trước tiên, bạn cần xác định các loại chính sách để hỗ trợ ở cấp độ chức năng. Chính sách có thể độ mạnh mật khẩu khoá màn hình, hết thời gian chờ, mã hoá, v.v.

Bạn phải khai báo bộ chính sách đã chọn mà ứng dụng sẽ thực thi trong phần Tệp res/xml/device_admin.xml. Tệp kê khai Android cũng phải tham chiếu đến bộ chính sách đã khai báo.

Mỗi chính sách đã khai báo tương ứng với số lượng phương thức chính sách thiết bị có liên quan trong DevicePolicyManager (xác định độ dài mật khẩu tối thiểu và số lượng phương thức tối thiểu là hai ví dụ). Nếu một ứng dụng cố gắng gọi các phương thức có chính sách tương ứng không được khai báo trong XML, điều này sẽ dẫn đến SecurityException trong thời gian chạy. Các quyền khác, chẳng hạn như force-lock, sẽ có sẵn nếu ứng dụng định quản lý các loại chính sách khác. Như bạn sẽ thấy sau này, trong quá trình kích hoạt quản trị viên thiết bị, danh sách các chính sách đã khai báo sẽ được hiển thị cho người dùng trên màn hình hệ thống.

Đoạn mã sau đây khai báo chính sách giới hạn mật khẩu trong res/xml/device_admin.xml:

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

Tệp XML khai báo chính sách được tham chiếu trong tệp kê khai Android:

<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>

Tạo bộ nhận quản trị thiết bị

Tạo một broadcast receiver để quản trị thiết bị. Thiết bị này sẽ nhận thông báo về các sự kiện liên quan đến những chính sách mà bạn đã khai báo hỗ trợ. Ứng dụng có thể ghi đè một cách có chọn lọc các phương thức gọi lại.

Trong ứng dụng mẫu, Quản trị viên thiết bị, khi quản trị viên thiết bị bị huỷ kích hoạt người dùng, chính sách đã định cấu hình sẽ bị xoá khỏi lựa chọn ưu tiên dùng chung. Bạn nên cân nhắc việc triển khai logic kinh doanh phù hợp với trường hợp sử dụng của bạn. Ví dụ: ứng dụng có thể mất vài phút để giảm thiểu rủi ro bảo mật bằng cách triển khai một số biện pháp kết hợp xoá dữ liệu nhạy cảm trên thiết bị, tắt đồng bộ hoá từ xa, cảnh báo cho quản trị viên, v.v.

Để broadcast receiver hoạt động, hãy nhớ đăng ký broadcast receiver đó trong tệp kê khai Android như minh hoạ trong đoạn mã trên.

Kotlin

class PolicyAdmin : DeviceAdminReceiver() {

    override fun onDisabled(context: Context, intent: Intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent)
        context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE).edit().apply {
            clear()
            apply()
        }
    }
}

Java

public static class PolicyAdmin extends DeviceAdminReceiver {

    @Override
    public void onDisabled(Context context, Intent intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent);
        SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE);
        prefs.edit().clear().commit();
    }
}

Kích hoạt quản trị viên thiết bị

Trước khi thực thi bất kỳ chính sách nào, người dùng cần phải kích hoạt ứng dụng theo cách thủ công với tư cách là thiết bị Google Cloud. Đoạn mã dưới đây minh hoạ cách kích hoạt hoạt động cài đặt trong đó người dùng có thể kích hoạt ứng dụng của bạn. Bạn nên thêm văn bản giải thích để đánh dấu cho người dùng lý do ứng dụng yêu cầu làm quản trị viên thiết bị, bằng cách chỉ định Thêm EXTRA_ADD_EXPLANATION trong ý định.

Hình 1. Màn hình kích hoạt người dùng mà trong đó bạn có thể cung cấp nội dung mô tả về chính sách thiết bị của bạn.

Kotlin

if (!policy.isAdminActive()) {

    val activateDeviceAdminIntent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)

    activateDeviceAdminIntent.putExtra(
            DevicePolicyManager.EXTRA_DEVICE_ADMIN,
            policy.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,
            resources.getString(R.string.device_admin_activation_message)
    )

    startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN)
}

Java

if (!policy.isAdminActive()) {

    Intent activateDeviceAdminIntent =
        new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_DEVICE_ADMIN,
        policy.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);
}

Nếu người dùng chọn "Kích hoạt", ứng dụng sẽ trở thành quản trị viên thiết bị và có thể bắt đầu định cấu hình và thực thi chính sách.

Ứng dụng cũng cần được chuẩn bị để xử lý các tình huống đặt lại khi người dùng bỏ ngang quá trình kích hoạt bằng cách nhấn nút Huỷ, phím Quay lại hoặc phím Home. Do đó, onResume() trong Hoạt động thiết lập chính sách cần có logic để đánh giá lại điều kiện và hiển thị tuỳ chọn Kích hoạt quản trị viên thiết bị cho người dùng nếu cần thiết.

Triển khai trình kiểm soát chính sách thiết bị

Sau khi quản trị viên thiết bị được kích hoạt thành công, ứng dụng sẽ định cấu hình Thiết bị Trình quản lý chính sách có chính sách được yêu cầu. Xin lưu ý rằng các chính sách mới sẽ được thêm vào Android với mỗi bản phát hành. Bạn nên thực hiện việc kiểm tra phiên bản trong ứng dụng của mình nếu sử dụng chính sách mới trong khi vẫn hỗ trợ các phiên bản cũ của nền tảng. Ví dụ: Mật khẩu tối thiểu Chính sách chữ hoa chỉ áp dụng với API cấp 11 (Honeycomb) trở lên. Mã sau đây minh hoạ cách kiểm tra phiên bản trong thời gian chạy.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var policyAdmin: ComponentName

dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
policyAdmin = ComponentName(context, PolicyAdmin::class.java)

dpm.apply {
    setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality])
    setPasswordMinimumLength(policyAdmin, passwordLength)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase)
    }
}

Java

DevicePolicyManager dpm = (DevicePolicyManager)
        context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName policyAdmin = new ComponentName(context, PolicyAdmin.class);

dpm.setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality]);
dpm.setPasswordMinimumLength(policyAdmin, passwordLength);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    dpm.setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase);
}

Tại thời điểm này, ứng dụng có thể thực thi chính sách. Khi ứng dụng không có quyền truy cập với mật khẩu khoá màn hình thực tế được sử dụng, thông qua Device Policy Manager API, công cụ có thể xác định liệu mật khẩu hiện tại có đáp ứng chính sách bắt buộc hay không. Nếu thực tế cho thấy rằng mật khẩu khoá màn hình là không đủ, API quản trị thiết bị sẽ không tự động lấy biện pháp khắc phục. Ứng dụng có trách nhiệm khởi chạy hệ thống một cách rõ ràng màn hình thay đổi mật khẩu trong ứng dụng Cài đặt. Ví dụ:

Kotlin

if (!dpm.isActivePasswordSufficient) {
    // Triggers password change screen in Settings.
    Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
        startActivity(intent)
    }
}

Java

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

Thông thường, người dùng có thể chọn một trong các cơ chế khoá có sẵn, chẳng hạn như Không có, Hình mở khoá, Mã PIN (số) hoặc Mật khẩu (số và chữ số). Khi bạn định cấu hình chính sách mật khẩu, các mật khẩu đó các loại yếu hơn các loại được xác định trong chính sách sẽ bị vô hiệu hoá. Ví dụ: nếu Chất lượng mật khẩu "số" được định cấu hình, người dùng có thể chọn mã PIN (số) hoặc Mật khẩu chỉ sử dụng mật khẩu (chữ và số).

Sau khi thiết bị được bảo mật đúng cách bằng cách thiết lập mật khẩu khoá màn hình thích hợp, ứng dụng cho phép truy cập vào nội dung bảo mật.

Kotlin

when {
    !dpm.isAdminActive(policyAdmin) -> {
        // Activates device administrator.
        ...
    }
    !dpm.isActivePasswordSufficient -> {
        // Launches password set-up screen in Settings.
        ...
    }
    else -> {
        // Grants access to secure content.
        ...
        startActivity(Intent(context, SecureActivity::class.java))
    }
}

Java

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