使用TLS证书配置OpenLDAP CentOS 7 Linux

时间:2020-01-09 10:37:46  来源:igfitidea点击:

其他部分内容:
安装和配置OpenLDAP分步教程:
使用TLS证书配置OpenLDAP分步教程:
配置LDAP客户端以通过LDAP服务器进行身份验证

使用TLS证书配置OpenLDAP

在开始本文以在Linux上使用TLS证书配置OpenLDAP之前,我们必须了解基本的LDAP术语。

为了演示本文,我正在使用CentOS7. 在本文中,我将分享详细的步骤来使用TLS保护LDAP连接。
默认情况下,使用LDAP连接时,所有信息均以纯文本形式发送。
无需再坚持要求加密在客户端和服务器之间传输的所有流量的重要性。

我们首先创建一个证书。
我们已经看过很多次了,但是这次,我们将采用不同的方法。
到目前为止,我们已经创建了自签名证书,以提供与已知服务的安全连接。
这足以保护本地网络中的流量。
证书的更严格使用将要求使用由证书颁发机构或者CA签名的证书。
这是Internet站点通常会执行的操作。
他们向著名的CA请求签名证书。

但是,就我们而言,我们将创建自己的CA并签署证书以将其与LDAP一起使用。

如果我们不熟悉openssl和创建证书,我强烈建议我们先仔细阅读这些文章,然后再为LDAP配置TLS。

  • 初学者指南,了解与openssl一起使用的所有与证书相关的术语

  • 生成带有示例的openssl自签名证书

  • 创建我们自己的证书颁发机构并生成由CA签名的证书

  • 使用我们自己的根CA和带有openssl的中间证书创建证书链(CA捆绑包)

  • 使用openssl创建服务器和客户端证书,以通过SSL通过Apache进行端到端加密

  • 创建SAN证书以在单个证书中保护服务器的多个DNS,CN和IP地址

安装必备的rpm

要使用TLS证书配置OpenLDAP,我们需要openssl软件包。
这将为我们提供目录层次结构,用于创建证书以使用TLS证书配置OpenLDAP

[root@ldap-server ~]# yum -y install openssl

创建CA证书的私钥

首先,我们需要一个私钥来生成我们自己的CA证书。
如果我们不希望拥有加密的私钥,则可以在以下命令中忽略-des3:

[root@ldap-server ~]# openssl genrsa -des3 -out ca.key 4096
Generating RSA private key, 4096 bit long modulus
..........................................++
...........................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:

生成CA证书

接下来,我们将使用我们的CA密钥生成CA证书。
我们稍后将使用此CA证书对ldap客户端证书进行签名

