keycloak集群

安装步骤

下文采用的主备模式

下载

下载keycloak:
https://downloads.jboss.org/keycloak/6.0.1/keycloak-6.0.1.tar.gz
下载keycloak-gatekeeper:
#用于代理kibana,prometheus
https://downloads.jboss.org/keycloak/6.0.1/gatekeeper/keycloak-gatekeeper-linux-amd64.tar.gz
下载驱动:
#MySQL Server 8.0, 5.7, and 5.6
http://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.13/mysql-connector-java-8.0.13.jar

安装Keycloak

基础安装

安装mariadb数据库服务,创建数据库keycloak

安装Nginx

安装keycloak的机器需要安装JDK1.8

Keycloak配置

注:通过以下步骤配置两台keycloak服务。第6步只需要在一台keycloak机器上完成。第7步是数据库操作。

1.解压keycloak-6.0.1.tar.gz包。

2.创建目录keycloak-6.0.1\modules\system\layers\keycloak\com\mysql\main放入驱动,同时在该目录创建module.xml,内容如下:

<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.3" name="com.mysql">

    <resources>
        <resource-root path="mysql-connector-java-8.0.13.jar"/>
    </resources>

    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.servlet.api" optional="true"/>
    </dependencies>
</module>

3.修改standalone.xml

添加驱动配置,修改数据源配置。配置文件位于keycloak-6.0.1\standalone\configuration

#添加驱动,h2后面添加mysql驱动
<drivers> 
  <driver name="h2" module="com.h2database.h2"> 
    <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class> 
  </driver>  
  <driver name="mysql" module="com.mysql"> 
    <xa-datasource-class>com.mysql.cj.jdbc.MysqlXADataSource</xa-datasource-class> 
  </driver> 
</drivers>

#创建数据库keycloak,修改数据源配置,用户名密码要正确
<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:mysql://localhost:3306/keycloak?useSSL=false&amp;serverTimezone=GMT%2B8&amp;characterEncoding=UTF-8</connection-url>  
  <driver>mysql</driver>  
  <security> 
    <user-name>root</user-name>  
    <password>root</password> 
  </security> 
</datasource>

#注释掉h2数据源配置
<!--
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
<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>
-->

#通过配置jndi-name配置数据源,如java:jboss/datasources/KeycloakDS和上面的一致即可,默认一致
<provider name="default" enabled="true"> 
  <properties> 
    <property name="dataSource" value="java:jboss/datasources/KeycloakDS"/>  
    <property name="initializeEmpty" value="false"/>  
    <property name="migrationStrategy" value="manual"/>  
    <property name="migrationExport" value="${jboss.home.dir}/keycloak-database-update.sql"/> 
  </properties> 
</provider>

4.配置内存

#通过bin/standalone.conf修改jvm内存。
JAVA_OPTS="-Xms256m -Xmx1024m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=512m -Djava.net.preferIPv4Stack=true"

5.启动

可以通过查看standalone.xmlsocket-binding-group部分查看相关端口,会启动好几个端口,偏移量可以对端口全部偏移:

http默认端口8080,偏移100,实际访问8180。

bin/standalone.sh --server-config=standalone.xml  -Djboss.socket.binding.port-offset=100 -Djboss.bind.address=0.0.0.0 &

6.添加初始化用户

#如果是有多台keycloak,则只需要在一台初始化admin用户,重启配置的这台,密码可以复杂点
./add-user-keycloak.sh -r master -u admin -p admin

7.配置http模式

配置http模式:
通过访问数据库执行:update REALM set ssl_required='NONE' where id = 'master';
注:如果认证访问keycloak采用公网ip,一定需要执行该sql,可能需要重启keycloak,否则会采用https访问。

keycloak集群

1.集群配置

修改两台keycloak服务配置,修改standalone\configuration\standalone.xml配置文件中urn:jboss:domain:undertow:中的X-Forwarded-For HTTP Config。将属性proxy-address-forwarding添加到http-listener元素。将值设置为true。

<subsystem xmlns="urn:jboss:domain:undertow:9.0">
   <buffer-cache name="default"/>
   <server name="default-server">
      <ajp-listener name="ajp" socket-binding="ajp"/>
      <http-listener name="default" socket-binding="http" redirect-socket="https"
          proxy-address-forwarding="true"/>
      ...
   </server>
   ...
</subsystem>

2.配置conf/nginx.conf,启动nginx

