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, buka Penghentian admin perangkat.

Sejak Android 2.2 (API level 8), platform Android menawarkan pengelolaan perangkat level sistem kemampuan Google Cloud melalui Device Administration API.

Dalam pelajaran ini, Anda akan mempelajari cara membuat aplikasi sadar keamanan yang mengelola akses ke kontennya dengan menerapkan kebijakan pengelolaan perangkat. Secara khusus, aplikasi dapat dikonfigurasi sedemikian rupa sehingga memastikan {i>password<i} layar yang cukup kuat telah disiapkan sebelum menampilkan konten yang dibatasi bagi pengguna.

Menetapkan dan mendeklarasikan kebijakan

Pertama, Anda harus menentukan jenis kebijakan yang akan didukung di tingkat fungsi. Kebijakan dapat mencakup kekuatan sandi kunci layar, batas waktu kedaluwarsa, enkripsi, dll.

Anda harus mendeklarasikan kumpulan kebijakan yang dipilih, yang akan diterapkan oleh aplikasi, di File res/xml/device_admin.xml. Manifes Android juga harus mereferensikan kumpulan kebijakan yang dideklarasikan.

Setiap kebijakan yang dideklarasikan sesuai dengan beberapa metode kebijakan perangkat yang terkait di DevicePolicyManager (menentukan panjang sandi minimum dan jumlah minimum karakter huruf besar adalah dua contohnya). Jika aplikasi mencoba memanggil metode yang kebijakan yang sesuai tidak dideklarasikan dalam XML, hal ini akan menghasilkan SecurityException saat runtime. Izin lainnya, seperti force-lock, tersedia jika aplikasi bermaksud untuk mengelola jenis kebijakan lain. Seperti yang akan Anda lihat nanti, sebagai bagian dari proses aktivasi administrator perangkat, daftar kebijakan yang dideklarasikan akan ditampilkan 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

Buat penerima siaran Administrasi Perangkat, yang akan mendapatkan notifikasi peristiwa terkait kebijakan yang telah Anda nyatakan sebagai dukungan. Aplikasi dapat mengganti metode callback secara selektif.

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

Agar penerima siaran dapat berfungsi, pastikan untuk mendaftarkannya dalam manifes Android seperti yang digambarkan 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();
    }
}

Aktifkan administrator perangkat

Sebelum menerapkan kebijakan apa pun, pengguna perlu mengaktifkan aplikasi secara manual sebagai perangkat Google Workspace for Education. Cuplikan di bawah ini mengilustrasikan cara memicu aktivitas setelan yang dapat mengaktifkan aplikasi Anda. Sebaiknya sertakan teks penjelasan untuk menyoroti kepada pengguna mengapa aplikasi meminta untuk menjadi administrator perangkat, dengan menentukan EXTRA_ADD_EXPLANATION tambahan di intent.

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

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 menjadi administrator perangkat dan dapat memulai mengonfigurasi dan menerapkan kebijakan.

Aplikasi juga harus siap menangani situasi pengaturan balik di mana pengguna mengabaikan proses aktivasi dengan menekan tombol {i>Cancel<i}, tombol {i>Back<i}, atau tombol {i>Home<i}. Oleh karena itu, onResume() di Aktivitas Penyiapan Kebijakan harus memiliki logika untuk mengevaluasi kembali kondisi dan memberikan opsi Aktivasi Administrator Perangkat kepada pengguna jika diperlukan.

Mengimplementasikan pengontrol kebijakan perangkat

Setelah administrator perangkat berhasil diaktifkan, aplikasi akan mengonfigurasi Perangkat Policy Manager dengan kebijakan yang diminta. Perlu diperhatikan bahwa kebijakan baru ditambahkan ke Android di setiap rilis. Sangat tepat untuk melakukan pemeriksaan versi di aplikasi Anda jika menggunakan kebijakan baru sambil mendukung versi platform yang lama. Misalnya, Nilai Minimum Sandi Kebijakan Kasus Besar hanya tersedia dengan API level 11 (Honeycomb) dan yang lebih tinggi. Kode berikut menunjukkan cara memeriksa versi pada 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 menerapkan kebijakan. Saat aplikasi tidak memiliki akses dengan {i>password<i} kunci layar yang sebenarnya digunakan, melalui {i>Device Policy Manager API<i} dapat menentukan apakah sandi yang ada mematuhi kebijakan yang diwajibkan. Jika ternyata {i>password<i} kunci layar tidak mencukupi, API administrasi perangkat tidak secara otomatis mengambil sebagai tindakan korektif. Aplikasi bertanggung jawab untuk meluncurkan sistem secara eksplisit layar perubahan sandi di aplikasi Setelan. Contoh:

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). Ketika kebijakan {i>password<i} dikonfigurasi, {i>password<i} tersebut yang lebih lemah dari apa yang ditentukan dalam kebijakan itu akan dinonaktifkan. Misalnya, jika Kualitas sandi “numerik” dikonfigurasi, pengguna dapat memilih PIN (numerik) atau Sandi (alfanumerik) saja.

Setelah perangkat diamankan dengan tepat dengan menyiapkan {i>password<i} layar-kunci yang tepat, aplikasi memungkinkan akses ke konten yang aman.

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