第 8 章 身份管理

8.1. 安全 LDAP 通信

如果您已将 Identity 服务(keystone)配置为针对或从 LDAP 服务器检索身份信息,您可以使用 CA 证书保护身份服务的 LDAP 通信。

您必须从 Active Directory 获取 CA 证书,将 CA 证书文件转换为 Privacy Enhanced Mail (PEM)文件格式,并为 Identity 服务配置安全 LDAP 通信。您可以根据配置 CA 信任的位置和方式,通过三种方法之一执行此配置。

8.1.1. 从 Active Directory 获取 CA 证书

使用以下示例代码查询 Active Directory 以获取 CA 证书。CA_NAME 是证书的名称,并可根据您的配置更改其余参数:

CA_NAME="WIN2012DOM-WIN2012-CA"
AD_SUFFIX="dc=win2012dom,dc=com" LDAPURL="ldap://win2012.win2012dom.com"
ADMIN_DN="cn=Administrator,cn=Users,$AD_SUFFIX"
ADMINPASSWORD="MyPassword"

CA_CERT_DN="cn=latexmath:[$CA_NAME,cn=certification authorities,cn=public key services,cn=services,cn=configuration,$]AD_SUFFIX"

TMP_CACERT=/tmp/cacert.`date +'%Y%m%d%H%M%S'`.$$.pem

ldapsearch -xLLL -H
latexmath:[$LDAPURL -D `echo \"$]ADMIN_DN"`-W -s base -b`echo
"$CA_CERT_DN"` objectclass=* cACertificate

8.1.2. 将 CA 证书转换为 PEM 文件格式

创建名为 /path/cacert.pem 的文件,并包含从 Active Directory 获取 CA 证书的 LDAP 查询站的内容,该文件在标头和页脚内:

-----BEGIN CERTIFICATE-----
MIIDbzCCAlegAwIBAgIQQD14hh1Yz7tPFLXCkKUOszANB... -----END
CERTIFICATE-----

为进行故障排除,您可以执行以下查询来检查 LDAP 是否正常工作,并确保 PEM 证书文件是否已正确创建。

LDAPTLS_CACERT=/path/cacert.pem ldapsearch -xLLL -ZZ -H $LDAPURL -s base -b "" "objectclass=*" currenttime

查询应返回类似如下的结果:

dn: currentTime:
20141022050611.0Z

如果 CA 证书由 web 服务器托管,您可以运行以下命令获取 CA 证书。

Example

  • $HOST=redhat.com
  • $PORT=443
# echo Q | openssl s_client -connect $HOST:$PORT | sed -n -e '/BEGIN CERTIFICATE/,/END CERTIFICATE/ p'

8.1.3. 为 Identity 服务配置安全 LDAP 通信的方法

8.1.3.1. 方法 1

如果使用 PEM 文件在 LDAP 级别配置了 CA 信任,请使用此方法。手动指定 CA 证书文件的位置。以下流程保护 LDAP 通信不仅针对 Identity 服务的安全,而不适用于所有使用 OpenLDAP 库的应用程序。

  1. 将包含 PEM 格式的 CA 证书链的文件复制到 /etc/openldap/certs 目录。
  2. 编辑 /etc/openldap/ldap.conf 并添加以下指令,将 [CA_FILE] 替换为 CA 证书文件的位置和名称:

    TLS_CACERT /etc/openldap/certs/[CA_FILE]
  3. 重启 horizon 容器:

    # systemctl restart tripleo_horizon

8.1.3.2. 方法 2

如果使用网络安全服务(NSS)数据库在 LDAP 库级别配置了 CA 信任,则使用此方法。使用 certutil 命令将 CA 证书导入并信任到 OpenLDAP 库使用的 NSS 证书数据库中。以下流程保护 LDAP 通信不仅针对 Identity 服务的安全,而不适用于所有使用 OpenLDAP 库的应用程序。

  1. 导入并信任证书,将 [CA_FILE] 替换为 CA 证书文件的位置和名称:

    # certutil -d /etc/openldap/certs -A -n "My CA" -t CT,, -a -i [CA_FILE]
    # certutil -d /etc/openldap/certs -A -n "My CA" -t CT,, -a -i [CA_FILE]
  2. 确认 CA 证书是否已正确导入:

    # certutil -d /etc/openldap/certs -L

    您的 CA 证书已被列出,信任属性被设置为 CT,

  3. 重启 horizon 容器:

    # systemctl restart tripleo_horizon

8.1.3.3. 方法 3

如果使用 PEM 文件在 Keystone 级别配置了 CA 信任,则使用此方法。保护 Identity 服务和 LDAP 服务器之间的通信的最终方法是为 Identity 服务配置 TLS。

但是,与以上两种方法不同,此方法只为 Identity 服务保护 LDAP 通信,且不会保护使用 OpenLDAP 库的其他应用程序的 LDAP 通信。

以下流程使用 openstack-config 命令编辑 /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf 文件中的值。

  1. 启用 TLS:

    # openstack-config --set /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf ldap use_tls True
  2. 指定证书的位置,将 [CA_FILE] 替换为 CA 证书的名称:

    # openstack-config --set /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf ldap tls_cacertfile [CA_FILE]
  3. 指定 LDAP 服务器的传入 TLS 会话上执行的客户端证书检查,将 [CERT_BEHAVIOR] 替换为以下列出的行为之一:

    需求
    从 LDAP 服务器请求证书。如果没有提供证书,或者无法针对现有证书颁发机构文件验证所提供的证书,则会话将被终止。
    allow
    从 LDAP 服务器请求证书。即使未提供证书,会话也会正常进行。如果提供了证书,但无法针对现有的证书颁发机构文件进行验证,则证书将被忽略,会话将正常运行。
    never
    将不会请求证书。
    # openstack-config --set /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf ldap tls_req_cert [CERT_BEHAVIOR]
  4. 重启 keystone 和 horizon 容器:

    # systemctl restart tripleo_keystone
    # systemctl restart tripleo_horizon