امنیت

ویژگی‌های این راهنما قابلیت‌های مدیریت امنیتی را شرح می‌دهد که می‌توانید در برنامه کنترل‌کننده خط‌مشی دستگاه (DPC) خود پیاده‌سازی کنید. این سند حاوی نمونه کد است و همچنین می‌توانید از برنامه Test DPC به‌عنوان منبع نمونه کد برای ویژگی‌های سازمانی Android استفاده کنید.

برنامه DPC می‌تواند در حالت مالک نمایه در دستگاه‌های شخصی یا در حالت مالک دستگاه در دستگاه‌های کاملاً مدیریت‌شده اجرا شود. این جدول نشان می‌دهد که وقتی DPC در حالت مالک نمایه یا حالت مالک دستگاه اجرا می‌شود، کدام ویژگی‌ها دردسترس هستند:

ویژگی مالک نمایه مالک دستگاه
غیرفعال کردن دسترسی به برنامه‌ها ✓ ✓
مسدود کردن برنامه‌های منابع ناشناخته ✓ ✓
محدود کردن حساب‌ها در Google Play ✓ ✓
فعال کردن محافظت سازمانی پس‌از بازنشانی کارخانه‌ای ✓
پایش گزارش‌های فرایند سازمانی و گزارش‌های اشکال از راه دور ✓
اعطا و لغو دسترسی به گواهینامه کارخواه ✓ ✓
بازنشانی ایمن گذرنویسه ✓ ✓
چالش امنیتی نمایه کاری ✓

غیرفعال کردن دسترسی به برنامه‌ها

برای سازمان‌هایی که می‌خواهند کارمندانشان در زمان‌های خاصی از روز یا روزهای خاصی از هفته نتوانند در دستگاه Android خود بازی کنند یا YouTube تماشا کنند، DPC می‌تواند دسترسی به برنامه‌ها را موقتاً غیرفعال کند.

برای غیرفعال کردن دسترسی به برنامه‌ها، یک DPC که در حالت مالک دستگاه یا مالک نمایه اجرا می‌شود، setPackagesSuspended() را پیکربندی می‌کند و سپس برنامه انتخاب‌شده طوری عمل می‌کند که گویی غیرفعال است (راه‌انداز Google برنامه را خاکستری می‌کند). وقتی کاربر روی برنامه ضربه می‌زند، کادر گفتگوی سیستم را می‌بیند که می‌گوید برنامه تعلیق شده است.

وقتی برنامه‌ای تعلیق می‌شود، نمی‌تواند فعالیت‌ها را شروع کند و اعلان‌های مربوط به بسته متوقف می‌شود. بسته‌های تعلیق‌شده در صفحه نمای کلی نشان داده نمی‌شوند، نمی‌توانند کادرهای گفتگو (ازجمله اعلان‌های موقت و نوارهای میان‌وعده) را نشان دهند، و نمی‌توانند صدا پخش کنند یا دستگاه را بلرزانند.

راه‌اندازها می‌توانند با فراخوانی روش isPackageSuspended() متوجه شوند که آیا برنامه‌ای تعلیق شده است یا نه. برای جزئیات مربوط به نحوه پیکربندی تعلیق برنامه، setPackagesSuspended را ببینید.

مسدود کردن برنامه‌ها از منابع ناشناخته

برنامه‌هایی که از Google Play (یا دیگر فروشگاه‌های برنامه مورداعتماد) نصب نشده‌اند برنامه‌هایی از منابع ناشناخته نامیده می‌شوند. وقتی افراد این برنامه‌ها را نصب می‌کنند، دستگاه‌ها و داده‌ها ممکن است درمعرض خطر بیشتری قرار بگیرند.

برای جلوگیری از نصب برنامه‌ها از منابع ناشناخته توسط افراد، مؤلفه‌های سرپرست دستگاه‌های کاملاً مدیریت‌شده و نمایه‌های کاری می‌توانند محدودیت کاربر DISALLOW_INSTALL_UNKNOWN_SOURCES را اضافه کنند.

محدودیت سراسر دستگاه نمایه کاری

وقتی سرپرست نمایه کاری DISALLOW_INSTALL_UNKNOWN_SOURCES را اضافه می‌کند، محدودیت فقط برای نمایه کاری اعمال می‌شود. بااین‌حال، سرپرست نمایه کاری می‌تواند با تنظیم پیکربندی مدیریت‌شده برای Google Play، محدودیتی در سطح دستگاه اعمال کند. محدودیت سراسری دستگاه در Android نسخه ۸.۰ (یا بالاتر) دردسترس است، به‌شرطی که برنامه Google Play نصب‌شده نسخه ۸۰۸۱۲۵۰۰ یا بالاتر باشد.

