Аутентификация пользователя с помощью прокси-сервера с идентификацией личности

1. Введение

Аутентификация пользователей вашего веб-приложения часто необходима и обычно требует специального программирования в вашем приложении. Для приложений Google Cloud Platform вы можете передать эти обязанности службе Identity-Aware Proxy . Если вам нужно ограничить доступ только для выбранных пользователей, никаких изменений в приложении не требуется. Если приложению необходимо знать личность пользователя (например, для сохранения пользовательских настроек на стороне сервера), прокси-сервер с идентификацией может предоставить это с минимальным кодом приложения.

Что такое прокси-сервер с идентификацией личности?

Identity-Aware Proxy (IAP) — это служба Google Cloud Platform, которая перехватывает веб-запросы, отправленные в ваше приложение, аутентифицирует пользователя, делающего запрос, с помощью службы Google Identity Service, и пропускает запросы только в том случае, если они исходят от пользователя, которого вы авторизовали. Кроме того, он может изменить заголовки запросов, включив в них информацию об аутентифицированном пользователе.

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

Что вы построите

В этой лабораторной работе вы собираетесь создать минимальное веб-приложение с помощью Google App Engine, а затем изучить различные способы использования прокси-сервера с идентификацией для ограничения доступа к приложению и предоставления ему идентификационной информации пользователя. Ваше приложение будет:

  • Отображение страницы приветствия
  • Доступ к идентификационной информации пользователя, предоставленной IAP.
  • Используйте криптографическую проверку, чтобы предотвратить подделку идентификационной информации пользователя.

Что вы узнаете

  • Как написать и развернуть простое приложение App Engine с помощью Python 3.7
  • Как включить и отключить IAP, чтобы ограничить доступ к вашему приложению
  • Как перенести идентификационную информацию пользователя из IAP в ваше приложение
  • Как криптографически проверить информацию из IAP для защиты от подделки

Что вам понадобится

  • Современный веб-браузер, такой как Chrome .
  • Базовые знания языка программирования Python

Эта лаборатория кода ориентирована на Google App Engine и IAP. Нерелевантные концепции и блоки кода замалчиваются и предоставляются для простого копирования и вставки.

2. Приступаем к настройке

Вы будете работать в среде командной строки Cloud Shell. Начните с открытия этой среды и загрузки в нее примера кода.

Запустите консоль и Cloud Shell.

В верхней левой части страницы лаборатории нажмите кнопку «Открыть консоль Google». Вам нужно будет войти в систему, используя имя пользователя и пароль, указанные под этой кнопкой.

Все команды в этой лаборатории кода будут выполняться в Cloud Shell для проекта, который был создан и открыт для вас. Откройте Cloud Shell, щелкнув значок «Активировать Cloud Shell» в правой части заголовка страницы консоли. Нижняя половина страницы позволит вам вводить и запускать команды. Команды можно запускать с вашего собственного компьютера, но сначала вам придется установить и настроить необходимое программное обеспечение для разработки. В Cloud Shell уже есть все необходимые программные инструменты.

Загрузите код

Щелкните область командной строки в Cloud Shell, чтобы можно было вводить команды. Получите код с Github, а затем перейдите в папку с кодом:

git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user-authentication-with-iap

Эта папка содержит одну подпапку для каждого шага этой лаборатории кода. Вы перейдете в правильную папку для выполнения каждого шага.

3. Шаг 1. Разверните приложение и защитите его с помощью IAP.

Это стандартное приложение App Engine, написанное на Python 3.7, которое просто отображает страницу приветствия «Hello, World». Мы развернем и протестируем его, а затем ограничим доступ к нему с помощью IAP.

Просмотрите код приложения

Перейдите из основной папки проекта в подпапку 1-HelloWorld , содержащую код для этого шага.

cd 1-HelloWorld

Код приложения находится в файле main.py Он использует веб-инфраструктуру Flask для ответа на веб-запросы содержимым шаблона. Этот файл шаблона находится в templates/index.html и на этом этапе содержит только простой HTML. Второй файл шаблона содержит скелетный пример политики конфиденциальности в templates/privacy.html .

Есть еще два файла: requirements.txt перечисляет все библиотеки Python, не используемые по умолчанию, которые использует приложение, а app.yaml сообщает Google Cloud Platform, что это приложение Python 3.7 App Engine.

Вы можете перечислить каждый файл в оболочке с помощью команды cat, например:

cat main.py

