تحسين الأمان باستخدام سياسات إدارة الأجهزة

إيقاف مشرف الجهاز نهائيًا تم وضع علامة على بعض سياسات المشرف على أنّها متوقفة نهائيًا عندما استدعاها مشرف الجهاز. لمزيد من المعلومات والاطّلاع على خيارات النقل، يُرجى الاطّلاع على إيقاف مشرف الجهاز.

بدءًا من الإصدار Android 2.2 (المستوى 8 لواجهة برمجة التطبيقات)، يوفّر نظام Android الأساسي إمكانات لإدارة الأجهزة على مستوى النظام من خلال واجهات برمجة تطبيقات إدارة الأجهزة.

في هذا الدرس، ستتعلم كيفية إنشاء تطبيق مدرك للأمان ويدير الوصول إلى المحتوى من خلال فرض سياسات إدارة الجهاز. على وجه التحديد، يمكن ضبط التطبيق لضمان إعداد كلمة مرور قفل الشاشة ذات القوة الكافية قبل عرض المحتوى المشروط للمستخدم.

تعريف سياستك وإعلانك

أولاً، عليك تحديد أنواع السياسات التي يجب توفيرها على المستوى الوظيفي. قد تشمل السياسات مدى قوة كلمة مرور قفل الشاشة ومهلة انتهاء الصلاحية والتشفير وما إلى ذلك.

يجب أن تتضمّن ملف res/xml/device_admin.xml مجموعة السياسات المحدَّدة التي سيفرضها التطبيق. يجب أن يشير بيان Android أيضًا إلى مجموعة السياسات المُعلن عنها.

تتوافق كل سياسة معلنة مع عدد من طُرق سياسات الجهاز ذات الصلة في DevicePolicyManager (من الأمثلة على ذلك تحديد الحد الأدنى لطول كلمة المرور والحد الأدنى لعدد الأحرف الكبيرة). إذا حاول أحد التطبيقات استدعاء طرق لم يتم تعريف سياستها المقابلة في ملف 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 لبيان السياسة المُشار إليه في بيان 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>

إنشاء متلقٍ لإدارة الجهاز

يمكنك إنشاء جهاز استقبال بث إدارة الجهاز، والذي يتم إشعاره بالأحداث ذات الصلة بالسياسات التي أتحتها بدعمك. يمكن أن يلغي التطبيق طرق معاودة الاتصال بشكل انتقائي.

في نموذج التطبيق، مشرف الجهاز، عندما يوقِف المستخدم مشرف الجهاز، يتم محو السياسة التي تم ضبطها من التفضيل المشترك. يجب أن تفكر في تنفيذ منطق العمل ذي الصلة بحالة استخدامك. على سبيل المثال، قد يتخذ التطبيق بعض الإجراءات للتخفيف من مخاطر الأمان من خلال تنفيذ مجموعة تضم حذف البيانات الحساسة على الجهاز وتعطيل المزامنة عن بُعد وتنبيه المشرف، وما إلى ذلك.

لكي يعمل مستلِم البث، تأكَّد من تسجيله في بيان 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);
}

وإذا اختار المستخدم "تفعيل"، يصبح التطبيق مشرف الجهاز ويمكنه البدء في ضبط السياسة وفرضها.

يجب أن يكون التطبيق جاهزًا أيضًا للتعامل مع حالات التراجع التي يترك فيها المستخدم عملية التفعيل بالضغط على زر "Cancel" (إلغاء) أو مفتاح "Back" (الرجوع) أو مفتاح الشاشة الرئيسية. وبالتالي، يجب أن يتضمّن onResume() في نشاط إعداد السياسة منطقًا لإعادة تقييم الحالة وتقديم خيار "تفعيل مشرف الجهاز" للمستخدم إذا لزم الأمر.

تنفيذ وحدة التحكّم بسياسة الجهاز

بعد تفعيل مشرف الجهاز بنجاح، يضبط التطبيق بعد ذلك "مدير سياسات الجهاز" باستخدام السياسة المطلوبة. يرجى مراعاة أنه تتم إضافة سياسات جديدة إلى Android مع كل إصدار. من المناسب إجراء عمليات فحص للإصدارات في تطبيقك في حال استخدام سياسات جديدة مع التوافق مع الإصدارات الأقدم من النظام الأساسي. على سبيل المثال، لا تتوفر سياسة "الحد الأدنى لكلمة المرور" إلا مع المستوى 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، يمكنه تحديد ما إذا كانت كلمة المرور الحالية تستوفي السياسة المطلوبة أم لا. إذا تبيّن أنّ كلمة المرور الحالية لقفل الشاشة غير كافية، لن تتّخذ واجهة برمجة تطبيقات إدارة الجهاز إجراءً تصحيحيًا تلقائيًا. تقع على عاتق التطبيق مسؤولية تشغيل شاشة تغيير كلمة المرور الصريحة للنظام في تطبيق "الإعدادات". على سبيل المثال:

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

وفي العادة، يمكن للمستخدم الاختيار من بين إحدى آليات القفل المتاحة، مثل بدون قفل أو النقش أو رقم التعريف الشخصي (رقمي) أو كلمة المرور (أبجدي رقمي). عند ضبط سياسة لكلمة المرور، يتم إيقاف أنواع كلمات المرور هذه التي تكون أضعف من تلك المحدّدة في السياسة. على سبيل المثال، في حال ضبط جودة كلمة المرور "الرقمية"، يمكن للمستخدم اختيار إما رقم التعريف الشخصي (رقمي) أو كلمة مرور (أبجدية رقمية) فقط.

بمجرد تأمين الجهاز بشكل صحيح من خلال إعداد كلمة مرور مناسبة لقفل الشاشة، يسمح التطبيق بالوصول إلى المحتوى الآمن.

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