الأمان

توضّح الميزات الواردة في هذا الدليل إمكانات إدارة الأمان التي يمكنك تنفيذها في تطبيق وحدة التحكّم بسياسة الجهاز (DPC). ويحتوي هذا المستند على نماذج رموز ويمكنك أيضًا استخدام تطبيق اختبار وحدة التحكّم بسياسة الجهاز كمصدر نموذج رمز لميزات Android Enterprise.

يمكن تشغيل تطبيق وحدة التحكّم بسياسة الجهاز (DPC) في وضع مالك الملف الشخصي على الأجهزة الشخصية أو في وضع مالك الجهاز على الأجهزة المُدارة بالكامل. يشير هذا الجدول إلى الميزات المتاحة عند تشغيل وحدة التحكّم بسياسة الجهاز (DPC) في وضع مالك الملف الشخصي أو وضع مالك الجهاز:

الميزة مالك الملف الشخصي مالك الجهاز
إيقاف الوصول إلى التطبيقات
حظر التطبيقات من مصادر غير معروفة
حظر حسابات على Google Play
تفعيل حماية إعادة الضبط على الإعدادات الأصلية للمؤسسة
مراقبة سجلّات عمليات المؤسسة وتقارير الأخطاء عن بُعد
منح الإذن بالوصول إلى شهادة العميل وإزالته
إعادة ضبط رمز المرور الآمن
اختبار الأمان للملف الشخصي للعمل

إيقاف الوصول إلى التطبيقات

بالنسبة إلى المؤسسات التي تريد حظر الموظفين من تشغيل الألعاب أو مشاهدة YouTube على أجهزتهم التي تعمل بنظام التشغيل Android في أوقات معيّنة من اليوم أو في أيام معيّنة من الأسبوع، يمكن لوحدة التحكّم بسياسة الجهاز إيقاف الوصول إلى التطبيقات مؤقتًا.

لإيقاف الوصول إلى التطبيقات، تعمل وحدة التحكّم بسياسة الجهاز (DPC) التي تعمل في وضع مالك الجهاز أو مالك الملف الشخصي على إعداد setPackagesSuspended()، وبعد ذلك يعمل التطبيق المحدد كما لو كان غير مفعَّل (يظهر تطبيق Google مشغّل التطبيقات باللون الرمادي التطبيق). عندما ينقر المستخدم على التطبيق، يظهر له مربع حوار نظام يفيد بأن التطبيق معلّق.

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

يمكن لمشغّلات التطبيقات معرفة ما إذا كان التطبيق معلّقًا من خلال طلب الإجراء isPackageSuspended(). ولمزيد من التفاصيل عن كيفية ضبط تعليق التطبيق، يُرجى الاطّلاع على setPackagesSuspended.

حظر التطبيقات من مصادر غير معروفة

يُطلق على التطبيقات التي لم يتم تثبيتها من Google Play (أو متاجر التطبيقات الأخرى الموثوق بها) اسم التطبيقات من مصادر غير معروفة. يمكن أن تكون الأجهزة والبيانات أكثر عرضة للخطر عندما يثبّت الأشخاص هذه التطبيقات.

لمنع تثبيت تطبيقات من مصادر غير معروفة، يمكن لمكوّنات المشرف للملفات الشخصية للعمل والأجهزة المُدارة بالكامل إضافة التقييد على DISALLOW_INSTALL_UNKNOWN_SOURCES.

القيود المفروضة على الملف الشخصي للعمل على مستوى الجهاز

عندما يضيف مشرف الملف الشخصي للعمل DISALLOW_INSTALL_UNKNOWN_SOURCES، ينطبق القيود على الملف الشخصي للعمل فقط. ومع ذلك، يمكن لمشرف الملف الشخصي للعمل فرض قيود على مستوى الجهاز من خلال ضبط عملية ضبط مُدارة لـ Google Play. يتوفّر التقييد على مستوى الجهاز في الإصدار Android 8.0 (أو الإصدارات الأحدث) عندما يكون إصدار تطبيق Google Play المثبَّت هو الإصدار 80812500 أو إصدار أحدث.