Или вы можете открыть редактор кода Cloud Shell, щелкнув значок карандаша в правом верхнем углу окна Cloud Shell, и таким образом изучить код.

На этом этапе вам не нужно изменять какие-либо файлы.

Развертывание в App Engine

Теперь разверните приложение в стандартной среде App Engine для Python 3.7.

gcloud app deploy

Вас могут попросить выбрать регион для развертывания. Выберите любой ближайший к вам вариант, на котором написано, что он «поддерживает стандарт». Когда вас спросят, хотите ли вы продолжить, введите Y , если да.

Через несколько минут развертывание должно завершиться, и вы увидите сообщение о том, что вы можете просмотреть свое приложение с помощью gcloud app browse . Введите эту команду. Если новая вкладка не открывается в вашем браузере, щелкните отображаемую ссылку, чтобы открыть ее на новой вкладке, или, если необходимо, скопируйте ее на новую вкладку, открытую вручную. Поскольку это приложение запускается впервые, оно появится через несколько секунд, пока будет запущен облачный экземпляр, и вы увидите следующее окно.

1c1c0b166c6023e.png

Вы можете открыть тот же URL-адрес с любого компьютера, подключенного к Интернету, чтобы просмотреть эту веб-страницу. Доступ пока не ограничен.

Ограничить доступ с помощью IAP

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

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

Нажмите КНОПКУ НАСТРОЙКА ЭКРАНА СОГЛАСИЯ. Откроется новая вкладка для настройки экрана согласия.

Заполните необходимые поля соответствующими значениями:

Имя приложения

Пример IAP

Электронная почта поддержки

Ваш электронный адрес. Возможно, оно уже заполнено для вас.

Авторизованный домен

часть имени хоста URL-адреса приложения, например iap-example-999999.appspot.com. Вы можете увидеть это в адресной строке веб-страницы Hello World, которую вы ранее открыли. Не включайте начальный https:// или конечный / из этого URL-адреса. Вы должны нажать Enter после заполнения этого значения.

Ссылка на домашнюю страницу приложения

URL-адрес, который вы использовали для просмотра вашего приложения

Ссылка на политику конфиденциальности приложения

ссылка на страницу конфиденциальности в приложении, такая же, как ссылка на домашнюю страницу с добавлением /privacy в конце.

Нажмите Сохранить . Вам будет предложено создать учетные данные. Вам не нужно создавать учетные данные для этой лаборатории кода, поэтому вы можете просто закрыть эту вкладку браузера.

Вернитесь на страницу прокси-сервера с поддержкой идентификации и обновите ее. Теперь вы должны увидеть список ресурсов, которые можно защитить. Нажмите кнопку переключения в столбце IAP в строке приложения App Engine, чтобы включить IAP.

Вы увидите доменные имена, которые будут защищены IAP. Нажмите ВКЛЮЧИТЬ.

Теперь откройте вкладку браузера и перейдите по URL-адресу вашего приложения. Вам будет представлен экран «Войти с помощью Google», требующий входа в систему для доступа к приложению.

Войдите с помощью учетной записи Google или GSuite. Вы увидите экран, запрещающий вам доступ.

Вы успешно защитили свое приложение с помощью IAP, но еще не указали IAP, какие учетные записи разрешать.

Вернитесь на страницу консоли с идентификацией прокси, установите флажок рядом с приложением App Engine и просмотрите боковую панель в правой части страницы.

Каждый адрес электронной почты (или адрес группы Google, или имя домена G Suite), которому должен быть разрешен доступ, необходимо добавить в качестве участника. Нажмите ДОБАВИТЬ УЧАСТНИКА. Введите свой адрес электронной почты, затем выберите роль пользователя облачного IAP/IAP-защищенного веб-приложения, чтобы назначить этот адрес. Таким же образом вы можете ввести дополнительные адреса или домены G Suite.

Нажмите «Сохранить». В нижней части окна появится сообщение «Политика обновлена».

Вернитесь в свое приложение и перезагрузите страницу. Теперь вы должны увидеть свое веб-приложение, поскольку вы уже вошли в систему под авторизованным пользователем. Однако вы все равно можете увидеть страницу «У вас нет доступа», поскольку IAP не может повторно проверить вашу авторизацию. В этом случае выполните следующие действия:

  • Откройте веб-браузер по адресу домашней страницы, добавив /_gcp_iap/clear_login_cookie в конец URL-адреса, как в https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie .
  • Вы увидите новый экран «Войти через Google», где уже отображается ваша учетная запись. Не нажимайте на учетную запись. Вместо этого нажмите «Использовать другую учетную запись» и повторно введите свои учетные данные.
  • Эти действия заставят IAP перепроверить ваш доступ, и теперь вы должны увидеть главный экран вашего приложения.

