LDAP 认证最佳实践¶
原文:LDAP Authentication Best Practices | 适用:Vertica 8.x+
概述¶
本文档演示如何使用 LDAP 的 ldapsearch 工具在外部验证 LDAP 认证参数,然后将验证通过的参数一对一映射为 Vertica 配置。用 ldapsearch 先验证,再用经验证的设置配置 Vertica。
本文档涵盖以下内容:
- LDAP Bind 认证 — 用
ldapsearch验证 Bind 认证,然后在 Vertica 中实施 - LDAP Search and Bind 认证 — 用
ldapsearch验证 Search+Bind 认证,然后在 Vertica 中实施 - LDAP 安全加密(SSL/TLS) — 包括 SSL/TLS 验证、LDAP Search+Bind + SSL、Search+Bind + TLS、Bind + TLS
- LDAP Link 自动同步 — LDAP 用户/组自动同步到 Vertica
- 附录 — Windows 域和邮箱绑定示例
LDAP 前提条件¶
使用 LDAP 认证客户端访问 Vertica 之前,必须具备以下条件:
| 条件 | 说明 |
|---|---|
| LDAP 服务器 IP 和主机名 | Vertica 支持 IPv4 和 IPv6 |
| 组织的 Active Directory 信息 | — |
| LDAP 服务账号(仅 Search+Bind) | 对 LDAP 服务器有读取和搜索权限的账号 |
| 数据库管理员权限 | 对 Vertica 的管理访问 |
openldap-clients 包 |
Debian/Ubuntu:ldap-utils,SUSE:openldap2-client。至少在一个节点上安装(含 ldapsearch 工具) |
开始之前¶
重要提醒: 新建或全新安装的数据库默认所有用户使用密码认证。但是,创建 LDAP 认证方法后,原有的默认密码认证将不再对所有用户可用。如果你希望非 LDAP 用户继续使用密码认证,必须显式创建默认认证方法并授予所有用户:
CREATE AUTHENTICATION default_network METHOD 'hash' HOST '0.0.0.0/0';
CREATE AUTHENTICATION default_local METHOD 'hash' LOCAL;
GRANT AUTHENTICATION default_network TO public;
GRANT AUTHENTICATION default_local TO public;
Part 1: LDAP Bind 认证(简单绑定)¶
原理: 用户登录 Vertica 时,Vertica 尝试将用户名绑定到 LDAP 服务器中匹配的用户。绑定成功即允许访问。
1.1 用 ldapsearch 验证 LDAP Bind¶
以下示例使用 ldapsearch 验证 LDAP Bind 认证,使用 DN(Distinguished Name)方式。先在外部验证通过,再配置 Vertica:
ldapsearch -x -v -s base -h 10.10.10.60 \
-D "CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' -LLL 'objectClass=none' none
# 输出:
ldap_initialize( ldap://10.10.10.60 )
filter: objectClass=none
requesting: none
参数说明:
-D:用户的 Distinguished Name(CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com)
1.2 在 Vertica 中实施 LDAP Bind¶
ldapsearch 参数与 Vertica 配置之间是一对一映射关系:
| ldapsearch 参数 | Vertica 参数 | 示例值 |
|---|---|---|
-h |
host |
ldap://10.10.10.60 |
-D 的 CN= 前缀 |
binddn_prefix |
CN= |
-D 的后缀部分 |
binddn_suffix |
,OU=Vertica Users,DC=Vertica,DC=com |
-b |
basedn |
OU=Vertica Users,dc=vertica,dc=com |
Vertica 构造 -D 参数的方式: binddn_prefix + <Vertica 用户名> + binddn_suffix
-- 第 1 步:创建 LDAP 认证方法
CREATE AUTHENTICATION LDAP2 METHOD 'ldap' HOST '0.0.0.0/0';
-- 第 2 步:设置 LDAP 参数(与 ldapsearch 参数一一对应)
ALTER AUTHENTICATION LDAP2 SET
host='ldap://10.10.10.60',
binddn_prefix='CN=',
binddn_suffix=',OU=Vertica Users,DC=Vertica,DC=com',
basedn='OU=Vertica Users,dc=vertica,dc=com';
-- 第 3 步:启用认证
ALTER AUTHENTICATION LDAP2 enable;
-- 第 4 步:验证 LDAP 认证参数解析正确
SELECT * FROM client_auth_params WHERE auth_name='LDAP2';
auth_oid | auth_name | auth_parameter_name | auth_parameter_value
-------------------+-----------+---------------------+---------------------
45035996273751694 | LDAP2 | host | ldap://10.10.10.60
45035996273751694 | LDAP2 | basedn | OU=Vertica Users,dc=vertica,dc=com
45035996273751694 | LDAP2 | binddn_prefix | CN=
45035996273751694 | LDAP2 | binddn_suffix | ,OU=Vertica Users,DC=Vertica,DC=com
(4 rows)
Vertica 构造的 DN: CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com
-- 第 5 步:创建 Vertica 用户(用户名 = LDAP 的 CN 值)
CREATE USER "James Smith";
-- 第 6 步:将 LDAP 认证授予用户
GRANT AUTHENTICATION LDAP2 TO "James Smith";
-- 第 7 步:验证授权
SELECT object_name, grantee FROM grants
WHERE object_type = 'CLIENTAUTHENTICATION';
object_name | grantee
------------+-----------
LDAP2 | James Smith
(1 row)
测试登录: LDAP 服务器的绑定在用户登录 Vertica 时完成。
vsql -U "James Smith" -h <VERTICA_IP> -w 'USERS_LDAP_PASSWORD' \
-c "SELECT user_name, client_authentication_name FROM sessions;"
user_name | client_authentication_name
-------------+-----------------------------
James Smith | LDAP2
(1 row)
必须使用
-h <VERTICA_IP>,因为创建认证方法时HOST指定为0.0.0.0/0。
成功绑定后的日志记录:
LDAP authentication succeeded for user DN
"CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com"
on server ldap://10.10.10.60
Part 2: LDAP Search and Bind 认证(搜索后绑定)¶
原理: Search+Bind 允许使用 DN 以外的其他用户标识符(如 sAMAccountName、employeeID、firstName 等)进行认证。但只能使用一个属性。
Search and Bind 需要 Active Directory 信息。
Search+Bind 需要两步操作:
- Search: 在 LDAP 目录中搜索匹配指定属性的用户。Vertica 连接到 LDAP 服务器后,搜索 LDAP 用户中其 Vertica 登录名与 login_name 属性匹配的用户(即
search_attribute=vertica_user_login_id)。找到该用户后,第 2 步与前面描述的 DN Bind 相同。 - Bind: 用搜索到的用户 DN 进行绑定
2.1 用 ldapsearch 验证 Search + Bind¶
第 1 步:Search(搜索)¶
需要先配置一个LDAP 服务账号(示例中使用 vertica\SearchServiceUser),该账号对 LDAP 服务器有读取和搜索权限。服务账号不能是数据库用户账号。 如果服务账号密码变更,LDAP 认证会失败。
以下示例用 sAMAccountName 作为搜索属性,查找登录名为 jsmith 的用户:
ldapsearch -x -v -s one -h 10.10.10.60 \
-D "vertica\SearchServiceUser" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'SAVED_SECRET' \
-LLL sAMAccountName=jsmith dn
# 输出:
ldap_initialize( ldap://10.10.10.60 )
filter: sAMAccountName=jsmith
requesting: dn
dn: CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com
参数说明:
| 参数 | 含义 | 值 |
|---|---|---|
-h |
LDAP 服务器 | 10.10.10.60 |
-D |
用于认证的 binddn | vertica\SearchServiceUser(服务账号) |
-b |
LDAP 服务器的 basedn | OU=Vertica Users,dc=vertica,dc=com |
-w |
binddn 的密码 | SAVED_SECRET |
sAMAccountName |
应与登录名匹配的 LDAP 属性 | jsmith |
dn |
搜索后返回的 Distinguished Name | — |
⚠️ 搜索必须唯一匹配。 如果多个用户匹配同一属性,登录会失败。搜索成功后才会执行 LDAP bind。
第 2 步:Bind(绑定)¶
搜索成功后,用返回的 DN 执行 bind:
ldapsearch -x -v -h 10.10.10.60 \
-D "CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com" \
-b "dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' sAMAccountName=jsmith
2.2 在 Vertica 中实施 Search + Bind¶
配置 Search¶
ldapsearch 参数与 Vertica 配置的一对一映射:
-- 第 1 步:创建 LDAP 认证方法
CREATE AUTHENTICATION LDAP1 METHOD 'ldap' HOST '0.0.0.0/0';
-- HOST '0.0.0.0/0' 允许从任意 IP 登录
-- 第 2 步:设置 Search 参数
ALTER AUTHENTICATION LDAP1 SET
host='ldap://10.10.10.60',
basedn='OU=Vertica Users,DC=Vertica,DC=com',
binddn='vertica\SearchServiceUser', -- 服务账号
search_attribute='sAMAccountName', -- 用于匹配用户登录名的 LDAP 属性
bind_password='SAVED_SECRET'; -- 服务账号密码
-- 第 3 步:启用
ALTER AUTHENTICATION LDAP1 enable;
-- 第 4 步:验证参数
SELECT * FROM client_auth_params WHERE auth_name='LDAP1';
auth_oid | auth_name | auth_parameter_name | auth_parameter_value
-------------------+-----------+---------------------+----------------------
45035996273935258 | LDAP1 | host | ldap://10.10.10.60
45035996273935258 | LDAP1 | basedn | OU=Vertica Users,dc=vertica.com,dc=com
45035996273935258 | LDAP1 | binddn | vertica\SearchServiceUser
45035996273935258 | LDAP1 | bind_password | SAVED_SECRET
45035996273935258 | LDAP1 | search_attribute | sAMAccountName
(5 rows)
配置 Bind(搜索后自动执行)¶
搜索成功后,Vertica 使用搜索到的 LDAP 用户 DN 执行 bind:
-- 第 5 步:创建 Vertica 用户(用户名 = sAMAccountName 值)
CREATE USER "jsmith";
-- 第 6 步:授予认证
GRANT AUTHENTICATION LDAP1 TO "jsmith";
-- 第 7 步:验证
SELECT object_name, grantee FROM grants
WHERE object_type = 'CLIENTAUTHENTICATION';
object_name | grantee
------------+-----------
LDAP1 | jsmith
(1 row)
测试登录:
vsql -U "jsmith" -h <VERTICA_IP> -w 'USERS_LDAP_PASSWORD' \
-c "SELECT user_name, client_authentication_name FROM sessions;"
user_name | client_authentication_name
-----------+-----------------------------
jsmith | LDAP1
(1 row)
USERS_LDAP_PASSWORD不存储在 Vertica 中,Vertica 在每次用户登录时验证 LDAP 密码。
Part 3: LDAP Link 自动同步¶
LDAP Link 实现 LDAP 服务器与 Vertica 服务器之间的用户和组/角色自动同步,无需分别管理 LDAP 和 Vertica 两套用户体系。通过 LDAP 同步,Vertica 服务器成为 LDAP 服务器的复制数据库。
同步内容:
- LDAP 用户 → Vertica 用户
- LDAP 组 → Vertica 角色
所有用户和组属性在 LDAP 服务器中管理,Vertica DBA 只需对用户和组设置 Vertica 数据库访问权限即可。
LDAP Link 通过存储在 catalog 中的连接参数进行配置。详见产品文档 Set LDAP Link Parameters。
3.1 验证 LDAP Link 过滤条件¶
在配置 LDAP Link 之前,先用 ldapsearch 验证导入用户和组的过滤条件。
组过滤(导入名为 dba 的 Windows 组):
ldapsearch -h vertica.com \
-D 'CN=bind ldap,OU=QA,DC=vertica,DC=com' \
-w password \
-b 'dc=vertica,dc=com' \
'(&(objectClass=group)(cn=dba))' samaccountname
用户过滤(选择 dba 组中所有用户的 sAMAccountName):
ldapsearch -h vertica.com \
-D 'CN=bind ldap,OU=QA,DC=vertica,DC=com' \
-w password \
-b 'dc=vertica,dc=com' \
'(&(objectClass=user)(cn=*)(memberof=CN=dba,OU=IT,dc=vertica,dc=com))' samaccountname
确认上述命令返回正确的用户和组属性后再继续。
3.2 LDAP Link Dry Run(Vertica 9.3.x+)¶
基于上述 ldapsearch 命令的参数,可构造等价的 SQL 测试命令(结果记录在 LDAP_LINK_DRYRUN_EVENTS 系统表中):
-- 测试连接
SELECT LDAP_LINK_DRYRUN_CONNECT(
'ldap://vertica.com',
'CN=bind ldap,OU=QA,DC=vertica,DC=com', 'password'
);
-- 测试搜索
SELECT LDAP_LINK_DRYRUN_SEARCH(
'ldap://vertica.com',
'CN=bind ldap,OU=QA,DC=vertica,DC=com', 'password',
'dc=vertica,dc=com', 'sub',
'(&(objectClass=user)(cn=*)(memberof=CN=dba,OU=IT,dc=vertica,dc=com))',
'(&(objectClass=group)(cn=dba))',
'sAMAccountName', 'sAMAccountName', 'member'
);
-- 测试同步
SELECT LDAP_LINK_DRYRUN_SYNC(
'ldap://vertica.com',
'CN=bind ldap,OU=QA,DC=vertica,DC=com', 'password',
'dc=vertica,dc=com', 'sub',
'(&(objectClass=user)(cn=*)(memberof=CN=dba,OU=IT,dc=vertica,dc=com))',
'(&(objectClass=group)(cn=dba))',
'sAMAccountName', 'sAMAccountName', 'member'
);
3.3 正式配置 LDAP Link¶
也可通过 ALTER DATABASE 直接配置:
ALTER DATABASE verticadb SET PARAMETER
LDAPLinkDryRun=1,
LDAPLinkURL='ldap://vertica.com',
LDAPLinkSearchBase='dc=vertica,dc=com',
LDAPLinkBindDN='CN=bind ldap,OU=QA,DC=vertica,DC=com',
LDAPLinkBindPswd='password',
LDAPLinkFilterGroup='(&(objectClass=group)(cn=dba))',
LDAPLinkFilterUser='(&(objectClass=user)(cn=*)(memberof=CN=dba,OU=IT,dc=vertica,dc=com))',
LDAPLinkGroupName='sAMAccountName',
LDAPLinkUserName='sAMAccountName',
LDAPLinkOn=1;
-- 启动同步
SELECT LDAP_LINK_SYNC_START();
LDAP Link 只做用户供应(provisioning),仍需要根据本文档前面章节配置用户认证。
LDAPLinkDryRun=1测试连接和参数但不执行同步。验证通过后设置为 0 再执行实际同步。
配置 LDAP Link 后的认证:
-- 创建认证方法
CREATE AUTHENTICATION LDAP2 METHOD 'ldap' HOST '0.0.0.0/0';
ALTER AUTHENTICATION LDAP2 SET
host='ldap://vertica.com',
domain_prefix='vertica',
basedn='dc=vertica,dc=com';
ALTER AUTHENTICATION LDAP2 enable;
-- 将认证授予同步的角色(而非逐个用户)
GRANT AUTHENTICATION LDAP2 TO dba;
3.4 管理 LDAP 用户¶
要为额外的 LDAP 用户授予 Vertica 访问权限,需要创建与 LDAP sAMAccountName 匹配的 Vertica 登录名的 Vertica 用户,然后将认证方法授予该用户:
-- 添加 LDAP 用户(Vertica 登录名必须与 LDAP sAMAccountName 匹配)
CREATE USER apowell;
GRANT AUTHENTICATION LDAP1 TO apowell;
-- 撤销认证(拒绝 LDAP 用户访问)
REVOKE AUTHENTICATION LDAP1 FROM apowell;
-- 禁用整个 LDAP 认证方法(阻止所有使用该方法的用户)
ALTER AUTHENTICATION LDAP1 disable;
Part 4: SSL / TLS 安全加密¶
本节说明如何使用 SSL 或 TLS 实现 LDAP 认证的安全加密。操作步骤与前文类似,但增加了一些安全相关的配置差异。本节提供的设置可实现更安全的 LDAP 认证。
⚠️ 重要:在未配置 SSL 的情况下成功配置 LDAP 之前,不要进行 SSL 配置。
4.1 用 ldapsearch 验证 SSL / TLS¶
启用 startTLS(-Z 参数)¶
以下示例在 Search+Bind 命令中添加 -Z 参数以启用 startTLS。如果 TLS 无法正常工作,非 TLS 的认证也会失败。
ldapsearch -Z -x -v -s one -H ldap://ldap-server-prod.vertica.com \
-D "vertica\SearchServiceUser" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'SAVED_SECRET' -LLL sAMAccountName=jsmith dn
启用 SSL(ldaps://)¶
以下示例在简单 Bind 命令中将 ldap 改为 ldaps 以启用 SSL:
ldapsearch -x -v -s base -H ldaps://ldap-server-prod.vertica.com \
-D "CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' -LLL 'objectClass=none' none
注意: 以上示例均使用主机名而非 IP 地址。
4.2 主机名与 IP 地址的重要规则¶
| 规则 | 说明 |
|---|---|
| 不能用 IP 替代主机名 | 必须用 ldaps://ldap-server-prod.vertica.com,不能用 ldap://10.10.10.60 |
| 证书 subject 匹配 | 主机名必须是证书的 subject 或 subject alternative name |
| DNS 正反向解析 | 主机名必须能正向和反向 DNS 解析 |
# 验证 DNS 解析
nslookup ldap-server-prod.vertica.com
Name: ldap-server-prod.vertica.com
Address: 10.10.10.60
nslookup 10.10.10.60
Name: ldap-server-prod.vertica.com
Address: 10.10.10.60
这非常重要——SSL 证书通常包含的是主机名。如果使用 IP 地址,主机名与 IP 字符串不匹配会导致认证失败。
4.3 验证 LDAP 服务器证书¶
# 第 1 步:查看证书有效期
openssl s_client -showcerts -connect ldap-server-prod.vertica.com:636 \
| openssl x509 -noout -dates
# 输出示例:
notBefore=Apr 21 17:35:18 2014 GMT
notAfter=Apr 21 17:45:18 2015 GMT
# 如果证书已过期或有效期在未来,认证会失败
# 第 2 步:验证证书链(可能失败的示例)
openssl s_client -showcerts -connect ldap-server-prod.vertica.com:636
# 输出:
CONNECTED(00000003)
depth=0 CN = glw2k8-64.dc.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = glw2k8-64.dc.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 CN = glw2k8-64.dc.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/CN=glw2k8-64.dc.com
i:/DC=com/DC=dc/CN=dc-GLW2K8-64-CA
---
Server certificate
subject=/CN=ldap-server-prod.vertica.com
issuer=/DC=com/DC=dc/CN=dc-GLW2K8-64-CA
---
Verify return code: 21 (unable to verify the first certificate)
# 以上失败说明必须用 -CAFile 信任证书颁发者
# 第 3 步:用 -CAFile 显式验证证书
openssl s_client -showcerts -connect ldap-server-prod.vertica.com:636 \
-CAfile /path/to/ca.cer | grep Verify
# 成功输出:
depth=1 DC = com, DC = dc, CN = dc-GLW2K8-64-CA
verify return:1
depth=0 CN = ldap-server-prod.vertica.com
verify return:1
Verify return code: 0 (ok)
必须看到
Verify return code: 0 (ok)后才能继续下一步。
4.4 使用 ldapsearch 验证 SSL / TLS LDAP 配置¶
证书验证通过后,回到 ldapsearch,用带证书信任的方式重新验证完整的 SSL/TLS 认证。请注意以下命令使用主机名而非 IP 地址(与非安全 LDAP 认证的关键区别)。
TLS 搜索示例(-Z = 尝试 startTLS):
ldapsearch -Z -x -v -s one -H ldap://ldap-server-prod.vertica.com \
-D "vertica\SearchServiceUser" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'SAVED_SECRET' -LLL sAMAccountName=jsmith dn
SSL 搜索示例(ldaps:// 端口 636):
ldapsearch -x -v -s base -H ldaps://ldap-server-prod.vertica.com \
-D "CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' -LLL 'objectClass=none' none
4.5 LDAP 配置文件设置(ldap.conf)¶
使用命令行设置 ldap.conf 中的 LDAP 参数。这两个参数用来指定 CA 证书位置:
| 参数 | 说明 |
|---|---|
TLS_CACERT |
CA 证书文件所在路径 |
TLS_CADIR |
如果有多个证书,证书目录所在路径 |
Vertica 中所有节点上的要求:
TLS_CACERT/TLS_CADIR路径在所有节点上必须相同- 文件或路径必须可读且属于数据库管理员(dbadmin)
- 文件或路径不能被其他任何组或用户写入
4.6 TLS_REQCERT 参数¶
指定证书验证失败时系统的处理方式。注意这是 Vertica 专属参数,功能与 ldap.conf 中的同名参数相同(以下调试示例会演示如何验证配置正确性):
| 值 | 行为 |
|---|---|
try |
尝试 TLS,服务器不支持则明文继续认证 |
allow |
使用 SSL/TLS,但证书无法验证或已过期也允许继续 |
hard |
证书无法验证则认证失败 |
4.7 starttls 参数¶
定义 StartTLS 行为:
| 值 | 行为 | 等效 ldapsearch |
|---|---|---|
soft |
服务器不支持 TLS 则明文继续认证 | -Z |
hard |
服务器不支持 TLS 则认证失败 | -ZZ |
4.8 调试与验证 SSL/TLS 配置¶
以 dbadmin 身份运行以下命令。这些命令是排查认证失败的调试工具。
错误配置示例:
cat ldap.conf
# TLS_CACERT /path/to/badca.crt
# TLS_REQCERT hard
LDAPCONF=/path/to/ldap.conf ldapsearch -ZZ -x -v -s one \
-H ldap://ldap-server-prod.vertica.com \
-D "vertica\SearchServiceUser" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'SAVED_SECRET' -LLL sAMAccountName=jsmith dn
# 输出:
ldap_initialize( ldap://ldap-server-prod.vertica.com/??base )
ldap_start_tls: Connect error (-11)
additional info: TLS error -8179:Peer's Certificate issuer is not recognized
ldap_result: Can't contact LDAP server (-1)
此例中
TLS_REQCERT hard导致认证失败——LDAP 服务器用的是 Microsoft 颁发的证书,但提供的bad.crt是 Verisign 的证书。
正确配置示例:
cat ldap.conf
TLS_CACERT /path/to/ca.crt
TLS_REQCERT hard
# 验证 Search(-ZZ = hard startTLS):
LDAPCONF=/path/to/ldap.conf ldapsearch -ZZ -x -v -s one \
-H ldap://ldap-server-prod.vertica.com \
-D "vertica\SearchServiceUser" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'SAVED_SECRET' -LLL sAMAccountName=jbond dn
# 输出:
ldap_initialize( ldap://ldap-server-prod.vertica.com/??base )
filter: sAMAccountName=jsmith requesting: dn
dn: CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com
# 验证 Bind:
LDAPCONF=/path/to/ldap.conf ldapsearch -ZZ -x -v -s one \
-H ldap://ldap-server-prod.vertica.com \
-D "CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com" \
-b "dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' sAMAccountName=jsmith
# 验证简单 LDAP Bind:
LDAPCONF=/path/to/ldap.conf ldapsearch -ZZ -x -v -s base \
-H ldap://ldap-server-prod.vertica.com \
-D "CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' -LLL 'objectClass=none' none
验证 Search + Bind + SSL/TLS 配置¶
# Search:
LDAPCONF=/path/to/ldap.conf ldapsearch -x -v -s one \
-H ldaps://ldap-server-prod.vertica.com \
-D "vertica\SearchServiceUser" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'SAVED_SECRET' -LLL sAMAccountName=jsmith dn
# 输出:
ldap_initialize(ldaps://ldap-server-prod.vertica.com:636/??base)
filter: sAMAccountName=jsmith
requesting: dn
dn: CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com
# Bind:
LDAPCONF=/path/to/ldap.conf ldapsearch -x -v -s one \
-H ldaps://ldap-server-prod.vertica.com \
-D "CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' sAMAccountName=jsmith
# 验证简单 LDAP Bind(SSL):
LDAPCONF=/path/to/ldap.conf ldapsearch -x -v -s base \
-H ldaps://ldap-server-prod.vertica.com \
-D "CN=James Smith,OU=Vertica Users,DC=Vertica,DC=com" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' -LLL 'objectClass=none' none
4.9 配置前的检查清单¶
在 Vertica 上配置安全 LDAP 之前,确认以下内容:
- 以下情况不要使用
TLS_REQCERT=hard: - 证书已过期
- 证书颁发者不是受信任的颁发者
- 主机名与证书 subject 名称不匹配
- 证书无法通过 DNS(正向和反向)解析
记录以下有效配置的值(后续配置 LDAP SSL 时需要):
TLS_CACERTTLS_REQCERT- ldapsearch 的
-Z或-ZZ参数 -H参数(主机名)
4.10 在 Vertica 中配置 LDAP Search + Bind + SSL¶
SSL 端口通常为 636,使用
ldaps://协议。
-- 第 1 步:创建认证
CREATE AUTHENTICATION LDAP1 METHOD 'ldap' HOST '0.0.0.0/0';
-- 第 2 步:设置 SSL 参数
ALTER AUTHENTICATION LDAP1 SET
host='ldaps://ldap-server-prod.vertica.com',
basedn='DC=Vertica,DC=com',
binddn='vertica\SearchServiceUser',
search_attribute='sAMAccountName',
bind_password='SAVED_SECRET';
Vertica 11.0.1+:通过 TLS CONFIGURATION 管理 LDAP SSL
\set ldap_ca '\''`cat ldap_ca.crt`'\''
CREATE CA CERTIFICATE ldap_ca AS :ldap_ca;
ALTER TLS CONFIGURATION LDAPAuth ADD CA CERTIFICATES ldap_ca;
ALTER TLS CONFIGURATION LDAPAUTH TLSMODE 'enable';
11.0.1 之前版本:
ALTER AUTHENTICATION LDAP1 SET
tls_cacert='/path/to/ca.crt',
tls_reqcert='allow';
-- 启用
ALTER AUTHENTICATION LDAP1 enable;
-- 验证参数(7 行输出)
SELECT * FROM client_auth_params WHERE auth_name='LDAP1';
auth_oid | auth_name | auth_parameter_name | auth_parameter_value
-------------------+-----------+---------------------+-------------------------
45035996273935258 | LDAP1 | host | ldaps://ldap-server-prod.vertica.com
45035996273935258 | LDAP1 | basedn | OU=Vertica Users,dc=vertica.com,dc=com
45035996273935258 | LDAP1 | binddn | vertica\SearchServiceUser
45035996273935258 | LDAP1 | bind_password | SAVED_SECRET
45035996273935258 | LDAP1 | search_attribute | sAMAccountName
45035996273935258 | LDAP1 | tls_reqcert | allow
45035996273935258 | LDAP1 | tls_cacert | /path/to/ca.crt
(7 rows)
4.11 在 Vertica 中配置 LDAP Search + Bind + TLS¶
TLS 使用常规 LDAP 端口 389。
-- 第 1 步:创建认证
CREATE AUTHENTICATION LDAP1 METHOD 'ldap' HOST '0.0.0.0/0';
-- 第 2 步:设置参数(注意 host 用 ldap:// 而非 ldaps://)
ALTER AUTHENTICATION LDAP1 SET
host='ldap://ldap-server-prod.vertica.com',
basedn='OU=Vertica Users,DC=Vertica,DC=com',
binddn='vertica\SearchServiceUser',
search_attribute='sAMAccountName',
bind_password='SAVED_SECRET';
Vertica 11.0.1+:
\set ldap_ca '\''`cat ldap_ca.crt`'\''
CREATE CA CERTIFICATE ldap_ca AS :ldap_ca;
ALTER TLS CONFIGURATION LDAPAuth ADD CA CERTIFICATES ldap_ca;
ALTER TLS CONFIGURATION LDAPAUTH TLSMODE 'enable';
11.0.1 之前版本:
ALTER AUTHENTICATION LDAP1 SET
tls_cacert='/path/to/ca.crt',
starttls='soft',
tls_reqcert='allow';
-- 启用并验证(8 行输出,比 SSL 多 starttls 参数)
ALTER AUTHENTICATION LDAP1 enable;
SELECT * FROM client_auth_params WHERE auth_name='LDAP1';
auth_oid | auth_name | auth_parameter_name | auth_parameter_value
-------------------+-----------+---------------------+---------------------
... (同上 7 行)
45035996273935258 | LDAP1 | starttls | soft
(8 rows)
4.12 在 Vertica 中配置 LDAP Bind + TLS(简单绑定 + TLS)¶
-- 第 1 步:创建认证
CREATE AUTHENTICATION LDAP2 METHOD 'ldap' HOST '0.0.0.0/0';
-- 第 2 步:设置参数(Bind 模式 + TLS)
ALTER AUTHENTICATION LDAP2 SET
host='ldap://ldap-server-prod.vertica.com',
domain_prefix='vertica',
basedn='OU=Vertica Users,dc=vertica';
Vertica 11.0.1+:
\set ldap_ca '\''`cat ldap_ca.crt`'\''
CREATE CA CERTIFICATE ldap_ca AS :ldap_ca;
ALTER TLS CONFIGURATION LDAPAuth ADD CA CERTIFICATES ldap_ca;
ALTER TLS CONFIGURATION LDAPAUTH TLSMODE 'enable';
11.0.1 之前版本:
ALTER AUTHENTICATION LDAP2 SET
tls_cacert='/path/to/ca.crt',
starttls='soft',
tls_reqcert='allow';
ALTER AUTHENTICATION LDAP2 enable;
SELECT * FROM client_auth_params WHERE auth_name='LDAP2';
auth_oid | auth_name | auth_parameter_name | auth_parameter_value
-------------------+-----------+---------------------+---------------------
45035996273935258 | LDAP2 | host | ldaps://ldap-server-prod.vertica.com
45035996273935258 | LDAP2 | basedn | OU=Vertica Users,dc=vertica.com,dc=com
45035996273935258 | LDAP2 | domain_prefix | vertica
45035996273935258 | LDAP2 | tls_reqcert | allow
45035996273935258 | LDAP2 | tls_cacert | /path/to/ca.crt
45035996273935258 | LDAP2 | starttls | soft
(6 rows)
4.13 配置 LDAP Link with TLS / SSL¶
Vertica 11.0.1+: LDAP Link 和 LDAP Link DryRun 通过 LdapLink TLS CONFIGURATION 管理。详见 TLS for LDAP Link 文档。
附录 A: 其他绑定方式¶
A.1 使用 Windows 域名绑定¶
# ldapsearch 验证
ldapsearch -x -v -s base -h 10.10.10.60 \
-D "vertica\jsmith" \
-b "OU=Vertica Users,dc=Vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' -LLL 'objectClass=none' none
-- Vertica 配置
CREATE AUTHENTICATION LDAP2 METHOD 'ldap' HOST '0.0.0.0/0';
ALTER AUTHENTICATION LDAP2 SET
host='ldap://10.10.10.60',
domain_prefix='vertica',
basedn='OU=Vertica Users,dc=vertica,dc=com';
ALTER AUTHENTICATION LDAP2 enable;
CREATE USER jsmith; -- 注意:只用用户名,不含域名
GRANT AUTHENTICATION LDAP2 TO jsmith;
A.2 使用邮箱地址绑定¶
# ldapsearch 验证
ldapsearch -x -v -s base -h 10.10.10.60 \
-D "jsmith@vertica.com" \
-b "OU=Vertica Users,dc=vertica,dc=com" \
-w 'USERS_LDAP_PASSWORD' -LLL 'objectClass=none' none
-- Vertica 配置
CREATE AUTHENTICATION LDAP2 METHOD 'ldap' HOST '0.0.0.0/0';
ALTER AUTHENTICATION LDAP2 SET
host='ldap://10.10.10.60',
email_suffix='vertica.com',
basedn='OU=Vertica Users,dc=vertica,dc=com';
ALTER AUTHENTICATION LDAP2 enable;
CREATE USER jsmith;
GRANT AUTHENTICATION LDAP2 TO jsmith;
附录 B: 参数速查¶
ldapsearch ↔ Vertica 参数映射¶
| ldapsearch 参数 | Vertica 参数 | 含义 |
|---|---|---|
-h <host> |
host |
LDAP 服务器地址 |
-b <basedn> |
basedn |
搜索根 DN |
-D <binddn> |
binddn |
绑定 DN(Search+Bind 模式) |
-w <password> |
bind_password |
绑定密码 |
| — | binddn_prefix |
DN 前缀(Bind 模式) |
| — | binddn_suffix |
DN 后缀(Bind 模式) |
| — | search_attribute |
搜索属性(Search 模式) |
-Z |
starttls='soft' |
尝试 TLS |
-ZZ |
starttls='hard' |
必须 TLS |
ldaps:// |
host='ldaps://...' |
SSL 连接 |
认证方法对比¶
| 特性 | Bind | Search+Bind |
|---|---|---|
| 匹配方式 | 用户登录名直接拼 DN | 用 LDAP 属性搜索后匹配 |
| 需要服务账号 | 否 | 是(只读+搜索权限) |
| 可用属性 | CN(固定) | sAMAccountName / employeeID / firstName 等任意一个 |
| 密码验证 | 每次登录验证 | 每次登录验证 |
| 速度 | 快(一步) | 较慢(两步:搜索+绑定) |