لحصر عمليات تثبيت التطبيق على Google Play، يُرجى اتّباع الخطوات التالية:

  1. إعداد حزمة ضبط مُدارة لحزمة Google Play com.android.vending.
  2. في الحزمة، أضِف قيمة منطقية لمفتاح verify_apps:device_wide_unknown_source_block.
  3. أضِف قيد المستخدم في ENSURE_VERIFY_APPS.

يوضِّح المثال التالي كيف يمكنك التحقّق من أنّ Google Play يتيح هذا الإعداد وضبط القيمة على true:

Kotlin

internal val DEVICE_WIDE_UNKNOWN_SOURCES = "verify_apps:device_wide_unknown_source_block"
internal val GOOGLE_PLAY_APK = "com.android.vending"

// ...

// Add the setting to Google Play's existing managed config. Supported in
// Google Play version 80812500 or higher--older versions ignore unsupported
// settings.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
var existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DEVICE_WIDE_UNKNOWN_SOURCES, true)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

// Make sure that Google Play Protect verifies apps.
dpm.addUserRestriction(adminName, UserManager.ENSURE_VERIFY_APPS)
dpm.addUserRestriction(adminName, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)

Java

static final String DEVICE_WIDE_UNKNOWN_SOURCES =
    "verify_apps:device_wide_unknown_source_block";
static final String GOOGLE_PLAY_APK = "com.android.vending";

// ...


// Add the setting to Google Play's existing managed config. Supported in
// Google Play version 80812500 or higher--older versions ignore unsupported
// settings.
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
Bundle existingConfig =
    dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DEVICE_WIDE_UNKNOWN_SOURCES, true);
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

// Make sure that Google Play Protect verifies apps.
dpm.addUserRestriction(adminName, UserManager.ENSURE_VERIFY_APPS);
dpm.addUserRestriction(adminName, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);

تظل واجهة المستخدم في إعدادات النظام نشطة، إلا أن النظام يحظر تثبيت التطبيقات. يؤثر هذا التقييد على عمليات التثبيت المستقبلية—تظل التطبيقات المثبتة سابقًا على الجهاز. يمكن لمستخدمي الجهاز مواصلة تثبيت التطبيقات في الملف الشخصي باستخدام Android Debug Bridge (adb).

لمزيد من المعلومات حول المصادر غير المعروفة، يمكنك الاطّلاع على خيارات التوزيع البديلة.

حظر حسابات في Google Play

في بعض الأحيان، قد ترغب إحدى المؤسسات في السماح للأشخاص بإضافة حسابات Google شخصية (لقراءة البريد في Gmail على سبيل المثال)، ولكنها لا تريد أن يقوم الحساب الشخصي بتثبيت التطبيقات. يمكن لوحدة التحكّم بسياسة الجهاز إعداد قائمة بالحسابات التي يمكن للمستخدمين استخدامها في Google Play.

يمكن لمكونات المشرف للأجهزة المُدارة بالكامل أو الملفات الشخصية للعمل فرض قيود على الحسابات من خلال ضبط عملية ضبط مُدارة لـ Google Play. يتوفر قيد الحساب عندما يكون الإصدار 80970100 من تطبيق Google Play المثبت أو إصدارًا أحدث.

لفرض قيود على الحسابات في Google Play، اتّبِع الخطوات التالية:

  1. إعداد حزمة ضبط مُدارة لحزمة Google Play com.android.vending.
  2. في الحزمة، ضَع عناوين البريد الإلكتروني مفصولة بفواصل كقيمة سلسلة للمفتاح allowed_accounts.

يوضّح المثال التالي كيفية وضع قيود على الحسابات:

Kotlin

internal val ALLOWED_ACCOUNTS = "allowed_accounts"
internal val GOOGLE_PLAY_APK = "com.android.vending"

