เพิ่มความปลอดภัยด้วยนโยบายการจัดการอุปกรณ์

การเลิกใช้งานผู้ดูแลระบบอุปกรณ์ นโยบายผู้ดูแลระบบบางรายการถูกทำเครื่องหมายเป็นเลิกใช้งานเมื่อเรียกใช้ โดยผู้ดูแลระบบอุปกรณ์ หากต้องการเรียนรู้เพิ่มเติมและดูตัวเลือกการย้ายข้อมูล โปรดดูที่ การเลิกใช้งานผู้ดูแลระบบอุปกรณ์

แพลตฟอร์ม Android มีการจัดการอุปกรณ์ระดับระบบมาตั้งแต่ Android 2.2 (API ระดับ 8) ผ่านทาง Device Administration API

ในบทเรียนนี้ คุณจะได้ดูวิธีสร้างแอปพลิเคชันที่คำนึงถึงความปลอดภัยซึ่งจัดการการเข้าถึง เนื้อหาของแอปด้วยการบังคับใช้นโยบายการจัดการอุปกรณ์ กล่าวคือ สามารถกำหนดค่าแอปพลิเคชัน เพื่อให้แน่ใจได้ว่ารหัสผ่านการล็อกหน้าจอมีความรัดกุมเพียงพอก่อนที่จะแสดง เนื้อหาที่จำกัดไว้สำหรับผู้ใช้

กําหนดและประกาศนโยบาย

ก่อนอื่นคุณต้องกำหนดประเภทของนโยบายที่จะสนับสนุนในระดับการทำงาน นโยบายอาจ ครอบคลุมระดับความปลอดภัยของรหัสผ่านล็อกหน้าจอ การหมดเวลาหมดอายุ การเข้ารหัส ฯลฯ

คุณต้องประกาศชุดนโยบายที่เลือก ซึ่งจะมีการบังคับใช้โดยแอปพลิเคชันใน res/xml/device_admin.xml ไฟล์ ไฟล์ Manifest ของ Android ควรอ้างอิง ที่ประกาศแล้ว

นโยบายที่ประกาศแต่ละรายการจะสอดคล้องกับเมธอดนโยบายด้านอุปกรณ์ที่เกี่ยวข้องจำนวนหนึ่งใน DevicePolicyManager (กำหนดความยาวขั้นต่ำของรหัสผ่านและจำนวนขั้นต่ำของรหัสผ่าน อักขระตัวพิมพ์ใหญ่เป็น 2 ตัวอย่าง) หากแอปพลิเคชันพยายามจะเรียกใช้เมธอด ไม่ได้ประกาศนโยบายที่เกี่ยวข้องใน XML ซึ่งจะส่งผลให้มี SecurityException ขณะรันไทม์ สิทธิ์อื่นๆ เช่น force-lock สามารถใช้ได้หากแอปพลิเคชันต้องการจัดการ นโยบายประเภทอื่นๆ คุณจะเห็นขั้นตอนในภายหลัง ซึ่งเป็นขั้นตอนหนึ่งของการเปิดใช้งานผู้ดูแลระบบอุปกรณ์ รายการนโยบายที่ประกาศไว้จะแสดงให้ผู้ใช้เห็นในหน้าจอของระบบ

ข้อมูลโค้ดต่อไปนี้ประกาศนโยบายขีดจำกัดรหัสผ่านใน 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 ของการประกาศนโยบายที่อ้างอิงในไฟล์ Manifest ของ 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>

สร้างตัวรับการดูแลระบบอุปกรณ์

สร้าง Broadcast Receiver ของการดูแลระบบอุปกรณ์ซึ่งจะได้รับการแจ้งเตือนเหตุการณ์ที่เกี่ยวข้องกับนโยบายที่คุณประกาศไว้ว่าสนับสนุน แอปพลิเคชันอาจเลือกลบล้างเมธอด Callback ได้

ในแอปพลิเคชันตัวอย่าง ผู้ดูแลระบบอุปกรณ์ เมื่อผู้ดูแลระบบอุปกรณ์ถูกปิดใช้งานโดย ผู้ใช้ นโยบายที่กำหนดค่าไว้จะถูกลบออกจากค่ากำหนดที่ใช้ร่วมกัน คุณควรพิจารณาใช้ ตรรกะทางธุรกิจที่เกี่ยวข้องกับกรณีการใช้งานของคุณ ตัวอย่างเช่น แอปพลิเคชันอาจใช้เวลา การดำเนินการเพื่อลดความเสี่ยงด้านความปลอดภัยด้วยการดำเนินการต่างๆ ร่วมกับการลบข้อมูลที่ละเอียดอ่อนใน อุปกรณ์, การปิดใช้การซิงค์ระยะไกล, การแจ้งเตือนผู้ดูแลระบบ ฯลฯ

เพื่อให้ Broadcast Receiver ทำงานได้ โปรดลงทะเบียนในไฟล์ Manifest ของ Android ตามที่แสดงในตัวอย่างข้างต้น

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

เปิดใช้งานโปรแกรมควบคุมอุปกรณ์