其中server1:8180server2:8180keycloak服务,以主备方式提供服务。(注:一定要以主备方式提供服务,不然会遇到很多问题)

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    upstream keycloak_servers {
        server server1:8180 max_fails=2  fail_timeout=3s;
        server server2:8180 backup;
    }

    server {
        listen 80;

        location / {
            proxy_pass          http://keycloak_servers/;
            proxy_set_header    Host               $host;
            proxy_set_header    X-Real-IP          $remote_addr;
            proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Host   $host;
            proxy_set_header    X-Forwarded-Server $host;
            proxy_set_header    X-Forwarded-Port   $server_port;
            proxy_set_header    X-Forwarded-Proto  $scheme;
        }

    }
}

3.重启keycloaknginx服务,可以通过nginx代理服务访问keycloak

后面使用keycloak时都需要配置代理地址。

集成keycloak

基础配置

1.配置中文

将master域设置成中文。

访问 Keycloak 服务,点击页面中的“Administration Console“,进入 Keycloak 登录页面,输入创建好的 Keycloak 的管理员账户,登录 Keycloak。您可以通过以下方式切换 Keycloak 的语言环境,默认为英文,该示例中,将语言切换至中文:

点击左侧导航栏中的“Realm Settings”,在右侧页面选择“Themes”选项卡,其中,“Login Theme”项、“Account Theme”项、“Admin Console Theme”项、“Email Theme”项全部选择“keycloak”,“Internationalization Enabled”项选择“ON”,开启国际化,“Default Locale”选择“zh-CN”,最后点击“Save”按钮。

此时,管理员登出,在 Keycloak 的登录页面会显示语言切换项,可能已经显示“中文简体”,还是要点一次选择“中文简体”,登录 Keycloak

2.添加域

Keycloak默认的域为 Master,您可以使用默认的 Master 域,也可以新添加一个域。鼠标移动到左侧导航栏 Master 域名上,在下拉按钮中点击“添加域”,输入域名称,例如:sso,点击“创建”按钮,此时,进入到新创建的 sso,进行以下配置。需要注意的是,域和域之间的资源(包括用户、角色、客户端等一切信息)是相互隔离的。

按第1点的方式将sso域设置成中文。

注:如果采用的http方式,需要SSL需要设置成无,不然会出现required SSL之类错误。

3.添加客户端模板

添加‘客户端模板’,所有需要单点的系统共用一个模块进行安全控制。

(1).创建名称为sso-scope的‘客户端模板’

(2).在其下创建名称为Client-audience的Mappers。(如果存在多个应用,只要该域下面有新增客户端,那就需要在此处添加)

设置映射器类型:Audience

Included Client Audience: client (选择应用)

添加到ID令牌:开

添加访问到令牌:开

全局配置:通过点击'客户端模板'tab项Default Client Scopes

在Default Client Scopes 项,添加Available Client Scopes 中的client-scope到Assigned Default Client Scopes中。

注意:通过全局配置配置时,在客户端模板创建前,创建的客户端不会自动添加该模板,需要手动添加。

4.添加客户端

左侧导航栏选择“客户端”,在右侧页面点击“创建”按钮,添加客户端。添加客户端记得配置如下:

客户端Id(自定义值)

根URL (自定义值)

授权已启用:开

注:客户端使用的secret在凭证功能。

5.添加用户

Keycloak 允许直接由管理员添加用户与开放用户注册两种方式进行用户的添加。

<font color=red>注:创建用户时邮箱输入栏没有为必填,一定要添加邮箱地址,不然会影响登录。</font>

6.配置域token超时

配置使用域sso中Tokens,设置框中的两个属性与“SSO会话最长时间”项值一样,避免使用过程中过期时间太短。

token.png

7.配置ldap(需要支持ldap用户认证时使用)

打开“用户联合”,通过添加提供程序配置ldap

http://tech.bejond.org/2018/07/18/Keycloak配置LDAP-Active-Directory/
ldap_config.png

Keycloakgrafana集成

grafanakeycloak共用了同一个mysql数据库服务,创建数据库grafana

Keycloak配置

@ 登录Keycloak后台

@ Add Realm,Name为sso

@ 创建Client,Name为grafanagrafana默认端口是3000, 因此Root URL填写http://ip:3000

@ 打开Credentials,留存Secret,用于稍后配置grafana.ini

@ 到Users模块创建用户,用户必须填邮箱,保存后需要设置密码,同时“临时”关闭。

