OpenLDAP安装使用及与各系统的集成

OpenLDAP安装使用及与各系统的集成

公司内部运行着各个系统,如:jira、jenkins、svn、gitlab等等,每次有新同事入职,运维人员都需要在各个系统中添加或者删除用户,非常的不方便。为了解决频繁去各个系统中创建和删除账号,决定使用ldap集成各个系统,实现账号密码统一管理。如果有兴趣可以看看关于ldap的介绍,也可以跳过直接搭建使用,然后基本就理解ldap是个什么东西了

注意:在命令中以#开头的信息为使用root用户执行的命令,其他信息为命令执行后的输出内容。

一、LDAP介绍

在安装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安装及使用

目前有很多LDAP类型的服务可供选择安装,比如:Microsoft Active DirectoryApache Directory ServerApple Open DirectoryOpenDSOpenLDAP等等。这里进介绍OpenLDAP在CentOS7操作系统的安装。

2.1 安装OpenLDAP

使用以下命令安装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

2.2 配置OpenLDAP

OpenLDAP配置比较复杂牵涉到的内容比较多,接下来我们一步一步对其相关的配置进行介绍。

注意:从OpenLDAP2.4.23版本开始所有配置数据都保存在/etc/openldap/slapd.d/中,建议不再使用slapd.conf作为配置文件。

2.2.1 生成OpenLDAP管理员密码
slappasswd -s 123456
{SSHA}Sd7/JTu1JOG4iyLgo63zq7KU/9PQTfDj

我们得到了一个加密后的字符串。记住它!在后面我们会用到。

2.2.2 修改配置文件olcDatabase={2}hdb.ldif

对于这个文件,我们新增一行olcRootPW,然后分别修改了olcSuffixolcRootDN的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这只的密码,这里只能填写加密后的字符
2.2.3 修改配置文件

在这个文件中,我们仅修改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
2.2.4 验证OpenLDAP的配置
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

忽略前两行的错误信息,当出现最后一行信息,说明检测通过。

2.2.5 启动openldap服务
systemctl enable slapd --now

启动后校验服务状态

systemctl status slapd
ss -atnpl | grep 389
2.2.6 OpenLDAP数据库配置

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数据库默认存储的路径。

2.2.7 导入基本Schema
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
2.2.8 修改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;
2.2.9 添加基本目录
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
2.2.10 查询LDAP全部信息
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
2.2.11 开启OpenLDAP日志记录

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
2.2.12 LDAP管理工具使用(LDAP Admin)

LDAP Admin是一款优秀的LDAP管理工具,官方网站提供各个版本的下载http://www.ldapadmin.org/download/ldapadmin.html,解压后双击就可以使用

  1. 点击左边的Connect按钮
  2. 双击New connect图标
  3. connection name为这个连接的名称(随意)
  4. host填写OpenLDAP服务器地址,Port为默认的端口389
  5. 点击Fetch DNs,左边的Base会出现LDAP的dc信息
  6. 在Account项,填写前面创建的用户名admin和密码123456
  7. 点击Test connection测试连接,测试通过后就可以进行管理了。
    OpenLDAP安装使用及与各系统的集成_第1张图片

三、LDAP与各系统的集成

Subversion集成

在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:定义验证方式,这里同时使用ldapfile的方式,当ldap找不到的用户,会使用file中的用户进行验证,如果file在前面,则优先使用file的用户
  • AuthLDAPBindDN:LDAP管理员的用户名
  • AuthLDAPBindPassword:LDAP管理员的密码
  • AuthLDAPURL:LDAP的连接信息

集成完成后,重启httpd服务,建议分别在认证文件和LDAP中创建相同的用户,密码设置为不同,调整配置进行验证。

Gitlab集成

为确保万无一失,强烈建议在操作前对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集成

与JIRA的集成可以直接在Web界面操作。

  1. 使用管理员登录Jira。
  2. 依次点击’管理’-‘用户管理’,然后点击左下角的’用户目录’
  3. 点击’添加目录’,目录类型选择’LDAP’

服务器设置

名称:[随意]

目录类型: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

数据恢复

  1. 停止OpenLDAP服务
systemctl stop slapd
  1. 清理已有的配置(在原服务器上恢复,这个步骤可以跳过)
rm -rf /etc/openldap/slapd.d/*
  1. 清理已有数据
rm -rf /var/lib/ldap/*
  1. 恢复配置(如果前面清理了已有配置,需要恢复配置)
slapadd -n 0 -F /etc/openldap/slapd.d -l config.ldif 

-F 指定了配置目录,在旧的版本中,一般会使用-f参数指定配置文件/etc/openldap/slapd.conf

  1. 恢复数据
slapadd -n 2 -l database.ldif
  1. 为相关目录设置正确权限
chown -R ldap:ldap /var/lib/ldap /etc/openldap/slapd.d
  1. 启动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

你可能感兴趣的:(linux,jira,运维,devops)