跳转至

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
-DCN= 前缀 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 以外的其他用户标识符(如 sAMAccountNameemployeeIDfirstName 等)进行认证。但只能使用一个属性

Search and Bind 需要 Active Directory 信息。

Search+Bind 需要两步操作:

  1. Search: 在 LDAP 目录中搜索匹配指定属性的用户。Vertica 连接到 LDAP 服务器后,搜索 LDAP 用户中其 Vertica 登录名与 login_name 属性匹配的用户(即 search_attribute=vertica_user_login_id)。找到该用户后,第 2 步与前面描述的 DN Bind 相同。
  2. Bind: 用搜索到的用户 DN 进行绑定

2.1 用 ldapsearch 验证 Search + Bind

需要先配置一个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

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 密码。


LDAP Link 实现 LDAP 服务器与 Vertica 服务器之间的用户和组/角色自动同步,无需分别管理 LDAP 和 Vertica 两套用户体系。通过 LDAP 同步,Vertica 服务器成为 LDAP 服务器的复制数据库

同步内容:

  • LDAP 用户 → Vertica 用户
  • LDAP 组 → Vertica 角色

所有用户和组属性在 LDAP 服务器中管理,Vertica DBA 只需对用户和组设置 Vertica 数据库访问权限即可。

LDAP Link 通过存储在 catalog 中的连接参数进行配置。详见产品文档 Set LDAP Link Parameters

在配置 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

确认上述命令返回正确的用户和组属性后再继续。

基于上述 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'
);

也可通过 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 匹配 主机名必须是证书的 subjectsubject 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 如果有多个证书,证书目录所在路径
cat ldap.conf
TLS_CACERT /path/to/ca.crt
TLS_REQCERT hard

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_CACERT
  • TLS_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)

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 等任意一个
密码验证 每次登录验证 每次登录验证
速度 快(一步) 较慢(两步:搜索+绑定)

关联阅读