- Познакомиться со способами аутентификации и авторизации сервисов в облачных системах.
- Изучить принципы работы сервиса аутентификации и авторизации
Keycloak. - Изучить особенности контейнеризации сервисов с использованием
Docker. - Доработать код сервиса инференса из первой лабораторной работы для
реализации его аутентификации через
OAuth2с помощью системыKeycloak. - Контейнеризовать доработанный сервис с использованием
Docker, реализовать оркестрацию используемых в работе сервисов с помощьюdocker-compose - Настроить автоматическую публикацию образов сервисов в репозиторий
DockerHubс помощьюGithub Actions.
Под контейнеризацией понимают процесс развертывания программного обеспечения, который объединяет код приложения со всеми файлами и библиотеками, необходимыми для запуска в любой инфраструктуре. К преимуществам контейнеризации относят:
- Использование ПО в различных средах без его изменения.
- Отсутствие влияние процессов в одном контейнере на процессы в другом.
- Возможность масштабирования ПО посредством порождения новых экземпляров контейнеров.
- Возможность изменять приложение, не изменяяя хостовую систему.
Одной из популярных сред выполнения контейнеров с открытым исходным кодом
является Docker. Контейнеры в Docker – это автономные пакеты приложений и
связанных файлов, созданных с помощью платформы Docker.
Оркестрация контейнеров – это программная технология, позволяющая автоматически управлять контейнерами. Это необходимо для разработки современных облачных приложений, поскольку приложение может содержать тысячи микросервисов в соответствующих контейнерах, которые необходимо в правильном порядке и правильным способом запустить и настроить.
Современным способом авторизации и аутентификации контейнеров в
микроконтейнерной архитектуре является применение протокола OAuth 2.0. Это
протокол авторизации, позволяющий выдать одному сервису права на доступ к
ресурсам пользователя на другом сервисе. OAuth 2.0 определяет четыре роли:
Владелец ресурса, Клиент, Сервер ресурсов, Авторизационный сервер.
Результатом авторизации является получение клиентом access token от
авторизационного сервиса, предъявление которого серверу ресурсов необходимо
для получения доступа.
Широко используемым в настоящее время Identity-провайдером является
Keycloak. Keycloak основан на наборе административных пользовательских
интерфейсов и RESTful API. Он предоставляет необходимые средства для создания
разрешений доступа к защищенным ресурсам, связывания этих разрешений с
политиками авторизации, применения авторизационных решений в приложениях и
сервисах.
- Создайте папку на компьютере для проекта и склонируйте в нее содержимое репозитория:
git clone https://github.com/kpdvstu/CloudCS-Lab2.git
- Изучите реализованный в проекте способ определения наличия прав клиента на выполнение операции инференса.
- Изучите файл
docker-compose.yml. Разберитесь, каким образом будут выполняться Docker-контейнеры. Образы, собираемые в проекте, доступны в DockerHub репозитории. - Запустите контейнеры
keycloakиpostgresс помощью нижеприведенной команды. Сервисinferenceпока запускать не нужно, поскольку он требует уже настроенного Keycloak!
docker-compose up -d postgres keycloak
- Дождитесь окончания процессов запуска и инициализации контейнеров. Статус их работы можно посмотреть с помощью команды:
docker-compose logs
-
Удостоверившись в корректном запуске сервисов
postgresиkeycloak, передите в браузере по адресу https://localhost:8443. -
В открывшемся окне перейдите в раздел "Administration Console" и авторизуйтесь от имени администратора Keycloak (логин:
admin, пароль указан в файле.env). В случае успешной авторизации перед Вами откроется веб-панель управления системойKeycloak. -
Теперь необходимо настроить Keycloak для корректной работы с ним сервиса инференса. Создайте новую область безопасности (
realm) с именемinference(см. документацию). Настраивать область безопасности не нужно. -
В созданной области безопасности создайте клиента (см. документацию) со следующими параметрами:
Client ID: inference-clientAlways Display in Console: OnClient authentication: OnAuthorization: OnAuthentication flow: только Service accounts roles, остальные галочки нужно снять. При включении опции авторизации Service accounts roles параметр включится автоматически, и отключить его не получится.Web Origins: *- Остальные опции следует оставить по умолчанию.
-
На панели слева выберите пункт
Clients, выберите вновь созданного клиента и перейдите на вкладкуCredentials. Значение Client secret на данной вкладке вместе с указанным ранее значением Client ID необходимо указать в файле.envв соответствующих полях. -
Аналогичным образом создайте еще два клиента с теми же настройками:
Privileged-client, которому будет разрешено выполнять инференс;Unprivileged-client, которому данное действие будет запрещено.
Запишите их Client ID и Client secret, они понадобятся позже при выполнении запросов к сервису.
-
Теперь нужно настроить привелегированному клиенту права на доступ к ресурсу инференса. На панели слева выберите пункт
Clients, выберите клиента inference-client и перейдите на вкладкуAuthorization. Далее, перейдите на вкладкуScopes. Создайте новый scope с именемdoInfer. -
Перейдите на вкладку
Resourses. Создайте новый ресурс, соответствующий ресурсу сервиса/predictions, отвечающего за инференс. Параметры ресурса:Name: infer_endpointURIs: /predictionsAuthorization scopes: doInfer- Остальные опции следует оставить по умолчанию.
-
Перейдите на вкладку
Policies. Создайте новую политику типаClientс параметрами:Name: inference-policyClients: privileged-clientLogic: Positive
-
Перейдите на вкладку
Permissions. Создайте новое разрешение типаscope-based permissionс параметрами:Name: inference-permissionResources: infer_endpointAuthorization scopes: doInferPolicies: inference-policyDecision strategy: Unanimous- Остальные опции следует оставить по умолчанию.
-
Теперь можно запускать сервис инференса. Выполните команду:
docker-compose up -d inference
- Убедитесь, что сервис успешно запустился. Если в процессе запуска
появились ошибки, исправьте их (как правило, это связано с неправильным
конфигурированием
Keycloak). - Проверьте работоспособность сервиса, перейдя в браузере по адресу: http://localhost:8000/healthcheck.
- Получите токен доступа привилегированного сервиса c использованием
curl(или любого другого клиента, например,telnet,PuTTY,Postmanи др.):
curl --insecure --request POST https://localhost:8443/realms/inference/protocol/openid-connect/token --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'client_id=privileged-client' --data-urlencode 'client_secret=<privileged-client-secret>' --data-urlencode 'grant_type=client_credentials'
- Выполните запрос на инференс от имени привилегированного пользователя:
curl -X POST http://localhost:8000/predictions -H "Authorization: Bearer <access-token>" -H 'Content-Type: application/json' -d '{"cylinders": 4, "displacement": 113.0, "horsepower": 95.0, "weight": 2228.0, "acceleration": 14.0, "model_year": 71, "origin": 3}'
- Убедитесь в работоспособности инференса для привилегированного пользователя. Аналогичным образом запросите токен для непривилегированного пользователя и попробуйте выполнить инференс с ним. Убедитесь в отсутствии доступа.
Данная лабораторная работа является составной частью курсовой работы, защищаемой студентами в конце семестра. При выполнении лабораторной работы можно использовать любые языки и фреймворки, позволяющие выполнить поставленную задачу.
-
Для своего сервиса, разработанного в процессе выполнения первой лабораторной работы, реализуйте аутентификацию и авторизацию с использованием
Keycloak. Воспользуйтесь представленным проектом как образцом. -
Выполните контейнеризацию разработанного Вами сервиса, составьте соответствующий
Dockerfile. -
Выполните оркестрацию всех сервисов, используемых в работе, с использованием инструмента
docker-compose. Составьте соответствующийdocker-compose.yml. -
Добейтесь работоспособности сервиса, продемонстрируйте корректную обработку запросов преподавателю для привилегированного и непривилегированного пользователей.
-
Создайте свой репозиторий на
GitHubс разработанным проектом. Реализуйте CI/CD-конвейер вGitHub Actionsдля тестирования сервиса, сборки Docker-образов и размещения их в DockerHub. Убедитесь в его работоспособности. Не забудьте прописать корректные GitHub Secrets для сохранения в GitHub конфиденциальных данных! -
Оформите вторую главу пояснительной записки к курсовой работе, описав в ней следующие моменты:
- Постановку задачи.
- Реализацию модулей сервиса, ответственных за выполнение аутентификации и
авторизации с помощью
Keycloak. - Процесс настройки
Keycloakдля различных категорий пользователей, использующихся в работе. - Структуру созданных
Dockerfileиdocker-compose.yml, обоснование применения используемых в них инструкций. - Команды сборки образов и запуска контейнеров со скринами, подтверждающими успешность их выполнения.
- Тестирование работоспособности сервиса и CI/CD (содержание запросов, содержание ответов, демонстрация корректной обработки сервисом различных сценариев, возникающих в процессе его использования (в том числе, ошибочных), скрины с результатами тестирования и их пояснением).
- Выводы по главе с анализом полученных результатов.
- Понятие виртуализации и контейнеризации, их возможности. Преимущества и недостатки каждой из технологий.
- Принцип работы технологии контейнеризации. Пространство пользователя и
пространство ядра.
Kernel Namespaces,CGroups,UnionFS. - Система
Docker. Архитектура системы. Функции каждого компонента архитектуры и взаимодействие между ними. - Процесс создания образов
Docker.Dockerfileи контекст создания образа. Уровни образа.UnionFS. Влияние кэширования на процесс создания образов. - Основные инструкции
Dockerfile, их функции и правила использования. Способы записи инструкций. - Обеспечение коммуникации между контейнерами: проброс портов и подключение контейнеров.
- Сохранение данных контейнера, понятие томов (
volumes). Управление томамиDocker. - Основные команды
Dockerдля работы с образами и контейнерами. - Понятие оркестрации Docker-контейнеров. Инструменты оркестрации Docker.
- Инструмент
docker-compose: назначение и принцип работы. Конфигурационный YAML-файл и его формат. Определение переменных окружающей среды (environment). - Определение и использование сервисов (
services), сетей (networks) и томов (volumes) вdocker-compose.yml. Типы драйверов для сетей. - Сборка
Docker-образов проекта с помощьюdocker-composeс использованиемDockerfile. Инструкцияbuildвdocker-compose.yml. - Использование существующих образов проекта в
docker-composeдля запуска контейнера. Инструкцияimageвdocker-compose.yml. - Политики перезапуска сервисов в
docker-compose. Инструкцияrestartвdocker-compose.yml. - Определение зависимости между сервисами в
docker-compose. Инструкцияdepends_onвdocker-compose.yml. - Основные команды
docker-compose. Построение и удаление образов с помощьюdocker-compose. Запуск, просмотр статуса и удаление контейнеров с помощьюdocker-compose. - Понятия идентификации, аутентификации и авторизации. Многофакторная аутентификация.
- Виды
HTTP-авторизации, их особенности. - Стандарт
OpenIDи протоколOAuth 2.0. Основные роли вOAuth 2.0и взаимодействие между ними. - Типы грантов в
OAuth 2.0. Их особенности и области применения. - Понятие
Identity Providers, основные их представители.Keycloak. - Основные механизмы контроля доступа:
ABAC,RBAC,UBAC,CBAC,rule-based,time-based. Их особенности и паттерны применения.
-
Сейерс, Э. Х. Docker на практике / Э. Х. Сейерс, А. Милл ; перевод с английского Д. А. Беликов. — Москва : ДМК Пресс, 2020. — 516 с. — ISBN 978-5-97060-772-5. — Текст : электронный // Лань : электронно-библиотечная система. — URL: https://e.lanbook.com/book/131719 (дата обращения: 28.03.2023).
-
Моуэт, Э. Использование Docker / Э. Моуэт ; научный редактор А. А. Маркелов ; перевод с английского А. В. Снастина. — Москва : ДМК Пресс,
-
— 354 с. — ISBN 978-5-97060-426-7. — Текст : электронный // Лань : электронно-библиотечная система. — URL: https://e.lanbook.com/book/93576 (дата обращения: 28.03.2023).
-
Кочер, П. С. Микросервисы и контейнеры Docker : руководство / П. С. Кочер ; перевод с английского А. Н. Киселева. — Москва : ДМК Пресс, 2019. — 240 с. — ISBN 978-5-97060-739-8. — Текст : электронный // Лань : электронно-библиотечная система. — URL: https://e.lanbook.com/book/123710 (дата обращения: 28.03.2023).
-
Authorization Services Guide [Электронный ресурс] : документация по системе Keycloak. – [2023]. – Режим доступа : https://www.keycloak.org/docs/latest/authorization_services/ (дата обращения: 28.03.2023).
-
Server Administration Guide [Электронный ресурс] : документация по системе Keycloak. – [2023]. – Режим доступа : https://www.keycloak.org/docs/latest/server_admin/ (дата обращения: 28.03.2023).
-
OAuth 2.0 [Электронный ресурс] : документация по протоколу OAuth 2.0. – [2023]. – Режим доступа : https://oauth.net/2/ (дата обращения: 28.03.2023).
-
FastAPI [Электронный ресурс] : документация по фреймворку FastAPI. – [2023]. – Режим доступа : https://fastapi.tiangolo.com/ (дата обращения: 28.03.2023).