// ...

// Limit Google Play to one work and one personal account. Use
// a comma-separated list of account email addresses (usernames).
val googleAccounts = "ali@gmail.com,ali.connors@example.com"

// Supported in Google Play version 80970100 or higher.
val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putString(ALLOWED_ACCOUNTS, googleAccounts)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

Java

static final String ALLOWED_ACCOUNTS = "allowed_accounts";
static final String GOOGLE_PLAY_APK = "com.android.vending";

// ...


// Limit Google Play to one work and one personal account. Use
// a comma-separated list of account email addresses (usernames).
String googleAccounts = "ali@gmail.com,ali.connors@example.com";

// Supported in Google Play version 80970100 or higher.
Bundle existingConfig =
    dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putString(ALLOWED_ACCOUNTS, googleAccounts);
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

لحصر Google Play على حساب العمل فقط، اضبط allowed_accounts على حساب مُدار واحد فور تعرُّف وحدة التحكّم بسياسة الجهاز على عنوان البريد الإلكتروني للحساب. تمنع السلسلة الفارغة الأشخاص من استخدام أي حساب على Google Play.

تفعيل حماية إعادة الضبط على الإعدادات الأصلية للمؤسسة

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

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

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

التحكُّم في إدارة الحسابات بعد إعادة الضبط على الإعدادات الأصلية

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

ويمكن لوحدة التحكّم بسياسة الجهاز ضبط هذه الحسابات طوال فترة بقاء الجهاز المُدار بالكامل.

  1. يمكن لمشرف تكنولوجيا المعلومات استخدام طريقة people.get من People API مع إضافة القيمة الخاصة me. يؤدي ذلك إلى استرداد userId للحساب الذي تم تسجيل الدخول إليه. يتم عرض userID في المفتاح resourceName بالصيغة people/[userId] كسلسلة عدد صحيح. قد لا تكون الحسابات التي تم إنشاؤها حديثًا متاحة لأغراض إعادة الضبط على الإعدادات الأصلية لمدة 72 ساعة.
  2. يمكنك أيضًا تفعيل واحد أو أكثر من مشرفي تكنولوجيا المعلومات من فتح قفل الجهاز بعد إعادة ضبطه على الإعدادات الأصلية. اطلب من كل من مشرفي تكنولوجيا المعلومات هؤلاء تسجيل الدخول إلى حساباتهم على Google واتّباع الخطوة 1 أيضًا ومشاركة userId معهم، حتى تتمكن من إضافة userIds إلى القائمة في الخطوة التالية.
  3. تضع وحدة التحكّم بسياسة الجهاز تقييدًا مناسبًا للتطبيق باستخدام setFactoryResetProtectionPolicy() لإعداد قائمة userId التي يمكنها توفير المتطلبات اللازمة لجهاز تمت إعادة ضبطه على الإعدادات الأصلية.
  4. تتيح وحدة التحكّم بسياسة الجهاز للحسابات التي يمكنها إدارة الأجهزة بعد إعادة الضبط على الإعدادات الأصلية، وذلك عن طريق إرسال رمز البث com.google.android.gms.auth.FRP_CONFIG_CHANGED كهدف صريح لتجنُّب إسقاط الجهاز بسبب قيود في الخلفية.

Kotlin

const val ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

// List of userId that can provision a factory reset device.
// You can use the value returned calling people/me endpoint.
val accountIds = listOf("000000000000000000000")

dpm.setFactoryResetProtectionPolicy(
    adminName,
    FactoryResetProtectionPolicy.Builder()
        .setFactoryResetProtectionAccounts(accountIds)
        .setFactoryResetProtectionEnabled(true)
        .build()
)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

// List of userId that can provision a factory reset device.
// You can use the value returned calling people/me endpoint.
List<String> accountIds = new ArrayList<String>();
accountIds.add("000000000000000000000");

