LDAP—轻量级目录访问服务搭建

近几年,随着LDAP(Light Directory Access Protocol,轻量级目录访问协议)技术的兴起和应用领域的不断扩展,目录服务技术成为许多新型技术实现信息存储、管理和查询的首选方案,特别是在网络资源查找、用户访问控制与认证信息的查询、新型网络服务、网络安全、商务网的通用数据库服务和安全服务等方面,都需要应用目录服务技术来实现一个通用、完善、应用简单和可以扩展的系统。

随着企业自身的发展,企业网络也日益壮大,网络提供的服务也越来越多,如网络登录、电子邮件服务、FTP服务、WEB服务、代理服务和办公自动化等,但带来的问题也日益增多,其中最突出的问题是用户账号的管理。

由于大部分的应用系统都来自不同的开发商,各个系统都使用自已的认证机制,需要网络管理员在每个应用系统中建立相应的账号信息,因此造成大量重复的劳动,同时也给用户们带来了无穷的烦恼,他们不得不记一大堆账号和密码。

目录服务就是为了解决以上问题而产生的,目录服务是一个特殊的数据库,它为读、浏览和搜索进行了优化,目录服务目前有X.500和LDAP两个国际标准协议。

LDAP协议简介

LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是为了实现目录服务的信息服务。

目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。在网络中应用了LDAP后,用户只需要使用一个账号和密码就可以轻松访问网络中的所有服务,实现用户身份的统一认证。

LDAP系统结构,如下图

LDAP的信息是以树型结构存储的

首先要为目录树建立一个“根(ROOT)”,根是目录树的最顶层,后面建立的所有对象都是基于这个根的,所以它也称为基准DN。

推荐使用公司域名的不同部分:dc=com,dc=example

公司的部门作为OU,如ou=people,ou=servers

用户是目录树的最底层(即叶子节点),可以根据用户所在的部门将其放在不同的OU中,使用uid或cn描述都可以,如uid=babs或cn=babs

一. 配置OPENLDAP服务器

安装openldap、db4、migrationtools安装包

#yum install openldap*

#yum install db4

#yum install migrationtools

#cd /var/lib/ldap/

下面的这一步非常重要 ( 必须要第一步就执行这个 slapd 命令)

查看服务进程是否启动

#ps aux | grep ldap

查看端口:

[root@station3 ldap]# netstat -ntlp | grep 389

tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 3782/slapd

tcp 0 0 :::389 :::* LISTEN 3782/slapd

2. 创建LDAP服务的主配置文件/etc/openldap/slapd.conf

cp -p/etc/openldap/slapd.conf.bak /etc/openldap/slapd.conf

3. 产生一个manager服务的管理的密码

#slappasswd –h –s redhat >>/etc/openldap/slapd.conf

4. 编辑文件slapd.conf

vi /etc/openldap/slapd.conf

database bdb

suffix "dc=example,dc=com" #一条记录所属区域#

rootdn "cn=Manager,dc=example,dc=com"

rootpw 此处所写的就是上一步所产生的加密密码 #定义LDAP根管理员的密码(强烈建议使用加密的密码)rootpw与加密密码之间最好用按TAB键分隔

5. 设置各项服务的开机启动

#chkconfig slapd on ldap服务(5.4为ldap)现在变成了slapd

#chkconfig rsyslog on rsyslog 服务(日志) 5.4为syslog

#chkconfig rpcbind on 启动rpcbind服务 5.4为portmap 111端口

6. 将系统账户转移到openldap中(事先建好一些系统账号),编辑文件migrate_common.ph文件

#vi /usr/share/migrationtools/migrate_common.ph

$DEFAULT_MAIL_DOMAIN = "http://example.com"; 第71行

$DEFAULT_BASE = "dc=example,dc=com"; 第74行

# cd /usr/share/migrationtools

# ./migrate_passwd.pl /etc/passwd > /etc/openldap/user.ldif

# ./migrate_group.pl /etc/group > /etc/openldap/group.ldif

建立example.ldif,ou_people.ldif, ou_group.ldif三个文件

# cd /etc/openldap/

#cat example.ldif