برای محدود کردن نصب برنامه به Google Play، این مراحل را دنبال کنید:

  1. دسته پیکربندی مدیریت‌شده‌ای برای بسته Google Play com.android.vending تنظیم کنید.
  2. در بسته، مقدار بولی برای کلید verify_apps:device_wide_unknown_source_block قرار دهید.
  3. محدودیت کاربر ENSURE_VERIFY_APPS را اضافه کنید.

مثال زیر نشان می‌دهد که چگونه می‌توانید بررسی کنید که Google Play از این تنظیم پشتیبانی می‌کند و مقدار را روی true تنظیم کنید:

کاتلین

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)

جاوا

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‏ (adb) به نصب برنامه‌ها در نمایه شخصی ادامه دهند.

برای کسب اطلاعات بیشتر درباره منابع ناشناخته، گزینه‌های توزیع جایگزین را بخوانید.

محدود کردن حساب‌ها در Google Play

گاهی اوقات ممکن است سازمانی بخواهد به افراد اجازه دهد «حساب‌های Google» شخصی اضافه کنند (برای مثال، برای خواندن ایمیل در Gmail) اما نمی‌خواهد حساب شخصی بتواند برنامه نصب کند. DPC شما می‌تواند فهرستی از حساب‌هایی را که افراد می‌توانند در Google Play استفاده کنند تنظیم کند.

مؤلفه‌های سرپرست دستگاه‌های کاملاً مدیریت‌شده یا نمایه‌های کاری می‌توانند با تنظیم پیکربندی مدیریت‌شده برای Google Play، حساب‌ها را محدود کنند. محدودیت حساب زمانی دردسترس است که نسخه برنامه Google Play نصب‌شده ۸۰۹۷۰۱۰۰ یا بالاتر باشد.

برای محدود کردن حساب‌ها در Google Play، کارهای زیر را انجام دهید:

  1. دسته پیکربندی مدیریت‌شده‌ای برای بسته Google Play com.android.vending تنظیم کنید.
  2. در بسته، نشانی‌های ایمیل جداشده با کاما را به‌عنوان مقدار رشته‌ای برای کلید allowed_accounts قرار دهید.

مثال زیر نشان می‌دهد که چگونه می‌توانید حساب‌ها را محدود کنید:

کاتلین

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)

جاوا

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 به حساب کاری، به‌محض اینکه DPC نشانی ایمیل حساب را دریافت کرد، allowed_accounts را روی حساب مدیریت‌شده تکی تنظیم کنید. رشته خالی مانع از استفاده افراد از هر حسابی در Google Play می‌شود.

فعال کردن محافظت سازمانی پس‌از بازنشانی کارخانه‌ای

بااستفاده از محافظت سازمانی پس‌از بازنشانی کارخانه‌ای، سازمان‌ها می‌توانند مشخص کنند کدام «حساب‌های Google» می‌توانند دستگاهی را که بازنشانی کارخانه‌ای شده است آماده‌سازی کنند.

محافظت پس‌از بازنشانی کارخانه‌ای برای مصرف‌کننده به‌منظور جلوگیری از سرقت دستگاه طراحی شده است. قبل‌از اینکه به کسی اجازه داده شود دستگاه را پس‌از بازنشانی کارخانه‌ای غیرمجاز (مثلاً بااستفاده از EMM) آماده‌سازی کند، دستیار راه‌اندازی از کاربر می‌خواهد با هر «حساب Google» که قبلاً در نمایه شخصی دستگاه بوده است اصالت‌سنجی کند.

در محیط سازمانی، بازنشانی کارخانه‌ای ابزار مهمی برای مدیریت دستگاه‌های کارمندان هنگام ترک سازمان است. بااین‌حال، اگر سازمان اعتبارنامه‌های حساب کارمند را نداند، محافظت پس‌از بازنشانی کارخانه‌ای می‌تواند مانع از توانایی سازمان برای واگذاری دستگاه به کارمند دیگری شود.

کنترل تدارک پس‌از بازنشانی کارخانه‌ای

