Стаття також доступна російською (перейти до перегляду).
Зміст:
- Концепція SSO та варіанти її реалізації/a>
- Програмні засоби для реалізації напрямку Web Single Sign-on
- Розгортання Keycloak на Ubuntu 22.04 із використанням СУБД Postgresql
- Висновки
Щоб забезпечити безпеку облікових даних користувачів при роботі з великою кількістю різних сервісів на віддалених вузлах мережі, важливо організувати надійну систему аутентифікації. Для цього підходить технологія єдиного входу (SSO), яка дозволяє користувачеві авторизуватися лише раз для доступу до всіх сервісів. Keycloak — це один з ефективних інструментів реалізації SSO, який забезпечує централізовану аутентифікацію для різноманітних сервісів. Розглянемо можливості Keycloak та продемонструємо його розгортання на VPS-сервері Ubuntu.
Концепція SSO та варіанти її реалізації
Технологія SSO (Single Sign-On) може бути реалізована як для корпоративного використання, так і для забезпечення функцій аутентифікації у веб-додатках (Web Single Sign-on). У останньому випадку передбачається наявність єдиного центру аутентифікації або identity-провайдера, котрий надає доступ користувачеві з єдиним обліковим записом до усіх додатків.
Web Single Sign-on зазвичай реалізується на базі наступних стандартів та технологій:
-
OpenID;
-
OAuth;
-
SAML.
Стандарт OpenID визначає правила аутентифікації користувачів для децентралізованих систем та дозволяє мати єдиний пароль для всіх сторонніх сервісів, котрий передається їм центром аутентифікації по запиту. Це забезпечується завдяки генеруванню унікального користувацького ідентифікатора (токена) для вільного використання. OpenID-аутентифікація використовується у IBM, Yahoo!, Orange, Grafana та інших сервісах.
Стандарт OAuth визначає правила авторизації. Стандарт описаний у специфікаціях RFC 6749 та RFC 6750. Його особливість полягає в тому, що, на відміну від OpenID, тут не передаються облікові дані користувача сервісам, у котрих він зареєстрований. Передаються лише права на використання тих або інших можливостей веб-сервісів. Це дає можливість захистити користувача від витіку персональних даних. Протокол OAuth використовується такими сервісами, як, Instagram, Facebook, Google та багатьма іншими.
SAML (Security Assertion Markup Language) є відкритим стандартом обміну даними між identity-провайдером та сторонніми сервісами.
Найбільшу віддачу від використання вказаних технологій можна отримати лише в результаті сумісного поєднання їх можливостей. І тому, починаючи з версії OpenID 2.0 здійснювалися спроби інтеграції з протоколом OAuth за допомогою спеціального розширення.
Однак, повної інтеграції вказаних технологій вдалося досягти між наступними версіями стандартів: OpenID Connect(OIDC), OAuth 2.0 та SAML, що поєднало їх переваги та дало змогу здійснювати надійну реєстрацію, аутентифікацію та авторизацію користувачів без передачі облікових даних стороннім сервісам.
Програмні засоби для реалізації напрямку Web Single Sign-on
На ринку програмного забезпечення існує чимало програмних засобів, котрі в тій чи іншій мірі спираються на вказані стандарти, підтримуючи концепцію SSO. Найбільш відомі з них: FusionAuth, Keycloak, Jans, Okta та Authentik. Їх віддача, тобто, якість забезпечення надійної та безпечної роботи користувачів зі сторонніми сервісами напряму залежить від стеку протоколів, котрі вони підтримують. І тому має сенс розглядати лише ПЗ із підтримкою OpenID Connect, OAuth 2.0 та SAML. До їх числа, зокрема, відносяться FusionAuth та Keycloak, котрі, за офіційною інформацією розробників, підтримують вказаний стек протоколів та в більшій мірі орієнтовані на використання їх девелоперами.
Для їх роботи необхідний налаштований сервер та адаптер додатків.
Порівняємо основні функції вказаних програм, котрі зведені у Таблиці 1.
Таблица 1. Сравнительная черта Keycloak и FusionAuth.
Функція | Keycloak | FusionAuth' |
Безкоштовне використання | + | + |
Необмежена кількість користувачів та груп |
+ | + |
Реєстрація користувачів |
+ | + |
Аналітичні звіти |
+ | + |
Аутентифікація для мобільних та веб-застосунків |
+ | + |
Можливість зміни інтерфейсу форм реєстрації та входу |
+ | + |
Пошук користувачів та сегментація |
- | + |
Адмін-панель для управління сервером |
- | + |
Консоль управління акаунтом користувача |
+ | + |
Реалізація концепції єдиного входу – багато застосунків та єдиний вхід |
+ | + |
Авторизація та дозвіл |
+ | + |
Можливість розміщення на хості або хмарному сервісі |
+ | + |
Використання журналу |
+ | + |
Авторизація за допомогою соціальних мереж |
+ | + |
Можливість налаштувати хеш паролю |
+ | + |
Заказ функций на заказ |
- | + |
технічна підтримка на комерційній основі |
- | + |
Використання шаблонів електроної пошти |
+ | + |
Ізольоване сховище даних |
+ | + |
Інтеграція зі службами каталогів |
+ | + |
OAuth авторизація |
+ | + |
Управління ключами API, MFA и SSO |
+ | + |
Виявлення brute-force атак |
+ | + |
Періодичний випуск патчей для оновлення засобів захистута виправлення помилок |
- | + |
За результатами розгляду вказаних у таблиці характеристик можна зробити висновок, що майже всі вони однаково підтримуються обома програмами за невеликим винятком, що в основному пов’язано із наявністю комерційної підтримки для FusionAuth. Отже, обидва засоби здатні забезпечити ефективний захист облікових даних користувачів при роботі зі сторонніми сервісами. Keycloak має значно більшу спільноту, та великий набір додаткових модулів. З його допомогою можно робити більш складні механізми аутентифікації та авторизації, але часу на інтеграцію, скоріш за все, знадобиться більше ніж при використанні FusionAuth.
Розгортання Keycloak на Ubuntu 22.04 із використанням СУБД Postgresql
Розіб’ємо процес розгортання програми на кілька етапів:
-
Підготовчі дії;
-
Розгортання та налаштування Keycloak у якості служби;
-
Розгортання та налаштування СУБД Postgresql;
-
Налаштування зв’язку між Keycloak та Postgresql.
Виконаємо по черзі кожен із вказаних етапів.
Підготовчі дії
Як завжди, перед інсталяцією нового ПЗ потрібно підготувати системне середовище для його успішного розгортання та роботи.
Оновимо індекс пакетів у відповідності зі станом репозиторію. Для цього введемо у терміналі:
$ sudo apt update
Індекс успішно оновлений.
Оскільки Keycloak створений на мові Java, він вимагає відповідного середовища. Перевіримо поточну версію Java, розгорнутої в нашій системі:
$ java -version
Як бачимо, Java-середовище відсутнє і тому оберемо останню версію програми зі списку для її встановлення. Введемо в терміналі:
$ sudo apt install openjdk-21-jre-headless
Підтвердимо виділення додаткових 205 Mb дискового простору, після чого процес інсталяції продовжиться.
Java-середовище було успішно розгорнуте: Setting up openjdk-21-jre-headless:amd64 (21.0.4+7-1ubuntu2~22.04) ...
Оберемо місце для скачування архіву програми. Зовнішнє ПЗ повинно знаходитися у директорії /opt. Перейдемо до неї:
$ cd /opt
Скопіюємо із Github-репозиторію останню на сьогодні версію релізу Keycloak 26.0.2 за допомогою наступної команди:
$ sudo wget https://github.com/keycloak/keycloak/releases/download/26.0.2/keycloak-26.0.2.tar.gz
Результат:
keycloak-26.0.2.tar.gz 100%[=================>] 139.99M 9.58MB/sin 13s
Команда успішно виконана.
Розгортання та налаштування Keycloak у якості служби
Розгорнемо отриманий архів програми у поточній директорії:
$ sudo tar -xvf keycloak-26.0.2.tar.gz
Перейменуємо головну директорію програми:
$ mv keycloak-26.0.2 keycloak
Додамо групу для користувачів програми:
$ groupadd keycloak
Додамо користувача із ім’ям Keycloak^
$ useradd -r -g keycloak -d /opt/keycloak -s /sbin/nologin keycloak
Встановимо власника директорії програми та надамо йому дозвіл на запуск файлів програми у двійковому форматі:
$ chown -R keycloak: keycloak
$ chmod o+x /opt/keycloak/bin
Перемістимо конфігураційні файли програми з поточної директорії у директорію /etc, котра зазвичай використовується для збереження файлів конфігурації. Для цього введемо в терміналі наступні команди:
$ cd /etc
$ mkdir keycloak
$ cp /opt/keycloak/conf/keycloak.conf /etc/keycloak/keycloak.conf
Надамо службі Keycloak дозвіл на запуск файлу kc.sh:
$ chown keycloak: /opt/keycloak/bin/kc.sh
Створимо службу Keycloak у нашій системі. Для цього перейдемо до відповідної системної директорії та відредагуємо файл нової служби за допомогою редактора:
$ cd /etc/systemd/system
$ nano keycloak.service
Введемо до файлу наступні розділи із відповідними параметрами та їх значеннями, котрі відображають поточну конфігурацію:
[Unit] Description=Keycloak Authorization Server After=network.target [Service] User=keycloak Group=keycloak ExecStart=/opt/keycloak/bin/kc.sh start ExecStop=/opt/keycloak/bin/kc.sh stop Restart=always RestartSec=5 Environment="JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64" [Install] WantedBy=multi-user.target
Збережемо внесені дані (ctrl+O, Enter) та вийдемо з редактору (ctrl+X).
Для того, щоб внесені до файлу зміни почали діяти перезавантажимо основний процес програми:
$ systemctl daemon-reload
Запустимо службу за допомогою наступної команди:
$ systemctl start keycloak.service
Перевіримо її статус:
$ systemctl status keycloak.service
Результат виконання:
keycloak.service - Keycloak Authorization Server Loaded: loaded (/etc/systemd/system/keycloak.service; disabled; vendor preset: enabled) Active: active (running) since Tue 2024-10-29 17:09:39 UTC; 834ms ago
Main PID: 2115930 (kc.sh) Tasks: 20 (limit: 2162) Memory: 57.1M CPU: 1.324s CGroup: /system.slice/keycloak.service ??2115930 /bin/sh /opt/keycloak/bin/kc.sh start ??2115999 /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Dkc.config.build-and-exit=true -Djava.util.concurrent.ForkJ> Oct 29 17:09:39 dedicated systemd[1]: Stopped Keycloak Authorization Server. Oct 29 17:09:39 dedicated systemd[1]: keycloak.service: Consumed 4.401s CPU time. Oct 29 17:09:39 dedicated systemd[1]: Started Keycloak Authorization Server.
Отже, служба Keycloak успішно запущена та готова до роботи.
Розгортання та налаштування СУБД Postgresql
Keycloak вміє працювати не лише з Postgresql, а й з MySQL, але Postgresql вважається для нього стандартною, тому розглянемо налаштування Keycloak разом з цим типом баз даних.
Перед тим як починати скачування та встановлення СУБД, встановимо клієнт postgresql, котрий реалізований на віртуальній машині Keycloak. Це можна зробити за допомогою наступної команди:
$ apt install postgresql-client-commo
Клієнт успішно встановлений: Setting up postgresql-client-common (238) ...
Ще раз оновимо індекс пакетів:
$ sudo apt update
Розпочнемо процес інсталяції СУБД:
$ sudo apt install postgresql postgresql-contrib -y
Програма успішно розгорнута у нашій системі:
Setting up postgresql-contrib (14+238) ... Setting up postgresql (14+238) ...
Переключимося на влаштованого користувача СУБД:
$ sudo -i -u postgres
Можна переконатися, що запрошення командної строчки змінилося:
postgres@dedicated:~$
Перейдемо у режим створення таблиць бази даних:
$ psql
Введемо наступні команди:
# CREATE DATABASE keycloak; # CREATE USER keycloak WITH PASSWORD 'admin'; # GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak; # \q
Тепер СУБД готова до використання.
Налаштування зв’язку між Keycloak та Postgresql
Змінимо налаштування СУБД, встановлені за замовчуванням для можливості підключення до неї із Keycloak. Для цього відредагуємо конфігураційний файл програми під назвою pg_hba.conf:
$ cd /etc/postgresql/14/main/
$ nano pg_hba.conf
У розділі локального під’єднання IPv4 додамо наступну строчку:
hostall all <VM-IP>/32 md5
Тепер відредагуємо файл postgresql.conf таким чином, щоб СУБД мала змогу «прослуховувати» іншіхости. Для цього введемо в терміналі:
$ nano postgresql.conf
Встановимо наступне значення для параметру listen_addresses:
listen_addresses = '*'
Збережемо внесені зміни та вийдемо з редактору.
Перевіримо налаштоване з’єднання локально із Postgresql за допомогою наступної команди:
$ psql -h localhost -U keycloak -d keycloak
Результат: SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GSM_SHA384, bits: 256, compression: off)
Можна переконатися, що SSL-з’єднання налаштоване.
Тепер налаштуємо службу keycloak.service для взаємодії із СУБД:
$ cd /etc/systemd/system
$ nano keycloak.service
Додамо до файлу служби наступні строчки:
Environment="DB_VENDOR=postgres" Environment="DB_ADDR=Postgresql_IP" Environment="DB_DATABASE=keycloak" Environment="DB_USER=keycloak" Environment="DB_PASSWORD=admin"
Всі значення параметрів повинні відповідати поточній конфігурації СУБД.
Збережемо внесені зміни та вийдемо з редактору.
Після цього залишається виконати наступні команди:
$ sudo systemctl daemon-realod $ sudo systemctl restart keycloak
У цьому разі Keycloak буде запущений у виробничому режимі.
Висновки
На завершення можна зазначити, що Keycloak є потужним та гнучким рішенням для впровадження SSO (Single Sign-On), яке успішно використовується у великих проєктах завдяки широким можливостям для управління ідентифікацією, авторизацією та інтеграцією з різними системами. Однак його налаштування потребує певних навичок та досвіду, що може стати викликом для нових користувачів. Важливий момент полягає в тому, що конфігурація Keycloak є досить складною, а документація не завжди встигає за швидким розвитком продукту, що може ускладнити процес впровадження та підтримки на початкових етапах.
Порівнюючи з FusionAuth, варто зазначити, що останній має більш дружній інтерфейс і може бути легшим для освоєння тим, хто вперше стикається з налаштуванням SSO. Водночас FusionAuth може поступатися Keycloak у функціональності та гнучкості при роботі з великими та складними проєктами, де важливо мати точні налаштування безпеки та інтеграції з різними системами.
Отже, вибір між Keycloak та FusionAuth має базуватися на потребах вашого проєкту: якщо важлива гнучкість та наявність широкого функціоналу, Keycloak стане хорошим вибором, проте якщо пріоритетом є простота налаштування та зручність роботи, FusionAuth може виявитися більш підходящим варіантом.
Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.
Дивіться наш канал Youtube на https://www.youtube.com/freehostua.
Ми у чомусь помилилися, чи щось пропустили?
Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.
Дата: 06.11.2024 Автор: Олександр Ровник
|
|
Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus