安装步骤
下文采用的主备模式
下载
下载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.xml
中socket-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:8180
和server2:8180
为keycloak
服务,以主备方式提供服务。(注:一定要以主备方式提供服务,不然会遇到很多问题)
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.重启keycloak
和nginx
服务,可以通过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会话最长时间”项值一样,避免使用过程中过期时间太短。
7.配置ldap(需要支持ldap
用户认证时使用)
打开“用户联合”,通过添加提供程序配置ldap
。
http://tech.bejond.org/2018/07/18/Keycloak配置LDAP-Active-Directory/
Keycloak
和grafana
集成
grafana
和keycloak
共用了同一个mysql
数据库服务,创建数据库grafana
。
Keycloak
配置
@ 登录Keycloak
后台
@ Add Realm,Name为sso
@ 创建Client,Name为grafana
,grafana
默认端口是3000, 因此Root URL填写http://ip:3000
@ 打开Credentials,留存Secret,用于稍后配置grafana.ini
。
@ 到Users模块创建用户,用户必须填邮箱,保存后需要设置密码,同时“临时”关闭。
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中sso
为keycloak
中创建的域名称。
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]
该配置主要用于集群grafana
,grafana
数据库配置,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代理方式的一种,kibana
和prometheus
采用的该方式。下面以kibana
为例。
流程
配置
1.在Keycloak
域sso
下面创建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 &