Meningkatkan keamanan dengan kebijakan pengelolaan perangkat

Penghentian admin perangkat. Beberapa kebijakan admin telah ditandai sebagai tidak digunakan lagi saat dipanggil oleh admin perangkat. Untuk mempelajari lebih lanjut dan melihat opsi migrasi, lihat Penghentian admin perangkat.

Mulai Android 2.2 (API level 8), platform Android menawarkan kemampuan pengelolaan perangkat tingkat sistem melalui Device Administration API.

Dalam kursus ini, Anda akan mempelajari cara membuat aplikasi sadar keamanan yang mengelola akses ke kontennya dengan menerapkan kebijakan pengelolaan perangkat. Secara khusus, aplikasi dapat dikonfigurasi sehingga memastikan sandi kunci layar dengan kekuatan yang memadai telah disiapkan sebelum menampilkan konten yang dibatasi kepada pengguna.

Menentukan dan mendeklarasikan kebijakan

Pertama, Anda perlu menentukan jenis kebijakan yang didukung di tingkat fungsional. Kebijakan dapat mencakup kekuatan sandi kunci layar, waktu tunggu habis masa berlaku, enkripsi, dll.

Anda harus mendeklarasikan kumpulan kebijakan yang dipilih, yang akan diterapkan oleh aplikasi, dalam file res/xml/device_admin.xml. Manifes Android juga harus merujuk ke kumpulan kebijakan yang dideklarasikan.

Setiap kebijakan yang dideklarasikan sesuai dengan beberapa metode kebijakan perangkat terkait di DevicePolicyManager (dua contoh adalah menentukan panjang sandi minimum dan jumlah minimum karakter berhuruf besar). Jika aplikasi mencoba memanggil metode yang kebijakannya terkait tidak dideklarasikan dalam XML, hal ini akan mengakibatkan SecurityException saat runtime. Izin lainnya, seperti force-lock, tersedia jika aplikasi bermaksud mengelola jenis kebijakan lainnya. Seperti yang akan Anda lihat nanti, sebagai bagian dari proses aktivasi administrator perangkat, daftar kebijakan yang dideklarasikan akan disajikan kepada pengguna di layar sistem.

Cuplikan berikut mendeklarasikan kebijakan batas sandi di res/xml/device_admin.xml:

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

XML deklarasi kebijakan yang dirujuk dalam manifes 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>

Membuat penerima administrasi perangkat

Membuat penerima siaran Administrasi Perangkat, yang akan mendapatkan notifikasi peristiwa terkait kebijakan yang telah Anda nyatakan untuk didukung. Aplikasi dapat mengganti metode callback secara selektif.

Dalam aplikasi contoh, Device Admin, saat administrator perangkat dinonaktifkan oleh pengguna, kebijakan yang dikonfigurasi akan dihapus dari preferensi bersama. Anda harus mempertimbangkan untuk menerapkan logika bisnis yang relevan dengan kasus penggunaan Anda. Misalnya, aplikasi mungkin melakukan beberapa tindakan untuk mengurangi risiko keamanan dengan menerapkan beberapa kombinasi penghapusan data sensitif di perangkat, menonaktifkan sinkronisasi jarak jauh, memberi tahu administrator, dll.

Agar penerima siaran berfungsi, pastikan untuk mendaftarkannya dalam manifes Android seperti yang diilustrasikan dalam cuplikan di atas.

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();
    }
}

Mengaktifkan administrator perangkat

Sebelum menerapkan kebijakan apa pun, pengguna harus mengaktifkan aplikasi secara manual sebagai administrator perangkat. Cuplikan di bawah menggambarkan cara memicu aktivitas setelan tempat pengguna dapat mengaktifkan aplikasi Anda. Sebaiknya sertakan teks penjelasan untuk menyoroti kepada pengguna alasan aplikasi meminta untuk menjadi administrator perangkat, dengan menentukan tambahan EXTRA_ADD_EXPLANATION dalam intent.

Gambar 1. Layar aktivasi pengguna tempat Anda dapat memberikan deskripsi kebijakan perangkat.

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);
}

Jika pengguna memilih "Aktifkan", aplikasi akan menjadi administrator perangkat dan dapat mulai mengonfigurasi serta menerapkan kebijakan.

Aplikasi juga harus siap untuk menangani situasi kemunduran ketika pengguna meninggalkan proses aktivasi dengan menekan tombol Cancel, tombol Kembali, atau tombol Beranda. Oleh karena itu, onResume() di Aktivitas Penyiapan Kebijakan harus memiliki logika untuk mengevaluasi kembali kondisi dan menampilkan opsi Aktivasi Administrator Perangkat kepada pengguna jika diperlukan.

Mengimplementasikan pengontrol kebijakan perangkat

Setelah administrator perangkat berhasil diaktifkan, aplikasi akan mengonfigurasi Pengelola Kebijakan Perangkat dengan kebijakan yang diminta. Perlu diingat bahwa kebijakan baru ditambahkan ke Android pada setiap rilis. Melakukan pemeriksaan versi pada aplikasi adalah langkah yang tepat jika Anda menggunakan kebijakan baru sambil mendukung versi platform yang lebih lama. Misalnya, kebijakan Huruf Besar Minimum Sandi hanya tersedia dengan API level 11 (Honeycomb) dan yang lebih baru. Kode berikut menunjukkan cara memeriksa versi saat runtime.

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);
}

Pada tahap ini, aplikasi dapat memberlakukan kebijakan tersebut. Meskipun aplikasi tidak memiliki akses ke sandi kunci layar sebenarnya yang digunakan, melalui Device Policy Manager API, aplikasi dapat menentukan apakah sandi yang ada memenuhi kebijakan yang diwajibkan. Jika ternyata sandi kunci layar yang ada tidak cukup, Device Administration API tidak secara otomatis mengambil tindakan korektif. Aplikasi bertanggung jawab untuk secara eksplisit meluncurkan layar perubahan sandi sistem di aplikasi Setelan. Misalnya:

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);
}

Biasanya, pengguna dapat memilih dari salah satu mekanisme kunci yang tersedia, seperti Tidak Ada, Pola, PIN (numerik), atau Sandi (alfanumerik). Saat kebijakan sandi dikonfigurasi, jenis sandi yang lebih lemah daripada yang ditentukan dalam kebijakan tersebut akan dinonaktifkan. Misalnya, jika kualitas sandi "Numerik" dikonfigurasi, pengguna hanya dapat memilih sandi PIN (numerik) atau Sandi (alfanumerik).

Setelah perangkat diamankan secara benar dengan menyiapkan sandi kunci layar yang tepat, aplikasi akan mengizinkan akses ke konten yang diamankan.

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));
}