公司内部运行着各个系统,如:jira、jenkins、svn、gitlab等等,每次有新同事入职,运维人员都需要在各个系统中添加或者删除用户,非常的不方便。为了解决频繁去各个系统中创建和删除账号,决定使用ldap集成各个系统,实现账号密码统一管理。如果有兴趣可以看看关于ldap的介绍,也可以跳过直接搭建使用,然后基本就理解ldap是个什么东西了
注意:在命令中以#
开头的信息为使用root用户执行的命令,其他信息为命令执行后的输出内容。
在安装OpenLDAP之前,我们首先来介绍下LDAP。
LDAP是一款轻量级目录访问协议(Lightweight Directory Access Protocol,简称LDAP),属于开源集中账号管理架构的实现,且支持众多系统版本,被广大互联网公司所采用。
LDAP提供并实现目录服务的信息服务,目录服务是一种特殊的数据库系统,对于数据的读取、浏览、搜索有很好的效果。目录服务一般用来包含基于属性的描述性信息并支持精细复杂的过滤功能,但OpenLDAP目录服务不支持通用数据库的大量更新操作所需要的复杂的事务管理或回滚策略等。
LDAP具有两个标准,分别是X.500和LDAP。OpenLDAP是基于X.500标准的,而且去除了X.500复杂的功能并且可以根据自我需求定制额外扩展功能,但与X.500也有不同之处,例如OpenLDAP支持TCP/IP协议等,目前TCP/IP是Internet上访问互联网的协议。
OpenLDAP可以直接运行在更简单和更通用的TCP/IP或其他可靠的传输协议层上,避免了在OSI会话层和表示层的开销,使连接的建立和包的处理更简单、更快,对于互联网和企业网应用更理想。
OpenLDAP目录中的信息是以树状的层次结构来存储数据(这很类同于DNS),最顶层即根部称作“基准DN”,形如“dc=mydomain,dc=org”或者“o=mydomain.org”,前一种方式更为灵活也是Windows AD中使用的方式。在根目录的下面有很多的文件和目录,为了把这些大量的数据从逻辑上分开,OpenLDAP像其它的目录服务协议一样使用OU(Organization Unit,组织单元),可以用来表示公司内部机构,如部门等,也可以用来表示设备、人员等。同时OU还可以有子OU,用来表示更为细致的分类。
OpenLDAP中每一条记录都有一个唯一的区别于其它记录的名字DN(Distinguished Name),其处在“叶子”位置的部分称作RDN(用户条目的相对标识名)。如dn:cn=tom,ou=animals,dc=ilanni,dc=com中cn即为RDN,而RDN在一个OU中必须是唯一的。
OpenLDAP默认以Berkeley DB作为后端数据库,BerkeleyDB数据库主要以散列的数据类型进行数据存储,如以键值对的方式进行存储。
BerkeleyDB是一类特殊的面向查询进行优化、面向读取进行优化的数据库,主要用于搜索、浏览、更新查询操作,一般对于一次写入数据、多次查询和搜索有很好的效果。BerkeleyDB不支持事务型数据库(MySQL、MariDB、Oracle等)所支持的高并发的吞吐量以及复杂的事务操作。
目前有很多LDAP类型的服务可供选择安装,比如:Microsoft Active Directory
、Apache Directory Server
、Apple Open Directory
、OpenDS
和OpenLDAP
等等。这里进介绍OpenLDAP
在CentOS7操作系统的安装。
使用以下命令安装openldap
yum install openldap openldap-servers openldap-clients migrationtools -y
查看ldap版本
slapd -VV
@(#) $OpenLDAP: slapd 2.4.44 (Jan 29 2019 17:42:45) $
[email protected]:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
我们可以看到,当前安装的版本为2.4.44
OpenLDAP配置比较复杂牵涉到的内容比较多,接下来我们一步一步对其相关的配置进行介绍。
注意:从OpenLDAP2.4.23
版本开始所有配置数据都保存在/etc/openldap/slapd.d/
中,建议不再使用slapd.conf
作为配置文件。
slappasswd -s 123456
{SSHA}Sd7/JTu1JOG4iyLgo63zq7KU/9PQTfDj
我们得到了一个加密后的字符串。记住它!在后面我们会用到。
olcDatabase={2}hdb.ldif
对于这个文件,我们新增一行olcRootPW
,然后分别修改了olcSuffix
和olcRootDN
的dc值(这不是必须的)。
vim /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
olcSuffix: dc=example,dc=com
olcRootDN: cn=admin,dc=example,dc=com
olcRootPW: {SSHA}Sd7/JTu1JOG4iyLgo63zq7KU/9PQTfDj
cn=admin
:admin表示OpenLDAP管理员的用户名olcRootPW
:表示为管理员admin
这只的密码,这里只能填写加密后的字符在这个文件中,我们仅修改olcAccess
的值,dn.base
是修改OpenLDAP管理员相关信息的
vim /etc/openldap/slapd.d/cn\=config/olcDatabase={1}monitor.ldif
原配置信息
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=Manager,dc=my-domain,dc=com" read by * none
修改为
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=admin,dc=example,dc=com" read by * none
slaptest -u
5f192c7e ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif"
5f192c7e ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif"
config file testing succeeded
忽略前两行的错误信息,当出现最后一行信息,说明检测通过。
systemctl enable slapd --now
启动后校验服务状态
systemctl status slapd
ss -atnpl | grep 389
OpenLDAP默认使用的数据库是BerkeleyDB,现在来开始配置OpenLDAP数据库,使用如下命令:
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap -R /var/lib/ldap
chmod 700 -R /var/lib/ldap
注意:/var/lib/ldap
就是BerkeleyDB数据库默认存储的路径。
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
migrate_common.ph
vim /usr/share/migrationtools/migrate_common.ph +71
分别修改以下信息
$DEFAULT_MAIL_DOMAIN = "example.com";
$DEFAULT_BASE = "dc=example,dc=com";
$EXTENDED_SCHEMA = 1;
cat > /root/basedomain.ldif1 << EOF
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: examplecom
dc: example
dn: cn=admin,dc=example,dc=com
objectClass: organizationalRole
cn: admin
description: Directory Manager
dn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: users
dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups
EOF
写入ldap服务器
ldapadd -x -D cn=admin,dc=example,dc=com -W -f basedomain.ldif
ldapsearch -x -b "dc=example,dc=com" -H ldap:///
以下为输出的ldap信息
# extended LDIF
#
# LDAPv3
# base with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# cesgroup.com
dn: dc=example,dc=com
...
# search result
search: 2
result: 0 Success
# numResponses: 5
# numEntries: 4
OpenLDAP默认是没有启动日志记录功能,在实际使用中为了方便定位问题,我们需要查看日志。
新建一个ldif文件,并导入到OpenLDAP中。
cat > /root/loglevel.ldif << EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF
ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/loglevel.ldif
运行后,我们会看到下面的输出
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
修改rsyslog配置文件,并重启服务
cat >> /etc/rsyslog.conf << EOF
local4.* /var/log/slapd.log
EOF
systemctl restart rsyslog
查看日志
tailf /var/log/slapd.log
LDAP Admin是一款优秀的LDAP管理工具,官方网站提供各个版本的下载http://www.ldapadmin.org/download/ldapadmin.html,解压后双击就可以使用
Connect
按钮New connect
图标connection name
为这个连接的名称(随意)Fetch DNs
,左边的Base会出现LDAP的dc信息admin
和密码123456
Test connection
测试连接,测试通过后就可以进行管理了。在Subversion中,用户和密码通常使用由htpasswd生成的文件,集成LDAP后可以如果LDAP中的用户和SVN原来的用户重复,可以设置验证的优先级
下面的配置文件/etc/httpd/conf.d/subversion.conf
,分别为仅验证认证文件和优先验证LDAP用户(如果LDAP用户不存在再验证认证文件)的配置方式
仅验证认证文件
DAV svn
SVNListParentPath on
SVNParentPath /data/svndata
AuthType Basic
AuthName "Authorization"
AuthUserFile /data/svndata/passwd.conf
AuthzSVNAccessFile /data/svndata/authz.conf
Require valid-user
SSLRequireSSL
优先验证LDAP用户
DAV svn
SVNListParentPath on
SVNParentPath /data/svndata
AuthType Basic
AuthName "Authorization"
AuthUserFile /data/svndata/passwd.conf
AuthzSVNAccessFile /data/svndata/authz.conf
Satisfy all
Require valid-user
AuthBasicProvider ldap file
AuthLDAPBindDN "cn=admin,dc=example,dc=com"
AuthLDAPBindPassword "123456"
AuthLDAPURL "ldap://10.xxx.xxx.2:389/ou=users,dc=example,dc=com?uid?sub?(objectClass=*)"
Options Indexes FollowSymLinks
Order allow,deny
Allow from all
AuthBasicProvider
:定义验证方式,这里同时使用ldap
和file
的方式,当ldap
找不到的用户,会使用file
中的用户进行验证,如果file
在前面,则优先使用file
的用户AuthLDAPBindDN
:LDAP管理员的用户名AuthLDAPBindPassword
:LDAP管理员的密码AuthLDAPURL
:LDAP的连接信息集成完成后,重启httpd服务,建议分别在认证文件和LDAP中创建相同的用户,密码设置为不同,调整配置进行验证。
为确保万无一失,强烈建议在操作前对Gitlab数据进行备份。
我们使用的8.13.3版本的Gitlab,没有尝试其他版本的配置,在集成LDAP前,我们的Gitlab已经运行了一段时间,有一定的用户,这时集成LDAP时需要注意LDAP和之前用户的关联。我们在创建LDAP用户时,邮箱要和Gitlab原帐号的邮箱保持一致,这样Gitlab会自动让这两个帐号进行关联,关联后原来的帐号只能用于网页登录,拉取来吗需要使用LDAP的用户名密码。
下面是gitlab的配置信息
vim /etc/gitlab/gitlab.rb
在最下方添加下面的代码
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main: # 'main' is the GitLab 'provider ID' of this LDAP server
label: 'LDAP'
host: '10.xxx.xxx.2'
port: 389
uid: 'uid'
method: 'plain'
bind_dn: 'cn=admin,dc=example,dc=com'
password: '123456'
verify_certificates: true
active_directory: true
allow_username_or_email_login: true
lowercase_usernames: false
block_auto_created_users: false
base: 'ou=users,dc=example,dc=com'
user_filter: ''
attributes:
username: ['uid', 'userid']
email: ['mail', 'email']
name: 'cn'
first_name: 'givenName'
last_name: 'sn'
## EE only
group_base: ''
admin_group: ''
sync_ssh_keys: false
EOS
测试获取LDAP用户信息
gitlab-rake gitlab:ldap:check
Checking LDAP ...
LDAP: ... Server: ldapmain
LDAP authentication... Success
LDAP users with access to your GitLab server (only showing the first 100 results)
DN: uid=admin,ou=users,dc=example,dc=com uid: admin
DN: uid=zhaiweiwei,ou=users,dc=example,dc=com uid: zhaiweiwei
...
Checking LDAP ... Finished
重新配置Gitlab
gitlab-ctl reconfigure
重启Gitlab
gitlab-ctl restart
集成LDAP后,网页登录时会多出一个LDAP的登录方式,原来的登录方式为Standard
,建议取消Standard
方式登录,因为原用户仅能登录网页版,不能拉取和提交代码。
与JIRA的集成可以直接在Web界面操作。
服务器设置
名称:[随意]
目录类型:OpenLDAP
主机名:10.xxx.xxx.2
端口:389
用户名:cn=admin,dc=example,dc=com
密码:123456
LDAP模式
基本DN:dc=example,dc=com
附加用户DN:ou=users
附加组DN:ou=jira,ou=groups
LDAP权限
高级设置
同步间隔(分钟):5
用户模式设置
用户名属性:uid(默认是cn,以ldap设置为准),可使用2.2.10查看用户信息后决定使用哪个字段作为用户名属性
其他配置保持默认即可
添加后点击"测试并保存",选择一个LDAP用户进行验证,比如"admin",验证通过后,将"LDAP服务器"移动到第一位,这样就会优先验证LDAP的用户了,当LDAP用户不存在才会验证原系统用户。
可以通过slapcat和slapsearch等工具完成数据的备份,这里仅介绍slapcat的使用,除了备份数据外,我们同时将配置备份(方便恢复到其他服务器)。
在备份前,建议关闭ldap server
,实际上我并没有感觉有这个必要,不关闭一样可以备份。
slapcat -n 0 -l /data/ldap/config.ldif
slapcat -n 2 -l /data/ldap/database.ldif
下面是一个简单的备份脚本,可以放到定时任务中,每天备份一次
vim /etc/crontab
# 添加以下定时任务,每天凌晨执行备份
0 0 * * * root /usr/local/bin/ldap_backup.sh
#!/bin/bash
DATE=`date "+%Y%m%d%H%M%S"`
BACKUP_DIR=/opt/ldap
BACKUP_SUBDIR=$BACKUP_DIR/$DATE
BACKUP_FILE=$BACKUP_DIR/${DATE}.tar.gz
DEBUG=1
if [ ! -e $BACKUP_DIR ]; then
mkdir -p $BACKUP_DIR
else
echo "Backup dir already exists."
fi
mkdir $BACKUP_SUBDIR
if [ $DEBUG -ne 0 ]; then
set -x
fi
slapcat -n 0 -l $BACKUP_SUBDIR/config.ldif
slapcat -n 2 -l $BACKUP_SUBDIR/database.ldif
cd $BACKUP_DIR
tar -zcf $BACKUP_FILE $DATE
rm -rf $BACKUP_SUBDIR
OpenLDAP
服务systemctl stop slapd
rm -rf /etc/openldap/slapd.d/*
rm -rf /var/lib/ldap/*
slapadd -n 0 -F /etc/openldap/slapd.d -l config.ldif
-F
指定了配置目录,在旧的版本中,一般会使用-f
参数指定配置文件/etc/openldap/slapd.conf
slapadd -n 2 -l database.ldif
chown -R ldap:ldap /var/lib/ldap /etc/openldap/slapd.d
OpenLDAP
服务systemctl start slapd
ldap filter https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx
https://docs.microsoft.com/zh-cn/windows/win32/adsi/search-filter-syntax?redirectedfrom=MSDN