ก่อนบังคับใช้นโยบาย ผู้ใช้ต้องเปิดใช้งานแอปพลิเคชันเป็นอุปกรณ์ด้วยตนเอง ผู้ดูแลระบบ ข้อมูลโค้ดด้านล่างแสดงวิธีเรียกกิจกรรมการตั้งค่าที่การเรียก ผู้ใช้ สามารถเปิดใช้งานแอปพลิเคชันของคุณ แนวทางปฏิบัติที่ดีคือการใส่ข้อความอธิบายเพื่อไฮไลต์ แก่ผู้ใช้ว่าเหตุใดแอปพลิเคชันจึงขอให้เป็นผู้ดูแลระบบอุปกรณ์ โดยระบุ ความตั้งใจเพิ่มขึ้น EXTRA_ADD_EXPLANATION

รูปที่ 1 หน้าจอการเปิดใช้งานของผู้ใช้ ซึ่งคุณสามารถ ให้คำอธิบายนโยบายด้านอุปกรณ์ของคุณ

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

หากผู้ใช้เลือก "เปิดใช้งาน" แอปพลิเคชันจะกลายเป็นโปรแกรมควบคุมอุปกรณ์ และ กำหนดค่าและบังคับใช้นโยบาย

และจะต้องเตรียมแอปพลิเคชันให้พร้อมรับมือกับสถานการณ์ต่างๆ ที่ผู้ใช้ยกเลิกการใช้งาน ขั้นตอนการเปิดใช้งานโดยกดปุ่ม "ยกเลิก" แป้นย้อนกลับ หรือแป้นหน้าแรก ดังนั้น onResume() ในกิจกรรมการตั้งค่านโยบายต้องมีตรรกะ เพื่อประเมินเงื่อนไขอีกครั้งและแสดงตัวเลือกการเปิดใช้งานผู้ดูแลระบบอุปกรณ์ให้กับผู้ใช้หาก ที่จำเป็น

ใช้เครื่องมือควบคุมนโยบายด้านอุปกรณ์

หลังจากเปิดใช้งานผู้ดูแลระบบอุปกรณ์สำเร็จแล้ว แอปพลิเคชันจะกำหนดค่าอุปกรณ์ ตัวจัดการนโยบายที่มีนโยบายที่ขอ โปรดทราบว่าเราจะเพิ่มนโยบายใหม่ลงใน Android ในแต่ละรุ่น คุณควรดำเนินการตรวจสอบเวอร์ชันในแอปพลิเคชันของคุณหากใช้ นโยบายใหม่ไปพร้อมกับรองรับแพลตฟอร์มเวอร์ชันเก่าด้วย เช่น การกำหนดรหัสผ่านขั้นต่ำ นโยบายอักษรตัวพิมพ์ใหญ่ใช้ได้เฉพาะกับ API ระดับ 11 (Honeycomb) ขึ้นไป รหัสต่อไปนี้ จะสาธิตวิธีการตรวจสอบเวอร์ชันขณะรันไทม์

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

ในจุดนี้ แอปพลิเคชันจะบังคับใช้นโยบายได้ แม้ว่าแอปพลิเคชันจะไม่มีสิทธิ์เข้าถึง รหัสผ่านล็อกหน้าจอจริงที่ใช้ โดยผ่าน Device Policy Manager API รหัสผ่านที่มีอยู่เป็นไปตามนโยบายที่กำหนด หากปรากฏว่าคำสั่งซื้อที่มีอยู่ รหัสผ่านล็อกหน้าจอไม่เพียงพอ API การดูแลระบบอุปกรณ์จะไม่นำไปใช้โดยอัตโนมัติ การดำเนินการแก้ไข แอปพลิเคชันมีหน้าที่รับผิดชอบในการเปิดใช้ระบบอย่างชัดเจน หน้าจอเปลี่ยนรหัสผ่านในแอปการตั้งค่า ดังตัวอย่างต่อไปนี้

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

ตามปกติแล้ว ผู้ใช้สามารถเลือกจากกลไกการล็อกที่ใช้ได้ เช่น ไม่มี รูปแบบ PIN (ตัวเลข) หรือรหัสผ่าน (ตัวอักษรและตัวเลข) เมื่อมีการกำหนดค่านโยบายรหัสผ่านแล้ว รหัสผ่านเหล่านั้น ประเภทที่มีประสิทธิภาพต่ำกว่าที่ระบุไว้ในนโยบายจะถูกปิดใช้ ตัวอย่างเช่น หาก มีการกำหนดคุณภาพรหัสผ่านแบบ "ตัวเลข" ผู้ใช้จะเลือก PIN (ตัวเลข) หรือรหัสผ่านก็ได้ (ตัวอักษรและตัวเลขคละกัน) เท่านั้น

เมื่ออุปกรณ์ได้รับการรักษาความปลอดภัยอย่างเหมาะสมแล้ว โดยการตั้งรหัสผ่านสำหรับล็อกหน้าจอที่เหมาะสม แอปพลิเคชัน อนุญาตให้เข้าถึงเนื้อหาที่ปลอดภัย

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