dpm.setFactoryResetProtectionPolicy(
    adminName,
    new FactoryResetProtectionPolicy.Builder()
        .setFactoryResetProtectionAccounts(accountIds)
        .setFactoryResetProtectionEnabled(true)
        .build());

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

معيار قديم

بالنسبة إلى الأجهزة التي لا يمكنها استخدام setFactoryResetProtectionPolicy()، والتي تم تقديمها مع مستوى واجهة برمجة التطبيقات 30، يمكن لوحدة التحكّم بسياسة الجهاز استخدام setApplicationRestrictions لإضافة الحسابات المختارة إلى إعدادات factoryResetProtectionAdmin المُدارة لحزمة com.google.android.gms.

Kotlin

const val GOOGLE_PLAY_APK = "com.android.vending"
const val FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin"
const val DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, false)
newConfig.putString(FACTORY_RESET_PROTECTION_ADMIN, googleAccounts)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String GOOGLE_PLAY_APK = "com.android.vending";
static final String FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin";
static final String DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

Bundle existingConfig =
        dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, false);
newConfig.putStringArray(FACTORY_RESET_PROTECTION_ADMIN,
        accountIds.toArray(new String[accountIds.size()]));
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

إيقاف حماية إعادة الضبط على الإعدادات الأصلية للمؤسسة

لإيقاف حماية إعادة الضبط على الإعدادات الأصلية، يمكن لوحدة التحكّم بسياسة الجهاز استخدام setFactoryResetProtectionPolicy()تمرير القيمة null.

Kotlin

const val ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

dpm.setFactoryResetProtectionPolicy(adminName, null)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

dpm.setFactoryResetProtectionPolicy(adminName, null);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

معيار قديم

بالنسبة إلى الأجهزة التي لا يمكنها استخدام setFactoryResetProtectionPolicy()، التي تم تقديمها مع مستوى واجهة برمجة التطبيقات 30، يمكن لوحدة التحكّم بسياسة الجهاز استخدام setApplicationRestrictions لضبط قيمة رئيسية تبلغ true في إعدادات disableFactoryResetProtectionAdmin المُدارة لحزمة com.google.android.gms.

Kotlin

const val GOOGLE_PLAY_APK = "com.android.vending"
const val FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin"
const val DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, true)

dpm.setApplicationRestrictions(
    adminName, GOOGLE_PLAY_SERVICES_PACKAGE, restrictions
)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String GOOGLE_PLAY_APK = "com.android.vending";
static final String FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin";
static final String DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

Bundle existingConfig =
        dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, true);

dpm.setApplicationRestrictions(
    adminName, GOOGLE_PLAY_SERVICES_PACKAGE, restrictions);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

راقِب سجلّات عمليات المؤسسة وتقارير الأخطاء عن بُعد

في وحدة التحكّم في إدارة الخدمات الجوّالة للمؤسسات (EMM)، يمكن للمشرف مراقبة الأجهزة المُدارة بالكامل باستخدام سجلّات عمليات المؤسسة وتقارير الأخطاء عن بُعد.

تسجيل نشاط أجهزة المؤسسة

يمكن لوحدة التحكّم بسياسة الجهاز (DPC) التي تعمل في وضع مالك الجهاز تحديد النشاط المريب من خلال تتبُّع نشاط الجهاز عن بُعد، بما في ذلك عمليات تشغيل التطبيقات ونشاط Android Debug Bridge (adb) وفتح قفل الشاشة. لا تتطلب سجلات العمليات موافقة المستخدم.

لتفعيل التسجيل أو إيقافه، تطلب وحدة التحكّم بسياسة الجهاز setSecurityLoggingEnabled().

عند توفُّر مجموعة جديدة من السجلّات، يتلقّى DeviceAdminReceiver معاودة الاتصال بـ onSecurityLogsAvailable(). لاسترداد السجلات (بعد تلقّي معاودة الاتصال)، تطلب وحدة التحكّم بسياسة الجهاز retrieveSecurityLogs().

