В этом руководстве описаны функции управления безопасностью, которые можно реализовать в контроллере политик устройств (DPC). Документ содержит примеры кода. В качестве источника примеров кода для корпоративных функций Android также можно использовать приложение Test DPC.
Приложение DPC может работать в режиме владельца профиля на личных устройствах или в режиме владельца устройства на полностью управляемых устройствах. В таблице ниже указано, какие функции доступны, когда контроллер политики устройств работает в режиме владельца профиля или владельца устройства.
Как отключить доступ к приложениям
Если организация хочет запретить сотрудникам играть в игры или смотреть YouTube на устройствах Android в определенное время дня или дни недели, контроллер политики устройств может временно отключить доступ к приложениям.
Чтобы отключить доступ к приложениям, контроллер политик, работающий в режиме владельца устройства или профиля, настраивает setPackagesSuspended(). После этого выбранное приложение ведет себя так, как будто оно отключено (в панели запуска Google оно становится серым). Если пользователь нажмет на приложение, появится системное диалоговое окно с сообщением о том, что приложение заблокировано.
Приостановленное приложение не может запускать действия, а уведомления для пакета блокируются. Приостановленные пакеты не отображаются на обзорном экране, не могут показывать диалоговые окна (в том числе всплывающие уведомления и снэкбары), воспроизводить аудио и вызывать вибрацию устройства.
Чтобы узнать, заблокировано ли приложение, можно вызвать метод isPackageSuspended(). Подробнее о том, как настроить приостановку приложений, рассказывается в статье setPackagesSuspended.
Блокировать приложения из неизвестных источников
Приложения, установленные не из Google Play или других надежных магазинов приложений, называются приложениями из неизвестных источников. Установка таких приложений может повысить риск для устройств и данных.
Чтобы запретить установку приложений из неизвестных источников, администраторы полностью управляемых устройств и рабочих профилей могут добавить ограничение для пользователей DISALLOW_INSTALL_UNKNOWN_SOURCES.
Ограничение для всего устройства с рабочим профилем
Если администратор рабочего профиля добавляет DISALLOW_INSTALL_UNKNOWN_SOURCES, ограничение применяется только к рабочему профилю. Однако администратор рабочего профиля может установить ограничение на уровне устройства, задав управляемую конфигурацию для Google Play. Ограничение на уровне устройства доступно в Android 8.0 и более поздних версиях, если установлено приложение Google Play версии 80812500 или выше.
Чтобы разрешить установку приложений только из Google Play, выполните следующие действия:
- Задайте пакет управляемой конфигурации для пакета Google Play
com.android.vending. - В пакете укажите логическое значение для ключа
verify_apps:device_wide_unknown_source_block. - Добавьте ограничение для пользователей
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. Ограничение аккаунта доступно в приложении Google Play версии 80970100 или более поздней.
Чтобы ограничить доступ к аккаунтам в Google Play, выполните следующие действия:
- Задайте пакет управляемой конфигурации для пакета Google Play
com.android.vending. - В пакете укажите адреса электронной почты, разделенные запятыми, в качестве строкового значения для ключа
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 могут активировать устройство, заблокированное функцией защиты после сброса настроек.
Защита после сброса настроек предназначена для предотвращения кражи устройств. Прежде чем разрешить кому-либо инициализировать устройство после несанкционированного сброса настроек (например, с помощью EMM), мастер настройки требует от пользователя пройти аутентификацию в любом аккаунте Google, который ранее был в личном профиле устройства.
В корпоративной среде сброс настроек – это важный инструмент для управления устройствами сотрудников, которые увольняются из организации. Однако если у организации нет учетных данных аккаунта сотрудника, защита после сброса настроек может помешать выдать устройство другому сотруднику.
Как управлять инициализацией после сброса настроек
В режиме владельца устройства контроллер политики устройств может использовать setFactoryResetProtectionPolicy(), чтобы определять, какие аккаунты могут настраивать устройство после сброса настроек. Если для этой конфигурации задано значение null или пустой список, то аккаунты, авторизованные для настройки устройства после сброса настроек, – это аккаунты в личном профиле устройства.
Контроллер политики устройств может настраивать эти аккаунты в течение всего срока службы полностью управляемого устройства.
- Администратор может использовать метод
people.getиз People API со специальным значениемme. Это позволяет получитьuserIdдля вошедшего в аккаунт.userIDвозвращается в ключеresourceNameв видеpeople/[userId]как целочисленная строка. Новые аккаунты могут быть недоступны для сброса настроек в течение 72 часов. - Вы также можете разрешить одному или нескольким системным администраторам разблокировать устройство после сброса настроек. Попросите каждого из этих администраторов войти в свой аккаунт Google, выполнить шаг 1 и поделиться с вами своим
userId, чтобы вы могли добавить этиuserIdsв список на следующем шаге. - Контроллер политики задает соответствующее ограничение для приложения, используя
setFactoryResetProtectionPolicy(), чтобы задать списокuserId, которые могут настраивать устройство после сброса настроек. - Контроллер политики устройств активирует аккаунты, которые могут настраивать устройства после сброса настроек, отправляя широковещательное сообщение
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);
Пакетная загрузка (Legacy)
Для устройств, на которых нельзя использовать setFactoryResetProtectionPolicy(), представленный в уровне API 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);
Пакетная загрузка (Legacy)
Для устройств, на которых нельзя использовать setFactoryResetProtectionPolicy(), представленный в API уровня 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.
При разработке и тестировании вы можете принудительно сделать доступными для контроллера политики устройств все существующие журналы безопасности, не дожидаясь, пока будет сформирован полный пакет. В Android 9.0 (уровень API 28) или более поздней версии выполните в терминале следующую команду Android Debug Bridge (adb):
adb shell dpm force-security-logs
Система ограничивает частоту использования инструмента и сообщает о любом намеренном замедлении в выводе терминала. Если журналы доступны, контроллер политики устройств получает обратный вызов onSecurityLogsAvailable().
Как удаленно запросить отчет об ошибке
Контроллер политики устройств, работающий в режиме владельца устройства, может удаленно запрашивать отчеты об ошибках для устройств с одним пользователем или аффилированными пользователями. В отчете об ошибке фиксируются действия на устройстве в момент запроса отчета, но также могут быть включены действия за последние несколько часов в зависимости от того, как часто обновляется буфер logcat.
Чтобы удаленно запросить отчеты об ошибках, контроллер политики устройств вызывает requestBugreport():
- Если пользователь разрешит отправить отчет об ошибке, контроллер политики устройств получит его с помощью метода
onBugreportShared(). - Если пользователь отклоняет запрос на отправку отчета об ошибке, контроллер политики получает сообщение об отклонении запроса на отправку с помощью
onBugreportSharingDeclined(). - Если отчет об ошибке не удается создать, контроллер политики устройств получает
onBugreportFailed()сBUGREPORT_FAILURE_FAILED_COMPLETINGилиBUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE.
Предоставление и отзыв доступа к сертификату клиента
Если контроллер политики устройств, работающий в режиме владельца профиля или устройства, предоставляет стороннему приложению возможность управлять сертификатами, приложение может самостоятельно предоставлять себе доступ к устанавливаемым сертификатам без вмешательства пользователя. Чтобы установить сертификат, доступный всем приложениям в профиле, используйте installKeyPair().
Информацию о том, какие параметры нужно настроить, можно найти в статье installKeyPair(). Эта функция работает в сочетании с существующим API для управления сертификатами.
Сценарий развертывания
Без метода installKeyPair():
- Пользователям нужно нажать на название сертификата и выбрать Разрешить каждый раз, когда они хотят предоставить доступ к сертификату.
- При установке сертификата пользователи увидят запрос, в котором нужно указать название сертификата.
При использовании метода installKeyPair():
- Пользователям не нужно нажимать Разрешить каждый раз, когда они хотят предоставить доступ к сертификату.
- Пользователи не могут переименовывать сертификаты.
- Администраторы могут блокировать сертификаты для приложений, у которых не должно быть доступа к определенным сертификатам.
Как удалить сертификат клиента
После предоставления доступа к сертификату клиента, чтобы удаленно удалить сертификаты клиента, установленные с помощью installKeyPair(), вызовите removeKeyPair().
Контроллер политики устройств, работающий в режиме владельца устройства или профиля, или делегированный установщик сертификатов может вызвать removeKeyPair(). Удаляет пару из сертификата и закрытого ключа, установленную под заданным псевдонимом закрытого ключа.
Сценарий развертывания
Используйте эту функцию, если организация переходит на более безопасную форму сертификата клиента. Если администратор развертывает новый сертификат и его распространение занимает много времени, он может отозвать устаревшие сертификаты после завершения переноса.
Безопасный сброс кода доступа
DPC может сбросить пароль пользователя, авторизовав изменение с помощью предварительно зарегистрированного защищенного токена. Владельцы устройств и профилей могут вызывать API безопасного сброса кода доступа, чтобы менять пароли устройств и рабочих профилей соответственно. Безопасный сброс кода доступа заменяет resetPassword() и предлагает следующие улучшения:
- Контроллер политики устройств может сбросить код доступа до того, как пользователь разблокирует устройство или профиль после перезагрузки на устройствах с шифрованием на уровне файлов.
- Android Keystore сохраняет ключи, прошедшие аутентификацию пользователя, после сброса кода доступа.
Если ваша сборка контроллера политики устройств предназначена для Android 8.0 (уровня API 26) или более поздней версии, используйте безопасный сброс кода доступа. Вызов resetPassword() вызывает SecurityException в контроллерах политики устройств, предназначенных для Android 8.0 или более поздней версии, поэтому вам может потребоваться обновить контроллер.
Как настроить и активировать токен
Прежде чем сбрасывать пароль, контроллер политики устройств должен задать и активировать токен. Поскольку контроллер политики устройств может не сразу использовать токен, вы задаете его до того, как он может понадобиться системному администратору.
Токен сброса пароля – это криптографически надежное случайное значение длиной не менее 32 байт. Создайте токен для каждого устройства и профиля. Не используйте токены повторно и не передавайте их другим пользователям.
Рекомендуем хранить токены или средства для расшифровки зашифрованного токена на сервере. Если вы храните токены локально в зашифрованном хранилище учетных данных, контроллер политики устройств не сможет сбросить пароль, пока пользователь не разблокирует устройство или профиль. Если вы храните токены локально в зашифрованном хранилище устройства, которое было взломано, злоумышленник может использовать токен, чтобы получить доступ к рабочему профилю или основному пользователю.
Вы можете сгенерировать новый токен в контроллере политики устройств или получить его с сервера. В примере ниже показано, как контроллер политик устройств генерирует токен и передает его на сервер.
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); }
В большинстве случаев после настройки токена контроллеру политики устройств нужно его активировать. Но если у пользователя нет пароля для заблокированного экрана, система сразу активирует токен. Чтобы активировать токен, попросите пользователя подтвердить свои учетные данные.
Контроллер политики устройств может вызвать метод KeyguardManager createConfirmDeviceCredentialIntent(), чтобы получить объект Intent, который запускает подтверждение. Объясните пользователю в интерфейсе, почему вы просите его пройти аутентификацию. В приведенном ниже фрагменте кода показано, как активировать токен в DPC.
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 хранит неактивированный токен в памяти и не сохраняет его после перезагрузки. Если пользователь перезагрузит устройство до активации токена, контроллер политики может установить тот же токен или сгенерировать новый.
Контроллер политик на устройствах может подтвердить, что токен активен, вызвав isResetPasswordTokenActive() и проверив, что результат – true.
После того как контроллер политики задаст и активирует токен, он будет действителен, пока контроллер не удалит или не заменит его (или пока на устройстве не будут сброшены настройки). Токен не зависит от пароля и не меняется, если пользователь меняет или удаляет пароль.
Как удалить токен
Чтобы удалить токен, ранее заданный контроллером политики, вызовите метод 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, работающий в режиме владельца профиля, может требовать от пользователей указывать запрос на подтверждение для приложений, работающих в рабочем профиле. Система будет запрашивать подтверждение при попытке открыть любое рабочее приложение. Если пользователь успешно проходит проверку, система разблокирует рабочий профиль и расшифровывает его, если это необходимо.
Как работает контрольная проверка в рабочем профиле
- Если контроллер политики устройств отправляет намерение
ACTION_SET_NEW_PASSWORD, система предлагает пользователю настроить проверку безопасности. - Контроллер также может отправить намерение
ACTION_SET_NEW_PARENT_PROFILE_PASSWORD, чтобы предложить пользователю настроить блокировку устройства.
Контроллер политики устройств может задавать для рабочего профиля правила паролей, отличные от правил для других паролей на устройстве. Например, минимальная длина ответа на запрос устройства может отличаться от длины, требуемой для других паролей. Контроллер политики устройств задает правила проверки с помощью стандартных методов DevicePolicyManager, таких как setPasswordQuality() и setPasswordMinimumLength().
Что нужно учесть
- Контроллер политики устройств может сбросить пароль рабочего профиля, но не может сбросить пароль устройства (личного профиля). Если пользователь установит одинаковые пароли для рабочего и личного профилей, то при выполнении команды
resetPassword()в рабочем профиле пароль будет сброшен только в нем и перестанет совпадать с паролем для заблокированного экрана устройства. - Контроллер политики устройств может настраивать экран ввода учетных данных для рабочего профиля с помощью методов
setOrganizationColor()иsetOrganizationName(). - Администраторы устройств не могут использовать
resetPassword(), чтобы удалять пароли или менять уже заданные. Администраторы устройств по-прежнему могут задавать пароль, но только если на устройстве не установлен пароль, PIN-код или графический ключ.
Дополнительную информацию можно найти в getParentProfileInstance() и справочной документации по DevicePolicyManager.