هنگام اجرا در حالت مالک دستگاه، DPC شما می‌تواند از setFactoryResetProtectionPolicy() استفاده کند تا کنترل کند کدام حساب‌ها مجاز به آماده‌سازی دستگاه پس‌از بازنشانی کارخانه‌ای هستند. اگر این پیکربندی روی null یا روی فهرست خالی تنظیم شده باشد، حساب‌های مجاز برای آماده‌سازی دستگاه پس‌از بازنشانی کارخانه‌ای، حساب‌های موجود در نمایه شخصی دستگاه هستند.

DPC می‌تواند این حساب‌ها را درطول عمر دستگاه کاملاً مدیریت‌شده پیکربندی کند.

  1. سرپرست فناوری اطلاعات می‌تواند از روش people.get از People API با مقدار ویژه me استفاده کند. این کار userId را برای حساب واردشده به سیستم بازیابی می‌کند. userID در کلید resourceName در فرم people/[userId] به‌عنوان رشته عدد صحیح برگردانده می‌شود. حساب‌های تازه ایجادشده ممکن است تا ۷۲ ساعت برای بازنشانی کارخانه‌ای دردسترس نباشند.
  2. همچنین ممکن است بخواهید به یک یا چند سرپرست فناوری اطلاعات اجازه دهید قفل دستگاه را پس‌از بازنشانی کارخانه‌ای باز کنند. از هرکدام از این سرپرستان فناوری اطلاعات بخواهید به سیستم «حساب Google» خود وارد شوند و مرحله ۱ را نیز دنبال کنند و userId خود را با شما هم‌رسانی کنند تا بتوانید این userIds را در مرحله بعدی به «فهرست» اضافه کنید.
  3. DPC بااستفاده از setFactoryResetProtectionPolicy() برای تنظیم «فهرست userId» که می‌تواند دستگاه بازنشانی کارخانه‌ای‌شده را آماده‌سازی کند، محدودیت برنامه مناسبی را تنظیم می‌کند.
  4. DPC حساب‌هایی را فعال می‌کند که می‌توانند دستگاه‌ها را پس‌از بازنشانی کارخانه‌ای با ارسال همه‌فرستی com.google.android.gms.auth.FRP_CONFIG_CHANGED به‌عنوان هدف صریح برای جلوگیری از حذف شدن به‌دلیل محدودیت‌های پس‌زمینه، آماده‌سازی کنند.

کاتلین

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)

جاوا

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() استفاده کنند، که با سطح API‏ ۳۰ معرفی شده است، DPC شما می‌تواند از setApplicationRestrictions برای افزودن حساب‌های انتخاب‌شده به پیکربندی مدیریت‌شده factoryResetProtectionAdmin برای بسته com.google.android.gms استفاده کند.

کاتلین

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)

جاوا

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

غیرفعال کردن محافظت سازمانی پس‌از بازنشانی کارخانه‌ای

برای غیرفعال کردن محافظت پس‌از بازنشانی کارخانه‌ای، DPC شما می‌تواند از setFactoryResetProtectionPolicy()با ارسال مقدار null استفاده کند.

کاتلین

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)

جاوا

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() (معرفی‌شده در سطح API‏ ۳۰) استفاده کنند، DPC شما می‌تواند از setApplicationRestrictions برای تنظیم مقدار کلید true در پیکربندی مدیریت‌شده disableFactoryResetProtectionAdmin برای بسته com.google.android.gms استفاده کند.

کاتلین

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)

جاوا

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»‏ (adb)، و قفل‌گشایی صفحه‌نمایش شناسایی کند. گزارش‌های پردازش به رضایت کاربر نیاز ندارد.

برای فعال یا غیرفعال کردن ثبت گزارش، DPC با setSecurityLoggingEnabled() تماس می‌گیرد.

وقتی دسته جدیدی از گزارش‌ها دردسترس باشد، DeviceAdminReceiver فراخوان برگشتی onSecurityLogsAvailable() را دریافت می‌کند. برای بازیابی گزارش‌ها (پس‌از دریافت تماس برگشتی)، DPC با retrieveSecurityLogs() تماس می‌گیرد.

DPCها همچنین می‌توانند retrievePreRebootSecurityLogs() را برای واکشی گزارش‌های امنیتی تولیدشده در چرخه بازراه‌اندازی قبلی فراخوانی کنند. این فاصله زمانی بین آخرین بازراه‌اندازی دستگاه و بازراه‌اندازی قبلی آن است. دستگاه‌هایی که از retrieveSecurityLogs() پشتیبانی نمی‌کنند، null را برمی‌گردانند. اگر برنامه‌تان گزارش‌ها را بااستفاده از هر دو retrievePreRebootSecurityLogs() و retrieveSecurityLogs() بازیابی می‌کند، باید وجود ورودی‌های تکراری را بررسی کنید.
توجه: این ویژگی فقط فعالیت را در دستگاه‌های کاملاً مدیریت‌شده با یک کاربر یا کاربران وابسته در دستگاه ثبت می‌کند. این ویژگی در دستگاه‌های شخصی کار نمی‌کند، زیرا فعالیت‌های سراسر دستگاه را ثبت می‌کند.