يمكن لوحدات التحكّم بسياسة الجهاز أيضًا استدعاء retrievePreRebootSecurityLogs() لاسترجاع سجلات الأمان التي تم إنشاؤها في دورة إعادة التشغيل السابقة. هذه هي الفاصل الزمني بين عملية إعادة تشغيل الجهاز الأخيرة وإعادة التشغيل السابقة له. الأجهزة غير المتوافقة مع retrieveSecurityLogs() تُرجع null. وإذا كان تطبيقك يسترد السجلات باستخدام كل من retrievePreRebootSecurityLogs() وretrieveSecurityLogs()، عليك البحث عن الإدخالات المكررة.
ملاحظة: لا تُسجِّل هذه الميزة إلا النشاط على الأجهزة المُدارة بالكامل التي لها مستخدم واحد أو مستخدمون تابعون على الجهاز. لا تعمل هذه الميزة على الأجهزة الشخصية، لأنها تسجّل النشاط على مستوى الجهاز.

يمكن الاستفادة من هذا الإعداد في تدقيق ما بعد الحدث الأمني لأنّه يسجِّل أنواع الإجراءات التالية:

  • في كل مرة يتم فيها بدء تشغيل التطبيق مؤخرًا. يمكن أن يساعد ذلك في تحديد ما إذا كانت هناك برامج ضارة تبدأ بتطبيق مخترَق.
  • المحاولات غير الناجحة لفتح القفل على الجهاز يمكن أن يحدد ذلك ما إذا كانت هناك العديد من محاولات فتح القفل الفاشلة في فترة زمنية قصيرة.
  • أوامر adb يُحتمل أن تكون ضارة عندما يوصِّل المستخدم الجهاز بجهاز كمبيوتر باستخدام كابل USB.

لمعرفة التفاصيل حول كيفية قراءة السجلّات، يُرجى الاطّلاع على SecurityLog.

