2

在Linux环境搭建LDAP服务端

 1 year ago
source link: https://blog.51cto.com/u_15130867/6988238
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

事情的起因是最近开始的HW行动,我们环境的NIFI集群由于是内外网隔离,所以没有开启任何安全防护措施(除了防火墙),因此内网嗅探工具检测出了未授权访问漏洞。为了在不开启kerberos的前提的进行漏洞修复,我们认识到KNOX这个工具,发现它能够和许多大数据组件进行集成,做正向代理或者SSO单点登录。

大伙一合计,既然本身就要做安全集群,那就折腾一下,最终整了出来,安全复扫也没有再扫出漏洞了

在Linux环境搭建LDAP服务端_apache

不过在做KNOX的时候,我们使用的是内置的ldap服务,并没有进行ldap自建,后来弄完以后,还是想着需要自建ldap会好些,于是乎就有了个人对OpenLDAP的学习。

2OpenLDAP介绍

OpenLDAP其实就是LDAP协议的一种开源实现,一定要注意LDAP指的是协议,不是服务,LDAP的目录信息是以树形结构进行存储的,在树根一般定义国家(c=CN)或者域名(dc=com),其次往往定义一个或多个组织(organization, o)或组织单元(organization unit, ou)。一个组织单元可以包含员工、设备信息(计算机/打印机等)相关信息。例如uid=babs, ou=People, dc=example, dc=com,dc这里如果你想要新增自己的domain component,只要继续生成objectClass: domain即可,这个是百度不到的;

在Linux环境搭建LDAP服务端_赋值_02

下图是LDAP中的相关概念,只是为了部署的话参照着看就行:

在Linux环境搭建LDAP服务端_apache_03

3LDIF文件书写规则

ldif是存储LDAP配置信息及目录内容的标准文本文件格式,通常用来交换数据并在OpenLDAP服务器之间互相交换数据,并且可以通过LDIF实现数据文件的导入、导出以及数据文件的添加、修改、重命名等操作,这些信息需要按照LDAP中schema的规范进行操作,并会接受schema的检查,如果不符合OpenLDAP schema规范要求,则会提示相关语法错误。

  • LDIF文件每行的结尾不允许有空格或者制表符;
  • LDIF文件允许相关属性可以重复赋值并使用;
  • LDIF文件以.ldif结尾命名;
  • LDIF文件中以#号开头的一行为注释,可以作为解释使用;
  • LDIF文件所有的赋值方式为:属性:[空格]属性值;
  • LDIF文件通过空行来定义一个条目,空格前为一个条目,空格后为另一个条目的开始。

4OpenLDAP部署

4.1安装服务

检查服务器是否已安装openldap相关服务,若没用使用yum进行安装,openldap服务在Centos的ISO镜像中包含,不需要额外引入软件源:

# yum安装命令
# yum -y install openldap openldap-servers openldap-clients openldap-devel compat-openldap
[lijiadong@hostname ~]$ rpm -qa|grep openldap
openldap-2.4.44-22.el7.x86_64
openldap-clients-2.4.44-22.el7.x86_64
openldap-servers-2.4.44-22.el7.x86_64
compat-openldap-2.3.43-5.el7.x86_64
openldap-devel-2.4.44-22.el7.x86_64

软件安装完成后,/usr/share/openldap-servers目录下会有一个文件DB_CONFIG.example,用来做配置初始化;

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# 注意进行授权给ldap用户
chown ldap:ldap DB_CONFIG

接下来启动slapd服务:

systemctl start slapd
systemctl status slapd
# 设置开机启动
systemctl enable slapd
在Linux环境搭建LDAP服务端_赋值_04

几乎所有网上资料都会说修改slapd.conf文件进行配置变更,但是openldap2.4.23版本后不再使用slapd.conf作为配置文件了,这个一定要知道

4.2配置ldap

4.2.1修改管理员密码

# 执行slappasswd -s ${password},记录下返回值,后续会用到
{SSHA}EVy9FDUpcmS8g9meVx7oZj2x38oikdsadsasNS

4.2.2初始化配置

这里展示了两种方式,是为了进行对比,因为笔者之前踩了这个坑,手动去做配置文件修改,这其实是官方不建议的

4.2.2.1直接修改配置文件(不建议)

修改 /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif

以下行没有则新增,dc注意更改成自己的域名domain

olcSuffix: dc=maggot,dc=com
olcRootPW: {SSHA}EVy9FDUpcmS8g9meVx7oZj2x38oikdsadsasNS
olcRootDN: cn=Manager,dc=maggot,dc=co

修改/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=maggot,dc=com" read by * none

测试配置文件

该步骤是为了检查配置文件是否存在错误:

slaptest -u

在Linux环境搭建LDAP服务端_赋值_05

返回值有config file testing succeeded则说明配置文件无误,checksum error on的异常是因为手动修改了文件,ldap检查和之前不一致;

4.2.2.1使用ldapmodify(建议)

首先来修改hbd.ldif文件,编辑一个新的db.ldif文件,注意修改olcRootDN和olcSuffix,改成你需要的域名相关信息,同时修改olcRootPW内容,这个值就是上一节返回的管理员密码加密字符串:

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

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=root,dc=maggot,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}EVy9FDUpcmS8g9meVx7oZj2x38oikdsadsasNS

保存退出后,执行ldapmodify进行更新:

ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/db.ldif
在Linux环境搭建LDAP服务端_apache_06

修改monitor.ldif文件,编辑一个新的monitor.ldif文件,注意修改域名相关信息:

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=root,dc=maggot,dc=com" read by * none

保存退出后,执行ldapmodify进行更新:

ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/monitor.ldif

在Linux环境搭建LDAP服务端_赋值_07

此时我们再进行检查,不会再像直接修改配置文件一样报checksum的错误:

slaptest -u

在Linux环境搭建LDAP服务端_apache_08

4.2.3添加模式

添加cosine和nis LDAP模式,这一步还不清楚原因:

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

4.2.4其他配置修改

4.2.4.1修改服务端口

端口配置在/etc/sysconfig/slapd文件:

vim /etc/sysconfig/slapd
# OpenLDAP server configuration
# see 'man slapd' for additional information

# Where the server will run (-h option)
# - ldapi:/// is required for on-the-fly configuration using client tools
#   (use SASL with EXTERNAL mechanism for authentication)
# - default: ldapi:/// ldap:///
# - example: ldapi:/// ldap://127.0.0.1/ ldap://10.0.0.1:1389/ ldaps:///
SLAPD_URLS="ldapi:/// ldap://localhost:33389/"

# Any custom options
#SLAPD_OPTIONS=""

# Keytab location for GSSAPI Kerberos authentication
#KRB5_KTNAME="FILE:/etc/openldap/ldap.keytab"

4.3创建域文件

4.3.1修改BaseDN信息

创建一个ldif文件,这里假设为maggot.ldif:

dn: dc=maggot,dc=com
dc: maggot
objectClass: top
objectClass: domain

dn: cn=root,dc=maggot,dc=com
objectClass: organizationalRole
cn: root
description: Maggot LDAP manager users

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

dn: ou=Group,dc=maggot,dc=com
objectClass: organizationalUnit
ou: Group

导入生效:

ldapadd -x -W -D "cn=root,dc=maggot,dc=com" -f /tmp/maggot.ldif
在Linux环境搭建LDAP服务端_配置文件_09

4.3.2添加自己的域信息

可以编辑一下结构的ldif文件,用于生成组织信息,该操作会最终生成多个层级的dc,

dn: dc=org,dc=maggot,dc=com
objectClass: domain
objectclass: dcObject
dc: org

dn: dc=apache,dc=org,dc=maggot,dc=com
objectClass: domain
objectclass: dcObject
dc: apache

dn: dc=hadoop,dc=apache,dc=org,dc=maggot,dc=com
objectClass: organization
objectClass: dcObject
o: Hadoop
dc: hadoop

添加完成后通过ldapsearch命令查看结果:

ldapsearch -h localhost -p 389 -x -D "cn=root,dc=maggot,dc=com" -w 'Dtsw@Admin996' -b 'dc=maggot,dc=com' '(objectClass=*)'
在Linux环境搭建LDAP服务端_配置文件_10

到这一步已经能够满足KNOX切换到自建LDAP服务的要求了,切换完成后,测试登录正常,且日志中能够看到对自定义域的用户规则的匹配记录:

在Linux环境搭建LDAP服务端_apache_11


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK