跳转至内容

Keycloak

来自 ArchWiki

Keycloak 是一个用 Java 实现的身份管理解决方案,可用作许多不同应用程序的身份验证后端。

本文或本章节已过时。

原因: Keycloak 17 采用了新的配置文件格式。[1](在 Talk:Keycloak#New configuration file format 中讨论)

安装

安装 keycloak 包。

运行

启动/启用 keycloak.service。在默认配置中,它将以独立模式启动,不推荐用于生产环境,但在本文中为了简单起见将使用它。

默认情况下,Keycloak 可通过 http://127.0.0.1:8080/https://127.0.0.1:8443/ 访问。

注意 在 Keycloak 18.0.0 之前,端点分别是 http://127.0.0.1:8080/auth/https://127.0.0.1:8443/auth/

创建管理员用户

根据 上游说明,有两种方法可以创建初始 Keycloak 管理员用户:一种是通过 https://:8080 连接到 Keycloak,另一种是为首次启动设置用户名和密码的环境变量。

要执行后者,请覆盖单元文件

/etc/systemd/system/keycloak.service.d/admin.conf
[Service]
Environment="KEYCLOAK_ADMIN=admin"
Environment="KEYCLOAK_ADMIN_PASSWORD=securepassword"

重新加载 systemd 守护进程,然后重启 keycloak.service

之后,请务必删除覆盖文件并再次重新加载守护进程,因为当账户已存在时,Keycloak 将拒绝启动已定义环境变量的服务。

配置

默认的独立配置文件位于 /etc/keycloak/standalone.xml

在服务器运行时对此文件进行的任何更改都不会生效,甚至可能被服务器覆盖。请提前停止服务,使用命令行脚本,或使用 WildFly 的 Web 控制台。

服务使用的端口可以在该文件中找到,尽管格式有些不寻常。

/etc/keycloak/standalone.xml
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
        <socket-binding name="http" port="${jboss.http.port:8080}"/>
        <socket-binding name="https" port="${jboss.https.port:8443}"/>   
        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>

H2 配置

Keycloak 的 standalone.xml 文件预配置了两个 h2 数据源。一个是“ExampleDS”,可以安全删除。另一个是“KeycloakDS”,用于存储 Keycloak 的配置。(在 Keycloak 包中,jboss.home.dir 指的是 /opt/keycloak

H2 基于文件的数据库示例配置部分

/etc/keycloak/standalone.xml
        <subsystem xmlns="urn:jboss:domain:datasources:5.0">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
                    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
                <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
                    <connection-url>jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
                <drivers>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>
   ...
            <default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/KeycloakDS" managed-executor-service="java:jboss/ee/concurrency/executor/default" managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default" managed-thread-factory="java:jboss/ee/concurrency/factory/default"/>

PostgreSQL 配置

官方 Arch Linux Keycloak 包已内置 PostgreSQL 支持。

PostgreSQL 示例配置部分

/etc/keycloak/standalone.xml
        <subsystem xmlns="urn:jboss:domain:datasources:5.0">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
                    <connection-url>jdbc:postgresql://:5432/keycloak</connection-url>
                    <driver>postgresql</driver>
                    <security>
                        <user-name>keycloak</user-name>
                        <password>keycloak</password>
                    </security>
                </datasource>
                <drivers>
                    <driver name="postgresql" module="org.postgresql">
                        <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>
   ...
            <default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/KeycloakDS" managed-executor-service="java:jboss/ee/concurrency/executor/default" managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default" managed-thread-factory="java:jboss/ee/concurrency/factory/default"/>

Keycloak Prometheus 指标

安装 keycloak-metrics-spi 包。要启用指标监听器端点:

 /opt/keycloak/bin/kcadm.sh config credentials --server https://:8080/auth --realm master --user $KEYCLOAK_ADMIN --password $KEYCLOAK_PASS
 /opt/keycloak/bin/kcadm.sh update events/config -s "eventsEnabled=true" -s "adminEventsEnabled=true" -s "eventsListeners+=metrics-listener"

config 命令会在运行命令的用户的主目录下的 .keycloak 目录中创建一个 kcadm.config 文件。由于其中包含访问令牌,建议之后删除该文件。

 rm /home/$USER/.keycloak/kcadm.config

重启后,可以通过 https://:8080/auth/realms/master/metrics 访问指标。