این تنظیم می‌تواند در ممیزی پس‌از رویداد امنیتی مفید باشد زیرا انواع کنش‌های زیر را ثبت می‌کند:

  • هربار که برنامه از ابتدا شروع می‌شود. این کار می‌تواند به شناسایی بدافزارهایی که با برنامه به‌خطرافتاده شروع می‌شوند کمک کند.
  • تلاش‌های ناموفق برای باز کردن قفل دستگاه. این ویژگی می‌تواند تشخیص دهد که آیا چندین تلاش ناموفق برای باز کردن قفل در مدت زمان کوتاهی وجود دارد یا نه.
  • فرمان‌های adb بالقوه مضر وقتی کاربر دستگاه را بااستفاده از کابل USB به رایانه وصل می‌کند.

برای جزئیات مربوط به نحوه خواندن گزارش‌ها، SecurityLog را ببینید.

هنگام توسعه و آزمایش، می‌توانید سیستم را مجبور کنید هرگونه گزارش امنیتی موجود را دردسترس DPC شما قرار دهد—لازم نیست منتظر یک دسته کامل بمانید. در Android نسخه ۹.۰ (سطح میانای برنامه‌سازی کاربردی ۲۸) یا بالاتر، فرمان پل اشکال‌زدایی Android (adb) زیر را در پایانه اجرا کنید:

adb shell dpm force-security-logs

سیستم تعداد دفعات استفاده از ابزار را محدود می‌کند و هرگونه کندی عمدی را در خروجی پایانه گزارش می‌دهد. اگر گزارش‌های موجود باشد، DPC شما فراخوانی برگشتی onSecurityLogsAvailable() را دریافت می‌کند.

درخواست گزارش اشکال از راه دور

یک DPC که در حالت مالک دستگاه اجرا می‌شود می‌تواند از راه دور گزارش‌های اشکال را برای دستگاه‌های کاربر با تنها یک کاربر یا کاربران وابسته درخواست کند. گزارش اشکال فعالیت دستگاه را دقیقاً در لحظه درخواست گزارش اشکال ثبت می‌کند، اما ممکن است شامل فعالیت چند ساعت گذشته نیز باشد، بسته به اینکه میان‌گیر logcat چند وقت یک‌بار بازآوری می‌شود.

برای درخواست گزارش‌های اشکال از راه دور، DPC با requestBugreport() تماس می‌گیرد:

اعطا کردن دسترسی و برداشتن دسترسی به گواهینامه کارخواه

اگر «کنترل‌کننده خط‌مشی دستگاه» که در حالت مالک نمایه یا مالک دستگاه اجرا می‌شود به برنامه طرف سومی امکان مدیریت گواهی‌ها را بدهد، آن برنامه می‌تواند بدون دخالت کاربر به گواهی‌هایی که نصب می‌کند دسترسی پیدا کند. برای نصب گواهینامه‌ای که همه برنامه‌های نمایه بتوانند به آن دسترسی داشته باشند، از installKeyPair() استفاده کنید.

برای اینکه بدانید کدام پارامترها را پیکربندی کنید، installKeyPair() را ببینید. این ویژگی در ارتباط با API موجود برای مدیریت گواهی‌ها کار می‌کند.

سناریوی پیاده‌سازی

بدون روش installKeyPair():

  • کاربران باید روی نام گواهینامه تک‌ضرب بزنند و هربار که می‌خواهند دسترسی به گواهینامه را اعطا کنند، روی اجازه دادن تک‌ضرب بزنند.
  • کاربران هنگام نصب گواهی، پیام‌واره‌ای می‌بینند و باید گواهی را نام‌گذاری کنند.

با روش installKeyPair():

  • کاربران لازم نیست هربار که می‌خواهند به گواهی‌ای اجازه دسترسی بدهند، روی اجازه دادن تک‌ضرب بزنند.
  • کاربران نمی‌توانند نام گواهی‌ها را تغییر دهند.
  • سرپرستان کنترل بیشتری دارند زیرا می‌توانند گواهی‌های برنامه‌هایی را که نباید به گواهی‌های خاصی دسترسی داشته باشند مسدود کنند.

