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) $mockbuild@x86-01.bsys.centos.org:/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=external,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=external,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: exampledn: cn=admin,dc=example,dc=com
objectClass: organizationalRole
cn: admin
description: Directory Managerdn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: usersdn: 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 <dc=example,dc=com> 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
EOFsystemctl 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测试连接,测试通过后就可以进行管理了。

三、LDAP与各系统的集成

Subversion集成

在Subversion中,用户和密码通常使用由htpasswd生成的文件,集成LDAP后可以如果LDAP中的用户和SVN原来的用户重复,可以设置验证的优先级

下面的配置文件/etc/httpd/conf.d/subversion.conf,分别为仅验证认证文件和优先验证LDAP用户(如果LDAP用户不存在再验证认证文件)的配置方式

仅验证认证文件

<Location /svn>DAV svnSVNListParentPath onSVNParentPath /data/svndataAuthType BasicAuthName "Authorization"AuthUserFile /data/svndata/passwd.conf      AuthzSVNAccessFile /data/svndata/authz.confRequire valid-userSSLRequireSSL
</Location>

优先验证LDAP用户

<Location /svn>DAV svnSVNListParentPath onSVNParentPath /data/svndataAuthType BasicAuthName "Authorization"AuthUserFile /data/svndata/passwd.confAuthzSVNAccessFile /data/svndata/authz.confSatisfy allRequire valid-userAuthBasicProvider ldap fileAuthLDAPBindDN "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 FollowSymLinksOrder allow,denyAllow from all
</Location>
  • 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 serverlabel: 'LDAP'host: '10.xxx.xxx.2'port: 389uid: 'uid'method: 'plain'bind_dn: 'cn=admin,dc=example,dc=com'password: '123456'verify_certificates: trueactive_directory: trueallow_username_or_email_login: truelowercase_usernames: falseblock_auto_created_users: falsebase: 'ou=users,dc=example,dc=com'user_filter: ''attributes:username: ['uid', 'userid']email:    ['mail', 'email']name:       'cn'first_name: 'givenName'last_name:  'sn'## EE onlygroup_base: ''admin_group: ''sync_ssh_keys: false
EOS

测试获取LDAP用户信息

gitlab-rake gitlab:ldap:checkChecking 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: adminDN: 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=1if [ ! -e $BACKUP_DIR ]; thenmkdir -p $BACKUP_DIR
elseecho "Backup dir already exists."
fimkdir $BACKUP_SUBDIRif [ $DEBUG -ne 0 ]; thenset -x
fislapcat -n 0 -l $BACKUP_SUBDIR/config.ldif
slapcat -n 2 -l $BACKUP_SUBDIR/database.ldifcd $BACKUP_DIR
tar -zcf $BACKUP_FILE $DATErm -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

OpenLDAP安装使用及与各系统的集成相关推荐

  1. 烂泥:OpenLDAP安装与配置

    一.OpenLDAP简介 二.初始化环境 三.安装OpenLDAP 四.配置OpenLDAP 4.1 配置OpenLDAP管理员密码 4.2 修改olcDatabase={2}hdb.ldif文件 4 ...

  2. OpenLDAP安装、配置和管理笔记

    目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它成树状结构组织数据,就好象Linux/Unix系统中的文件 目录一样.目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理 ...

  3. 解决“安装程序无法定位现有系统分区,也无法创建新的系统分区”的方法

    使用老毛桃PE格式化C盘后安装Win7出现"安装程序无法定位现有系统分区,也无法创建新的系统分区"的错误.本文给出了我遇到该情况的解决办法,亲身经历,绝非抄袭. 在网上看了好多办法 ...

  4. 安装linux和windows双系统

    很多人一提到安装linux和windows双系统就会想到单独将磁盘划一个分区给linux,如果一块磁盘上已经安装了windows,并且所有分区都有数据,那就麻烦了,即使有了单独的分区,还需要安装gru ...

  5. macos windowserver占用内存_【v007】如何安装MAC OS的虚拟机系统(上)

    宗旨:我授你受,你问我答:一起学习,一起进步. 小牛一直努力制作会声会影系列.系统操作系列.虚拟机系列.AE系列.PS系列等软件的视频教程和图文教程. 现在电脑端主要有两个主流系统,一是windows ...

  6. 8G的U盘轻松帮助你安装win7/win8/win10/xp系统

    你的电脑是否也经常出现卡顿.死机?你的操作系统使用时间太久也会出现,电脑开机无法正常启动但又不是硬件问题,电脑深度中毒且杀毒不彻底.如果用户的电脑遇到上述情况,那么您的电脑最好重装一套操作系统,可是不 ...

  7. python详细安装教程linux-python 在linux系统的安装教程

    Linux下默认系统自带python2.7的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装py ...

  8. unity桌面设置vnc_Ubuntu 16.04下安装VNC和Unity桌面系统

    本站之前已经跟大家分享了不少关于VNC以及桌面系统传送),关于为什么Linux要安装桌面,这个见仁见智,对于我而言,一个用途是是挂Vegax赚点零花钱(用Firefox的插件),之前的教程,所安装的桌 ...

  9. Windows XP硬盘安装Ubuntu 12.04双系统

    Windows XP硬盘安装Ubuntu 12.04双系统 一.下载文件 需要下载的东西有两个,一个是grub4dos,另一个是Ubuntu 12.04 LTS的镜像文件,具体下载地址如下: 1.Gr ...

最新文章

  1. gorm存指针数据_gormt: gormt 是一个数据库映射工具,可以将 mysql 数据库自动生成 golang sturct 结构...
  2. iOS---iPad开发及iPad特有的特技
  3. 字符之间或者结构体之间比较
  4. Long Beautiful Integer CodeForces - 1268A(贪心构造)
  5. ubuntu vim配置所有用户生效
  6. 数据结构—链表-循环链表
  7. java垃圾回收 分代_Java-垃圾回收机制-通用的分代垃圾回收机制
  8. CSS z-index 属性的使用方法和层级树的概念
  9. MySQL服务器停机迁移
  10. java从Swagger Api接口获取数据工具类
  11. 解决:IDEA2017/2019与Maven3.6.3不兼容的导致的unable to import maven project: see logs for details问题
  12. asp小偷转html,ASP之XMLHTTP小偷程序的简单代码范例
  13. Cocos2d-x CocosBuilder使用教程(一)HelloCocosBuilder
  14. 什么叫做石英表_什么是石英表?石英表与机械表的区别
  15. c语言中可以使用setw函数吗,string和stringstream+setw()用法总结
  16. 《夏洛特烦恼》观后感
  17. python文本关键词提取_python实现关键词提取
  18. Centos7配置网络
  19. 花开花落又是一度春秋,聚散离别见证一场青春。
  20. 微信小程序富文本渲染(rich-text)换行失效

热门文章

  1. hive 原理 用法,编码,UDF 001
  2. 骂谷歌,怼百度,批腾讯,吴军为何DISS互联网公司没得怕的?
  3. 来看一看那些已经倒闭的互联网公司
  4. Rocket Launching: A Universal and Efficient Framework for Training Well-performing Light Net论文阅读
  5. django-oscar学习笔记(一)
  6. 【实用技巧】MAC苹果电脑怎么远程?
  7. 小米模式VS华为模式,谁能主宰智能家居的下一个十年?
  8. c#对话框,文件打开对话框,
  9. 计算思维模拟题参考答案-单选题
  10. anaconda python3.6版本_Anaconda Python V3.6 官方版