最新消息:

配置 OpenLDAP 使用 SSL/TLS 加密数据通信

OpenLDAP admin 4318浏览 0评论

OpenLDAP 和 OpenSSL 简介

OpenLDAP 是最常用的目录服务之一,它是一个由开源社区及志愿者开发和管理的一个开源项目,提供了目录服务的所有功能,包括目录搜索、身份认证、安全通道、过滤器等等。大多数的 Linux 发行版里面都带有 OpenLDAP 的安装包。OpenLDAP 服务默认使用非加密的 TCP/IP 协议来接收服务的请求,并将查询结果传回到客户端。由于大多数目录服务都是用于系统的安全认证部分比如:用户登录和身份验证,所以它也支持使用基于 SSL/TLS 的加密协议来保证数据传送的保密性和完整性。OpenLDAP 是使用 OpenSSL 来实现 SSL/TLS 加密通信的。

OpenSSL 是 SSL/TLS 加密算法及通信协议的开源实现包,实现了 SSLv2、SSLv3、TLSv1 及 TLSv1.2 的加密算法和通信协议,并提供 API 给第三方应用。第三方应用可以很容易的使用 OpenSSL 来将明文通信加密。OpenLDAP 和 OpenSSL 的互相配合是本文的主要内容,包括:OpenLDAP 服务端的 SSL/TLS 配置、OpenLDAP 客户端的 SSL/TLS 配置。

本文讲述的所有内容和命令适用于 Redhat Enterprise Linux 6.3,其他发行版本的 Linux 可能略有不同。

 

配置 OpenLDAP 使用 SSL/TLS 加密数据通信

SSL/TLS 加密原理简介

SSL/TLS 是基于 PKI 机制的加密方式,包括证书认证、密钥交换、非对称加密、对称加密。SSL/TLS 采用 CA 作为服务端和客户端都信赖的具有权威性的组织,证书的颁发和认证都依赖于 CA,并假定 CA 颁发的证书是可靠的、可信赖的,证书里面的内容是真实的、有效的,并可用于客户机和服务器进行安全的可靠的通信加密。

SSL/TLS 证书用来认证服务器和客户机双方的身份,并用于密钥交换时候的非对称加密。密钥交换完毕之后,就可以用这个密钥做通信数据的对称加密了,具体的加密算法是由客户机和服务器互相协商得来。服务器和客户机由于 SSL/TLS 库的不同以及用户的配置不同,双方支持的算法列表不完全相同,当双方做 SSL/TLS 握手的时候,就需要将自己支持的算法列表及优先顺序告知对方,一旦对方按照优先顺序找到了第一个支持的算法,那么协商完成,否则双方协商失败,SSL/TLS 连接断开。

如何配置 OpenLDAP 客户端和服务端的算法列表将在本文的后续内容中做重点介绍,用户可以通过控制这个列表来提高安全等级,或者降低安全等级来适应更多的算法。

OpenSSL 常用命令

OpenSSL 提供了为数众多的命令来帮助用户使用和查看 SSL/TLS 加密算法、查看证书、生成证书、测试 SSL/TLS 连接等等,以下是一些常用命令的介绍。

  • 查看 OpenSSL 支持的所有算法
    #openssl ciphers
  • 查看 OpenSSL 是否支持某个算法,如 ECDH-ECDSA-AES128-GCM-SHA256
    # openssl ciphers ECDH-ECDSA-AES128-GCM-SHA256
  • 查看 OpenSSL 是否支持某个协议,如 TLSv1.2
    # openssl ciphers TLSv1.2
  • 查看 x509 证书
    # openssl x509 -in cert.pem -text –noout
  • 检测与 LDAP server 的连接
    # openssl s_client -connect 9.181.137.155:636 -showcerts -state 
      -CAfile /opt/ibm/director/vmi/data/sec/vmitruststore.pem
  • 生成自签名的 CA 证书
    #openssl req -x509 -newkey rsa:1024 -passout pass:123456 -days 3650 
    -keyout whhit.pem.key -out whhit.pem.cer -subj 
    "/CN=whhit.me/OU=WeRun Club/O=whhit/L=Weihai/S=Shandong/C=CN"
  • 生成私钥
    #openssl genrsa -des3 -out whhit.pem.key -passout pass:123456 1024
  • 使用指定的私钥生成一个 CSR (Certificate Signing Request)
    #openssl req -new -key whhit.pem.key -passin pass:123456 
    -out whhit.pem.csr -subj 
     "/CN=whhit.me/OU=WeRun Club/O=whhit/L=Weihai/S=Shandong/C=CN"
  • 将加密的私钥导出为明文的私钥
    #openssl rsa -in whhit.pem.key -passin pass:123456 -out whhit.pem.clear.key
  • 使用指定的私钥签名生成证书
    #openssl x509 -req -days 3650 -in whhit.pem.csr -signkey whhit.pem.clear.key -out whhit.pem.cer
  • 将私钥和证书转化为 PKCS#12 格式的单个文件
    #openssl pkcs12 -export -in whhit.pem.cer -inkey whhit.pem.key -passin pass:123456 
    -out whhit.p12 -passout pass:123456 -name tomcat

OpenLDAP 的 SSL/TLS 服务器端配置

OpenLDAP 服务端的配置包括软件安装、证书生成、密码组配置等,下面是详细介绍。

  • 服务器端需要安装的软件检查 OpenLDAP 和 OpenSSL 的组件是否已经安装,如果没有,需要先安装如下组件:
    openldap2-back-meta-2.4.20-35,openldap2-client-2.4.20-35,openldap2-2.4.20-35,
    openldap2-back-perl-2.4.20-35,openssl-1.0.1e-13,openssl-32bit-1.0.1e-13,
    php5-openssl-5.2.14-0.7.30.38.2,python-openssl-0.7.0-217
  • 用 PKI 生成 SSL/TLS 服务器证书创建证书分为 3 个步骤,创建 CA、创建证书请求和用 CA 对证书请求签名生成证书。
    1. 创建 CA/etc/pki/tls/misc 是工作目录,/etc/pki/CA 是存放所有 CA 相关文件的目录。如果脚本检测到/etc/pki/CA 下面有文件存在,CA 脚本什么工作也不会做。为确保 CA 脚本能正常工作,需要先把/etc/pki/CA 目录下的文件全删除。
      # cd  /etc/pki/tls/misc   (进入工作目录)
      # ./CA –newca               (生成 CA)
    2. 创建 Server 端证书证书的生成分为两步,生成证书请求文件和用 CA 对证书文件进行签名。
      #./CA.pl –newreq      (生成证书请求)
    3. CA 对证书请求签名
      #./CA.pl –sign

      在/etc/pki/tls/misc 路径下创建了 3 个文件,newreq.pem 创建证书请求文件,newcert.pem CA 签发的证书,newkey.pem 证书对应的钥匙。

      重命名证书和私钥文件

      # mv newcert.pem server.cert
      # mv newkey.pem server.key
      # chmod 644 server.cert
      # chmod 644 server.key

      把这两个文件和 CA 的证书文件拷贝到 OpenLDAP 存放证书的目录下,一般在/etc/openldap/cacerts。如果 CA 与 LDAP server 不在同一台机器上需要用 scp 命令将以下文件拷贝到 LDAP server 相应目录。

      # mv server.cert /etc/openldap/cacerts
      # mv serve.key /etc/openldap/cacerts
      # cp ../../CA/cacert.pem /etc/openldap/cacerts
  • 配置 LDAP 服务器
    1. 停掉 LDAP 服务
      #service ldap stop
    2. 编辑/etc/openldap/slapd.conf 在 slapd.conf 文件中加入以下内容
      TLSCACertificateFile /etc/openldap/cacerts/cacert.pem #配置 CA 证书的路径
      TLSCertificateFile /etc/openldap/cacerts/server.cert #配置 server 证书的路径
      TLSCertificateKeyFile /etc/openldap/cacerts/server.key #配置 server 私钥的路径
      TLSCipherSuite ALL:!TLSv1.1:TLSv1.2:!SSLv2:!aNULL:!eNULL:!MD5:!MEDIUM:!LOW
      :!EXPORT:@STRENGTH #支持的协议密码及不支持的协议和密码,!表示不支持
      TLSVerifyClient never # 设置是否验证 client 的身份,其值可以是 never/allow/try/demand,
      #never 不需要验证 client 端的身份,Client 端只需要有 CA 证书就可以了
      #allow Server 会要求 client 提供证书,如果 client 端没有提供证书,会话会正常进行
      #try    Client 端提供了证书,但是 Server 端有可能不能校验这个证书,这个证书会被忽略,会话正常进行
      #demand Server 端需要认证 client 端的身份,Client 端需要有自己的证书和私钥
    3. 启动 LDAP 服务
      #service ldap start

OpenLDAP 的 SSL/TLS 客户端配置

