Для тех, кто работает удаленно, провести грань между решаемыми задачами и свободным временем может быть непросто. Но я сейчас буду говорить не про work-life balance, а про Android Work Profile — технологию для управления корпоративными устройствами, которая создает разграничение персонального и рабочего пространства в них.



Установка и настройка рабочего профиля позволяет организациям контролировать работу девайса в рамках рабочего сектора и получать доступ к данным в нем, сохраняя при этом персональную информацию пользователей отдельно и в безопасности.


Сотрудники же имеют возможность включать и выключать рабочий профиль на своих устройствах в любое время. Когда рабочий профиль выключен, все приложения в нем «отключены» — это означает, что они не используют мобильные данные и не показывают уведомления пользователю. Между тем личный профиль можно использовать в обычном режиме, а уведомления, связанные с работой, останутся в silent-режиме. Удобно? Очень, особенно если устройство — ваше личное, а не корпоративное (BYOD). Об этом и поговорим.


Итак, рабочий профиль — это функция в Android, обеспечивающая безопасность и конфиденциальность путем разделения мобильного устройства на два сектора: личный и корпоративный. Эта технология является частью платформы Android Enterprise — инициативы Google, которая помогает компаниям использовать устройства и приложения Android на рабочем месте. Программа предлагает разработчикам API и другие инструменты для интеграции поддержки Android в платформы MDM.


Подготовка устройства к установке рабочего профиля


Подготовить устройство для создания рабочего профиля можно двумя способами:


  1. С помощью DPC.
    Контроллер политики устройств (DPC) — это приложение, созданное решением EMM (Enterprise Mobility Management), которое образует мост между сервером EMM и управляемым устройством Android. Сервер EMM отправляет инструкции DPC-приложению, которые DPC затем реализует на устройстве. По завершении создания рабочего профиля DPC становится владельцем профиля (profile owner).
    Чтобы начать создание рабочего профиля с помощью DPC, пользователь должен загрузить приложение, предоставленное решением EMM, на целевое устройство, впоследствии оно само начнет создание рабочего профиля, когда получит команду о необходимости сделать это.


  2. Если организация использует Google Workspace или Cloud Identity, пользователь может ввести свои корпоративные учетные данные, чтобы настроить рабочий профиль или полностью управляемое устройство.



Мы же подробнее рассмотрим первый способ, так как именно им департамент мобильной разработки «Лаборатории Касперского» руководствовался при создании приложения Kaspersky Endpoint Security.


Создание рабочего профиля


Первое, с чем встретится пользователь, — визард создания рабочего профиля. На этом этапе нужно ознакомиться с информацией, отображающейся на экранах, и запустить раскатку профиля нажатием на кнопку «Принять».



Что в этот момент происходит внутри DPC-приложения? Краткий ответ: запускается intent с действием ACTION_PROVISION_MANAGED_PROFILE, в который в качестве дополнительного параметра передается полное имя класса, наследующего DeviceAdminReceiver. Но давайте рассмотрим по шагам, как научиться создавать рабочий профиль из своего DPC-приложения:


  1. Чтобы создать рабочий профиль на устройстве, на котором уже есть личный профиль, необходимо сначала проверить, используя флаг 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)) {
    // Можно начинать подготовку устройства к созданию рабочего профиля
    }

  2. Далее создаем и отправляем 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)
    }

  3. Система будет обрабатывать созданный нами 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
      }
      }

  4. После подготовки профиля система вызывает метод 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).


Давайте подробнее рассмотрим, какие ограничения мы можем применить:


Название Описание Версия Android
DISALLOW_MODIFY_ACCOUNTS Определяет, доступно ли пользователю самостоятельное добавление и удаление аккаунтов в системном хранилище в рабочем профиле. 5.0+
DISALLOW_SHARE_INTO_MANAGED_PROFILE Определяет, может ли пользователь делиться файлом/изображением/данными основного пользователя с управляемым профилем. 9.0+
DISALLOW_CONTENT_CAPTURE Определяет, разрешен ли захват содержимого экрана пользователя. 10.0+
DISALLOW_CROSS_PROFILE_COPY_PASTE Определяет, можно ли экспортировать содержимое буфера обмена путем вставки данных. Это ограничение не препятствует импорту данных. 5.0+
DISALLOW_DEBUGGING_FEATURES Определяет, запрещено ли пользователю включать функции отладки или получать доступ к ним. 5.0+
DISALLOW_INSTALL_APPS Определяет, запрещено ли пользователю устанавливать приложения в рабочий профиль. 4.3+
DISALLOW_INSTALL_UNKNOWN_SOURCES Определяет, запрещено ли пользователю включать параметр «Неизвестные источники», который разрешает установку приложений в рабочий профиль из неизвестных источников. Неизвестные источники исключают adb и доверенные магазины приложений. 4.3+
DISALLOW_UNINSTALL_APPS Определяет, запрещено ли пользователю удалять приложения из рабочего профиля. 4.3+
DISALLOW_CONFIG_VPN Определяет, запрещено ли пользователю настраивать VPN. 5.0+

Полный список ограничений доступен в официальной документации.


Мы также можем удалить установленное ограничение, используя метод DevicePolicyManager.clearUserRestriction(ComponentName admin, String key).


Некоторые публичные методы класса DevicePolicyManager менее универсальны и направлены на установку конкретных режимов работы устройства в режиме profile owner:


Название Описание Версия API
setCrossProfileCallerIdDisabled Определяет, разрешена ли передача информации об идентификаторе контакта из рабочего профиля в личный для входящих вызовов. 5.0+
setScreenCaptureDisabled Система должна запрещать: запись экрана с приложениями рабочего профиля, создание скриншотов экранов приложений рабочего профиля, отображение экранов приложений рабочего профиля на незащищенных дисплеях. 5.0+
addCrossProfileIntentFilter Настройка доступа к файлам из личного профиля приложениям из рабочего профиля. 5.0+
setKeyguardDisabledFeatures Определяет, отображается ли содержимое нотификаций от приложений рабочего профиля, когда устройство или профиль заблокированы. 6.0+
setPermissionPolicy Определяет политику выдачи разрешений для всех приложений в рабочем профиле. 6.0+
setCameraDisabled Определяет, могут ли приложения из рабочего профиля иметь доступ к камере устройства. 5.0+
addCrossProfileWidgetProvider Определяет, разрешено ли пользователю добавлять на рабочий стол устройства виджеты от приложений из рабочего профиля. 5.0+

Настройки пароля для рабочего профиля


Еще одной функцией, предоставляющей возможность управления безопасностью данных на корпоративном устройстве, является создание пароля для приложений, установленных в рабочем профиле. При этом, если текущая блокировка экрана в личном профиле соответствует требованиям к блокировке рабочего профиля, можно использовать один и тот же пароль для обоих. Таким образом, вы сможете открывать свои рабочие приложения без необходимости вводить другой пароль.


Чтобы направить пользователя в настройки для задания пароля рабочего профиля, необходимо запустить 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(), определяющий требования к минимальной сложности пароля. Уровень сложности является одним из предопределенных.


Существует еще несколько способов задать ограничения к паролю для рабочего профиля:


Название Описание Версия API
setMaximumFailedPasswordsForWipe Максимальное количество неудачных попыток до полной очистки профиля. 2.2+
setPasswordExpirationTimeout Установка максимального срока действия пароля (в днях). 3.0+
setPasswordHistoryLength Установка длины истории паролей. После установки этого параметра пользователь не сможет ввести новый пароль, совпадающий с любым паролем в истории. 5.0+

Блокировка рабочего профиля


Иногда происходят ситуации, когда просто запросить установку пароля у пользователя недостаточно или безопасность корпоративных данных ставится под угрозу, в таких случаях мы можем воспользоваться методом [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.

Комментарии (3)


  1. Komrus
    28.11.2023 08:42
    +3

    > Подготовить устройство для создания рабочего профиля можно двумя способами

    А про програмку Shelter почему ничего не написали?
    Которая позволяет пользователю самостоятельно создать у себя на Андроид смартфоне два профиля и раскидать приложения между ними...

    PS. Берётся с F-Droid'а...


    1. UnknownErrror
      28.11.2023 08:42

      1. Тут речь именно про корпоративное управление, Shelter'ом управляет не корпорация, а сам пользователь

      2. Shelter и есть этот самый DPC, просто управляемый локально, а не удалённо


  1. Lexicon
    28.11.2023 08:42
    +5

    Сама мысль, что работодатель чем-то может управлять на личном устройстве, - бее. Рабочее устройство и делайте с ним что хотите

    Сейчас вовсе пошли в ход электронные документы, которые потом нигде не найдёшь