برداشتن گواهینامه کارخواه

پس‌از اعطای دسترسی به گواهینامه کارخواه، برای برداشتن گواهینامه‌های کارخواه نصب‌شده ازطریق installKeyPair() از راه دور، با removeKeyPair() تماس بگیرید.

DPC که در حالت مالک دستگاه یا حالت مالک نمایه اجرا می‌شود، یا نصب‌کننده گواهی واگذارشده می‌تواند removeKeyPair() را فراخوانی کند. این کار جفت کلید خصوصی و گواهی نصب‌شده تحت نام مستعار کلید خصوصی داده‌شده را برمی‌دارد.

سناریوی پیاده‌سازی

اگر سازمانی درحال انتقال به شکل امن‌تری از گواهینامه کارخواه است، از این ویژگی استفاده کنید. اگر سرپرست گواهی جدیدی عرضه کند و توزیع آن زمان زیادی طول بکشد، سرپرست می‌تواند گواهی‌های منسوخ‌شده را پس‌از تکمیل انتقال لغو کند.

بازنشانی ایمن گذرنویسه

DPC شما می‌تواند با صدور مجوز تغییر بااستفاده از یک کد امنیتی پیش‌ثبت‌شده، گذرواژه کاربر را بازنشانی کند. مالکان دستگاه و مالکان نمایه می‌توانند میاناهای برنامه‌سازی کاربردی بازنشانی گذرنویسه ایمن را فراخوانی کنند تا به‌ترتیب گذرواژه دستگاه‌ها و نمایه‌های کاری را تغییر دهند. بازنشانی ایمن گذرنویسه جایگزین resetPassword() می‌شود و بهبودهای زیر را به‌همراه دارد:

اگر ساخت DPC شما Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) یا بالاتر را هدف قرار می‌دهد، باید از بازنشانی گذرنویسه ایمن استفاده کنید. فراخوانی resetPassword() باعث ایجاد SecurityException در «کنترل‌کننده‌های خط‌مشی دستگاه» (DPC) می‌شود که Android نسخه ۸.۰ یا بالاتر را هدف قرار می‌دهند، بنابراین ممکن است لازم باشد DPC خود را به‌روز کنید.

تنظیم و فعال کردن کد امنیتی

DPC شما باید قبل‌از بازنشانی گذرواژه، یک کد تنظیم و فعال کند. چون ممکن است DPC شما نتواند بلافاصله از کد استفاده کند، کد را پیش‌از زمانی که سرپرست فناوری اطلاعات ممکن است به استفاده از آن نیاز داشته باشد تنظیم می‌کنید.

یک توکن بازنشانی گذرواژه، مقدار تصادفی قوی ازنظر رمزنگاری است و باید حداقل ۳۲ بایت طول داشته باشد. برای هر دستگاه و نمایه یک توکن ایجاد کنید—از توکن‌های تولیدشده‌تان مجدداً استفاده نکنید یا آن‌ها را هم‌رسانی نکنید.

توصیه می‌کنیم توکن‌ها یا ابزار رمزگشایی توکن رمزگذاری‌شده را در سرور ذخیره کنید. اگر نشان‌ها را به‌طور محلی در فضای ذخیره‌سازی رمزگذاری‌شده با اطلاعات کاربری ذخیره کنید، «کنترل‌کننده خط‌مشی دستگاه» شما نمی‌تواند گذرواژه را بازنشانی کند تا زمانی‌که کاربر قفل دستگاه یا نمایه را باز کند. اگر نشان‌ها را به‌طور محلی در فضای ذخیره‌سازی رمزگذاری‌شده دستگاه ذخیره کنید و این فضا به‌خطر بیفتد، مهاجم می‌تواند از نشان برای دسترسی به نمایه کاری یا کاربر اصلی استفاده کند.

می‌توانید در DPC خود یک کد جدید ایجاد کنید یا کدی را از سرور واکشی کنید. مثال زیر نشان می‌دهد که یک DPC خودش یک توکن تولید می‌کند و آن را به یک سرور گزارش می‌دهد:

کاتلین

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

