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

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

แพลตฟอร์ม 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 ตามที่แสดงในตัวอย่างข้างต้น

KotlinJava
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
()
       
}
   
}
}
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 หน้าจอการเปิดใช้งานของผู้ใช้ ซึ่งคุณสามารถ ให้คำอธิบายนโยบายด้านอุปกรณ์ของคุณ

KotlinJava
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)
}
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) ขึ้นไป รหัสต่อไปนี้ จะสาธิตวิธีการตรวจสอบเวอร์ชันขณะรันไทม์

KotlinJava
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)
   
}
}
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 การดูแลระบบอุปกรณ์จะไม่นำไปใช้โดยอัตโนมัติ การดำเนินการแก้ไข แอปพลิเคชันมีหน้าที่รับผิดชอบในการเปิดใช้ระบบอย่างชัดเจน หน้าจอเปลี่ยนรหัสผ่านในแอปการตั้งค่า ดังตัวอย่างต่อไปนี้

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

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

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

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