dn: dc=example,dc=com (dn惟一辨别名,类似于文件系统的绝对路径

objectclass: dcObject

objectclass: organization

o: Example, Inc. (组织名)

dc: example

空行

dn: cn=Manager,dc=example,dc=com

objectclass: organizationalRole

cn: Manager

#cat ou_people.ldif

dn: ou=people,dc=example,dc=com

objectclass: organizationalUnit

ou: people

#cat ou_group.ldif

dn: ou=group,dc=example,dc=com

objectclass: organizationalUnit

ou: group

停止slapd服务

service slapd stop

转换原有Linux 账号至OpenLDAP服务器上:

#cd /etc/openldap

#slapadd -vl example.ldif

若出错误就将/etc/openldap/slapd.d目录重命名,因为在默认情况下她会自动寻找slap.d/目录下的slapd.conf文件

added: "dc=example,dc=com" (00000001)

#slapadd -vl ou_people.ldif

added: "ou=people,dc=example,dc=com" (00000002)

#slapadd -vl ou_group.ldif

added: "ou=group,dc=example,dc=com" (00000003)

#slapadd -vl user.ldif

#slapadd -vl group.ldif

启动slapd服务

#service slapd start

为了检查服务是否正在运行并且被正确配置,可以对服务器运行一个搜索命令,使用ldapsearch,确保openldap-clients软件包安装

查询:

#ldapsearch -x -H ldap://192.168.1.209 -b 'dc=example,dc=com'

#ldapsearch -x -b 'dc=example,dc=com'-b设置目录起点

注意:slapd重启时可能会遇到的问题

[root@station3 ldap]# service slapd restart

停止 slapd: [确定]

/var/lib/ldap/id2entry.bdb is not owned by "ldap" [警告]

/var/lib/ldap/__db.002 is not owned by "ldap" [警告]

/var/lib/ldap/__db.001 is not owned by "ldap" [警告]

/var/lib/ldap/dn2id.bdb is not owned by "ldap" [警告]

/var/lib/ldap/__db.005 is not owned by "ldap" [警告]

/var/lib/ldap/__db.006 is not owned by "ldap" [警告]

/var/lib/ldap/__db.003 is not owned by "ldap" [警告]

/var/lib/ldap/__db.004 is not owned by "ldap" [警告]

正在检查 slapd 的配置文件: bdb_db_open: alock package is unstable

backend_startup_one: bi_db_open failed! (-1)

slap_startup failed (test would succeed using the -u switch)

[失败]

解决方法:

chown ldap:ldap /var/lib/ldap/* -----修改属主

#service slapd restart

停止 slapd: [失败]

正在检查 slapd 的配置文件: bdb_db_open: Warning - No DB_CONFIG file found in directory /var/lib/ldap: (2)

Expect poor performance for suffix dc=my-domain,dc=com.

config file testing succeeded

[确定]

启动 slapd: [确定]

bdb_db_open: Warning - No DB_CONFIG file found in directory /var/lib/ldap: (2)也是一个问题

解决方法:

拷贝DB_CONFIG.example 为DB_CONFIG

cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

#service slapd restart

一切都正常了,slapd服务启动正常。

二. LDAP服务器安全通信

LDAP是以明文的格式通过网络来发送所有信息的,包括用户名和密码,这样会有严重的安全隐患。不过可以在传输层采用SSL安全套接层所提供的加密机制来解决这个问题

SSL(Secure Socket Layer)是目前应用最广泛的安全协议,由两部分组成——SSL握手协议(SSL Handshare Protocol)和SSL记录协议(SSL Record Protocol)。

上层的握手协议的作用在于建立SSL连接,协商会话密钥。下层的记录协议则负责处理数据的加解密。当有客户端向LDAP服务发起连接时,双方首先要进行安全连接的初始化和协商,通常需要服务器端向客户端提供自己的证书,客户端解签名确认服务器端身份的真实性。这需要PKI公钥基础结构的支持。

在我们企业的局域网中可以使用openssl软件包来创建一个根CA认证服务器,由根CA向自己颁发LDAP服务的使用证书。公钥包含在证书之中,其中包括了服务器完整域名(FQDN)名。在LDAP服务的客户端存放一张根CA的证书,并且用这一张授权证书去检测LDAP服务器证书的有效性和真实性。

下图是SSL 身份认证及协商密钥的过程

客户端发起请求,包含一个hello消息,并附上客户端支持的密码算法和 SSL 协议的版本消息以及用于生成密钥的随机数;

服务器收到消息后,服务器端选择加密压缩算法并生成服务器端的随机数,将该信息反馈给客户端,接着服务器端将自身的数字证书(在图 1 中使用了一个 X.509 数字证书)发送到客户端,完成上述动作后后服务器端会发送“hello done”消息给客户端,此外如果服务器需要对客户端进行身份认证,服务器端还会发送一个请求客户端证书的消息;

一旦客户端收到”hello done” , 就开始对服务器端的数字证书进行认证并检查服务器端选中的算法是可行的。如果服务器要求认证客户端身份,客户端还会发送自己的公钥证书;

如果对服务器的身份认证通过,客户端会发起密钥交换的请求;

服务器端和客户端根据先前协商的算法和交换随机数生成对称密钥进行后续的通信。

根CA配置

要确保openssl的软件包已安装,如下图所示:

1>编辑/etc/pki/tls/openssl.cnf 文件前首先备份成openssl.cnf.raw

cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.raw

vi /etc/pki/tls/openssl.cnf

[CA_default]

default_days = 3650 ---- 证书有效期为十年 (第73行)最好设置时间要长一些,否则过期后所有的都要重新设置

[req]

default_bits = 1024 改为 2048 密钥的长度 (第106行)

[usr_cert]

basicConstraints=CA: FALSE 改为 CA:TRUE 可以签发下级证书 (第172行)

[v3_req]

basicConstraints = CA : FALSE 改为 CA:TRUE (第223行)

#cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.rootca

使其能够签发下级证书。

2>进入/etc/pki/tls/misc 目录

在该目录中有一个CA脚本文件可以用它来制作根CA

编辑CA文件找到DAYS=“-days ” 和CADAY=“-days ” (第63行和第64行)

配置为DAYS=“-days 3650”#10years

CADAYS=“-days 3650”#10years

创建根CA机构

这里关系到两个目录

/etc/pki/tls/misc是工作目录

/etc/pki/CA是存放所有CA相关文件的目录

完成此步骤后,会在/etc/pki/CA目录下生成一系列文件,其中最重要的是

/etc/pki/CA/private/cakey.pem-----CA的私钥文件

/etc/pki/CA/cacert.pem-----CA的证书文件

注意:如果脚本检测到/etc/pki/CA下面有文件存在,那么script会安静的退出,不会创建任何东西,所以需要把/etc/pki/CA下的文件全部删除,script就可以正常工作了

#rm -rf /etc/pki/CA/

#cd /etc/pki/tls/misc/

执行脚本文件CA创建根CA机构(为根CA申请证书)

#./CA –newca

需要特别注意的是创建证书时,输入Common Name的时候如果输入FQDN,客户端就指定FQDN连接,如果输入IP,客户端就指定IP连接

如果指定的FQDN,就全部用FQDN,否则全部用IP地址

创建过程如下:

CA certificate filename (or enter to create)

Making CA certificate ...

Generating a 1024 bit RSA private key

..................................++++++

.....++++++

writing new private key to '../../CA/private/cakey.pem'

Enter PEM pass phrase: 输入rootca的私钥密码

Verifying - Enter PEM pass phrase: 确认密码

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [GB]: ――国家区域号(如US、CN等)

State or Province Name (full name) [Berkshire]: ――国家或省市名

Locality Name (eg, city) [Newbury]: ――城市名

Organization Name (eg, company) [My Company Ltd]: ――单位名

Organizational Unit Name (eg, section) []: ――部门名

Common Name (eg, your name or your server's hostname) []: ――证书的名称一般书写根CA服务器的完全合格名如http://svr.example.com

Email Address []: ―― 联系邮箱

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []: ――申请书的密码,直接跳过

An optional company name []: ――代办公司的名称,直接跳过

Using configuration from /etc/pki/tls/openssl.cnf

Enter pass phrase for ../../CA/private/cakey.pem:

Check that the request matches the signature

Signature ok

Certificate Details:

Serial Number:

c4:87:8a:c3:fd:11:b2:61

Validity

Not Before: Jul 23 06:43:39 2010 GMT

Not After : Jul 22 06:43:39 2013 GMT

Subject:

countryName = GB

stateOrProvinceName = Berkshire

organizationName = My Company Ltd

commonName = http://svr.example.com

X509v3 extensions:

X509v3 Subject Key Identifier:

4B:11:F1:EE:53:DC:74:2A:66:F4:C5:E4:5A:15:61:8B:7A:4D:1F:2D

X509v3 Authority Key Identifier:

keyid:4B:11:F1:EE:53:DC:74:2A:66:F4:C5:E4:5A:15:61:8B:7A:4D:1F:2D

DirName:/C=GB/ST=Berkshire/O=My Company Ltd/CN=http://ldapm.dh.cn

serial:C4:87:8A:C3:FD:11:B2:61

X509v3 Basic Constraints:

CA:TRUE

Certificate is to be certified until Jul 22 06:43:39 2013 GMT (1095 days)

Write out database with 1 new entries

Data Base Updated

创建成功后转入/etc/pki/CA/private/目录,有cakey.pem密钥(权限设为400)

/etc/pki/CA/下有根CA的证书cacert.pem

#cd /etc/pki/CA

#openssl x509 –noout –text –in cacert.pem

必须要显示 X509V3 Basic Constraints

CA:TRUE -----表示可以签发下级证书

3. 签发LDAP服务器证书

LDAP服务器证书也由根CA签发,不过该证书在扩展结构上应该是一张

终端用户证书,所以必须修改/etc/pki/tls/openssl.cnf文件适应变化

服务器签发证书文件配置

[CA_default]

default_days=3650

[req]

default_bits=1024

[usr_cert]

basicConstraints=CA:FALSE

[v3_req]

basicContraints=CA:FALSE

#cd /etc/pki/tls/misc/

#./CA -newreq (与创建根CA证书过程类似)

Generating a 1024 bit RSA private key

...............++++++

.++++++

writing new private key to 'newkey.pem'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [GB]:

State or Province Name (full name) [Berkshire]:

Locality Name (eg, city) [Newbury]:

Organization Name (eg, company) [My Company Ltd]:

Organizational Unit Name (eg, section) []:

Common Name (eg, your name or your server's hostname) []:――证书的名称一般书写LDAP服务器的完全合格名,如http://svr.example.com,很重要后面会用到

Email Address []:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

Request is in newreq.pem, private key is in newkey.pem

对证书进行签证

#./CA -sign (对证书签证)

Using configuration from /etc/pki/tls/openssl.cnf

Enter pass phrase for ../../CA/private/cakey.pem:输入密码 (Rootca 的 Private key 密码)

Check that the request matches the signature

Signature ok

Certificate Details:

Serial Number:

c4:87:8a:c3:fd:11:b2:62

Validity

Not Before: Jul 23 06:52:31 2010 GMT

Not After : Jul 23 06:52:31 2011 GMT

Subject:

countryName = GB

stateOrProvinceName = Berkshire

localityName = Newbury

organizationName = My Company Ltd

commonName = http://svr.example.com

X509v3 extensions:

X509v3 Basic Constraints:

CA:FALSE

Netscape Comment:

OpenSSL Generated Certificate

X509v3 Subject Key Identifier:

BE:21:BD:4C:39:C1:B4:26:B4:EB:ED:B6:42:36:97:1F:97:49:15:49

X509v3 Authority Key Identifier:

keyid:4B:11:F1:EE:53:DC:74:2A:66:F4:C5:E4:5A:15:61:8B:7A:4D:1F:2D

Certificate is to be certified until Jul 23 06:52:31 2011 GMT (365 days)

Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

Signed certificate is in newcert.pem

这样LDAP服务器证书就制作完毕了,不过一定要确定是一张终端证书

验证LDAP服务器端证书

#openssl x509 –noout –text –in newcert.pem

X509V3 Basic Constraints:

CA:FALSE -----表明是一张终端证书。

#cd /etc/pki/tls/misc

#openssl verify –CAfile /etc/pki/CA/cacert.pem newcert.pem

成功会显示newcert.pem:OK -----表明新证书newcert.pem是由根证书cacert.pem授权

运行完上面两个步骤后,会发现当前目录下创建了3个文件

newreq.pem -----创建证书请求文件,没什么用了

newcert.pem -----CA签发的证书

newkey.pem -----证书对应的私钥,(权限设为400)

4. LDAP服务器配置使用SSL

使用SSL安全通信需要重新配置服务器端slapd.conf文件添加SSL支持,同时将cacert.pem,LDAP服务器证书和密钥放入指定路径。

slapd.conf文件配置修改

找到以下三行去掉注释并修改为正确的路径

TLSCACertificateFile /etc/openldap/cacerts/cacert.pem--根CA证书的存放路径

TLSCertificateFile /etc/openldap/cacerts/newcert.pem---服务器证书存放路径

TLSCertificatekeyFile /etc/openldap/cacerts/newkey.pem---私钥的存放路径

TLSVerifyClient never ---服务器端不需要客户端提供证书这是一个单向认证

转移文件

cp new* /etc/openldap/cacerts/

cp /etc/pki/CA/cacert.pem /etc/openldap/cacerts/

属主

cd /etc/openldap/cacerts/

chown ldap.ldap newkey.pem (否则slapd有服务启动不了)

设置合适的权限

chmod 644 newcert.pem

chmod 400 newkey.pem

修改httpd.conf文件,创建/etc/openldap/cacerts目录的虚拟目录,如下图所示

重启httpd服务

service httpd restart

5. LDAP客户端配置支持安全通信

注意:防火墙和selinux

1、停掉iptables服务或创建LDAP的允许规则

iptables –A INPUT –p tcp –dport 389 –s 192.168.10.0/24 –j ACCEPT

方法:

将CA的证书文件(cacert.pem)放到客户端的/etc/openldap/cacerts目录下(可以用scp命令)

在/etc/hosts中添加LDAP服务器的IP和http://svr.example.com的对应记录

在配置客户端之前,你应该确保已安装directory-client的软件包,其中包括软件包sssd、authconfig-gtk和oddjob-mkhomedir

系统->管理->身份验证或system-config-authentication可用于修改”身份标识和身份验证”的配置

然后单击“下载CA证书”

填写http://svr.example.com/pub/cacert.pem

以上是通过http方式下载CA证书,也可以通过ftp方式下载

修改/etc/sssd/sssd.conf文件,如下图

重启sssd

service sssd restart

系统安全服务守护进程(SSSD)功能

它实现了集中身份验证/认证管理,并且支持广泛的身份验证/认证服务(包括OpenLDAP、动态目录、Kerberos以及红帽自带的目录服务器)

客户端配置完成

测试:使用ldap服务器上的用户在客户机上登录

能正常登录,但报一个错,说没有家目录

怎么办?对,自动挂载给他做一个家目录

在LDAP服务器端先配配置好NFS服务器,共享/home目录

在客户端上配置自动挂载auto.master文件

auto.nfs文件:

注意:我们想要支持任意用户名登录,因此可以将第一列替换为“星号(*)”,它是一个通配符,代表所有用户,然后,我们使用元字符“连号(&)”替换共享中的用户名

好了现在测试一下,OK,没问题了。

通过安装openLDAP GUI可以更方便管理OPENLDAP

安装下列软件包

httpd 、php、php-ldap、php-common、php-pdo

修改/etc/httpd/conf.d/php.conf文件

确保LoadModule php5_module modules/libphp5.so存在

添加下列配置

AddType application/x-httpd-php .php

修改/etc/httpd/conf/httpd.conf文件,在DirectoryIndex后添加index.php

重新启动httpd服务

service httpd restart

把下载的 phpLDAPadmin 解压到 Apache 的网站文档根目录中,目录命名为 phpldapadmin

#tar zxvf phpldapadmin-1.1.0.7.tar –C /var/www/html

#cd /var/www/html

#mv phpldapadmin-1.1.0.7 phpldapadmin

#chown -R apache.apache phpldapadmin

#cp config.php.example config.php

# vi config.php

对phpLDAPadmin进行支持中文的配置

// $config->custom->appearance['language'] = 'auto';

$config->custom->appearance['language'] = 'zh_CN'

设置口令加密信息,在配置文件中修改查询语句

$config->custom->session['blowfish']='hildap';

为LDAP服务器设置名称、地址和端口等信息

$ldapservers->SetValue($i,'server','name','My LDAP Server');

$ldapservers->SetValue($i,'server','host','192.168.0.1');

$ldapservers->SetValue($i,'server','port','389');

为LDAP服务器设置管理员的DN

$ldapservers->SetValue($i,'login','dn','cn=Manager,dc=example,dc=com');

$ldapservers->SetValue($i,'login','pass','');

注:如果用户认证方式设置的是config,则必须在此填写正确的LDAP服务器管理员的口令

设置用户认证方式

$ldapservers->SetValue($i,'Server','auth_type','cookie');

phpLDAPadmin提供了cookie、session和config 3种认证方式

config是phpLDAPadmin默认的认证方式,不需要用户登录

cookie用户输入正确的LDAP管理员得DN与口令会保存在Web浏览器的cookie里面

session类似于cookie,不同之处在于DN与口令保存在服务器端。

为目录树设置基准DN

$ldapservers->SetValue($i,'server','base',array('dc=example,dc=com'));

$queries[$q]['base']='dc=example,dc=com';

在浏览器中输入http:/LDAP服务器的IP/phpldapadmin即可访问LDAP SERVER服务器

运行之后可能出现了一个错误:

Unrecognized error number: 8192: Function eregi() is deprecated

打开/var/www/html/phpldapadmin/lib/common.php 文件,找到下面的代码

# We are now ready for error reporting.

error_reporting(E_ALL);

把它修改成:

#We are now ready for error reporting.

error_reporting(E_ALL & ~E_DEPERCATED);

到此所有配置全部完成。

编辑/Alex 美编/Mary

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180730G05RX000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券