轻型目录访问协议 (LDAP) 身份验证方法的工作原理与密码身份验证类似。主要差异在于,LDAP 方法通过 LDAP 或 Active Directory 服务器对尝试访问您的 Vertica 数据库的客户端进行身份验证。当您的数据库需要通过 LDAP 或 Active Directory 服务器验证用户身份时,请使用 LDAP 身份验证。
LDAP 身份验证
- 1: LDAP 先决条件和定义
- 2: LDAP 身份验证参数
- 3: LDAP 身份验证的 TLS
- 4: LDAP 的身份验证 fallthrough
- 5: LDAP 绑定方法
- 5.1: 配置 LDAP 捆绑的工作流程
- 5.2: LDAP 搜索和捆绑配置工作流
1 - LDAP 先决条件和定义
先决条件
在为 Vertica 数据库配置 LDAP 身份验证前,您必须具有:
-
LDAP 服务器的 IP 地址和主机名。Vertica 支持 IPv4 和 IPv6 地址。
-
组织的 Active Directory 信息。
-
用于搜索和捆绑的服务账户。
-
对 Vertica 数据库的管理访问权限。
-
open-ldap-tools
程序包至少安装在一个节点上。该包包括ldapsearch
。
定义
对于 LDAP 身份验证,记住以下定义非常重要:
2 - LDAP 身份验证参数
LDAP 身份验证需要配置几个参数。
常规 LDAP 参数
使用下列参数配置 LDAP 绑定或 LDAP 绑定和搜索:
LDAP 绑定参数
以下参数将创建一个绑定名称字符串,用于指定并唯一标识 LDAP 服务器的用户。有关详细信息,请参阅配置 LDAP 捆绑的工作流程。
要创建绑定名称字符串,必须设置以下内容之一(且只能设置一项):
-
binddn_prefix
和binddn_suffix
(必须一起设置) -
domain_prefix
-
email_suffix
例如,如果您设置了 binddn_prefix
和 binddn_suffix
,则不能设置 email_suffix
。相反,如果设置了 email_suffix
,则不能设置 binddn_prefix
和 binddn_suffix
。
如果未设置绑定参数,Vertica 将执行绑定和搜索操作,而不是绑定操作。
以下示例使用身份验证记录 v_ldap
:
=> CREATE AUTHENTICATION v_ldap METHOD 'ldap' HOST '10.0.0.0/23';
LDAP 搜索和绑定参数
使用 LDAP 搜索和绑定进行身份验证时,使用以下参数。有关详细信息,请参阅LDAP 搜索和捆绑配置工作流。
以下示例演示了如何设置这三个属性。在本例中,设置为:
-
binddn
到cn=Manager,dc=example,dc=com
-
bind_password
到secret
-
search_attribute
到cn
=> ALTER AUTHENTICATION auth_method_name SET host='ldap://example13',
basedn='dc=example,dc=com',binddn='cn=Manager,dc=example,dc=com',
bind_password='secret',search_attribute='cn';
binddn
和 bind_password
参数是可选的。如果忽略,Vertica 将执行匿名搜索。
3 - LDAP 身份验证的 TLS
Vertica 在两个上下文中建立到 LDAP 服务器的连接,每个上下文都有一个对应的 TLS CONFIGURATION,用于控制每个连接是否应使用 TLS:
-
LDAPLink:使用 LDAPLink 服务或其试运行功能在 Vertica 和 LDAP 服务器之间同步用户和组。
-
LDAPAuth:当具有
ldap
身份验证方法的用户尝试登录 Vertica 时,Vertica 会尝试将该用户绑定到 LDAP 服务器中的匹配用户。如果绑定成功,Vertica 将允许用户登录。
查询 TLS_CONFIGURATIONS 以查看现有的 TLS CONFIGURATION:
=> SELECT * FROM tls_configurations WHERE name IN ('LDAPLink', 'LDAPAuth');
name | owner | certificate | ca_certificate | cipher_suites | mode
----------+---------+-------------+----------------+---------------+----------
LDAPLink | dbadmin | client_cert | ldap_ca | | VERIFY_CA
LDAPAuth | dbadmin | client_cert | ldap_ca | | DISABLE
(2 rows)
本页介绍 LDAPAuth 上下文。有关 LDAPLink 上下文的详细信息,请参阅 LDAP Link 的 TLS。
请注意,为 LDAP 身份验证配置 TLS 不会使用 TLS 对 Vertica 与客户端之间的连接进行加密。要配置客户端-服务器 TLS,请参阅配置客户端-服务器 TLS。
配置 LDAP 身份验证
客户端与 Vertica 成功建立连接后,它们必须以用户身份进行身份验证,然后才能与数据库进行交互。如果用户具有 ldap
身份验证方法,Vertica 将连接到 LDAP 服务器以对用户进行身份验证。要为此上下文配置 TLS,请使用以下过程。
设置 LDAPAuth TLS 配置
LDAPAuth TLS 配置采用客户端证书和使用 CREATE CERTIFICATE 创建或导入的 CA 证书。Vertica 会将客户端证书提供给 LDAP 服务器以供其 CA 进行验证。Vertica 使用 CA 证书来验证 LDAP 服务器的证书。
有关密钥和证书生成的详细信息,请参阅生成 TLS 证书和密钥。
-
如果您希望 Vertica 在建立连接之前验证 LDAP 服务器的证书,请生成或导入 CA 证书并将其添加到 LDAPAuth TLS 配置中。
例如,要导入现有的 CA 证书
LDAP_CA.crt
:=> \set ldap_ca '\''`cat ldap_ca.crt`'\'' => CREATE CA CERTIFICATE ldap_ca AS :ldap_ca; CREATE CERTIFICATE
然后,将
ldap_ca
CA 证书添加到 LDAPAuth:ALTER TLS CONFIGURATION LDAPAuth ADD CA CERTIFICATES ldap_ca;
-
如果您的 LDAP 服务器需要验证客户端证书,您必须生成或导入客户端证书及其密钥,并将其添加到 LDAPAuth TLS 配置中。Vertica 会将此证书提供给 LDAP 服务器以供其 CA 进行验证。
例如,要导入现有的证书
client.crt
(由导入的 CA 签名)和密钥client.key
:=> \set client_key '\''`cat client.key`'\'' => CREATE KEY client_key TYPE 'RSA' AS :client_key; CREATE KEY => \set client_cert '\''`cat client.crt`'\'' => CREATE CERTIFICATE client_cert AS :client_cert SIGNED BY ldap_ca KEY client_key; CREATE CERTIFICATE
然后,将
client_cert
添加到 LDAPAuth:=> ALTER TLS CONFIGURATION LDAPAuth CERTIFICATE client_cert;
-
通过将 TLSMODE 设置为以下之一来启用 TLS 或 LDAPS(使用的确切协议取决于 AUTHENTICATION 对象中
host
的值)。TRY_VERIFY
或更高版本需要 CA 证书:-
ENABLE
:启用 TLS。Vertica 不检查 LDAP 服务器的证书。 -
TRY_VERIFY
:如果出现以下任一情况,则建立 TLS 连接:-
LDAP 服务器提供一个有效的证书。
-
LDAP 服务器不提供证书。
如果 LDAP 服务器提供无效证书,则使用纯文本连接。
-
-
VERIFY_CA
:如果 Vertica 验证 LDAP 服务器的证书来自受信任的 CA,则连接成功。使用此 TLSMODE 会强制所有没有证书的连接使用纯文本。 -
VERIFY_FULL
:如果 Vertica 验证 LDAP 服务器的证书来自受信任的 CA 并且cn
(通用名称)或subjectAltName
属性与 LDAP 服务器的主机名或 IP 地址匹配,则连接成功。cn
用于用户名,因此subjectAltName
必须与 LDAP 服务器的主机名或 IP 地址匹配。
例如:
=> ALTER TLS CONFIGURATION LDAPAuth TLSMODE 'verify_ca'; ALTER TLS CONFIGURATION
-
-
验证 LDAPAuthConfigParameter 参数是否正在使用 TLS 配置:
=> SHOW CURRENT LDAPAuthTLSConfig; level | name | setting ---------+-------------------+---------- DEFAULT | LDAPAuthTLSConfig | LDAPAuth (1 row)
-
启用身份验证记录:
=> ALTER AUTHENTICATION ldap_auth ENABLE;
创建 LDAP 身份验证记录
客户端与 Vertica 成功建立连接后,它们必须以用户身份进行身份验证,然后才能与数据库进行交互。如果用户具有 ldap
身份验证方法,Vertica 将连接到 LDAP 服务器并尝试绑定以对用户进行身份验证。
要查看现有的身份验证记录,请查询 CLIENT_AUTH。
有关此过程中引用的参数的详细信息,请参阅 LDAP 身份验证参数。
-
创建具有 LDAP 方法的身份验证记录。
用于创建 LDAP 身份验证记录的语法:
=> CREATE AUTHENTICATION auth_record_name method 'ldap' HOST 'user_connection_source';
例如,要创建适用于从任何主机连接的用户的 LDAP 身份验证记录:
=> CREATE AUTHENTICATION ldap_auth METHOD 'ldap' HOST '0.0.0.0/0';
-
更改身份验证类型,以设置 LDAP 服务器的主机和端口(可选)以及域名 (basedn),并绑定可分辨名称 (
binddn
)。-
要在 Vertica 和 LDAP 服务器之间使用明文连接,请将
host
URL 设置为以ldap://
开头,并将 LDAPAuth 的 TLSMODE 设置为DISABLE
。 -
要使用 StartTLS,请将
host
URL 设置为以ldap://
开头,并将LDAPAuth
的 TLSMODE 设置为ENABLE
或更高。 -
要使用 LDAPS,请将
host
URL 设置为以ldaps://
开头,并将LDAPAuth
的 TLSMODE 设置为ENABLE
或更高。
例如,要在位于端口 5389 上且 IP 地址为 192.0.2.0 的 LDAP 服务器上搜索 Active Directory
orgunit.example.com
中的用户:=> ALTER AUTHENTICATION ldap_auth SET host='ldap://192.0.2.0:5389', basedn='ou=orgunit,dc=example,dc=com', binddn_prefix='cn=', binddn_suffix=',ou=orgunit,dc=example,dc=com';
binddn_prefix
和binddn_suffix
结合起来可创建完整 DN。也就是说,对于 Vertica 用户 asmith,'cn=asmith,ou=orgunit,dc=example,dc=com
' 是 Vertica 尝试绑定时的完整 DN。 -
-
将身份验证记录授予用户或角色。
例如:
=> GRANT AUTHENTICATION ldap_auth TO asmith;
在这种情况下,当用户 asmith 尝试登录时,Vertica 会通过 ldap_auth 中指定的搜索库构建可分辨名称 'cn=asmith,ou=orgunit,dc=example,dc=com',然后连接到 LDAP 服务器,并尝试将其绑定到 Vertica 用户。如果绑定成功,Vertica 将允许 asmith 登录。
4 - LDAP 的身份验证 fallthrough
要为单个 LDAP 服务器使用多个搜索属性或配置多个 LDAP 服务器,请为每个搜索属性或服务器创建单独的身份验证记录,并在每个 ldap
记录(最后一个除外)上启用身份验证 fallthrough(按优先级顺序)。
示例
以下示例创建了两个身份验证记录,vldap1
和 vldap2
。它们一起指定 LDAP 服务器应首先搜索整个目录 (basedn=dc=example,dc=com
) 中 OU 属性为 Sales
的 DN。如果第一个搜索没有返回结果或失败,LDAP 服务器接下来将搜索 OU 属性为 Marketing
的 DN:
=> CREATE AUTHENTICATION vldap1 method 'ldap' HOST '10.0.0.0/8' FALLTHROUGH;
=> ALTER AUTHENTICATION vldap1 PRIORITY 1;
=> ALTER AUTHENTICATION vldap1
SET host='ldap://ldap.example.com/search',
basedn='dc=example,dc=com',
search_attribute='Sales';
=> GRANT AUTHENTICATION vldap1 to public;
=> CREATE AUTHENTICATION vldap2 method 'ldap' HOST '10.0.0.0/8';
=> ALTER AUTHENTICATION vldap2 PRIORITY 0;
=> ALTER AUTHENTICATION vldap2 SET
host='ldap://ldap.example.com/search',
basedn='dc=example,dc=com',
search_attribute='Marketing';
=> GRANT AUTHENTICATION vldap2 to public;
5 - LDAP 绑定方法
您可以使用以下两种 LDAP 方法来在 LDAP 服务器上对 Vertica 数据库进行身份验证。
-
绑定 — 当 Vertica 连接到 LDAP 服务器并使用 CN 和密码绑定时,使用 LDAP 绑定。(这些值是登录到数据库的用户的用户名和密码)。当您的 LDAP 帐户的 CN 字段与数据库中定义的用户名的 CN 字段匹配时,使用捆绑方法。有关详细信息,请参阅配置 LDAP 捆绑的工作流程。
-
搜索和绑定 — 当您的 LDAP 帐户的 CN 字段是用户的全称或与数据库中定义的用户名不匹配时,使用 LDAP 搜索和绑定。对于搜索和捆绑,用户名通常在另一个字段中,如 标准 Active Directory 环境中的 UID 或 sAMAccountName。搜索和捆绑需要组织的 Active Directory 信息。这些信息能让 Vertica 登录到 LDAP 服务器并搜索指定的字段。有关详细信息,请参阅LDAP 搜索和捆绑配置工作流。
如果您正在使用搜索和捆绑,可通过服务帐户简化服务器端配置。此外,您无需存储 Active Directory 密码。
LDAP 匿名绑定
Anonymous binding 是一个 LDAP 服务器函数。匿名捆绑不需要 binddn 和 bindpasswd,因此允许客户无需登录即可连接和搜索目录(捆绑和搜索)。
当您使用管理控制台 (Management Console) 配置 LDAP 身份验证时,也不需要登录。
5.1 - 配置 LDAP 捆绑的工作流程
要配置您的 Vertica 数据库,以使用 LDAP 捆绑对客户端进行身份验证,请遵循以下步骤:
-
获取服务帐户。有关信息,请参阅 [LDAP 产品文档](https://msdn.microsoft.com/en-us/library/aa772152(v=vs.85)。您无法使用连接参数中的服务帐户进行 LDAP 捆绑。
-
比较用户的 LDAP 帐户名及其 Vertica 用户名。例如,如果 John Smith 的 Active Directory (AD) sAMAccountName = jsmith,他的 Vertica 用户名必须是 jsmith。
但是,LDAP 帐户不必与数据库用户名匹配,如以下示例中所示:
=> CREATE USER r1 IDENTIFIED BY 'password'; => CREATE AUTHENTICATION ldap1 METHOD 'ldap' HOST '172.16.65.177'; => ALTER AUTHENTICATION ldap1 SET HOST= 'ldap://172.16.65.10',basedn='dc=dc,dc=com',binddn_suffix=',ou=unit2,dc=dc,dc=com',binddn_prefix='cn=use'; => GRANT AUTHENTICATION ldap1 TO r1;
\! ${TARGET}/bin/vsql -p $PGPORT -U r1 -w $LDAP_USER_PASSWD -h ${HOSTNAME} -c "select user_name, client_authentication_name from sessions;" user_name | client_authentication_name -----------+---------------------------- r1 | ldap (1 row)
-
针对您的 LDAP 或 AD 服务器从一个 Vertica 节点运行
ldapsearch
。验证到服务器的连接,并确定相关字段的值。运行ldapsearch
有助于构建配置 LDAP 身份验证所需的客户端身份验证字符串。在下述示例中,对于其 CN 包含用户名 jsmith 的任何用户,
ldapsearch
将返回 CN、DN 和 sAMAccountName 字段(若存在)。此搜索只有对允许匿名捆绑的 LDAP 服务器执行才会成功:$ ldapsearch -x -h 10.10.10.10 -b "ou=Vertica Users,dc=CompanyCorp,dc=com" '(cn=jsmith*)' cn dn uid sAMAccountName
ldapsearch
返回以下结果。LDAP 捆绑的相关信息显示为粗体:# extended LDIF # # LDAPv3 # base <ou=Vertica Users,dc=CompanyCorp,dc=com> with scope subtree # filter: (cn=jsmith*) # requesting: cn dn uid sAMAccountName # # jsmith, Users, CompanyCorp.com dn:cn=jsmith,ou=Vertica Users,dc=CompanyCorp,dc=com cn: jsmith uid: jsmith # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
-
基于
ldapsearch
提供的信息创建新的身份验证记录。在ldapsearch
条目中,CN 是用户名 jsmith,所以您无需设置它。Vertica 自动将 CN 设置为尝试建立连接的用户的用户名。Vertica 使用该 CN 捆绑 LDAP 服务器。=> CREATE AUTHENTICATION v_ldap_bind METHOD 'ldap' HOST '0.0.0.0/0'; => GRANT AUTHENTICATION v_ldap_bind TO public; => ALTER AUTHENTICATION v_ldap_bind SET host='ldap://10.10.10.10/', basedn='DC=CompanyCorp,DC=com', binddn_prefix='cn=', binddn_suffix=',OU=Vertica Users,DC=CompanyCorp,DC=com';
有关详细信息,请参阅 LDAP 捆绑参数。
5.2 - LDAP 搜索和捆绑配置工作流
要配置您的 Vertica 数据库,以使用 LDAP 搜索和捆绑对客户端进行身份验证,请遵循以下步骤:
-
获取服务帐户。有关信息,请参阅 [LDAP 产品文档](https://msdn.microsoft.com/en-us/library/aa772152(v=vs.85)。
-
从一个 Vertica 节点针对您的 LDAP 或 AD 运行
ldapsearch
。验证到服务器的连接,并确定相关字段的值。运行ldapsearch
有助于构建配置 LDAP 身份验证所需的客户端身份验证字符串。在下述示例中,对于其 CN 中包含用户名 John 的任何用户,
ldapsearch
将返回 CN、DN 和 sAMAccountName fields 字段(若存在)。此搜索只有对允许匿名捆绑的 LDAP 服务器执行才会成功:$ ldapsearch -x -h 10.10.10.10 -b 'OU=Vertica Users,DC=CompanyCorp,DC=com' -s sub -D 'CompanyCorp\jsmith' -W '(cn=John*)' cn dn uid sAMAccountName
-
查看
ldapsearch
返回的结果。搜索和捆绑的相关信息显示为粗体:# extended LDIF # # LDAPv3 # base <OU=Vertica Users,DC=CompanyCorp,DC=com> with scope subtree # filter: (cn=John*) # requesting: cn dn sAMAccountName # # John Smith, Vertica Users, CompanyCorp.com dn: CN=jsmith,OU=Vertica Users,DC=CompanyCorp,DC=com cn: Jsmith sAMAccountName: jsmith # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
-
创建客户端身份验证记录。cn 属性包含您想要的用户名 — jsmith。将您的搜索属性设置为 CN 字段,以便搜索找到相应帐户。
=> CREATE AUTHENTICATION v_ldap_bind_search METHOD 'ldap' HOST '10.10.10.10'; => GRANT AUTHENTICATION v_ldap_bind_search TO public; => ALTER AUTHENTICATION v_ldap_bind_search SET host='ldap://10.10.10.10', basedn='OU=Vertica,DC=CompanyCorp,DC=com', binddn='CN=jsmith,OU=Vertica Users,DC=CompanyCorp,DC=com', bind_password='password', search_attribute='CN';
有关详细信息,请参阅 LDAP 绑定和搜索参数