Android Work Profile: как безопасно поделить свой смартфон между домом и работой
Для тех, кто работает удаленно, провести грань между решаемыми задачами и свободным временем может быть непросто. Но я сейчас буду говорить не про work-life balance, а про Android Work Profile — технологию для управления корпоративными устройствами, которая создает разграничение персонального и рабочего пространства в них.
Установка и настройка рабочего профиля позволяет организациям контролировать работу девайса в рамках рабочего сектора и получать доступ к данным в нем, сохраняя при этом персональную информацию пользователей отдельно и в безопасности.
Сотрудники же имеют возможность включать и выключать рабочий профиль на своих устройствах в любое время. Когда рабочий профиль выключен, все приложения в нем «отключены» — это означает, что они не используют мобильные данные и не показывают уведомления пользователю. Между тем личный профиль можно использовать в обычном режиме, а уведомления, связанные с работой, останутся в silent-режиме. Удобно? Очень, особенно если устройство — ваше личное, а не корпоративное (BYOD). Об этом и поговорим.
Итак, рабочий профиль — это функция в Android, обеспечивающая безопасность и конфиденциальность путем разделения мобильного устройства на два сектора: личный и корпоративный. Эта технология является частью платформы Android Enterprise — инициативы Google, которая помогает компаниям использовать устройства и приложения Android на рабочем месте. Программа предлагает разработчикам API и другие инструменты для интеграции поддержки Android в платформы MDM.
Подготовка устройства к установке рабочего профиля
Подготовить устройство для создания рабочего профиля можно двумя способами:
С помощью DPC.
Контроллер политики устройств (DPC) — это приложение, созданное решением EMM (Enterprise Mobility Management), которое образует мост между сервером EMM и управляемым устройством Android. Сервер EMM отправляет инструкции DPC-приложению, которые DPC затем реализует на устройстве. По завершении создания рабочего профиля DPC становится владельцем профиля (profile owner).
Чтобы начать создание рабочего профиля с помощью DPC, пользователь должен загрузить приложение, предоставленное решением EMM, на целевое устройство, впоследствии оно само начнет создание рабочего профиля, когда получит команду о необходимости сделать это.Если организация использует Google Workspace или Cloud Identity, пользователь может ввести свои корпоративные учетные данные, чтобы настроить рабочий профиль или полностью управляемое устройство.
Мы же подробнее рассмотрим первый способ, так как именно им департамент мобильной разработки «Лаборатории Касперского» руководствовался при создании приложения Kaspersky Endpoint Security.
Создание рабочего профиля
Первое, с чем встретится пользователь, — визард создания рабочего профиля. На этом этапе нужно ознакомиться с информацией, отображающейся на экранах, и запустить раскатку профиля нажатием на кнопку «Принять».
Что в этот момент происходит внутри DPC-приложения? Краткий ответ: запускается intent с действием ACTION_PROVISION_MANAGED_PROFILE, в который в качестве дополнительного параметра передается полное имя класса, наследующего DeviceAdminReceiver. Но давайте рассмотрим по шагам, как научиться создавать рабочий профиль из своего DPC-приложения:
Чтобы создать рабочий профиль на устройстве, на котором уже есть личный профиль, необходимо сначала проверить, используя флаг FEATURE_MANAGED_USERS и метод DevicePolicyManager.isProvisioningAllowed (), сможем ли мы вообще начать подготовку устройства к раскатке рабочего профиля:
val packageManager: PackageManager = context.getPackageManager() val devicePolicyManager: DevicePolicyManager = context.getSystemService(Context.DEVICE_POLICY_SERVICE) if (packageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS) && devicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_PROFILE)) { // Можно начинать подготовку устройства к созданию рабочего профиля }
Далее создаем и отправляем intent ACTION_PROVISION_MANAGED_PROFILE с указанием полного имени класса, наследующего DeviceAdminReceiver, в качестве дополнительного параметра:
val provisioningActivity = getActivity() val myDPCPackageName = "com.example.myDPCApp" // Создаем intent val provisioningIntent = Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE) val adminComponent = ComponentName(provisioningActivity.applicationContext, MyAdminReceiver::class.java) provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString()) if (provisioningIntent.resolveActivity(provisioningActivity.packageManager) == null) { // Нет обработчика для данного вида intent'ов } else { // REQUEST_PROVISION_MANAGED_PROFILE - уникальный код запроса startActivityForResult(provisioningIntent, REQUEST_PROVISION_MANAGED_PROFILE) }
Система будет обрабатывать созданный нами intent, выполняя следующие действия:
- Проверку, что устройство зашифровано. Если это не так, система предложит пользователю зашифровать устройство, прежде чем продолжить.
- Создание рабочего профиля.
- Удаление ненужных приложений из рабочего профиля.
- Копирование приложения DPC в рабочий профиль и назначение его владельцем профиля (profile owner).
Мы можем отследить статус подготовки устройства к началу использования рабочего профиля, переопределив метод onActivityResult ():override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { // Убедимся, что проверяем статус обработки intent’а именно по созданию рабочего профиля if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) { if (resultCode == Activity.RESULT_OK) { // Рабочий профиль подготовлен } else { // Подготовка рабочего профиля окончилась неуспехом } return } }
После подготовки профиля система вызывает метод DeviceAdminReceiver.onProfileProvisioningComplete () DPC-приложения. Мы можем переопределить его в нашем наследнике DeviceAdminReceiver, чтобы завершить настройку рабочего профиля и активировать его с помощью метода DevicePolicyManager.setProfileEnabled ():
class DemoComponent : DeviceAdminReceiver() { override fun onProfileProvisioningComplete(context: Context, intent: Intent) { super.onProfileProvisioningComplete(context, intent) val componentName = ComponentName(context, DemoComponent::class.java) val devicePolicyManager = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager with(devicePolicyManager) { setProfileName(componentName, "Demo work profile") setProfileEnabled(componentName) } } }
Начиная с версии Android 8.0, после завершения подготовки вместе с вызовом метода onProfileProvisioningComplete () в то же приложение будет отправлен intent DevicePolicyManager#ACTION_PROVISIONING_SUCCESSFUL.
Как рабочий профиль отображается на устройствах
Расположение установленного рабочего профиля зависит от производителя устройства и версии Android. Например, он может отображаться на панели приложений в виде отдельной вкладки «Работа»:
На некоторых устройствах рабочие приложения размещаются в специальной рабочей папке на начальном экране. Эта папка создается автоматически при настройке.
Вы можете приостановить рабочий профиль, чтобы не получать уведомления от рабочих приложений. Приостановка фактически отключает рабочий профиль, деактивируя рабочие приложения и уведомления.
Расположение параметра приостановки зависит от производителя устройства и версии Android (требуется Android 7 или более поздней версии). Обычно его можно найти в быстрых параметрах, в приложении «Настройки» или на панели приложений.
Технические детали
Связь с основным профилем
Важно понимать, что функционал, предоставляемый Android вместе с рабочими профилями, в первую очередь направлен на защиту конфиденциальных данных компании.
Приложения, управляемые рабочим профилем, хранятся в безопасном «контейнере». В целом контейнеризация — это форма разделения приложений, обеспечивающая их запуск в отдельных контейнерах на одном устройстве и с использованием одной и той же ОС. Контейнеризация работает путем виртуализации всех компонентов приложения в один контейнер, где оно работает как изолированный объект в общей ОС. Контейнеризация во многом помогает предприятиям оптимизировать и защитить управление BYOD. Это позволяет ИТ-администраторам отделять рабочие приложения сотрудников от личных приложений на персональных устройствах. Эти контейнерные данные также могут быть отдельно зашифрованы или защищены паролем для дополнительной безопасности. Контейнеризация помогает сотрудникам изменить свой взгляд на управление BYOD, поскольку любая корпоративная политика, распространяемая их предприятием, применяется конкретно к рабочему профилю и не мешает работе их устройств или их личных данных.
Поддержка ограничений
Работа ограничений, поддерживаемых в режиме рабочего профиля, обеспечивается с помощью уже знакомого нам класса DevicePolicyManager, который подробнее обозревала моя коллега Светлана Палицына в статье про Kiosk mode.
Для выставления ограничений будем использовать метод DevicePolicyManager.addUserRestriction (ComponentName admin, String key). В метод мы передаем все то же полное имя наследника DeviceAdminReceiver, а также ограничение, которое хотим применить. В случае если переданное имя не будет принадлежать владельцу профиля, будет выброшено исключение безопасности (SecurityException).
Давайте подробнее рассмотрим, какие ограничения мы можем применить:
Полный список ограничений доступен в официальной документации.
Мы также можем удалить установленное ограничение, используя метод DevicePolicyManager.clearUserRestriction (ComponentName admin, String key).
Некоторые публичные методы класса DevicePolicyManager менее универсальны и направлены на установку конкретных режимов работы устройства в режиме profile owner:
Настройки пароля для рабочего профиля
Еще одной функцией, предоставляющей возможность управления безопасностью данных на корпоративном устройстве, является создание пароля для приложений, установленных в рабочем профиле. При этом, если текущая блокировка экрана в личном профиле соответствует требованиям к блокировке рабочего профиля, можно использовать один и тот же пароль для обоих. Таким образом, вы сможете открывать свои рабочие приложения без необходимости вводить другой пароль.
Чтобы направить пользователя в настройки для задания пароля рабочего профиля, необходимо запустить activity с intent«ом ACTION_SET_NEW_PASSWORD:
var intent = Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD)
startActivity(intent)
На устройствах с Android 9.0+ также есть возможность задать требование на использование двух разных паролей: один — для экрана блокировки, другой — для рабочего профиля.
Начиная с Android 3.0, класс DevicePolicyManager включает методы, позволяющие настроить содержимое пароля. Например, вы можете установить политику, согласно которой пароли должны содержать как минимум N заглавных букв. Список методов, регулирующих требуемое содержание пароля:
Для более новых версий Android (12.0+) можно использовать метод setRequiredPasswordComplexity (), определяющий требования к минимальной сложности пароля. Уровень сложности является одним из предопределенных.
Существует еще несколько способов задать ограничения к паролю для рабочего профиля:
Блокировка рабочего профиля
Иногда происходят ситуации, когда просто запросить установку пароля у пользователя недостаточно или безопасность корпоративных данных ставится под угрозу, в таких случаях мы можем воспользоваться методом [DevicePolicyManager.lockNow ()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#lockNow ()) и немедленно заблокировать рабочий профиль. Позднее выполнить разблокировку можно с помощью PIN-кода, графического ключа или пароля, назначенного администратором.
Мы также можем установить максимальный период бездействия пользователя, допустимый до блокировки. Например:
val devicePolicyManager = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as
DevicePolicyManager
val componentName = ComponentName(context, DemoComponent::class.java)
...
val timeMs = 1000L*timeout
devicePolicyManager.setMaximumTimeToLock(mDeviceAdminSample, timeMs)
Заключение
Мы смогли поближе познакомиться с одним из важных механизмов для управления девайсами в режимах BYOD и COPE — Android Work Profile. Надеюсь, эта статья станет полезна тем, кто не так давно знаком с MDM-решениями, а также ответственно относится к безопасности корпоративных и пользовательских данных. Я буду рада ответить на любые ваши вопросы, оставленные в комментариях.
Также, если вам в целом интересна тема Mobile Device Management, рекомендую ознакомиться со статьей моей коллеги по мобильной команде «Лаборатории Касперского» Марии Глущенко, где Маша подробно описала разные режимы управления мобильными устройствами, в том числе упомянутые ранее BYOD и COPE.