OpenLDAP 客户端的配置包括证书创建、服务器连接配置、证书配置、密码组配置等,以下是详细的步骤。

  • Client 端的证书文件制作Client 端的证书制作与 Server 端类似,先创建请求文件,然后用 CA 对请求文件进行签名。签名时一般采用 Client 的主机名(hostname)做为 Common name。证书的名字实际上就是证书中的 Common Name 字段。这个字段应该从证书中进行检索,并根据主机名进行验证,如果二者不能匹配,证书的安全性就会受到质疑。有些公司在不同的主机上使用相同的证书,即使证书中的 Common Name 只是用于一个主机的,这是为了确保证书来自相同的公司,能够进行更深入的检查。Common Name 具体取什么值取决于项目的安全性需要。
    #./CA.pl –newreq      (生成证书请求)
    #./CA.pl –sign
    # mv newcert.pem client.cert
    # mv newkey.pem client.key
    # chmod 644 client.cert
    # chmod 644 client.key

    把这两个文件和 CA 的证书文件用 scp 命令拷贝到 Client 端 OpenLDAP 存放证书的目录下,如/etc/openldap/cacerts。

  • 编辑/etc/openldap/ldap.conf
    URI ldaps://vm189.cn.ibm.com:636     # 一定要和 server 的证书里输入的 full qualified name 一样
    TLS_CACERT /etc/openldap/cacerts/cacert.pem     # CA 的证书
    TLS_REQCERT never     # client 是否要求认证 server 端
    TLS_CIPHER_SUITE ALL:!TLSv1.1:!TLSv1:!SSLv3:!SSLv2:!aNULL:!eNULL:!MD5:!MEDIUM:!LOW:
    !EXPORT:@STRENGTH
  • 重启 LDAP 服务
    #service ldap restart
  • 检验与 LDAP server 之间是否能连通
    #openssl s_client –connect vm189.cn.ibm.com:636 –CAfile /etc/openldap/cacerts/cacert
    .pem-showcerts –state

验证 OpenLDAP 服务器端和客户端的 SSL/TLS 协议协商方式

为了验证 OpenLDAP 的服务端和客户端的 SSL/TLS 连接协议的正确性,我们可以按照如下的步骤来检验。

  • 配置服务器端并重启服务器端的 LDAP Service按照前面叙述的步骤配置好 LDAP 服务器。重启 LDAP Service
    #service ldap restart

    导入 LDAP user 信息

    将 ldif 文件上传到 ldap 服务器,如 tmp 目录。如导入的文件名字为 ldapou.ldif, 其文件中关于 oladmin 账户的内容如下:

    dn: uid=oladmin,ou=People,c=cn,dc=ibm,dc=com
    uid: oladmin
    cn: oladmin
    sn: oladmin
    mail: oladmin@cn.ibm.com
    objectClass: person
    objectClass: organizationalPerson
    objectClass: inetOrgPerson
    objectClass: top
    objectClass: posixAccount
    userPassword: passw0rd
    uidNumber: 501
    gidNumber: 501
    homeDirectory: /home/oladmin

    运行如下命令增加用户和组到 LDAP 服务器目录

    # ldapadd -x -D "cn=root,c=cn,dc=ibm,dc=com" -w passw0rd -f /tmp/ldapou.ldif

    重启 LDAP Service

    #service ldap restart
  • 配置客户端并重启客户端的 LDAP Service在客户端的/etc/openldap/目录中配置 ldap.conf 文件,内容如下:
    TLS_REQCERT never
    TLS_CIPHER_SUITE ALL:!TLSv1.1:!TLSv1:!SSLv3:!SSLv2:!aNULL:!eNULL:!MD5:!MEDIUM
    :!LOW:!EXPORT:@STRENGTH
    URI ldaps://vm189.cn.ibm.com:636     #ldap server 地址
    base c=cn,dc=ibm,dc=com
    binddn cn=root,c=cn,dc=ibm,dc=com
    bindpw crypt{77f132b2f9d77723}
    searchfilter (&(uid=%v)(objectclass=inetOrgPerson))
    pam_login_attribute uid
    ldap_version 3
    timelimit 30
    bind_timelimit 30
    bindpw_key /etc/openldap/fsm.data     #密码
    TLS_CACERT /opt/ibm/director/vmi/data/sec/vmitruststore.pem  #CA 证书
    pam_lookup_policy yes
  • 在客户端验证服务器端的 LDAP user 信息运行 ldapsearch 命令,查看服务器端的 user
     # ldapsearch -x -ZZ -h 9.181.137.189 636 (ZZ 选项用来启动 TLS 连接)

    命令运行后的结果

    # extended LDIF
    # LDAPv3
    # base <c=cn,dc=ibm,dc=com> (default) with scope subtree
    # filter: (objectclass=*)
    # requesting: 636
    # cn, ibm.com
    dn: c=cn,dc=ibm,dc=com
    # People, cn, ibm.com
    dn: ou=People,c=cn,dc=ibm,dc=com
    # Group, cn, ibm.com
    dn: ou=Group,c=cn,dc=ibm,dc=com
    # oladmin, People, cn, ibm.com
    dn: uid=oladmin,ou=People,c=cn,dc=ibm,dc=com
    ……(此处省略了其他账户的信息)

    从返回的结果中可以找到从服务器端导入的 user,如 oladmin 等账户信息,证明 TLS LDAP 连接时建立好了。

     

转载请注明:爱开源 » 配置 OpenLDAP 使用 SSL/TLS 加密数据通信

您必须 登录 才能发表评论!