Если у вас есть доступ к другому браузеру или вы можете использовать режим инкогнито в своем браузере, а также у вас есть другая действующая учетная запись GMail или GSuite, вы можете использовать этот браузер, чтобы перейти на страницу вашего приложения и войти в систему, используя другую учетную запись. Поскольку эта учетная запись не авторизована, вместо вашего приложения она увидит экран «У вас нет доступа».

4. Шаг 2. Доступ к идентификационной информации пользователя.

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

Это шаг 2, и последний шаг завершился открытием Cloud Shell в папке iap-codelab/1-HelloWorld . Перейдите в папку для этого шага:

cd ~/iap-codelab/2-HelloUser

Развертывание в App Engine

Поскольку развертывание занимает несколько минут, начните с развертывания приложения в стандартной среде App Engine для Python 3.7:

gcloud app deploy

Когда вас спросят, хотите ли вы продолжить, введите Y, если да. Через несколько минут развертывание должно завершиться. Пока вы ждете, вы можете просмотреть файлы приложения, как описано ниже.

Когда развертывание будет готово, вы увидите сообщение о том, что вы можете просмотреть свое приложение с помощью gcloud app browse . Введите эту команду. Если в вашем браузере не открывается новая вкладка, скопируйте отображаемую ссылку и откройте ее в новой вкладке в обычном режиме. Вы должны увидеть страницу, похожую на следующую:

5b5fb03111258cec.png

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

Изучите файлы приложения

Эта папка содержит тот же набор файлов, что и в шаге 1, но два файла были изменены: main.py и templates/index.html . Программа была изменена для получения информации о пользователе, которую IAP предоставляет в заголовках запросов, и теперь шаблон отображает эти данные.

В main.py есть две строки, которые получают идентификационные данные, предоставленные IAP:

user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')

Заголовки X-Goog-Authenticated-User- предоставляются IAP, а имена нечувствительны к регистру, поэтому при желании их можно указывать как в нижнем, так и в верхнем регистре. Оператор render_template теперь включает эти значения, чтобы их можно было отобразить:

page = render_template('index.html', email=user_email, id=user_id)

Шаблон index.html может отображать эти значения, заключая имена в двойные фигурные скобки:

Hello, {{ email }}! Your persistent ID is {{ id }}.

Как видите, предоставленные данные имеют префикс accounts.google.com :, показывающий, откуда взялась информация. Ваше приложение может удалить все, включая двоеточие, чтобы получить необработанные значения, если это необходимо.

Отключить IAP

Что произойдет с этим приложением, если IAP отключен или каким-либо образом обойден (например, другими приложениями, работающими в том же облачном проекте)? Отключите IAP, чтобы увидеть.

В окне облачной консоли щелкните значок меню в левом верхнем углу страницы, нажмите «Безопасность», а затем «Прокси-сервер с идентификацией личности». Нажмите переключатель IAP рядом с приложением App Engine, чтобы отключить IAP.

Вы будете предупреждены, что это позволит всем пользователям получить доступ к приложению.

Обновите веб-страницу приложения. Вы должны увидеть ту же страницу, но без какой-либо информации о пользователе:

17c850de95fea839.png

Поскольку приложение теперь не защищено, пользователь может отправить веб-запрос, который, по всей видимости, прошел через IAP. Например, для этого вы можете запустить следующую команду Curl из Cloud Shell (замените <your-url-here> правильным URL-адресом вашего приложения):

curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"

Веб-страница будет отображаться в командной строке и выглядеть следующим образом:

<!doctype html>
<html>
<head>
  <title>IAP Hello User</title>
</head>
<body>
  <h1>Hello World</h1>

  <p>
    Hello, totally fake email! Your persistent ID is None.
  </p>

  <p>
    This is step 2 of the <em>User Authentication with IAP</em>
    codelab.
 </p>

</body>
</html>

Приложение не может узнать, что IAP отключен или обойден. В случаях, когда это является потенциальным риском, шаг 3 показывает решение.

5. Шаг 3. Используйте криптографическую проверку.