update_password.png
grafana配置

可以直接修改conf/defaults.ini文件,也可以通过复制conf/sample.ini创建conf/custom.ini,然后修改conf/custom.ini配置文件(不同环境不同安装方式,配置文件名称可能不一样)。

1.配置[server]

设置回调根URL地址,默认为http://localhost:3000,根据实际填写回调根URL:

root_url=http://192.168.1.12:3000

2.配置[auth.generic_oauth]

keycloak相关信息,具体配置值以实际为准。

[auth.generic_oauth]
enabled = true
name = {sso}
allow_sign_up = true
client_id = {grafana}
client_secret = {1e917797-ce0f-495c-97c4-0d3320781e73}
scopes = openid email name
auth_url = http://{localhost:8180}/auth/realms/{SSO}/protocol/openid-connect/auth
token_url = http://{localhost:8180}/auth/realms/{SSO}/protocol/openid-connect/token
api_url =  http://{localhost:8180}/auth/realms/{SSO}/protocol/openid-connect/userinfo

配置说明,{}中是需要根据实际情况调整:

URL中ssokeycloak中创建的域名称。

enabled是否启动支持该认证。

name域名称。

登录成功后是否能注册账号到grafana

client_id为对应客户端名称。

client_secret为对应客户端grafana的凭证中的secret值。

localhost:8180 应该是实际keycloak的地址。

例子如下:

[auth.generic_oauth]
enabled = true
name = SSO
allow_sign_up = true
client_id = grafana
client_secret = 1e917797-ce0f-495c-97c4-0d3320781e73
scopes = openid email name
auth_url = http://localhost:8180/auth/realms/SSO/protocol/openid-connect/auth
token_url = http://localhost:8180/auth/realms/SSO/protocol/openid-connect/token
api_url =  http://localhost:8180/auth/realms/SSO/protocol/openid-connect/userinfo

3.配置[database]

该配置主要用于集群grafanagrafana数据库配置,grafana是集群需要关系数据库存储配置信息。

注意:如果以前以本地配置的形式运行,后面调整为数据库,会导致本地配置的数据看不到。

[database]
type = mysql
host = localhost:3306
name = grafana
user = root
password = root

配置说明:

type数据库类型。

host数据库地址。

name数据库名称。

user数据库用户名。

password数据库密码。

4.配置[security] (可选)

配置初次启动grafana管理员账号和密码,默认为admin,admin

[security]
admin_user = admin
admin_password = 123456

5.重启grafana服务

再次访问http://ip:3000 ,登录界面能看到"Sign in with sso",点击即跳转到Keycloak登录界面,Realm为sso。使用注册账号登录,登录成功跳转回grafana,实现单点登录。同时grafana会创建同名用户,并存储基本信息,如邮箱。

Gatekeeper集成

Gatekeeper代理方式的一种,kibanaprometheus采用的该方式。下面以kibana为例。

流程
keycloak-kibana.jpg
配置

1.在Keycloaksso下面创建kibana客户端名称为kibana,根url要配置代理地址,如http://ip:5602

注意:根url要配置代理地址

2.在刚才新建的客户端模板sso-scope中Mappers下添加kibana,具体参考基础配置第3点。

3.创建gatekeeper.yml配置文件

listen: {0.0.0.0:5602}
discovery-url: http://{localhost:80}/auth/realms/sso
upstream-url: http://{localhost:5601}

client-id: {kibana}   #和keycloak创建的客户端id一致
client-secret: {d870ea75-fb93-4842-9c35-315ee19c5595} #和keycloak创建的客户端id对应的凭证一致,只有授权已启用开启才会有凭证项
enable-default-deny: true
tokenEncryption: false
secure-cookie: false
encryption_key: AgXa7xRcoClDEAgXaSH4X0XhL5QyAgXa

#验证通过匹配
match-claims:
  aud: {kibana}  #这里有bug,不管配置的值是什么,系统匹配都是的client-id,目前配置成客户端名称
  iss: http://{localhost:80}/auth/realms/sso #如果是集群keycloak,需要配置代理地址  
  
resources:
- uri: /*

{}都是需要根据实际值进行调整。

启动:

openid-provider-timeout尽量配置长点,值单位s,m,h。避免使用过程中莫名奇妙导致一堆错。

keycloak-gatekeeper --openid-provider-timeout 12h --config gatekeeper.yml &
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容