جاوا

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 شما باید پس‌از تنظیم کردن یک کد، آن را فعال کند. اما وقتی کاربر گذرواژه صفحه قفل ندارد، سیستم بلافاصله یک توکن فعال می‌کند. برای فعال کردن کد، از کاربر بخواهید اعتبارنامه‌اش را تأیید کند. «کنترل‌کننده خط‌مشی دستگاه» شما می‌تواند روش KeyguardManager createConfirmDeviceCredentialIntent() را برای دریافت Intent که تأیید را شروع می‌کند فراخوانی کند. در میانای کاربر برای کاربر دستگاه توضیح دهید که چرا از او می‌خواهید اصالت‌سنجی کند. قطعه کد زیر نشان می‌دهد که چگونه می‌توانید یک توکن را در DPC خود فعال کنید:

کاتلین

// 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
}

جاوا

// 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
}

باید پیش‌از بازراه‌اندازی دستگاه، کدی را که DPC تنظیم می‌کند فعال کنید. Android یک توکن فعال‌نشده را در حافظه ذخیره می‌کند و توکن را پس‌از بازراه‌اندازی حفظ نمی‌کند. اگر کاربر دستگاه را قبل‌از فعال کردن یک کد راه‌اندازی مجدد کند، DPC شما می‌تواند همان کد را دوباره تنظیم کند یا کد جدیدی تولید کند.

DPC شما می‌تواند با فراخوانی isResetPasswordTokenActive() و بررسی اینکه نتیجه true است، فعال بودن یک کد را تأیید کند.

پس‌از اینکه DPC شما یک کد را تنظیم و فعال کرد، این کد تا زمانی معتبر است که DPC شما آن را حذف یا جایگزین کند (یا دستگاه بازنشانی کارخانه‌ای شود). این کد مستقل از گذرواژه است و تغییر یا پاک کردن گذرواژه توسط کاربر بر آن تأثیری ندارد.

حذف کردن توکن

می‌توانید clearResetPasswordToken() را فراخوانی کنید تا نشانه‌ای را که DPC شما قبلاً تنظیم کرده است حذف کنید. ممکن است لازم باشد یک توکن لورفته را لغو کنید یا بخواهید امکان بازنشانی گذرواژه را بردارید. نمونه زیر نشان می‌دهد که چگونه می‌توانید این کار را در DPC خود انجام دهید:

کاتلین

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

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

جاوا

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

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

بازنشانی گذرواژه

وقتی سرپرست فناوری اطلاعات نیاز به بازنشانی گذرواژه دارد، resetPasswordWithToken() را فراخوانی کنید و توکنی را که DPC شما ازقبل تنظیم و فعال کرده است ارسال کنید:

کاتلین

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.
}

جاوا

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. DPC همچنین می‌تواندACTION_SET_NEW_PARENT_PROFILE_PASSWORD قصدی را برای درخواست از کاربر برای تنظیم قفل دستگاه ارسال کند.

DPC می‌تواند خط‌مشی‌های گذرواژه را برای چالش کاری متفاوت از خط‌مشی‌های گذرواژه‌های دیگر دستگاه تنظیم کند. برای مثال، حداقل طول پاسخ به چالش دستگاه می‌تواند با طول موردنیاز برای گذرواژه‌های دیگر متفاوت باشد. «کنترل‌کننده خط‌مشی دستگاه» خط‌مشی‌های چالش را بااستفاده از روش‌های معمول DevicePolicyManager، مثل setPasswordQuality() و setPasswordMinimumLength() تنظیم می‌کند.

ملاحظات

  • DPC می‌تواند گذرواژه نمایه کاری را بازنشانی کند، اما نمی‌تواند گذرواژه دستگاه (شخصی) را بازنشانی کند. اگر کاربری انتخاب کند که گذرواژه کاری و شخصی‌اش یکسان باشد، resetPassword() در نمایه کاری باعث می‌شود گذرواژه فقط در نمایه کاری بازنشانی شود و گذرواژه دیگر با گذرواژه صفحه قفل دستگاه یکسان نخواهد بود.
  • DPC می‌تواند بااستفاده از setOrganizationColor() و setOrganizationName()، صفحه اطلاعات کاربری را برای چالش کاری سفارشی‌سازی کند.
  • سرپرستان دستگاه نمی‌توانند از resetPassword() برای پاک کردن گذرواژه‌ها یا تغییر گذرواژه‌هایی که ازقبل تنظیم شده‌اند استفاده کنند. سرپرستان دستگاه همچنان می‌توانند گذرواژه تنظیم کنند، اما فقط وقتی دستگاه گذرواژه، پین، یا الگو نداشته باشد.

برای اطلاعات بیشتر، getParentProfileInstance() و اسناد مرجع را در DevicePolicyManager ببینید.