ویژگیهای این راهنما قابلیتهای مدیریت امنیتی را که میتوانید در برنامه کنترلکننده خطمشی دستگاه (DPC) خود پیادهسازی کنید، توصیف میکند. این سند حاوی نمونه کد است و همچنین می توانید از برنامه Test DPC به عنوان منبع کد نمونه برای ویژگی های سازمانی اندروید استفاده کنید.
یک برنامه DPC می تواند در حالت مالک نمایه در دستگاه های شخصی یا در حالت مالک دستگاه در دستگاه های کاملاً مدیریت شده اجرا شود. این جدول نشان میدهد که وقتی DPC در حالت مالک نمایه یا حالت مالک دستگاه اجرا میشود، کدام ویژگیها در دسترس هستند:
غیرفعال کردن دسترسی به برنامه ها
برای سازمانهایی که میخواهند کارمندان را از انجام بازی یا تماشای YouTube در دستگاه مجهز به Android خود در ساعات خاصی از روز یا روزهای خاصی از هفته مسدود کنند، یک DPC میتواند به طور موقت دسترسی به برنامهها را غیرفعال کند.
برای غیرفعال کردن دسترسی به برنامهها، یک DPC که در حالت مالک دستگاه یا مالک نمایه اجرا میشود، setPackagesSuspended()
را پیکربندی میکند و سپس برنامه انتخابشده طوری عمل میکند که انگار غیرفعال است (راهانداز Google برنامه را خاکستری میکند). هنگامی که کاربر روی برنامه ضربه می زند، یک گفتگوی سیستم را می بیند که می گوید برنامه به حالت تعلیق درآمده است.
وقتی یک برنامه به حالت تعلیق درآمده است، نمیتواند فعالیتها را شروع کند و اعلانهای بسته متوقف میشوند. بستههای معلق در صفحه نمای کلی ظاهر نمیشوند، نمیتوانند دیالوگها (از جمله نان تست و اسنک بار) را نشان دهند، و نمیتوانند صدا را پخش کنند یا دستگاه را لرزانند.
راهاندازها میتوانند با فراخوانی متد isPackageSuspended()
متوجه تعلیق شدن یک برنامه شوند. برای جزئیات در مورد نحوه پیکربندی تعلیق برنامه، به setPackagesSuspended
مراجعه کنید.
مسدود کردن برنامه ها از منابع ناشناس
برنامههایی که از Google Play (یا سایر فروشگاههای برنامه قابل اعتماد) نصب نشدهاند ، برنامههایی از منابع ناشناس نامیده میشوند. وقتی افراد این برنامه ها را نصب می کنند، دستگاه ها و داده ها می توانند در معرض خطر بیشتری قرار گیرند.
برای جلوگیری از نصب برنامهها از منابع ناشناس، مؤلفههای سرپرست دستگاههای کاملاً مدیریتشده و نمایههای کاری میتوانند محدودیت کاربر DISALLOW_INSTALL_UNKNOWN_SOURCES
را اضافه کنند.
محدودیت در سطح دستگاه نمایه کاری
وقتی سرپرست یک نمایه کاری DISALLOW_INSTALL_UNKNOWN_SOURCES
را اضافه میکند، این محدودیت فقط برای نمایه کاری اعمال میشود. با این حال، سرپرست یک نمایه کاری میتواند با تنظیم یک پیکربندی مدیریتشده برای Google Play، محدودیتی در سراسر دستگاه اعمال کند. زمانی که برنامه Google Play نصب شده نسخه 80812500 یا بالاتر باشد، محدودیت در سراسر دستگاه در Android نسخه 8.0 (یا بالاتر) موجود است.
برای محدود کردن نصب برنامه به Google Play، این مراحل را دنبال کنید:
- یک بسته پیکربندی مدیریت شده برای بسته Google Play
com.android.vending
تنظیم کنید. - در بسته، یک مقدار بولی برای کلید
verify_apps:device_wide_unknown_source_block
قرار دهید. - محدودیت کاربر
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);
رابط کاربری در تنظیمات سیستم فعال می ماند اما سیستم نصب برنامه را مسدود می کند. این محدودیت بر نصبهای آینده تأثیر میگذارد—برنامههای نصبشده قبلی روی دستگاه باقی میمانند. کاربران دستگاه می توانند با استفاده از پل اشکال زدایی اندروید (adb) به نصب برنامه ها در نمایه شخصی ادامه دهند.
برای کسب اطلاعات بیشتر در مورد منابع ناشناخته، گزینه های توزیع جایگزین را بخوانید.
حسابها را در Google Play محدود کنید
گاهی اوقات ممکن است یک سازمان بخواهد به افراد اجازه دهد حسابهای شخصی Google را اضافه کنند (مثلاً برای خواندن نامه در Gmail) اما نمیخواهد حساب شخصی برنامهها را نصب کند. DPC شما میتواند فهرستی از حسابهایی را که افراد میتوانند در Google Play استفاده کنند تنظیم کند.
اجزای سرپرست دستگاههای کاملاً مدیریتشده یا نمایههای کاری میتوانند حسابها را با تنظیم یک پیکربندی مدیریتشده برای Google Play محدود کنند. محدودیت حساب زمانی در دسترس است که برنامه Google Play نصب شده نسخه 80970100 یا بالاتر باشد.
برای محدود کردن حسابها در Google Play، موارد زیر را انجام دهید:
- یک بسته پیکربندی مدیریت شده برای بسته Google Play
com.android.vending
تنظیم کنید. - در بسته، آدرس های ایمیل جدا شده با کاما را به عنوان یک مقدار رشته ای برای کلید
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 می تواند این حساب ها را در طول عمر یک دستگاه کاملاً مدیریت شده پیکربندی کند.
- سرپرست فناوری اطلاعات میتواند از روش
people.get
از People API با مقدار ویژهme
استفاده کند. اینuserId
برای حساب کاربری وارد شده بازیابی می کند.userID
در کلیدresourceName
به شکلpeople/[userId]
به عنوان یک رشته عدد صحیح بازگردانده میشود. حسابهای تازه ایجاد شده ممکن است تا ۷۲ ساعت برای اهداف بازنشانی کارخانه در دسترس نباشند. - همچنین ممکن است بخواهید یک یا چند سرپرست فناوری اطلاعات را فعال کنید تا قفل دستگاه را پس از بازنشانی کارخانه ای باز کنند. از هر یک از این مدیران فناوری اطلاعات بخواهید وارد حساب Google خود شوند و همچنین مرحله 1 را دنبال کرده و
userId
خود را با شما به اشتراک بگذارند تا در مرحله بعد بتوانید اینuserIds
به لیست اضافه کنید. - DPC با استفاده از
setFactoryResetProtectionPolicy()
یک محدودیت برنامه مناسب را برای تنظیم لیستuserId
که می تواند دستگاه بازنشانی کارخانه ای را فراهم کند، تنظیم می کند. - 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 Level 30 استفاده کنند، 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 Level 30 استفاده کنند، 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()
بازیابی میکند، باید ورودیهای تکراری را بررسی کنید.
توجه: این ویژگی فقط فعالیت را در دستگاه های کاملاً مدیریت شده با یک کاربر یا کاربران وابسته در دستگاه ثبت می کند. این ویژگی در دستگاههای شخصی کار نمیکند، زیرا فعالیتهای کل دستگاه را ثبت میکند.
این تنظیم می تواند در ممیزی پس از رویداد امنیتی مفید باشد زیرا انواع اقدامات زیر را ثبت می کند:
- هر بار که برنامه تازه راه اندازی می شود. این می تواند به شناسایی بدافزاری کمک کند که با یک برنامه در معرض خطر شروع می شود.
- تلاشهای ناموفق باز کردن قفل در یک دستگاه. این می تواند تشخیص دهد که آیا چندین تلاش برای باز کردن قفل ناموفق در یک دوره زمانی کوتاه وجود دارد یا خیر.
- هنگامی که کاربر دستگاه را با استفاده از کابل USB به رایانه متصل می کند، دستورات adb بالقوه مضر را صادر می کند.
برای جزئیات در مورد نحوه خواندن گزارشها، به SecurityLog
مراجعه کنید.
در حالی که در حال توسعه و آزمایش هستید، میتوانید سیستم را وادار کنید تا هرگونه گزارش امنیتی موجود را در دسترس DPC شما قرار دهد — لازم نیست منتظر یک دسته کامل باشید. در Android 9.0 (سطح API 28) یا بالاتر، دستور Android Debug Bridge (adb) زیر را در ترمینال خود اجرا کنید:
adb shell dpm force-security-logs
این سیستم تعداد دفعات استفاده از ابزار را محدود می کند و هرگونه کندی عمدی در خروجی ترمینال را گزارش می دهد. اگر گزارشهای موجود وجود داشته باشد، DPC شما پاسخ تماس onSecurityLogsAvailable()
را دریافت میکند.
از راه دور یک گزارش اشکال درخواست کنید
یک DPC که در حالت مالک دستگاه اجرا میشود، میتواند از راه دور گزارش اشکال را برای دستگاههای کاربر تنها با یک کاربر یا کاربران وابسته درخواست کند. گزارش اشکال، فعالیت دستگاه را دقیقاً در لحظه درخواست گزارش اشکال ثبت میکند، اما ممکن است شامل فعالیتهای چند ساعت قبل نیز باشد، بسته به اینکه بافر logcat هر چند وقت یکبار تازهسازی میشود.
برای درخواست از راه دور گزارشهای اشکال، DPC requestBugreport()
فراخوانی میکند:
- اگر کاربر اشتراکگذاری گزارش اشکال را بپذیرد، DPC گزارش اشکال را با استفاده از
onBugreportShared()
دریافت میکند. - اگر کاربر اشتراکگذاری گزارش اشکال را انکار کند، DPC با استفاده از
onBugreportSharingDeclined()
پیام رد درخواست اشتراکگذاری را دریافت میکند. - اگر گزارش اشکال ناموفق باشد، DPC
onBugreportFailed()
باBUGREPORT_FAILURE_FAILED_COMPLETING
یاBUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
می بیند.
اجازه دسترسی و حذف دسترسی به گواهی مشتری
اگر یک DPC که در حالت مالک نمایه یا مالک دستگاه اجرا میشود، به یک برنامه شخص ثالث امکان مدیریت گواهیها را بدهد، برنامه میتواند بدون دخالت کاربر به گواهیهایی که نصب میکند دسترسی داشته باشد. برای نصب گواهی که همه برنامههای یک نمایه میتوانند به آن دسترسی داشته باشند، از installKeyPair()
استفاده کنید.
برای اینکه کدام پارامترها را پیکربندی کنید، به installKeyPair()
مراجعه کنید. این ویژگی در ارتباط با API موجود برای مدیریت گواهی ها کار می کند.
سناریوی استقرار
بدون متد installKeyPair()
:
- کاربران باید هر بار که میخواهند اجازه دسترسی به گواهی را بدهند، روی نام گواهی ضربه بزنند و روی Allow ضربه بزنند.
- کاربران هنگام نصب گواهی نامه ای را می بینند و باید گواهی را نام گذاری کنند.
با متد installKeyPair()
:
- لازم نیست کاربران هر بار که میخواهند به گواهی دسترسی بدهند روی Allow ضربه بزنند.
- کاربران نمی توانند گواهی ها را تغییر نام دهند.
- ادمینها کنترل بیشتری دارند، زیرا میتوانند گواهیهای برنامههایی را که نباید به گواهیهای خاصی دسترسی داشته باشند، مسدود کنند.
یک گواهی مشتری را حذف کنید
پس از اعطای دسترسی به گواهی مشتری، برای حذف از راه دور گواهیهای کلاینت نصب شده از طریق installKeyPair()
، removeKeyPair()
فراخوانی کنید.
یک DPC که در حالت مالک دستگاه یا حالت مالک نمایه اجرا می شود، یا نصب کننده گواهی تفویض شده می تواند removeKeyPair()
را فراخوانی کند. این یک گواهی و جفت کلید خصوصی نصب شده تحت نام مستعار کلید خصوصی را حذف می کند.
سناریوی استقرار
اگر سازمانی در حال مهاجرت به شکل امنتری از گواهی مشتری است، از این ویژگی استفاده کنید. اگر یک سرپرست یک گواهی جدید ارائه کند و توزیع آن زمان قابل توجهی را به خود اختصاص دهد، مدیر میتواند گواهیهای منسوخ شده را پس از تکمیل انتقال باطل کند.
بازنشانی رمز عبور ایمن
DPC شما میتواند رمز عبور کاربر را با تأیید تغییر با یک توکن از قبل ثبتشده و ایمن بازنشانی کند. صاحبان دستگاه و مالکان نمایه میتوانند برای تغییر رمز عبور دستگاهها و نمایههای کاری به ترتیب با APIهای بازنشانی رمز عبور ایمن تماس بگیرند. تنظیم مجدد رمز عبور ایمن با بهبودهای زیر جایگزین resetPassword()
می شود:
- قبل از اینکه کاربر قفل دستگاه یا نمایه را پس از راهاندازی مجدد در دستگاهها با استفاده از رمزگذاری مبتنی بر فایل باز کند، DPC شما میتواند رمز عبور را بازنشانی کند.
- Android Keystore کلیدهای احراز هویت شده توسط کاربر را پس از بازنشانی رمز عبور حفظ می کند.
اگر ساخت DPC شما Android 8.0 (سطح API 26) یا بالاتر را هدف قرار می دهد، باید از بازنشانی رمز عبور ایمن استفاده کنید. فراخوانی resetPassword()
باعث ایجاد یک SecurityException
در DPCهایی می شود که اندروید 8.0 یا بالاتر را هدف قرار می دهند، بنابراین ممکن است لازم باشد DPC خود را به روز کنید.
یک توکن تنظیم و فعال کنید
قبل از تنظیم مجدد رمز عبور، DPC شما باید یک رمز را تنظیم و فعال کند. از آنجایی که DPC شما ممکن است نتواند فوراً از توکن استفاده کند، توکن را زودتر از زمانی که ممکن است یک سرپرست فناوری اطلاعات برای استفاده از آن نیاز داشته باشد تنظیم کنید.
رمز بازنشانی رمز عبور یک مقدار تصادفی رمزنگاری قوی است و باید حداقل 32 بایت طول داشته باشد. برای هر دستگاه و نمایه یک نشانه ایجاد کنید—از توکن های تولید شده خود دوباره استفاده نکنید یا به اشتراک نگذارید.
توصیه میکنیم توکنها یا ابزارهایی برای رمزگشایی رمز رمزگذاری شده روی سرور ذخیره شوند. اگر نشانهها را به صورت محلی در فضای ذخیرهسازی رمزگذاری شده اعتبار ذخیره میکنید، 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 شما باید یک توکن را پس از تنظیم آن فعال کند. اما، زمانی که کاربر رمز عبور صفحه قفل را نداشته باشد، سیستم فوراً یک توکن را فعال می کند. برای فعال کردن رمز، از کاربر بخواهید تا اعتبار خود را تأیید کند. 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 خود را تنظیم میکند. اندروید یک توکن فعال نشده را در حافظه ذخیره میکند و پس از راهاندازی مجدد، توکن را حفظ نمیکند. اگر کاربر قبل از فعال کردن یک نشانه، دستگاه را راهاندازی مجدد کند، 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 که در حالت مالک نمایه اجرا میشود، میتواند از کاربران بخواهد که یک چالش امنیتی برای برنامههای در حال اجرا در نمایه کاری مشخص کنند. هنگامی که کاربر تلاش می کند هر برنامه کاری را باز کند، سیستم چالش امنیتی را نشان می دهد. اگر کاربر چالش امنیتی را با موفقیت انجام دهد، سیستم نمایه کاری را باز می کند و در صورت لزوم آن را رمزگشایی می کند.
چالش امنیتی نمایه کاری چگونه کار می کند
- اگر یک DPC یک هدف
ACTION_SET_NEW_PASSWORD
ارسال کند، سیستم از کاربر می خواهد که یک چالش امنیتی را تنظیم کند. - DPC همچنین میتواند یک هدف
ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
ارسال کند تا از کاربر بخواهد قفل دستگاه را تنظیم کند.
یک DPC میتواند خطمشیهای رمز عبور را برای چالش کاری متفاوت از خطمشیهای گذرواژههای دیگر دستگاهها تنظیم کند. به عنوان مثال، حداقل طول پاسخ چالش دستگاه می تواند با طول مورد نیاز برای سایر رمزهای عبور متفاوت باشد. یک DPC سیاست های چالش را با استفاده از روش های معمول DevicePolicyManager
، مانند setPasswordQuality()
و setPasswordMinimumLength()
تنظیم می کند.
ملاحظات
- DPC میتواند گذرواژه را در نمایه کاری بازنشانی کند، اما نمیتواند گذرواژه (شخصی) دستگاه را بازنشانی کند. اگر کاربر انتخاب کند که گذرواژههای کاری و شخصی را یکسان تنظیم کند،
resetPassword()
در نمایه کاری باعث میشود که رمز عبور فقط در نمایه کاری بازنشانی شود و رمز عبور با رمز عبور قفل دستگاه یکسان نخواهد بود. صفحه نمایش - یک DPC می تواند با استفاده از
setOrganizationColor()
وsetOrganizationName()
صفحه اعتبار را برای چالش کاری سفارشی کند. - مدیران دستگاه نمیتوانند از
resetPassword()
برای پاک کردن گذرواژهها یا تغییر گذرواژههایی که از قبل تنظیم شدهاند استفاده کنند. سرپرستهای دستگاه همچنان میتوانند رمز عبور تعیین کنند، اما فقط زمانی که دستگاه رمز عبور، پین یا الگوی نداشته باشد.
برای اطلاعات بیشتر، به getParentProfileInstance()
و مستندات مرجع در DevicePolicyManager
مراجعه کنید.