Встановлення Keycloak на VPS: Повний гайд з налаштування SSO та IAM
TL;DR
У цьому докладному гайді ми крок за кроком налаштуємо Keycloak на вашому VPS, перетворивши його на потужний центр управління ідентифікацією та доступом (IAM) з функцією єдиного входу (SSO). Ви навчитеся встановлювати всі необхідні компоненти, конфігурувати Keycloak для роботи з PostgreSQL та HTTPS через Caddy, а також забезпечувати його безпеку та відмовостійкість. Це дозволить централізувати автентифікацію для ваших застосунків, підвищити безпеку та спростити управління користувачами.
- Встановлення та налаштування Keycloak 25.0.0 з PostgreSQL 17.
- Використання Docker Compose для зручного розгортання.
- Автоматичне отримання та поновлення TLS-сертифікатів за допомогою Caddy.
- Базовий захист сервера (SSH, Firewall, Fail2ban).
- Налаштування автоматичних бекапів бази даних та конфігурації.
- Рекомендації щодо вибору VPS-конфігурації та масштабування.
Що ми налаштовуємо і навіщо
У сучасному світі, де кожен застосунок вимагає автентифікації, управління обліковими записами може стати справжнім головним болем. Keycloak вирішує цю проблему, надаючи потужну платформу для управління ідентифікацією та доступом (IAM) з підтримкою єдиного входу (SSO).
Keycloak — це open-source рішення, яке дозволяє централізовано управляти користувачами, ролями, групами та надавати їм доступ до ваших застосунків. Він підтримує стандартні протоколи, такі як OpenID Connect, OAuth 2.0 та SAML 2.0, що робить його сумісним практично з будь-яким сучасним веб-застосунком або сервісом. За допомогою Keycloak ви можете:
- Реалізувати єдиний вхід (SSO): Користувачам достатньо один раз авторизуватися, щоб отримати доступ до всіх підключених застосунків без повторного введення облікових даних.
- Керувати користувачами та ролями: Централізоване створення, редагування та видалення користувачів, призначення їм ролей та груп.
- Використовувати соціальну авторизацію: Легко інтегрувати вхід через Google, GitHub, Facebook та інші популярні провайдери.
- Застосовувати багатофакторну автентифікацію (MFA): Підвищити безпеку облікових записів.
- Налаштовувати федерацію ідентифікації: Підключати зовнішні провайдери, такі як LDAP або Active Directory.
У підсумку, читач отримає повністю налаштований і готовий до роботи сервер Keycloak, який слугуватиме центральною точкою автентифікації для його проєктів. Це значно спростить розробку нових застосунків, підвищить безпеку та покращить користувацький досвід.
Альтернативи: Cloud-managed vs Self-hosted
Існують комерційні хмарні сервіси IAM/SSO, такі як Auth0, Okta, Amazon Cognito, Google Identity Platform. Вони пропонують зручність "під ключ", зняття тягаря обслуговування та масштабування. Однак у них є свої недоліки:
- Вартість: Зі зростанням кількості користувачів або функцій витрати можуть швидко стати значними.
- Контроль даних: Ваші дані автентифікації зберігаються у стороннього провайдера, що може бути неприйнятним з міркувань безпеки, конфіденційності або регуляторних вимог.
- Гнучкість: Хоча хмарні сервіси гнучкі, вони все ж мають обмеження щодо кастомізації та інтеграції, які можуть бути притаманні open-source рішенню.
Self-hosted Keycloak на VPS пропонує повний контроль над вашою системою автентифікації. Це ідеальний вибір для розробників, solo-фаундерів SaaS, компаній, яким потрібен високий ступінь кастомізації, або тих, хто хоче мінімізувати експлуатаційні витрати в довгостроковій перспективі. Ви керуєте всіма аспектами безпеки, продуктивності та даних, що дає максимальну свободу та незалежність.
Який VPS-конфіг потрібен для цього завдання
Keycloak, будучи Java-застосунком, вимагає достатніх ресурсів, особливо оперативної пам'яті. Вибір оптимального VPS-конфігу залежить від передбачуваного навантаження: кількості користувачів, частоти автентифікацій та кількості підключених застосунків.
Мінімальні вимоги для невеликої інсталяції (до 500 активних користувачів)
- CPU: 2 vCPU (віртуальних ядра). Цього буде достатньо для обробки більшості запитів.
- RAM: 4 GB. Keycloak сам по собі може споживати 1.5-2 GB RAM, плюс PostgreSQL та операційна система.
- Диск: 50 GB SSD. SSD критично важливий для продуктивності бази даних та швидкого завантаження Keycloak. 50 GB вистачить для ОС, Keycloak та помірного обсягу даних БД.
- Мережа: 100 Mbps. Для більшості завдань цього більш ніж достатньо.
Рекомендований VPS-план для середнього проєкту (до 5000 активних користувачів)
Для більш серйозних навантажень або якщо ви плануєте активно використовувати Keycloak з кількома застосунками та великою кількістю користувачів, рекомендується розглянути наступний конфіг:
- CPU: 4 vCPU. Забезпечить кращу чутливість при пікових навантаженнях.
- RAM: 8 GB. Дозволить Keycloak та PostgreSQL більш ефективно кешувати дані та обробляти більше одночасних запитів.
- Диск: 100-200 GB SSD. Більший обсяг диска забезпечить простір для логів, бекапів та зростання бази даних.
- Мережа: 1 Gbps. Для високонавантажених застосунків.
Для оренди VPS із зазначеними характеристиками можна взяти VPS з 4 vCPU, 8 GB RAM та 100 GB SSD.
Коли потрібен dedicated сервер, а не VPS
Dedicated сервер стає необхідним, коли:
- Дуже високе навантаження: Тисячі одночасних запитів, десятки тисяч активних користувачів.
- Вимоги до продуктивності: Потрібна гарантована продуктивність без "сусідства" з іншими користувачами на одному фізичному сервері.
- Специфічні апаратні вимоги: Наприклад, апаратні модулі безпеки (HSM) або дуже великий обсяг RAM/диска.
- Суворі норми відповідності: Деякі регуляторні вимоги можуть передбачати використання фізично ізольованого обладнання.
Для таких випадків, коли потрібна максимальна продуктивність та ізоляція, можна розглянути відповідний dedicated сервер.
Локація: на що впливає
Вибір локації VPS важливий з кількох причин:
- Затримка (Latency): Чим ближче сервер до ваших користувачів та застосунків, тим менша затримка. Це критично для інтерактивних сервісів.
- Законодавство про дані: Залежно від того, де знаходяться ваші користувачі та де ви ведете бізнес, можуть діяти різні закони про зберігання та обробку персональних даних (наприклад, GDPR у Європі). Вибір локації сервера, що відповідає цим законам, є обов'язковим.
- Доступність: Розміщення серверів у різних географічних точках може підвищити відмовостійкість вашої інфраструктури.
Завжди вибирайте локацію, яка знаходиться максимально близько до основної аудиторії ваших застосунків.
Підготовка сервера
Перед встановленням Keycloak необхідно виконати базове налаштування нового VPS для забезпечення безпеки та стабільності. Ми будемо використовувати Ubuntu Server 24.04 LTS як операційну систему.
1. Оновлення системи
Насамперед оновіть усі пакети до актуальних версій.
sudo apt update && sudo apt upgrade -y
Ця команда оновлює список доступних пакетів і потім оновлює встановлені пакети до останніх версій.
2. Створення нового користувача та налаштування SSH-доступу
Для підвищення безпеки не рекомендується працювати під обліковим записом root. Створимо нового користувача та надамо йому права sudo.
# Створюємо нового користувача (замініть 'youruser' на бажане ім'я)
sudo adduser youruser
# Додаємо користувача до групи sudo
sudo usermod -aG sudo youruser
Тепер скопіюйте ваш публічний SSH-ключ для нового користувача. З локальної машини:
ssh-copy-id youruser@your_vps_ip
Після цього вийдіть з root-сесії та увійдіть під новим користувачем.
exit
ssh youruser@your_vps_ip
3. Налаштування SSH-сервера
Вимкніть вхід за паролем та вхід для root-користувача, залишивши лише автентифікацію за ключем.
sudo nano /etc/ssh/sshd_config
Знайдіть та змініть наступні рядки:
# Заборонити вхід для root-користувача
PermitRootLogin no
# Заборонити вхід за паролем
PasswordAuthentication no
# Дозволити лише автентифікацію за ключем
PubkeyAuthentication yes
Збережіть зміни (Ctrl+O, Enter) та вийдіть (Ctrl+X). Перезапустіть SSH-сервер:
sudo systemctl restart sshd
Важливо: Переконайтеся, що ви можете увійти під новим користувачем з SSH-ключем, перш ніж закривати поточну сесію!
4. Налаштування файрволу (UFW)
Uncomplicated Firewall (UFW) — це простий у використанні інтерфейс для iptables. Налаштуємо його, щоб дозволити лише необхідні порти.
# Дозволяємо SSH (порт 22, якщо ви його не змінювали)
sudo ufw allow OpenSSH
# Дозволяємо HTTP (порт 80)
sudo ufw allow http
# Дозволяємо HTTPS (порт 443)
sudo ufw allow https
# Вмикаємо файрвол
sudo ufw enable
# Перевіряємо статус файрволу
sudo ufw status
Вивід sudo ufw status має показати, що SSH, HTTP та HTTPS дозволені.
5. Встановлення Fail2ban
Fail2ban сканує логи та блокує IP-адреси, що показують ознаки шкідливої активності (наприклад, багаторазові невдалі спроби входу через SSH).
# Встановлюємо Fail2ban
sudo apt install fail2ban -y
# Копіюємо файл конфігурації за замовчуванням
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Запускаємо та вмикаємо Fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Перевіряємо статус
sudo systemctl status fail2ban
Fail2ban за замовчуванням захищає SSH. Ви можете налаштувати його для захисту інших сервісів, відредагувавши /etc/fail2ban/jail.local.
6. Встановлення базових утиліт
Встановимо кілька корисних утиліт, які знадобляться в процесі налаштування та моніторингу.
sudo apt install curl wget git htop net-tools -y
Тепер ваш сервер готовий до встановлення основного ПЗ.
Встановлення ПЗ — покроково
Для зручності розгортання та керування ми будемо використовувати Docker та Docker Compose. Це дозволить ізолювати Keycloak та PostgreSQL, спростити їх оновлення та конфігурацію. Усі версії актуальні для 2026 року.
1. Встановлення Docker
Встановимо Docker Engine на Ubuntu.
# Удаляем старые версии Docker, если есть
for pkg in docker.io docker-doc docker-compose docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; do sudo apt remove $pkg; done
# Устанавливаем необходимые пакеты
sudo apt install ca-certificates curl gnupg lsb-release -y
# Добавляем официальный GPG ключ Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Добавляем репозиторий Docker в APT
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Обновляем список пакетов и устанавливаем Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# Добавляем текущего пользователя в группу docker для работы без sudo
sudo usermod -aG docker youruser
Вийдіть з поточної SSH-сесії та увійдіть заново, щоб зміни в групах набули чинності. Перевірте встановлення Docker:
docker run hello-world
Якщо ви бачите вітальне повідомлення від Docker, встановлення пройшло успішно.
2. Встановлення Caddy (зворотний проксі та TLS)
Caddy — це потужний, простий у налаштуванні веб-сервер, який автоматично отримує та поновлює TLS-сертифікати з Let's Encrypt. Це значно спрощує налаштування HTTPS.
# Устанавливаем необходимые пакеты
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
# Добавляем официальный GPG ключ Caddy
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
# Добавляем репозиторий Caddy в APT
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
# Обновляем список пакетов и устанавливаем Caddy
sudo apt update
sudo apt install caddy -y
# Проверяем статус Caddy
sudo systemctl status caddy
Caddy буде встановлено як системна служба, але ми поки не будемо його налаштовувати, це буде зроблено пізніше.
3. Створення Docker Compose файлу для Keycloak та PostgreSQL
Створимо директорію для проєкту Keycloak та файл docker-compose.yml.
mkdir keycloak-sso
cd keycloak-sso
nano docker-compose.yml
Вставте наступний вміст. Використовуємо Keycloak 25.0.0 та PostgreSQL 17.
version: '3.8'
services:
keycloak:
image: quay.io/keycloak/keycloak:25.0.0 # Актуальна версія Keycloak
container_name: keycloak
environment:
KEYCLOAK_ADMIN: admin # Ім'я адміністратора Keycloak
KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD} # Пароль адміністратора (буде взято з .env)
KC_DB: postgres # Використовуємо PostgreSQL
KC_DB_URL: jdbc:postgresql://db:5432/keycloak # URL бази даних
KC_DB_USERNAME: keycloak # Користувач БД
KC_DB_PASSWORD: ${KEYCLOAK_DB_PASSWORD} # Пароль БД (буде взято з .env)
KC_HOSTNAME: ${KEYCLOAK_HOSTNAME} # Доменне ім'я Keycloak (буде взято з .env)
KC_PROXY: edge # Важливо для роботи через зворотний проксі
KC_HTTP_ENABLED: 'true' # Keycloak буде слухати HTTP для проксі
KC_HTTP_PORT: 8080 # Порт, на якому Keycloak слухає HTTP
KC_HEALTH_ENABLED: 'true' # Вмикаємо Health Check
KC_METRICS_ENABLED: 'true' # Вмикаємо метрики
JAVA_OPTS_APPEND: -Dquarkus.log.level=INFO -Dquarkus.log.category."org.keycloak".level=INFO # Налаштування логування
ports:
- "8080:8080" # Внутрішній порт Keycloak, проксується Caddy
volumes:
- ./keycloak-data:/opt/keycloak/data # Персистентне зберігання даних Keycloak
command: start --optimized --hostname-strict=false # Запуск Keycloak в оптимізованому режимі
depends_on:
db:
condition: service_healthy
restart: always
db:
image: postgres:17-alpine # Актуальна версія PostgreSQL
container_name: keycloak-db
environment:
POSTGRES_DB: keycloak # Ім'я бази даних
POSTGRES_USER: keycloak # Користувач бази даних
POSTGRES_PASSWORD: ${KEYCLOAK_DB_PASSWORD} # Пароль бази даних (буде взято з .env)
volumes:
- ./postgres-data:/var/lib/postgresql/data # Персистентне зберігання даних БД
healthcheck: # Перевірка працездатності БД
test: ["CMD-SHELL", "pg_isready -U keycloak"]
interval: 5s
timeout: 5s
retries: 5
restart: always
Збережіть файл (Ctrl+O, Enter) та вийдіть (Ctrl+X).
4. Створення файлу .env
Для зберігання секретних даних та доменного імені створимо файл .env.
nano .env
Вставте наступний вміст, замінивши заповнювачі на ваші реальні значення:
KEYCLOAK_ADMIN_PASSWORD=YourStrongAdminPassword123! # Змініть на складний пароль
KEYCLOAK_DB_PASSWORD=YourStrongDBPassword456! # Змініть на складний пароль для БД
KEYCLOAK_HOSTNAME=auth.yourdomain.com # Замініть на ваш домен для Keycloak (наприклад, keycloak.example.com)
Важливо: Переконайтеся, що ви використовуєте дуже надійні паролі і що доменне ім'я auth.yourdomain.com (або будь-яке інше, яке ви обрали) вже вказує на IP-адресу вашого VPS у DNS-записах.
5. Запуск Keycloak та PostgreSQL
Тепер можна запустити контейнери за допомогою Docker Compose.
docker compose up -d
Ця команда запустить Keycloak та PostgreSQL у фоновому режимі. Docker Compose спочатку створить мережі та томи, потім запустить контейнер PostgreSQL, дочекається його готовності (healthcheck), а потім запустить Keycloak.
Перевірте статус контейнерів:
docker compose ps
Обидва контейнери повинні бути в стані "running".