- Планшет и домен: единство и борьба противоположностей
- В чем основная проблема?
- В чем основная идея?
- Как это выглядит?
- Дополнительные соображения безопасности
- Краткое руководство. Вход пользователей и вызов API Microsoft Graph из приложения Android
- Предварительные требования
- Шаг 1. Настройка приложения на портале Azure
- Шаг 2. Скачивание проекта
- Шаг 3. Приложение настроено и готово к запуску
- Шаг 1. Получение примера приложения
- Шаг 2. Запуск примера приложения
- Как работает этот пример
- Добавление MSAL в приложение
- Операции импорта MSAL
- SingleAccountModeFragment.java
- Инициализация MSAL одной учетной записи
- Вход пользователя
- Выход пользователя
- Получение токена в интерактивном режиме или автоматически
- Загрузка учетной записи
- Вызов Microsoft Graph
- auth_config_single_account.json
- MultipleAccountModeFragment.java
- Инициализация MSAL нескольких учетных записей
- Загрузка учетной записи
- Получение токена в интерактивном режиме или автоматически
- Удаление учетной записи
- auth_config_multiple_account.json
- Справка и поддержка
- Дальнейшие действия
Планшет и домен: единство и борьба противоположностей
Давайте представим себе довольно распространенный на сегодняшний день сценарий. В корпоративной сети развернуто некоторое количество бизнес-приложений. Эти приложения опубликованы для доступа снаружи по HTTPS. Мобильные сотрудники компании, находясь за пределами корпоративной сети, хотят подключаться к этим приложениям со своих личных планшетов, работающих под Windows, iOS или Android. Эти устройства либо невозможно включить в домен, либо пользователи просто не будут этого делать. Как повысить безопасность доступа с таких устройств к корпоративным приложениям? Помочь может служба регистрации устройств (Device Registration Service, DRS) в Windows Server 2012 R2.
В этой статье я сосредоточусь на основных принципах и архитектуре DRS. Детали настройки можно посмотреть в четвертом модуле курса «Корпоративные устройства. Как управлять гибридными учетными данными».
В чем основная проблема?
Внутри корпоративной сети есть веб-приложение с доступом по HTTPS, опубликованное для подключения снаружи. С любой платформы из любого браузера подключились, весь трафик между браузером и приложением шифруется, чего еще желать. Но при всех очевидных преимуществах современных мобильных устройств, планшетов в частности, есть и обратная сторона. То, что везде удобно носить с собой, легко может быть потеряно или украдено. Любой новый «владелец» устройства любопытства ради или же по злому умыслу может попытаться «поизучать» URLs в history браузера. И при сохраненных cookies, которые наверняка используются на личных устройствах, получить доступ в том числе к приложениям организации не составит труда.
В доменной сети средствами групповых политик подобных ситуаций легко избежать. Начиная с пароля для логина на доменное устройство, заканчивая сертификатами для аутентификации при доступе к приложению. Как быть с устройствами, которые в домен включить невозможно? Подходы могут быть разными: можно настроить обязательное использование пароля или PIN-кода для входа на устройство, можно сгенерировать и установить сертификат на планшет. Только для разных платформ эти процедуры отличаются, делать это придется вручную и наверняка ИТ-персоналу, и каждое новое устройство порождает соответствующую цепочку действий. А хочется, чтобы с такой задачей мог справиться владелец устройства, причем тогда, когда в этом действительно возникнет необходимость.
Одно из решений – использование DRS из состава Windows Server 2012 R2.
В чем основная идея?
Как следует из названия службы, DRS реализует процедуру регистрации устройства. В процессе регистрации DRS генерирует X.509-сертификат, который загружается на устройство, а также создает в Active Directory новый объект, содержащий информацию как об устройстве, так и пользователе, выполнившем регистрацию.
Каждый раз, когда пользователь подключается с зарегистрированного устройства к приложению, выполняется аутентификация пользователя (либо он вводит пароль, либо используется cookie) и осуществляется проверка сертификата. И только если обе проверки успешно пройдены, пользователь получает доступ к приложению. По сути мы имеем дело с двухфакторной аутентификацией.
Но важно отметить несколько моментов:
- Процедура регистрации максимально проста и не требует предварительной настройки устройства ИТ-специалистом.
- DRS поддерживает различные платформы:
- Windows 8.1 и выше
- iOS 6 и выше
- Android – Samsung KNOX
- Windows 7 Pro (включенная в домен)
- DRS не требует развертывания PKI
Как это выглядит?
В Windows Server 2012 R2 служба DRS устанавливается вместе с ADFS. ADFS, как видно из рисунков выше, играет ключевую роль в процессе аутентификации. Чтобы воспользоваться сервисом регистрации для приложения необходимо настроить аутентификацию через ADFS. Поскольку по соображениям безопасности сервер с ADFS как правило располагают внутри корпоративной сети, в зоне периметра нужна проксирующая компонента, которая будет принимать запросы из Интернет и перенаправлять их ADFS. Роль прокси может выполнять Web Application Proxy (WAP) – новая служба Windows Server 2012 R2. ADFS, в свою очередь, выполняет аутентификацию пользователя и, если настроена регистрация устройств, проверку сертификата. В случае успешной аутентификации ADFS формирует маркер (token) доступа для запрашиваемого приложения и возвращает маркер браузеру на пользовательском устройстве. После чего пользователь получает доступ к приложению.
Если говорить о требованиях к инфраструктуре, то для использования DRS необходимо расширить схему AD и иметь как минимум один сервер с Windows Server 2012 R2 и поднятой ролью ADFS.
Процесс регистрации устройства изображен на следующем рисунке.
Давайте посмотрим, как выглядит этот процесс с точки зрения владельца планшета с Windows 8.1, и что при этом происходит за кадром. В роли корпоративного приложения будет выступать SharePoint 2013. В моей инфраструктуре ADFS настроена таким образом, что регистрация устройств требуется, только если устройство находится за пределами корпоративной сети. Если же планшет подключен, например, к корпоративному Wi-Fi, то достаточно аутентификации по логину и паролю пользователя. И, конечно же, от пользователя вообще ничего не требуется, если он обращается к приложению с доменного компьютера в корпоративной сети. Имеет место полноценный Single Sign-On. Возможность настройки подобных условий доступа (conditional access), причем для конкретного приложения – еще одно серьезное преимущество использования ADFS для рассматриваемого сценария. Как задаются политики conditional access, можно посмотреть в упомянутом четвертом модуле курса «Корпоративные устройства. Как управлять гибридными учетными данными».
Итак, сотрудник компании находится за пределами компании и в браузере планшета, не включенного в домен, набирает URL корпоративного портала SharePoint. Запрос через WAP перенаправляется ADFS, и мы видим такую картину.
Как видно, элементы страницы аутентификации ADFS, равно как и страниц сообщений об ошибках (картинка, логотип, тексты сообщений), настраиваются. Пользователь указывает логин и пароль своей доменной учетной записи, причем логин вводится в формате User Principal Name (UPN). Так как устройство пока не зарегистрировано, в доступе отказано.
В тексте сообщения об ошибке я указал действия, которые необходимо совершить пользователю для регистрации планшета. Эти действия отличаются для разных платформ. Так для iOS надо просто пройти по URL: https:// /enrollmentserver/otaprofile. Для Windows 8.1 регистрация предусмотрена в интерфейсе ОС: PC Settings->Network->Workplace. И называется Workplace join.
Нажав на кнопку Join, увидим уже знакомое окно аутентификации ADFS.
Каким образом Windows 8.1 обнаруживает ADFS? Из введенного пользователем UPN берется суффикс, в данном случае, contosomsspb.com, к нему пристыковывает предопределенное имя, enterpriseregistration и получается FQDN, enterpriseregistration.contosomsspb.com, которое ОС пытается разрешить в IP. Соответственною, чтобы такой механизм обнаружения DRS работал, необходимо зарегистрировать в публичном DNS-домене организации A record с именем enterpriseregistration и IP-адресом пороксирующей компоненты, например, сервера WAP.
Если пароль введен верно, то выполняется регистрация устройства, и мы возвращаемся в предыдущее окно, где можно заметить, что операция Workplace join завершена.
Что же происходит за кадром? На самом планшете с помощью оснастки Certificates можно обнаружить появление нового сертификата.
Именно он и будет теперь использоваться в качестве второго фактора аутентификации при подключении к приложению.
В Active Directory соответствующий сертификату объект можно найти в новом контейнере RegisteredDevices. Имя объекта совпадает с CN сертификата. Атрибуты этого объекта можно посмотреть, например, с помощью ADSI Edit.
Среди атрибутов мы найдем имя устройства, тип и версию ОС, SID пользователя, выполнившего регистрацию, дату и время регистрации и др.
Пробуем снова подключиться к порталу, снова попадаем на страницу ADFS, снова вводим credentials учетной записи AD. Но теперь помимо проверки пароля успешно завершается и проверка сертификата, и доступ к приложению получен.
Более того, после первого успешного подключения пользователь получает SSO для этого приложения. Он может закрыть браузер, перезагрузить машину, открыть браузер снова, набрать URL и… получить доступ к приложению безо всяких дополнительных вопросов. Действительно, cookies обеспечивают первый фактор аутентификации, сертификат – второй. Естественно, не навечно, и периодически пользователю придется подтверждать свою аутентичность вводом пароля. Но это срок контролирует ИТ.
Дополнительные соображения безопасности
Давайте вернемся к ситуации с утерей/кражей планшета. Если устройство уже зарегистрировано, для приложения реализован SSO, и устройство попало в чужие руки. Первая линия защиты – пароль или PIN-код для входа в устройство. Для недоменных устройств обязательную блокировку можно включить, например, через Microsoft Intune или другое MDM-решение. Если этого не было сделано? Получается, мы дали злоумышленнику дополнительные козыри – ему остается просто открыть браузер и набрать URL. Очевидно, в такой ситуации владелец должен как можно быстрее оповестить свою службу ИТ. Что тогда предпримет ИТ? Посмотрим на несколько вариантов.
Если сервис регистрации устройств вообще не используется.
- Можно запретить доступ учетной записи пользователя к опубликованным приложениям. Но что, если он в длительной поездке, и ему нужен доступ к приложению с другого устройства (основного ноутбука, второго планшета и пр.)?
- Можно сбросить пользователю пароль. Но не всегда очевидно, как это отразится на доступе к другим сервисам.
Оба решения, а также другие варианты, которые можно предложить, вполне применимы, но не идеальны.
Если устройство было зарегистрировано.
Администратору достаточно найти в AD объект, ассоциированный с утерянным устройством и либо удалить объект, либо в его свойствах для атрибута msDS-IsEnabled задать значение FALSE.
Тогда при подключении к приложению сертификат устройства не пройдет проверку, и пользователь получит сообщение об ошибке. Таким образом, мы блокируем доступ конкретному устройству.
Ну а если пароль пользователя скомпрометирован и стал известен злоумышленнику? Ничто не помешает ему выполнить повторную регистрацию. Один из вариантов противодействия такому сценарию – использование сервиса многофакторной аутентификации (MFA) Microsoft Azure для регистрации устройства. В этом случае при регистрации устройства пользователю кроме ввода пароля необходимо будет пройти дополнительную проверку – ответить на входящий звонок на его мобильный телефон, либо ввести полученный по SMS код, либо использовать специальное приложение (Multi-Fator Auth), которое опять же есть в online store Microsoft, Google и Apple.
Но это уже тема отдельного разговора.
Итак, сервис регистрации устройств, появившийся в Windows Server 2012 R2, поможет обеспечить дополнительный уровень безопасности при удаленном подключении к корпоративным приложениям с личных мобильных устройств, не включенных в домен AD и работающих под управлением различных ОС.
Источник
Краткое руководство. Вход пользователей и вызов API Microsoft Graph из приложения Android
Из этого краткого руководства вы узнаете, как скачать и выполнить пример кода. В примере кода показано, как в приложении Android реализовать вход пользователей и получение маркера доступа для вызова API Microsoft Graph.
Чтобы приложение получало маркеры от платформы удостоверений Майкрософт, оно должно быть представлено объектом приложения в Azure Active Directory.
Предварительные требования
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно.
- Android Studio
- Android 16+
Шаг 1. Настройка приложения на портале Azure
Для работы примера кода в этом кратком руководстве необходимо добавить URI перенаправления, совместимый с брокером авторизации.
. Ваше приложение настроено с помощью этих атрибутов
Шаг 2. Скачивание проекта
Выполните проект с помощью Android Studio.
Шаг 3. Приложение настроено и готово к запуску
Мы уже настроили для проекта нужные значения свойств приложения, и его можно запускать. Пример приложения запускается на экране Single Account Mode (Режим единой учетной записи). Область по умолчанию, user.read, предоставляется по умолчанию и используется при чтении данных собственного профиля во время вызова API Microsoft Graph. URL-адрес для вызова Microsoft Graph API предоставляется по умолчанию. При необходимости их можно изменить.
Используйте меню приложения для переключения между режимами одной и нескольких учетных записей.
В режиме одной учетной записи войдите с помощью рабочей или домашней учетной записи:
- Выберите Get graph data interactively (Получить данные графов в интерактивном режиме), чтобы запросить у пользователя учетные данные. Вы увидите выходные данные вызова API Microsoft Graph в нижней части экрана.
- После входа в систему выберите Get graph data silently (Получить данные графов без уведомления), чтобы вызвать Microsoft Graph API, не запрашивая у пользователя учетные данные снова. Вы увидите выходные данные вызова API Microsoft Graph в нижней части экрана.
В режиме нескольких учетных записей можно повторить те же действия. Кроме того, можно удалить учетную запись для входа. При этом кэшированные токены для этой учетной записи также удаляются.
Шаг 1. Получение примера приложения
Шаг 2. Запуск примера приложения
Выберите эмулятор или физическое устройство из раскрывающегося списка доступных устройств Android Studio и запустите приложение.
Пример приложения запускается на экране Single Account Mode (Режим единой учетной записи). Область по умолчанию, user.read, предоставляется по умолчанию и используется при чтении данных собственного профиля во время вызова API Microsoft Graph. URL-адрес для вызова Microsoft Graph API предоставляется по умолчанию. При необходимости их можно изменить.
Используйте меню приложения для переключения между режимами одной и нескольких учетных записей.
В режиме одной учетной записи войдите с помощью рабочей или домашней учетной записи:
- Выберите Get graph data interactively (Получить данные графов в интерактивном режиме), чтобы запросить у пользователя учетные данные. Вы увидите выходные данные вызова API Microsoft Graph в нижней части экрана.
- После входа в систему выберите Get graph data silently (Получить данные графов без уведомления), чтобы вызвать Microsoft Graph API, не запрашивая у пользователя учетные данные снова. Вы увидите выходные данные вызова API Microsoft Graph в нижней части экрана.
В режиме нескольких учетных записей можно повторить те же действия. Кроме того, можно удалить учетную запись для входа. При этом кэшированные токены для этой учетной записи также удаляются.
Как работает этот пример
Код разделен на фрагменты, демонстрирующие, как записывать приложение MSAL для одной и нескольких учетных записей. Файлы кода организованы следующим образом:
Файл | Что демонстрирует |
---|---|
MainActivity | Управляет пользовательским интерфейсом |
MSGraphRequestWrapper | Вызывает API Microsoft Graph, используя токен, предоставленный MSAL |
MultipleAccountModeFragment | Инициализирует приложение с несколькими учетными записями, загружает учетную запись пользователя и получает токен для вызова API Microsoft Graph |
SingleAccountModeFragment | Инициализирует приложение с одной учетной записью, загружает учетную запись пользователя и получает токен для вызова API Microsoft Graph |
res/auth_config_multiple_account.json | Файл конфигурации нескольких учетных записей |
res/auth_config_single_account.json | Файл конфигурации одной учетной записи |
Скрипты Gradle/build.grade (модуль: app) | Здесь добавляются зависимости библиотеки MSAL |
Теперь мы рассмотрим эти файлы подробнее и вызовем код, относящийся к MSAL, в каждом из них
Добавление MSAL в приложение
MSAL (com.microsoft.identity.client) — это библиотека, используемая для выполнения входа пользователей и запросов маркеров, которые нужны для доступа к API, защищенному платформой удостоверений Майкрософт. Gradle 3.0+ устанавливает библиотеку при добавлении в файл Скрипты Gradle > build.gradle (модуль: app) в разделе Зависимости следующего фрагмента кода:
Он указывает Gradle загрузить и создать MSAL из Maven Central.
Также необходимо добавить ссылки на Maven в раздел allprojects > repositories в build.gradle (Module: app) , как показано ниже.
Операции импорта MSAL
Операции импорта, относящиеся к библиотеке MSAL: com.microsoft.identity.client.* . Например, вы увидите import com.microsoft.identity.client.PublicClientApplication; , что является пространством имен для класса PublicClientApplication , который представляет общедоступное клиентское приложение.
SingleAccountModeFragment.java
В этом файле показано, как создать приложение MSAL для одной учетной записи и вызвать API Microsoft Graph.
Приложения с одной учетной записью используются только одним пользователем. Например, у вас может быть только одна учетная запись для входа в приложение сопоставления.
Инициализация MSAL одной учетной записи
В файле auth_config_single_account.json в onCreateView() создается одна учетная запись PublicClientApplication с использованием сведений о конфигурации, хранящихся в файле auth_config_single_account.json . Таким образом вы инициализируете библиотеку MSAL для использования в приложении MSAL с одной учетной записью:
Вход пользователя
В файле SingleAccountModeFragment.java код для входа пользователя находится в initializeUI() в обработчике щелчков signInButton .
Прежде чем пытаться получить токены, вызовите signIn() . signIn() ведет себя так, как будто вызывается acquireToken() , в результате чего пользователь получает интерактивный запрос на вход.
Вход пользователя является асинхронной операцией. Передается метод для обратного вызова, который вызывает API Microsoft Graph и обновляет пользовательский интерфейс после входа пользователя:
Выход пользователя
В файле SingleAccountModeFragment.java код для выхода пользователя находится в initializeUI() в обработчике щелчков signOutButton . Выход пользователя является асинхронной операцией. При выходе пользователя также очищается кеш токена для этой учетной записи. Для обновления пользовательского интерфейса после выхода из учетной записи пользователя создается обратный вызов:
Получение токена в интерактивном режиме или автоматически
Чтобы пользователь получил минимальное количество запросов, токен обычно получается автоматически. Если возникает ошибка, попытайтесь перейти к токену в интерактивном режиме. Когда приложение вызывает signIn() впервые, оно фактически действует как вызов acquireToken() , который запрашивает учетные данные пользователя.
Ниже представлены некоторые ситуации, когда пользователю может быть предложено выбрать учетную запись, ввести учетные данные или дать согласие на разрешения, запрошенные вашим приложением:
- Первый вход пользователя в приложение.
- Если пользователь сбрасывает пароль, то потребуется вводить свои учетные данные.
- Если отменяется согласие.
- Приложение явно требует согласия.
- Когда ваше приложение впервые запрашивает доступ к ресурсу.
- Когда требуются политики условного доступа или MFA.
Код для интерактивного получения токена (то есть с помощью пользовательского интерфейса) находится в файле SingleAccountModeFragment.java в initializeUI() в обработчике щелчков callGraphApiInteractiveButton :
Если пользователь уже выполнил вход, acquireTokenSilentAsync() позволяет приложениям запрашивать токены автоматически, как показано в initializeUI() , в обработчике щелчков callGraphApiSilentButton :
Загрузка учетной записи
Код для загрузки учетной записи находится в файле SingleAccountModeFragment.java в loadAccount() . Загрузка учетной записи пользователя является асинхронной операцией, поэтому обратные вызовы для обработки при загрузке учетной записи, изменении или возникновении ошибки передаются в MSAL. Следующий код также обрабатывает onAccountChanged() , что происходит при удалении учетной записи, переходе пользователя на другую учетную запись и т. д.
Вызов Microsoft Graph
Когда пользователь выполнил вход, вызов Microsoft Graph выполняется через HTTP-запрос с помощью callGraphAPI() , определенного в файле SingleAccountModeFragment.java . Эта функция представляет собой программу-оболочку, которая упрощает пример, выполняя некоторые задачи, такие как получение маркера доступа из authenticationResult , упаковка вызова MSGraphRequestWrapper и отображение результатов вызова.
auth_config_single_account.json
Это файл конфигурации для приложения MSAL, использующего одну учетную запись.
Описание этих полей см. в разделе Android Microsoft Authentication Library (MSAL) configuration file (Файл конфигурации библиотеки аутентификации Microsoft для Android (MSAL)).
Обратите внимание на присутствие «account_mode» : «SINGLE» , который настраивает это приложение для использования одной учетной записи.
Параметр «client_id» предварительно настроен для использования регистрации объекта приложения, которую обслуживает корпорация Майкрософт. Параметр «redirect_uri» предварительно настроен для использования ключа подписывания, предоставленного в примере кода.
MultipleAccountModeFragment.java
В этом файле показано, как создать приложение MSAL с несколькими учетными записями и вызвать API Microsoft Graph.
Примером приложения с несколькими учетными записями является почтовое приложение, которое позволяет работать с несколькими учетными записями пользователей, такими как рабочая и личная учетная запись.
Инициализация MSAL нескольких учетных записей
В файле MultipleAccountModeFragment.java в onCreateView() объект приложения с несколькими учетными записями ( IMultipleAccountPublicClientApplication ) создается с использованием сведений о конфигурации, хранящихся в auth_config_multiple_account.json file :
Созданный объект MultipleAccountPublicClientApplication хранится в переменной члена класса, чтобы его можно было использовать для взаимодействия с библиотекой MSAL для получения токенов, загрузки и удаления учетной записи пользователя.
Загрузка учетной записи
Приложения с несколькими учетными записями обычно вызывают getAccounts() , чтобы выбрать учетную запись для использования в операциях MSAL. Код для загрузки учетной записи находится в файле MultipleAccountModeFragment.java в loadAccounts() . Загрузка учетной записи пользователя является асинхронной операцией. Поэтому обратный вызов обрабатывает ситуации, когда учетная запись загружается, изменяется или возникает ошибка.
Получение токена в интерактивном режиме или автоматически
Ниже представлены некоторые ситуации, когда пользователю может быть предложено выбрать учетную запись, ввести учетные данные или дать согласие на разрешения, запрошенные вашим приложением:
- первый вход пользователей в приложение;
- Если пользователь сбрасывает пароль, то потребуется вводить свои учетные данные.
- Если отменяется согласие.
- Приложение явно требует согласия.
- Когда ваше приложение впервые запрашивает доступ к ресурсу.
- Когда требуются политики условного доступа или MFA.
Приложения с несколькими учетными записями обычно должны получать токены в интерактивном режиме, то есть в пользовательском интерфейсе, с вызовом acquireToken() . Код для интерактивного получения токена находится в файле MultipleAccountModeFragment.java в initializeUI() в обработчике щелчков callGraphApiInteractiveButton :
Приложения не требуют, чтобы пользователи выполняли вход каждый раз при запросе токена. Если пользователь уже выполнил вход, acquireTokenSilentAsync() позволяет приложениям запрашивать токены без запроса к пользователю, как показано в файле MultipleAccountModeFragment.java в initializeUI() в обработчике щелчков callGraphApiSilentButton :
Удаление учетной записи
Код для удаления учетной записи и всех кэшированных токенов для учетной записи находится в файле MultipleAccountModeFragment.java в initializeUI() в обработчике кнопки удаления учетной записи. Прежде чем вы сможете удалить учетную запись, вам нужен объект учетной записи, который вы получаете из методов MSAL, таких как getAccounts() и acquireToken() . Так как удаление учетной записи является асинхронной операцией, обратный вызов onRemoved предоставляется для обновления пользовательского интерфейса.
auth_config_multiple_account.json
Это файл конфигурации для приложения MSAL, которое использует несколько учетных записей.
Описание разных полей см. в статье Android Microsoft Authentication Library (MSAL) configuration file (Файл конфигурации библиотеки аутентификации Microsoft для Android (MSAL)).
В отличие от файла конфигурации auth_config_single_account.json, в этом файле конфигурации указано «account_mode» : «MULTIPLE» вместо «account_mode» : «SINGLE» , так как это приложение с несколькими учетными записями.
Параметр «client_id» предварительно настроен для использования регистрации объекта приложения, которую обслуживает корпорация Майкрософт. Параметр «redirect_uri» предварительно настроен для использования ключа подписывания, предоставленного в примере кода.
Справка и поддержка
Если вам нужна помощь, если вы хотите сообщить о проблеме или узнать о доступных вариантах поддержки, воспользуйтесь статьей Возможности получения поддержки и справки для разработчиков.
Дальнейшие действия
Перейдите к учебнику по Android, с помощью которого вы создадите приложение Android, получающее маркер доступа от платформы удостоверений Майкрософт и использующее его для вызова API Microsoft Graph.
Источник