前言
本案例详细记录基于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对接
发表回复