Перейти к основному содержимому
  1. Статьи/

Установка и настройка Keycloak

·453 слов·3 минут· loading · loading · ·
Обзоры Безопасность Установка Аутентификация
Stilicho2011
Автор
Stilicho2011
Site owner
IAM-решения - This article is part of a series.
Part : This Article

то такое Keycloak
#

Keycloak — это open-source решение для управления идентификацией и доступом (IAM) с поддержкой SSO (Single Sign-On), OAuth2, OpenID Connect, SAML 2.0 и других стандартов. Оно часто используется DevOps- и enterprise-средой (де-факто стандарт в крупном энтерпрайзе) для централизованной аутентификации и авторизации пользователей в приложениях.


Зачем нужен Keycloak
#

Keycloak позволяет централизованно управлять аутентификацией пользователей:

  • Единый вход (SSO) для всех приложений
  • Поддержка внешних провайдеров (Google, GitHub и др.)
  • Подключение LDAP и Active Directory
  • Удобная админка
  • OpenID Connect и OAuth 2.0

Что понадобится
#

  • Docker + Docker Compose
  • Обратный прокси (Traefik)
  • Домен с настройкой DNS (auth.example.ru)
  • SSL-сертификат (через Let’s Encrypt)

Возможности Keycloak
#

Аутентификация и авторизация
#

  • Single Sign-On (SSO) — единый вход во все подключенные приложения.

  • Поддержка социальных логинов — Google, Facebook, GitHub и др.

  • Поддержка стандартов — OAuth2, OpenID Connect, SAML 2.0.

  • Поддержка MFA (многофакторная аутентификация) — TOTP (Google Authenticator и аналоги).

Управление пользователями и ролями
#

  • Создание и управление пользователями, группами и ролями.

  • Делегированное администрирование (разграничение доступа между администраторами).

  • Импорт и экспорт пользователей (LDAP, CSV, REST API).

Интеграция с корпоративной инфраструктурой
#

  • Интеграция с LDAP / Active Directory.

  • SCIM-подобные возможности через REST API.

  • Поддержка клиента CLI и Admin REST API.

Multi-tenancy и реалмы
#

  • Поддержка множественных реалмов (изолированных доменов аутентификации).

  • Каждый реалм имеет свои настройки, пользователей, клиентов и политик.

Кастомизация
#

  • Кастомизация UI экранов входа и регистрации.

  • Расширяемость через Java SPI/плагины.

  • Локализация интерфейса.

Аудит и безопасность
#

  • Аудит логов входа и действий.

  • Настраиваемые политики паролей.

  • Поддержка ограничений IP, блокировка по IP, brute-force защита.

Docker compose файл, который используется в ролике
#

services:
    postgres:
        image: postgres:16-alpine
        container_name: keycloak-db
        restart: always
        expose:
            - 5432
        volumes:
            - /home/pathto/docker/keycloak/database:/var/lib/postgresql/data
        environment:
            POSTGRES_DB: ${POSTGRES_DB}
            POSTGRES_USER: ${POSTGRES_USER}
            POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
        healthcheck:
            test:
                [
                    "CMD",
                    "pg_isready",
                    "-q",
                    "-d",
                    "${POSTGRES_DB}",
                    "-U",
                    "${POSTGRES_USER}",
                ]
            interval: 10s
            timeout: 5s
            retries: 3
            start_period: 60s
        networks:
            - keycloak

    keycloak:
        image: quay.io/keycloak/keycloak
        container_name: keycloak
        command: start
        environment:
            KC_HOSTNAME: ${KEYCLOAK_HOSTNAME}
            KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN}
            KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
            KC_DB: postgres
            KC_DB_URL: jdbc:postgresql://postgres/${POSTGRES_DB}
            KC_DB_USERNAME: ${POSTGRES_USER}
            KC_DB_PASSWORD: ${POSTGRES_PASSWORD}
            KC_PROXY_HEADERS: "xforwarded"
            KC_HTTP_ENABLED: true
            KC_HEALTH_ENABLED: true
            PROXY_ADDRESS_FORWARDING: "true"
        healthcheck:
            test:
                - "CMD-SHELL"
                - |
                    exec 3<>/dev/tcp/localhost/9000 &&
                    echo -e 'GET /health/ready HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3 &&
                    cat <&3 | tee /tmp/healthcheck.log | grep -q '200 OK'                    
            interval: 10s
            timeout: 5s
            retries: 3
            start_period: 90s
        #ports:
        #  - 8080:8080
        #expose:
        #  - 8080 # web ui http
        #  - 9000 # health endpoint
        restart: always
        depends_on:
            postgres:
                condition: service_healthy
        networks:
            - keycloak
            - proxy
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.keycloak.entrypoints=http"
            - "traefik.http.routers.keycloak.rule=Host(`keycloak.domain.ru`)"
            - "traefik.http.middlewares.keycloak-https-redirect.redirectscheme.scheme=https"
            - "traefik.http.routers.keycloak.middlewares=keycloak-https-redirect"
            - "traefik.http.routers.keycloak-secure.entrypoints=https"
            - "traefik.http.routers.keycloak-secure.rule=Host(`keycloak.domain.ru`)"
            - "traefik.http.routers.keycloak-secure.tls=true"
            - "traefik.http.routers.keycloak-secure.service=keycloak"
            - "traefik.http.services.keycloak.loadbalancer.server.port=8080"
            - "traefik.docker.network=proxy"

networks:
    keycloak:
        internal: true
    proxy:
        external: true

Значения в файле переменных

# define FQDN hostname
KEYCLOAK_HOSTNAME=keycloak.domain.ru

# define login credentials
KEYCLOAK_ADMIN=admin
KEYCLOAK_ADMIN_PASSWORD=password

# define database credentials
POSTGRES_DB=keycloak_db
POSTGRES_USER=keycloak_db_user
POSTGRES_PASSWORD=keycloak_db_user_password

Ссылки
#

IAM-решения - This article is part of a series.
Part : This Article