Если существует риск отключения или обхода IAP, ваше приложение может проверить достоверность получаемой идентификационной информации. При этом используется третий заголовок веб-запроса, добавленный IAP, который называется X-Goog-IAP-JWT-Assertion . Значение заголовка — это объект с криптографической подписью, который также содержит данные идентификации пользователя. Ваше приложение может проверить цифровую подпись и использовать данные, представленные в этом объекте, чтобы быть уверенным, что они были предоставлены IAP без изменений.

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

Это шаг 3, и последний шаг завершился открытием Cloud Shell в папке iap-codelab/2-HelloUser . Перейдите в папку для этого шага:

cd ~/iap-codelab/3-HelloVerifiedUser

Развертывание в App Engine

Разверните приложение в стандартной среде App Engine для Python 3.7:

gcloud app deploy

Когда вас спросят, хотите ли вы продолжить, введите Y, если да. Через несколько минут развертывание должно завершиться. Пока вы ждете, вы можете просмотреть файлы приложения, как описано ниже.

Когда развертывание будет готово, вы увидите сообщение о том, что вы можете просмотреть свое приложение с помощью gcloud app browse . Введите эту команду. Если в вашем браузере не открывается новая вкладка, скопируйте отображаемую ссылку и откройте ее в новой вкладке в обычном режиме.

Напомним, что вы отключили IAP на шаге 2, поэтому данные IAP не передаются приложению. Вы должны увидеть страницу, похожую на следующую:

8ef2abcc23d96958.png

Как и раньше, вам, возможно, придется подождать несколько минут, пока последняя версия станет доступной, чтобы увидеть новую версию страницы.

Поскольку IAP отключен, информация о пользователе недоступна. Теперь снова включите IAP.

В окне облачной консоли щелкните значок меню в левом верхнем углу страницы, нажмите «Безопасность», а затем «Прокси-сервер с идентификацией личности». Нажмите переключатель IAP рядом с приложением App Engine, чтобы снова включить IAP.

Обновите страницу. Страница должна выглядеть следующим образом:

3a4d93c11f228852.png

Обратите внимание, что адрес электронной почты, предоставленный проверенным методом, не имеет префикса accounts.google.com: :.

Если IAP отключен или обойден, проверенные данные либо отсутствуют, либо недействительны, поскольку они не могут иметь действительную подпись, если они не созданы владельцем закрытых ключей Google.

Изучите файлы приложения

Эта папка содержит тот же набор файлов, что и на шаге 2, с двумя измененными файлами и одним новым файлом. Новый файл — auth.py , который предоставляет метод user() для получения и проверки криптографически подписанной идентификационной информации. Измененные файлы — main.py и templates/index.html , которые теперь используют результаты этого метода. Непроверенные заголовки, обнаруженные на шаге 2, также показаны для сравнения.

Новая функциональность в основном заключается в функции user() :

def user():
    assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
    if assertion is None:
        return None, None

    info = jwt.decode(
        assertion,
        keys(),
        algorithms=['ES256'],
        audience=audience()
    )

    return info['email'], info['sub']

assertion — это данные с криптографической подписью, представленные в указанном заголовке запроса. Код использует библиотеку для проверки и декодирования этих данных. При проверке используются открытые ключи, которые Google предоставляет для проверки данных, которые он подписывает, и знания аудитории, для которой данные были подготовлены (по сути, защищаемого проекта Google Cloud). Вспомогательные функцииkey keys() и audience() собирают и возвращают эти значения.

Подписанный объект содержит две необходимые нам части данных: проверенный адрес электронной почты и уникальное значение идентификатора (указанное в стандартном поле sub для подписчика).

На этом Шаг 3 завершен.

6. Резюме

Вы развернули веб-приложение App Engine. На шаге 1 вы ограничили доступ к приложению только выбранным вами пользователям. На шаге 2 вы получили и отобразили идентификационные данные пользователей, которым IAP разрешил доступ к вашему приложению, и увидели, как эта информация может быть подделана, если IAP был отключен или обойден. На шаге 3 вы проверили криптографически подписанные утверждения личности пользователя, которые невозможно подделать.

7. Очистка

Единственные ресурсы Google Cloud Platform, которые вы использовали в этой лаборатории кода, — это экземпляры App Engine. Каждый раз, когда вы развертывали приложение, создавалась новая версия, которая продолжает существовать до тех пор, пока не будет удалена. Выйдите из лаборатории, чтобы удалить проект и все ресурсы в нем.