أثناء التطوير والاختبار، يمكنك إجبار النظام على إتاحة أي سجلات أمان حالية لوحدة التحكم بسياسة الجهاز (DPC)، ولن تضطر إلى الانتظار للحصول على دفعة كاملة. في نظام التشغيل Android 9.0 (المستوى 28 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، شغِّل أمر Android Debug Bridge (adb) التالي في الوحدة الطرفية:

adb shell dpm force-security-logs

يحدّ النظام من عدد المرات التي يمكنك فيها استخدام الأداة، ويُبلغ عن أي تباطؤ مقصود في الإخراج النهائي. في حال توفّر سجلات، ستتلقّى وحدة التحكّم بسياسة الجهاز (DPC) معاودة الاتصال بـ onSecurityLogsAvailable().

طلب تقرير خطأ عن بُعد

يمكن لوحدة التحكّم بسياسة الجهاز (DPC) التي تعمل في وضع مالك الجهاز أن تطلب عن بُعد تقارير الأخطاء لأجهزة المستخدمين التي تتضمن مستخدمًا واحدًا فقط أو مستخدمين تابعين. ويسجِّل تقرير الخطأ نشاط الجهاز في اللحظة التي يتم فيها طلب تقرير الخطأ، ولكنّه قد يتضمّن أيضًا نشاطًا من الساعات القليلة السابقة، اعتمادًا على عدد مرات إعادة تحميل المخزن المؤقت للسجلّ.

لطلب تقارير الأخطاء عن بُعد، تطلب وحدة التحكّم بسياسة الجهاز requestBugreport():

منح الإذن بالوصول إلى شهادة العميل وإزالته

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

وبالنسبة إلى المَعلمات التي يجب ضبطها، يُرجى الاطّلاع على installKeyPair(). وتعمل هذه الميزة إلى جانب واجهة برمجة التطبيقات الحالية لإدارة الشهادات.

سيناريو النشر

بدون استخدام طريقة installKeyPair():

  • على المستخدمين النقر على اسم الشهادة ثم النقر على السماح في كل مرة يريدون فيها منح إمكانية الوصول إلى شهادة.
  • يظهر للمستخدمين إشعار عند تثبيت شهادة ويجب عليهم تسمية الشهادة.

باستخدام طريقة installKeyPair():

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

إزالة شهادة عميل

بعد منح إمكانية الوصول إلى شهادة العميل، لإزالة شهادات العميل التي تم تثبيتها من خلال installKeyPair() عن بُعد، اتصل بـ removeKeyPair().

يمكن لوحدة التحكّم بسياسة الجهاز (DPC) التي تعمل في وضع مالك الجهاز أو وضع مالك الملف الشخصي أو أداة تثبيت الشهادة المفوَّضة طلب removeKeyPair(). يؤدي ذلك إلى إزالة شهادة وزوج مفاتيح خاصة تم تثبيتهما تحت اسم مستعار محدد للمفتاح الخاص.

سيناريو النشر

استخدِم هذه الميزة إذا كانت المؤسسة تنتقل إلى نموذج أكثر أمانًا لشهادة العميل. إذا طرح أحد المشرفين شهادة جديدة، واستغرق توزيعها وقتًا طويلاً، يمكن للمشرف إبطال الشهادات المتوقّفة بعد اكتمال عملية النقل.

إعادة ضبط رمز المرور الآمن

يمكن لوحدة التحكّم بسياسة الجهاز (DPC) إعادة ضبط كلمة مرور المستخدم من خلال منح الإذن بالتغيير باستخدام رمز مميّز آمن مسجَّل مسبقًا. يمكن لمالكي الأجهزة ومالكي الملفات الشخصية استدعاء واجهات برمجة التطبيقات لإعادة ضبط رمز المرور الآمن لتغيير كلمة مرور الأجهزة والملفات الشخصية للعمل على التوالي. تؤدي إعادة ضبط رمز المرور الآمن إلى استبدال resetPassword() بالتحسينات التالية:

يجب إعادة ضبط رمز المرور الآمن إذا كان إصدار وحدة التحكّم بسياسة الجهاز يستهدف الإصدار Android 8.0 (مستوى واجهة برمجة التطبيقات 26) أو الإصدارات الأحدث. يؤدي طلب الرمز resetPassword() إلى إنشاء SecurityException في وحدات التحكّم بسياسة الجهاز (DPC) التي تستهدف الإصدار Android 8.0 أو الإصدارات الأحدث، لذا قد تحتاج إلى تحديث وحدة التحكّم بسياسة الجهاز (DPC).

ضبط رمز مميّز وتفعيله

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

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

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

يمكنك إنشاء رمز مميّز جديد في وحدة التحكّم بسياسة الجهاز (DPC) أو استرجاع رمز مميّز من خادم. يوضح المثال أدناه وحدة التحكّم بسياسة الجهاز (DPC) لإنشاء رمز مميّز بنفسها وإبلاغ الخادم بذلك:

Kotlin

val token = ByteArray(32)

// Generate a new token
val random = SecureRandom()
random.nextBytes(token)

// Set the token to use at a later date
val success: Boolean
success = dpm.setResetPasswordToken(DeviceAdminReceiver.getComponentName(context), token)

// Activate the token and update success variable...

// Store the token on a server
if (success) {
 sendTokenToServer(token)
}

Java

byte token[] = new byte[32]; // Minimum size token accepted

// Generate a new token
SecureRandom random = new SecureRandom();
random.nextBytes(token);

// Set the token to use at a later date
boolean success;
success = dpm.setResetPasswordToken(DeviceAdminReceiver.getComponentName(getContext()), token);

// Activate the token and update success variable ...

// Store the token on a server
if (success) {
 sendTokenToServer(token);
}

في معظم الحالات، تحتاج وحدة التحكّم بسياسة الجهاز إلى تفعيل رمز مميّز بعد إعداده. ولكن، عندما لا يكون لدى المستخدم كلمة مرور لشاشة القفل، فإن النظام ينشط رمزًا مميزًا على الفور. لتفعيل رمز مميَّز، اطلب من المستخدم تأكيد بيانات اعتماده. يمكن لوحدة التحكّم بسياسة الجهاز (DPC) الاتصال بطريقة KeyguardManagercreateConfirmDeviceCredentialIntent() للحصول على Intent التي تبدأ عملية التأكيد. اشرح لمستخدم الجهاز في واجهة المستخدم السبب الذي تطلب منه المصادقة. يوضّح المقتطف أدناه كيفية تفعيل رمز مميّز في وحدة التحكّم بسياسة الجهاز:

Kotlin

// In your DPC, you'll need to localize the user prompt
val ACTIVATE_TOKEN_PROMPT = "Use your credentials to enable remote password reset"
val ACTIVATE_TOKEN_REQUEST = 1

// Create or fetch a token and set it in setResetPasswordToken() ...
val keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
val confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(null, ACTIVATE_TOKEN_PROMPT)

if (confirmIntent != null) {
 startActivityForResult(confirmIntent, ACTIVATE_TOKEN_REQUEST)
 // Check your onActivityResult() callback for RESULT_OK
} else {
 // Null means the user doesn't have a lock screen so the token is already active.
 // Call isResetPasswordTokenActive() if you need to confirm
}

Java

// In your DPC, you'll need to localize the user prompt
static final String ACTIVATE_TOKEN_PROMPT =
 "Use your credentials to enable remote password reset";
static final int ACTIVATE_TOKEN_REQUEST = 1;

// Create or fetch a token and set it in setResetPasswordToken() ...

KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
Intent confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(
  null, ACTIVATE_TOKEN_PROMPT);

if (confirmIntent != null) {
 startActivityForResult(confirmIntent, ACTIVATE_TOKEN_REQUEST);
 // Check your onActivityResult() callback for RESULT_OK
} else {
 // Null means the user doesn't have a lock screen so the token is already active.
 // Call isResetPasswordTokenActive() if you need to confirm
}

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

يمكن لوحدة التحكّم بسياسة الجهاز (DPC) تأكيد تفعيل الرمز المميّز من خلال طلب الرمز isResetPasswordTokenActive() والتحقّق من النتيجة هي true.

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

حذف رمز مميّز

يمكنك طلب الرمز clearResetPasswordToken() لحذف رمز مميّز سبق أن ضبطته وحدة التحكّم بسياسة الجهاز. قد تحتاج إلى إبطال الرمز المميز المخترق أو قد ترغب في إزالة إمكانية إعادة تعيين كلمة المرور. يوضّح النموذج أدناه كيفية إجراء ذلك في وحدة التحكّم بسياسة الجهاز:

Kotlin

val dpm = getDpm()
val admin = DeviceAdminReceiver.getComponentName(requireActivity())

// Clear the token
if (!dpm.clearResetPasswordToken(admin)) {
 // Report the failure and possibly try later ...
}

Java

DevicePolicyManager dpm = getDpm();
ComponentName admin = DeviceAdminReceiver.getComponentName(getActivity());

// Clear the token
if (!dpm.clearResetPasswordToken(admin)) {
 // Report the failure and possibly try later ...
}

إعادة ضبط كلمة المرور

عندما يحتاج مشرف تكنولوجيا المعلومات إلى إعادة ضبط كلمة المرور، يمكنك الاتصال مقدمًا بـ resetPasswordWithToken() وإرسال الرمز المميّز الذي ضبطته وحدة التحكّم بسياسة الجهاز وفعِّله مسبقًا:

Kotlin

val token: ByteArray = getTokenFromServer()
val newPassword = "password"

try {
 val result: Boolean = dpm.resetPasswordWithToken(
 DeviceAdminReceiver.getComponentName(requireContext()),
 newPassword,
 token,
 0
 )

 if (result) {
 // The password is now 'password'
 } else {
 // Using 'password' doesn't meet password restrictions
 }
} catch (e: IllegalStateException) {
 // The token doesn't match the one set earlier.
}

Java

byte token[] = getTokenFromServer();
String newPassword = "password";

try {
 boolean result = dpm.resetPasswordWithToken(
  DeviceAdminReceiver.getComponentName(getContext()), newPassword, token, 0);

 if (result) {
 // The password is now 'password'
 } else {
 // Using `password` doesn't meet password restrictions
 }
} catch (IllegalStateException e) {
 // The token doesn't match the one set earlier.
}

عند استدعاء resetPasswordWithToken()، يظهر false، ولا تتغير كلمة المرور، عندما لا تستوفي كلمة المرور الجديدة القيود التالية:

  • يفي عدد الأحرف بأي قيد كحد أدنى لطول كلمة المرور. يمكنك الاتصال بـ getPasswordMinimumLength() لمعرفة ما إذا كان مشرف تكنولوجيا المعلومات قد وضع حدًا للطول.
  • يتوافق نطاق وتعقيد الأحرف في كلمة المرور مع قيد التركيب. يمكنك الاتصال بـ getPasswordQuality() لمعرفة ما إذا كان مشرف تكنولوجيا المعلومات فرض قيدًا على التركيبة.

إذا كانت قيود جودة كلمة المرور لا تتطلب ضبط كلمة مرور، يمكنك ضبط null أو سلسلة فارغة على resetPasswordWithToken() لإزالة كلمة المرور.

اختبار أمان الملف الشخصي للعمل

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

آلية عمل اختبار الأمان للملف الشخصي للعمل

  1. إذا أرسلَت وحدة التحكّم بسياسة الجهاز هدف ACTION_SET_NEW_PASSWORD، سيطلب النظام من المستخدم إعداد اختبار أمان.
  2. يمكن لوحدة التحكّم بسياسة الجهاز أيضًا إرسال هدف ACTION_SET_NEW_PARENT_PROFILE_PASSWORD لطلب ضبط قفل الجهاز من المستخدم.

يمكن لوحدة التحكّم بسياسة الجهاز ضبط سياسات كلمة المرور لتحدي العمل بشكل مختلف عن سياسات كلمات المرور الأخرى للأجهزة. على سبيل المثال، يمكن أن يختلف الحد الأدنى لطول استجابة تحدي الجهاز عن الطول المطلوب لكلمات المرور الأخرى. تضبط وحدة التحكّم بسياسة الجهاز سياسات الاختبار باستخدام طرق DevicePolicyManager المعتادة، مثل setPasswordQuality() وsetPasswordMinimumLength().

الاعتبارات

  • يمكن لوحدة التحكّم بسياسة الجهاز إعادة ضبط كلمة المرور على الملف الشخصي للعمل، لكن لا يمكنه إعادة ضبط كلمة مرور الجهاز (الشخصية). إذا اختار المستخدم ضبط كلمات المرور الشخصية للعمل نفسه، سيؤدي ذلك إلى إعادة ضبط كلمة المرور resetPassword() في الملف الشخصي للعمل فقط على الملف الشخصي للعمل فقط، ولن تكون كلمة المرور هي نفسها كلمة مرور شاشة قفل الجهاز.
  • يمكن لوحدة التحكّم بسياسة الجهاز تخصيص شاشة بيانات الاعتماد لتحدّي العمل باستخدام setOrganizationColor() وsetOrganizationName().
  • لا يمكن لمشرفي الأجهزة استخدام resetPassword() لمحو كلمات المرور أو تغيير كلمات المرور التي سبق أن تم ضبطها. سيظل بإمكان مشرفي الأجهزة ضبط كلمة مرور، ولكن فقط عندما لا يكون للجهاز كلمة مرور أو رقم تعريف شخصي أو نقش.

للحصول على معلومات إضافية، يُرجى الاطّلاع على getParentProfileInstance() والمستندات المراجعة ضمن DevicePolicyManager.