[root@ldap-server ~]# openssl req -new -x509 -days 365 -key ca.key -out ca.cert.pem
Enter pass phrase for ca.key:
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) [XX]:IN
State or Province Name (full name) []:Karnataka
Locality Name (eg, city) [Default City]:Bengaluru
Organization Name (eg, company) [Default Company Ltd]:theitroad
Organizational Unit Name (eg, section) []:R&D
Common Name (eg, your name or your server's hostname) []:ldap-server.example.com
Email Address []:[email protected]

重要的提示:

提供适当的CN很重要,否则稍后将在TLS握手中遇到问题,正如我在之前的文章中所展示的。

其中我正在使用我的ldap-server的CN。

配置openssl x509扩展名以创建SAN证书

我们将创建SAN证书,以避免为每个ldap客户端创建多个证书。
我们可以在创建SAN证书中了解有关SAN证书的更多信息。

[root@ldap-server ~]# cat server_cert_ext.cnf
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.43.32
IP.2 = 192.168.43.31
IP.3 = 192.168.43.154
DNS.1 = client.example.com
DNS.2 = server2.example.com

alt_names下,我将提供ldap客户端证书在验证客户端请求时应解析的IP地址和DNS名称的完整列表。

生成LDAP客户端密钥

接下来,我们将需要一个ldap客户端密钥,我们将其命名为ldap.example.com.key

[root@ldap-server ~]# openssl genrsa -out ldap.example.com.key 4096
Generating RSA private key, 4096 bit long modulus
.............................................................++
...............................................................................................................................................................................++
e is 65537 (0x10001)

创建证书签名请求(CSR)

接下来,我们需要CSR来签名ldap客户证书。
其中我们将使用服务器配置文件来提供IP和DNS列表。
这些值将用作CN,因此将允许所有具有这些IP或者DNS的客户端与LDAP服务器建立TLS通信

[root@ldap-server ~]# openssl req -new -key ldap.example.com.key -out ldap.example.com.csr
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) [XX]:IN
State or Province Name (full name) []:Karnataka
Locality Name (eg, city) [Default City]:Bengaluru
Organization Name (eg, company) [Default Company Ltd]:theitroad
Organizational Unit Name (eg, section) []:R&D
Common Name (eg, your name or your server's hostname) []:ldap-server.example.com
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

创建LDAP客户端证书

接下来,我们将使用我们先前创建的CSR,CA密钥和CA证书来创建ldap客户端证书(ldap.example.com.crt`)。
该证书有效期为365天,并使用sha256算法加密。

[root@ldap-server ~]# openssl x509 -req -in ldap.example.com.csr -CA ca.cert.pem -CAkey ca.key -out ldap.example.com.crt -CAcreateserial -days 365 -sha256 -extfile server_cert_ext.cnf
Signature ok
subject=/C=IN/ST=Karnataka/L=Bengaluru/O=theitroad/OU=R&D/CN=ldap-server.example.com/[email protected]
Getting CA Private Key
Enter pass phrase for ca.key:

验证ldap客户端证书

接下来,检查ldap客户端证书的内容,以确保它包含我们之前提供的IP和DNS列表。

[root@ldap-server ~]# openssl x509  -noout -text -in ldap.example.com.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            f5:bb:f8:f2:53:05:10:30
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=IN, ST=Karnataka, L=Bengaluru, O=theitroad, OU=R&D, CN=ldap-server.example.com/[email protected]
        Validity
            Not Before: May 23 10:20:45 2017 GMT
            Not After : May 23 10:20:45 2021 GMT
        Subject: C=IN, ST=Karnataka, L=Bengaluru, O=theitroad, OU=R&D, CN=ldap-server.example.com/[email protected]
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:a4:6e:68:f6:5a:b2:72:ab:3c:8a:ca:aa:bf:3f:
                    e9:0a:d7:e5:49:67:6e:67:a4:01:56:dd:e8:dd:71:
                    40:d6:20:8a:24:ca:b3:72:b0:da:8e:05:86:37:61:
                    a5:1f:fd:0c:05:65:ac:35:72:7a:04:a6:6e:67:65:
                    f3:b4:b1:d5:b4:69:83:cb:d3:39:54:6d:94:b8:67:
                    9c:ec:4d:e6:24:90:a6:ff:fa:19:45:92:77:a7:77:
                    d3:79:d6:06:1c:63:17:d3:67:73:0c:1b:0b:63:97:
                    a7:73:ff:34:ee:8a:0e:6d:b5:4b:d6:2f:67:bc:62:
                    3d:65:21:f5:ff:8b:81:a0:cc:38:9c:fe:8c:27:10:
                    50:da:92:39:a4:bd:ae:14:e2:04:e8:70:f1:0a:01:
                    7f:37:70:c0:64:07:a0:51:1d:58:3e:de:7b:71:85:
                    ef:3f:c2:ff:6c:2f:15:13:17:05:36:9e:90:64:20:
                    d3:80:2d:3e:b3:6d:c2:94:b9:cf:81:8d:8f:65:00:
                    51:a9:8f:0c:0b:6a:dc:e6:93:10:79:68:af:b9:d6:
                    9c:53:32:e0:98:d9:c8:19:1c:6b:c1:d4:83:6b:d9:
                    cd:01:3d:0a:33:e9:6d:c6:c8:b2:27:8b:f1:a1:44:
                    5b:c9:01:7d:de:f9:cf:95:d5:85:4e:b8:e8:49:c2:
                    c8:84:93
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Server
            Netscape Comment:
                OpenSSL Generated Server Certificate
            X509v3 Subject Key Identifier:
                34:3E:4D:99:C6:FA:7A:11:EE:57:C4:41:00:89:28:10:3C:04:50:49
            X509v3 Authority Key Identifier:
                keyid:D2:D3:6F:EC:96:57:5E:13:47:57:A3:35:13:47:C1:57:24:C8:01:C6
                DirName:/C=IN/ST=Karnataka/L=Bengaluru/O=theitroad/OU=R&D/CN=ldap-server.example.com/[email protected]
                serial:88:BA:9D:AD:59:E8:C9:27
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                IP Address:192.168.43.32, IP Address:192.168.43.31, IP Address:192.168.43.154, DNS:client.example.com, DNS:server2.example.com
    Signature Algorithm: sha256WithRSAEncryption
         16:1e:13:6e:45:14:2f:2a:fc:e0:b3:e9:2c:68:e3:b4:4f:7b:
         03:f9:c2:c2:44:fb:5e:7f:ae:fb:07:1d:69:d0:5a:ed:70:62:
         f3:98:f0:8f:34:02:e4:0c:a0:3d:4d:19:69:7d:f8:7d:fb:a2:
         c6:b7:24:ec:02:a3:a3:cc:56:1e:ad:80:14:c7:21:b6:07:0e:
         13:36:80:7d:f8:a1:8c:53:8f:ab:ad:9d:09:f5:de:dc:d3:b7:
         2e:e2:39:40:1d:7e:be:1a:95:13:73:0b:57:64:5c:fd:22:8b:
         0f:56:d0:02:6f:87:b7:7e:c9:10:c0:7a:a2:8d:f6:24:33:b5:
         4f:2e:85:72:85:85:60:ac:f5:2c:28:ac:7e:aa:76:50:44:e0:
         7a:fa:14:06:ce:44:aa:fb:e8:22:cf:e5:ac:47:9c:aa:d4:2f:
         cd:1c:74:87:10:aa:17:af:40:99:7a:01:70:38:4a:a2:87:1e:
         4f:2f:0a:6e:22:71:37:4e:b5:31:28:22:ed:bf:62:d1:6f:34:
         2b:cc:62:06:bd:9f:b2:2d:a5:21:22:0b:a4:9b:19:4a:6c:02:
         b6:29:ec:2d:e7:0a:ed:c1

签署证书后,我们将证书和密钥文件都复制到/etc/openldap/certs /中。
我们还将CA证书复制到/etc/openldap/cacerts /中。
稍后,我们将不得不相应地修改openldap配置。

[root@ldap-server ~]# cp -v ldap.example.com.crt ldap.example.com.key /etc/openldap/certs/
‘ldap.example.com.crt’ -> ‘/etc/openldap/certs/ldap.example.com.crt’
‘ldap.example.com.key’ -> ‘/etc/openldap/certs/ldap.example.com.key’
[root@ldap-server ~]# cp -v ca.cert.pem /etc/openldap/cacerts/
‘ca.cert.pem’ -> ‘/etc/openldap/cacerts/ca.cert.pem’

保护LDAP协议

在CentOS 7中,已经存在与TLS相关的属性的默认值。
我们可以通过slapcat看到这些值。

[root@ldap-server ~]# slapcat -b "cn=config" | egrep "olcTLSCertificateFile|olcTLSCertificateKeyFile"
olcTLSCertificateFile: "OpenLDAP Server"
olcTLSCertificateKeyFile: /etc/openldap/certs/password

我们必须修改" olcTLSCertificateFile"和" olcTLSCertificateKeyFile"属性的值。
因此,我们创建以下LDIF文件:

[root@ldap-server ~]# cat tls7.ldif
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/ldap.example.com.crt

replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/ldap.example.com.key

更改"/etc/openldap/certs"和"/etc/openldap/cacerts"目录的所有权

[root@ldap-server ~]# chown -R openldap:openldap /etc/openldap/certs
[root@ldap-server ~]# chown -R openldap:openldap /etc/openldap/cacerts

然后,我们使用此LDIF文件运行ldapmodify命令。

[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi://-f tls7.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

接下来为CA证书文件添加一个新的属性olcTLSCACertificateFile
为此,我们将创建另一个ldiff文件

[root@ldap-server ~]# cat tls7_1.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/cacerts/ca.cert.pem
[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi://-f tls7_1.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

使用slapchat验证新值。

[root@ldap-server ~]# slapcat -b "cn=config" | egrep "olcTLSCertificateFile|olcTLSCertificateKeyFile|olcTLSCACertificateFile"
olcTLSCertificateFile: /etc/openldap/certs/ldap.example.com.crt
olcTLSCertificateKeyFile: /etc/openldap/certs/ldap.example.com.key
olcTLSCACertificateFile: /etc/openldap/cacerts/ca.cert.pem

现在,我们编辑/etc/sysconfig/slapd文件,将ldaps:///添加到SLAPD_URLS参数。

SLAPD_URLS="ldapi:///ldap:///ldaps:///"

在/etc/openldap/ldap.conf中更改以下内容

TLS_CACERTDIR /etc/openldap/certs
TLS_CACERT /etc/openldap/cacerts/ca.cert.pem

说明:

由于我们使用的是自签名证书,因此必须使用" TLS_CACERT"指定CA证书,否则在ldap客户端身份验证期间可能会导致TLS协商失败。
另外,我们可以选择从不对不安全的通信使用" TLS_REQCERT",并忽略任何证书检查

然后,我们重新启动服务以激活我们的更改

[root@ldap-server ~]# systemctl restart slapd

并使用journalctl -f确保日志中没有错误。
我更喜欢使用journalctl查看日志,我们可以使用任何编辑器/阅读器(例如less,more等)检查/var/log/messages

[root@ldap-server ~]# systemctl status slapd
● slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-23 16:51:12 IST; 3min 59s ago
     Docs: man:slapd
           man:slapd-config
           man:slapd-hdb
           man:slapd-mdb
           file:///usr/share/doc/openldap-servers/guide.html
  Process: 3799 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
  Process: 3760 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
 Main PID: 3801 (slapd)
   CGroup: /system.slice/slapd.service
           └─3801 /usr/sbin/slapd -u ldap -h ldapi:///ldap:///ldaps:///
May 23 16:52:19 ldap-server.example.com slapd[3801]: conn=1001 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
May 23 16:52:19 ldap-server.example.com slapd[3801]: conn=1001 op=2 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(&(&(?objectClass=sudo...2.168.43
May 23 16:52:19 ldap-server.example.com slapd[3801]: conn=1001 op=2 SRCH attr=objectClass objectClass cn sudoCommand sudoHost sudoUser sudoOptio...imestamp
May 23 16:52:19 ldap-server.example.com slapd[3801]: conn=1001 op=2 SEARCH RESULT tag=101 err=0 nentries=0 text=
Hint: Some lines were ellipsized, use -l to show in full.

验证LDAP的TLS连接

为了确保LDAP的TLS正常运行,我们可以通过将-ZZ选项传递给ldapsearch来对其进行检查。

因此,我们告诉" ldapsearch"建立TLS连接。

[root@ldap-server certs]# ldapsearch -x -ZZ
# extended LDIF
## LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
## search result
search: 3
result: 32 No such object
# numResponses: 1

当使用ldapsearch时,有时系统期望证书文件采用特殊的数字格式。
这种数字格式可以通过openssl获得,像这样:

[root@ldap-server certs]# openssl x509 -in /etc/openldap/certs/ca.cert.pem -hash
5e379662
-----BEGIN CERTIFICATE----
MIIEETCCAvmgAwIBAgIJAIUTUHlq/B9HMA0GCSqGSIb3DQEBCwUAMIGeMQswCQYD
VQQGEwJJTjESMBAGA1UECAwJS0FSTkFUQUtBMRIwEAYDVQQHDAlCRU5HQUxVUlUx

配置防火墙

首先,在服务器中,我们必须允许传入流量到端口ldap(389)和ldaps(636)。

[root@ldap-server ~]# firewall-cmd --add-service=ldap
success
[root@ldap-server ~]# firewall-cmd --add-service=ldaps
success