沫延说
沫延说

基于OpenLDAP的Keycloak SSO系统搭建

前言

本案例详细记录基于OpenLDAP的Keycloak企业SSO系统搭建。

环境

AliCloud ECS

CentOS 8

已安装EPEL源

 

搭建

OpenLDAP

yum install openldap openldap-clients openldap-servers

 

执行完毕后系统会新增一个ldap用户,可通过命令tail -n 1 /etc/passwd来查看

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG
systemctl start slapd

 

复制示例配置文件到指定位置,并调整隶属用户

启动slapd,slapd是OpenLDAP的守护程序。

通过命令systemctl status slapd查看其运行状态,如运行正常则使用enable选项加入开机自启动

systemctl enable slapd

 

至此OpenLDAP已经部署完成,配置我们放到后面说。

 

Keycloak

首先需要检测一下java版本:

java -version

如果回显为未找到命令即可继续执行,如果有java版本号的回显,则可能当前主机中存在其他依赖java的软件,此类事物处理不在本文讨论范围,请自行排除依赖冲突

yum install java-latest-openjdk
wget https://github.com/keycloak/keycloak/releases/download/[版本号]/keycloak-[版本号].zip
unzip keycloak-[版本号].zip

请根据所需版本下载对应压缩包,一般情况下源码可以放置在/usr/local/src文件夹中,命令中没有体现,可以使用mv命令移动,软件可以放置在/opt或者/usr/local下,前者类似于windows系统下的非系统盘软件安装目录,后者类似于系统目录下的Program Files文件夹

 

配置

OpenLDAP

调整OpenLDAP(后简称“LDAP”)配置需要编写LDIF文件,格式如下:

# 注释
dn: 条目名
属性描述: 值
属性描述: 值

首先我们需要通过命令生成一个密码,用作LDAP的管理密码

New password:
Re-enter new password:
{SSHA}4BU3pf************************TJ

将{SSHA}开头的密码保存备用

使用vi命令新建一个名为“SetRootPW.ldif”的文件,内容如下(将上一步生成的密码替换至“olcRootPW”):

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}4BU3pf************************TJ

执行命令将信息导入

ldapadd -Y EXTERNAL -H ldapi:/// -f SetRootPW.ldif

执行命令将程序自带的各类规则导入

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/core.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif

使用vi命令新建一个名为“SetDomain.ldif”的文件,配置组织单位信息并配置名为admin的管理员,内容如下(将之前生成的密码替换至“olcRootPW”,将”topstalk”替换为自己的域名或公司):

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=topstalk,dc=com" read by * none

dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=topstalk,dc=com

dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=topstalk,dc=com

dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}4BU3**************************TJ

dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=topstalk,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=topstalk,dc=com" write by * read

 

执行命令导入:

ldapmodify -Y EXTERNAL -H ldapi:/// -f SetDomain.ldif

使用vi命令新建一个名为“basedomain.ldif”的文件,将刚才创建的admin管理员配置管理权限并创建两个组织,其中一个为部门,一个为人员,内容如下(将”topstalk”替换为自己的域名或公司):

dn: dc=topstalk,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: Topstalk
dc: topstalk

dn: cn=admin,dc=topstalk,dc=com
objectClass: organizationalRole
cn: Manager

dn: ou=People,dc=topstalk,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Department,dc=topstalk,dc=com
objectClass: organizationalUnit
ou: Department

执行命令导入:

ldapadd -x -D cn=admin,dc=topstalk,dc=com -W -f basedomain.ldif

至此可以看出手动维护LDAP是比较困难的,因此我们需要一个可视化界面,执行命令安装:

yum install phpldapadmin

该程序基于apache+PHP的组合,因此需要配置apache允许外部访问,编辑/etc/httpd/conf.d/phpldapadmin.conf

Require local

变更为

Require all granted

以允许所有人访问,当然您可能有进阶设置,例如配置指定ip地址访问:

Require ip 192.168.0.100

编辑phpldapadmin配置文件/etc/phpldapadmin/config.php

您可能需要了解php语言的语言结构,因为其配置文件并没有那么利于编辑,如果不能正确配置,您可能会遇到配置无法生效甚至程序无法正常运行的错误:

1.将$servers>setValue(‘login’,‘anon_bind’,true);的true调整为false关闭匿名登陆功能

2.将$servers>setValue(‘login’,‘attr’,‘dn’);的dn调整为cn避免使用复杂的dn登陆

3.将$servers>setValue(‘unique’,‘attrs’,array(‘mail’,‘uid’,‘uidNumber’));的array中增加cn和sn以防止cn和sn有重复值

调整完成后启动apache服务并开启开机自启动服务:

systemctl start httpd
systemctl enable httpd

该服务占用80端口,您可能需要自行配置https服务或使用负载均衡、WAF等设备进行代理

 

Keycloak

使用命令配置环境变量,使程序运行时创建管理员账户:

export KEYCLOAK_ADMIN=<username>
export KEYCLOAK_ADMIN_PASSWORD=<password>

进入Keycloak目录(后文按存放在/usr/local/keycloak下)的conf目录,调整配置文件keycloak.conf

对数据库、代理模式、主机域名等信息进行配置,例如如果您的系统前置有WAF、负载均衡、CDN等设备,可能需要根据情况配置proxy选项,具体配置因人而异,可参考官方文档进行了解。

随后在Keycloak目录执行命令启动:

bin/kc.sh start

服务占用8080端口,与phpldapadmin一样,您可能需要自行配置https服务或使用负载均衡、WAF等设备进行代理

服务在前端运行,退出ssh或发生任何意外您的业务可能会中断,为此您需要将启动命令变为服务,使用ctrl+c(mac中为control+c)中断Keycloak后,使用vi新建并编辑文件/usr/lib/systemd/system/Keycloak.service,内容如下:

[Unit]
Description=Keycloak Service
After=network.target

[Service]
Type=idle
User=root
Group=root
ExecStart=/usr/local/keycloak/bin/kc.sh start
ExecStop=ps -ef | grep keycloak | awk ‘{print $2}’ | xargs kill -9
TimeoutStartSec=90
TimeoutStopSec=90

[Install]
WantedBy=multi-user.target

根据情况不同,您可能需要调整kc脚本文件的路径,随后执行systemctl daemon-reload以重载,并像phpldapadmin的服务一样使用systemctl控制其启动与关闭。

 

OpenLDAP与Keycloak对接

 

 

 

 

 

没有标签
首页      信息安全      SSO      基于OpenLDAP的Keycloak SSO系统搭建

Morton.L

文章作者

发表回复

textsms
account_circle
email


沫延说

基于OpenLDAP的Keycloak SSO系统搭建
前言 本案例详细记录基于OpenLDAP的Keycloak企业SSO系统搭建。 环境 AliCloud ECS CentOS 8 已安装EPEL源   搭建 OpenLDAP yum install openldap openldap-clients o…
扫描二维码继续阅读
2022-11-18