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://127.0.0.1:8080 连接到 Keycloak,另一种是在首次启动时添加用户名和密码环境变量。

要执行后者,覆盖 unit

/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 的配置。(jboss.home.dir 在 Keycloak 包中指的是 /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://127.0.0.1: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://127.0.0.1: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://127.0.0.1:8080/auth/realms/master/metrics 访问

外部链接