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,内容如下:




    
        
    

    
        
        
        
    

3.修改standalone.xml

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

#添加驱动,h2后面添加mysql驱动
 
   
    org.h2.jdbcx.JdbcDataSource 
    
   
    com.mysql.cj.jdbc.MysqlXADataSource 
   


#创建数据库keycloak,修改数据源配置,用户名密码要正确
 
  jdbc:mysql://localhost:3306/keycloak?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=UTF-8  
  mysql  
   
    root  
    root 
   


#注释掉h2数据源配置


#通过配置jndi-name配置数据源,如java:jboss/datasources/KeycloakDS和上面的一致即可,默认一致
 
   
      
      
      
     
   

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。


   
   
      
      
      ...
   
   ...

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 允许直接由管理员添加用户与开放用户注册两种方式进行用户的添加。

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

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 &

你可能感兴趣的:(keycloak集群)