1 - 使用试运行元函数配置 LDAP Link
Vertica 支持多个元函数,可让您在与 Vertica 同步之前调整 LDAP Link 设置。每个元函数都将 LDAP Link 参数作为实参,并测试 LDAP link 的一个单独部分:
这些元函数旨在连续使用和测试,且其实参是累积的。也就是说,用于配置 LDAP_LINK_DRYRUN_CONNECT 的参数可用于 LDAP_LINK_DRYRUN_SEARCH,而这些函数的实参可用于 LDAP_LINK_DRYRUN_SYNC。
在移至下一个元函数之前,请务必查询 LDAP_LINK_DRYRUN_EVENTS 系统表以验证每个试运行的结果。
为试运行配置 TLS
与标准 LDAP Link 函数一样,LDAP Link 试运行函数从“LDAPLink”中提取 TLS 配置,以管理 TLS 连接。查询 TLS_CONFIGURATIONS 系统表以查看现有的 TLS 配置。
=> SELECT * FROM tls_configurations WHERE name='LDAPLink';
name | owner | certificate | ca_certificate | cipher_suites | mode
----------+---------+-------------+----------------+---------------+---------
LDAPLink | dbadmin | client_cert | ldap_ca | | DISABLE
(1 row)
有关为 LDAP Link 及其试运行函数配置 TLS 的说明,请参阅 LDAP Link 的 TLS。
配置 LDAP Link 绑定
在配置 LDAP 用户并将其导入 Vertica 之前,您必须先连接或“绑定”LDAP 服务器。连接通过几个参数进行管理。有关每个参数、相关函数、选项和默认值的详细信息,请参阅 LDAP Link 参数。
LDAP_LINK_DRYRUN_CONNECT 需要一个可分辨名称 (DN)、一个通过 LDAP 服务器进行身份验证的密码以及 LDAP 服务器的 URL。
要加密连接,请配置 LDAPLink TLS 配置。
通过为 LDAPLinkBindPswd
实参提供空字符串,您还可以执行匿名绑定(如果 LDAP 服务器允许未经身份验证的绑定)。
=> SELECT LDAP_LINK_DRYRUN_CONNECT('LDAPLinkURL','LDAPLinkBindDN','LDAPLinkBindPswd');
试运行绑定示例
这将测试 CN=amir,OU=QA,DC=dc,DC=com
中 DN 为 ldap://example.dc.com
的 LDAP 服务器连接。
=> SELECT LDAP_LINK_DRYRUN_CONNECT('ldap://example.dc.com','CN=amir,OU=QA,DC=dc,DC=com','password');
ldap_link_dryrun_connect
---------------------------------------------------------------------------------
Dry Run Connect Completed. Query v_monitor.ldap_link_dryrun_events for results.
要检查绑定的结果,请查询系统表 LDAP_LINK_DRYRUN_EVENTS。
=> SELECT event_timestamp, event_type, entry_name, role_name, link_scope, search_base from LDAP_LINK_DRYRUN_EVENTS;
event_timestamp | event_type | entry_name | link_scope | search_base
------------------------------+-----------------------+----------------------+------------+-------------
2019-12-09 15:41:43.589398-05 | BIND_STARTED | -------------------- | ---------- | -----------
2019-12-09 15:41:43.590504-05 | BIND_FINISHED | -------------------- | ---------- | -----------
配置 LDAP Link 搜索
Vertica 和 LDAP 服务器成功建立连接后,您应该配置您的用户和组搜索空间并测试其正确性和效率。
要在 LDAP 服务器上搜索要导入数据库的用户和组,请同时将连接和搜索参数传递给 LDAP_LINK_DRYRUN_SEARCH 元函数。LDAP 服务器会返回一个用户和组列表作为响应,这些用户和组将使用给定参数导入 Vertica。
通过为 LDAPLinkBindPswd
实参提供空字符串,您还可以执行匿名搜索(如果 LDAP 服务器的访问控制列表 (ACL) 配置为允许未经身份验证的搜索)。允许匿名绑定的设置与允许匿名搜索的 ACL 设置不同。
=> SELECT LDAP_LINK_DRYRUN_SEARCH('LDAPLinkURL','LDAPLinkBindDN','LDAPLinkBindPswd','LDAPLinkSearchBase',
'LDAPLinkScope','LDAPLinkFilterUser','LDAPLinkFilterGroup','LDAPLinkUserName','LDAPLinkGroupName',
'LDAPLinkGroupMembers',[LDAPLinkSearchTimeout],['LDAPLinkJoinAttr']);
试运行搜索示例
这将在 LDAP 服务器中搜索用户和组。在这种情况下,LDAPLinkSearchBase
参数指定了 dc.com
域和子范围,它复制了 DN 下的整个子树。
为了进一步筛选结果,该函数将检查 objectClass 属性为 person
和 group
的用户和组。然后,它将搜索组属性 cn
,使用 member
属性识别该组的成员,然后使用属性 uid
识别其中的个人用户。
=> SELECT LDAP_LINK_DRYRUN_SEARCH('ldap://example.dc.com','CN=amir,OU=QA,DC=dc,DC=com','$vertica$','dc=DC,dc=com','sub',
'(objectClass=person)','(objectClass=group)','uid','cn','member',10,'dn');
ldap_link_dryrun_search
--------------------------------------------------------------------------------
Dry Run Search Completed. Query v_monitor.ldap_link_dryrun_events for results.
要检查搜索结果,请查询系统表 LDAP_LINK_DRYRUN_EVENTS。
=> SELECT event_timestamp, event_type, entry_name, ldapurihash, link_scope, search_base from LDAP_LINK_DRYRUN_EVENTS;
event_timestamp | event_type | entry_name | ldapurihash | link_scope | search_base
---------------------------------+------------------+------------------------+-------------+------------+--------------
2020-01-03 21:03:26.411753+05:30 | BIND_STARTED | ---------------------- | 0 | sub | dc=DC,dc=com
2020-01-03 21:03:26.422188+05:30 | BIND_FINISHED | ---------------------- | 0 | sub | dc=DC,dc=com
2020-01-03 21:03:26.422223+05:30 | SYNC_STARTED | ---------------------- | 0 | sub | dc=DC,dc=com
2020-01-03 21:03:26.422229+05:30 | SEARCH_STARTED | ********** | 0 | sub | dc=DC,dc=com
2020-01-03 21:03:32.043107+05:30 | LDAP_GROUP_FOUND | Account Operators | 0 | sub | dc=DC,dc=com
2020-01-03 21:03:32.04312+05:30 | LDAP_GROUP_FOUND | Administrators | 0 | sub | dc=DC,dc=com
2020-01-03 21:03:32.043182+05:30 | LDAP_USER_FOUND | user1 | 0 | sub | dc=DC,dc=com
2020-01-03 21:03:32.043186+05:30 | LDAP_USER_FOUND | user2 | 0 | sub | dc=DC,dc=com
2020-01-03 21:03:32.04319+05:30 | SEARCH_FINISHED | ********** | 0 | sub | dc=DC,dc=com
配置 LDAP Link 同步
配置搜索空间后,您将获取一个用户和组列表。LDAP 同步将 LDAP 用户和组映射到其在 Vertica 中的等效项。LDAPLinkUserName
映射到 Vertica 用户名,LDAPLinkGroupName
映射到 Vertica 角色。
=> SELECT LDAP_LINK_DRYRUN_SYNC('LDAPLinkURL','LDAPLinkBindDN','LDAPLinkBindPswd','LDAPLinkSearchBase',
'LDAPLinkScope','LDAPLinkFilterUser','LDAPLinkFilterGroup','LDAPLinkUserName','LDAPLinkGroupName',
'LDAPLinkGroupMembers',[LDAPLinkSearchTimeout],['LDAPLinkJoinAttr']);
试运行同步示例
要执行试运行以映射从 LDAP_LINK_DRYRUN_SEARCH 返回的用户和组,请将相同的参数作为实参传递给 LDAP_LINK_DRYRUN_SYNC。
=> SELECT LDAP_LINK_DRYRUN_SYNC('ldap://example.dc.com','CN=amir,OU=QA,DC=dc,DC=com','$vertica$','dc=DC,dc=com','sub',
'(objectClass=person)','(objectClass=group)','uid','cn','member',10,'dn');
LDAP_LINK_DRYRUN_SYNC
------------------------------------------------------------------------------------------
Dry Run Connect and Sync Completed. Query v_monitor.ldap_link_dryrun_events for results.
要检查同步结果,请查询系统表 LDAP_LINK_DRYRUN_EVENTS。
=> SELECT event_timestamp, event_type, entry_name, ldapurihash, link_scope, search_base from LDAP_LINK_DRYRUN_EVENTS;
event_timestamp | event_type | entry_name | ldapurihash | link_scope | search_base
---------------------------------+---------------------+------------------------+-------------+------------+--------------
2020-01-03 21:08:30.883783+05:30 | BIND_STARTED | ---------------------- | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:30.890574+05:30 | BIND_FINISHED | ---------------------- | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:30.890602+05:30 | SYNC_STARTED | ---------------------- | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:30.890605+05:30 | SEARCH_STARTED | ********** | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939369+05:30 | LDAP_GROUP_FOUND | Account Operators | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939395+05:30 | LDAP_GROUP_FOUND | Administrators | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939461+05:30 | LDAP_USER_FOUND | user1 | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939463+05:30 | LDAP_USER_FOUND | user2 | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939468+05:30 | SEARCH_FINISHED | ********** | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939718+05:30 | PROCESSING_STARTED | ********** | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939887+05:30 | USER_CREATED | user1 | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939895+05:30 | USER_CREATED | user2 | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939949+05:30 | ROLE_CREATED | Account Operators | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.939959+05:30 | ROLE_CREATED | Administrators | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.940603+05:30 | PROCESSING_FINISHED | ********** | 0 | sub | dc=DC,dc=com
2020-01-03 21:08:31.940613+05:30 | SYNC_FINISHED | ---------------------- | 0 | sub | dc=DC,dc=com
2 - 使用 LDAP Link
使用 LDAP Link 会直接影响以下内容,而这些内容可帮助您管理和监控 LDAP Link - Vertica 分析型数据库同步:
-
用户和组管理
-
LDAP Link 用户标记
-
阻止的命令
-
客户端身份验证类型
要取消正在进行的同步,请使用 LDAP_LINK_SYNC_CANCEL。
用户和组管理
在 LDAP 服务器上创建的用户和组与复制到 Vertica 服务器的用户和角色具有特定关系:
-
当这些用户和组(角色)与 Vertica 分析型数据库同步时,LDAP 服务器上的用户-组关系将保持不变。
-
如果 Vertica 数据库中存在某个用户或组名称,当使用 LDAP Link 从 LDAP 服务器同步具有相同名称的用户或组时,用户或组会发生冲突。Vertica 无法支持具有相同名称的多个用户。要解决此问题,请参阅用户冲突。
-
如果 LDAP 服务器包含循环关系,Vertica 会接受并为 LDAP 服务器返回的关系的第一个非循环部分创建角色,并忽略其余部分。
例如,假设 LDAP 服务器包含组 A
和 B
,其中 A
包含 B
,且 B
包含 A
,以此创建一个循环关系。
如果 LDAP 服务器首先返回 A
包含 B
,Vertica 会创建角色 A
和 B
,并将角色 A
授予角色 B
。然后,Vertica 会忽略组 B
也包含 A
这一事实。
将用户同步到 Vertica 分析型数据库时,LDAP Link 会使用 LDAP 配置文件的 dn: 部分中的条目作为唯一用户标识符:
dn: cn=user1,ou=dev,dc=example,dc=com
cn: user1
ou: dev
id: user1
LDAP 配置文件中的 uid 参数表示 LDAP 用户名。
uid: user1
同步后,会将 dn: 条目映射到 uid:,以标识 Vertica 分析型数据库用户。
如果更改 dn:
中的设置但不更改 uid:
,则在与 Vertica 分析型数据库重新同步时,LDAP Link 会将用户解释为新用户。在这种情况下,会将具有该 uid: 的现有 Vertica 分析型数据库用户从 Vertica 中删除,并创建一个新的 Vertica 分析型数据库用户。
如果在 LDAP 上更改 uid: 而不是 dn:,则会将 Vertica 分析型数据库上的 uid 更新为新的 uid。由于您没有更改 dn: LDAP Link 不会将用户解释为新用户。
LDAP Link 用户标记
作为 dbadmin 用户,您可以通过访问 vs_users 表来监控 Vertica 分析型数据库上的用户行为。用户表包含一个 ldap_dn
字段,用于标识 Vertica 分析型数据库用户是否也是 LDAP Link 用户。此示例中显示 ldap_dn
字段设置为 dn
,表示 Vertica 分析型数据库用户也是 LDAP Link 用户:
=> SELECT * FROM vs_users;
-[ RECORD 1 ]---------+--------------------------------------------------
user_id | 45035996273704962
user_name | dbadmin
is_super_user | t
profile_name | default
is_locked | f
lock_time |
resource_pool | general
memory_cap_kb | unlimited
temp_space_cap_kb | unlimited
run_time_cap | unlimited
max_connections | unlimited
connection_limit_mode | database
idle_session_timeout | unlimited
all_roles | dbduser*, dbadmin*, pseudosuperuser*
default_roles | dbduser*, dbadmin*, pseudosuperuser*
search_path |
ldap_dn | dn
ldap_uri_hash | 0
is_orphaned_from_ldap | f
阻止的命令
请注意,对于在 vs_users 表中将 ldapdn 设置为 dn 的 Vertica 用户,会阻止以下 SQL 语句:
客户端身份验证类型
如果未向用户或组分配客户端身份验证,LDAP 用户和组将无法登录 Vertica。您可以为 LDAP 用户和组使用以下有效的身份验证类型:
3 - LDAP Link 参数
使用 LDAP Link 参数决定:
要为 LDAP Link 配置 TLS,请参阅 LDAP Link 的 TLS。
设置 LDAP Link 参数
以下示例显示了如何设置:
您还可以查看如何设置 LDAP Link 绑定身份验证参数(LDAPLinkBindDN
和 LDAPLinkBindPswd
)以及启用 LDAP Link (LDAPLinkOn
)。
=> ALTER DATABASE myDB1 SET PARAMETER LDAPLinkURL='ldap://10.60.55.128',
LDAPLinkSearchBase='dc=corp,dc=com',LDAPLinkBindDN='dc=corp,dc=com',LDAPLinkBindPswd='password';
=> ALTER DATABASE myDB1 SET PARAMETER LDAPLinkOn = '1';
通用参数和连接参数
身份验证参数
其他参数
有关设置 LDAP Link 参数的信息,请参阅配置参数管理。
注意
当连接参数或身份验证参数发生改变时,LDAP Link 会重新连接并且重新初始化同步。
4 - LDAP Link 的 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)
本页介绍了 LDAP Link 服务上下文。有关 LDAP 身份验证上下文的详细信息,请参阅 LDAP 身份验证的 TLS。
配置 LDAP Link TLS
Vertica 使用 LDAP Link 服务从 LDAP 服务器中检索用户和组,并在数据库中创建相应的用户和角色。要为 LDAP Link 及其试运行函数配置 TLS,请使用以下过程。
此过程使用预定义的 TLS 配置 LDAPLink
。要创建自定义 TLS 配置,请参阅TLS 配置。
有关密钥和证书生成的详细信息,请参阅生成 TLS 证书和密钥。
-
如果您希望 Vertica 在建立连接之前验证 LDAP 服务器的证书,请生成或导入 CA 证书并将其添加到 LDAPLink 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 证书添加到 LDAPLink:
ALTER TLS CONFIGURATION LDAPLink ADD CA CERTIFICATES ldap_ca;
-
如果您的 LDAP 服务器需要验证客户端证书,则必须生成或导入客户端证书及其密钥并将其添加到 LDAPLink 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
添加到 LDAPLink:
=> ALTER TLS CONFIGURATION LDAPLink 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 LDAPLink TLSMODE 'verify_ca';
ALTER TLS CONFIGURATION
-
验证 LDAPLinkTLSConfig 参数是否正在使用 TLS 配置:
=> SHOW CURRENT LDAPLinkTLSConfig;
level | name | setting
---------+-------------------+----------
DEFAULT | LDAPLinkTLSConfig | LDAPLink
(1 row)
-
根据您的用例设置 LDAP Link 参数。
5 - LDAP Link 问题故障排除
LDAP Link 服务可能会出现各种问题,包括:
用户和角色断开连接(孤立)
如果 LDAP Link 服务出现问题,通过 LDAP Link 同步的 Vertica 用户和角色可能会断开连接或变为孤立状态。例如,当您更改与 LDAP 服务器的连接时,用户和角色会变为孤立状态,如以下场景中所述:
-
创建一个 LDAP 连接,如下所示:
=> ALTER DATABASE MyDB1 SET PARAMETER LDAPLinkURL='ldap://ebuser',
LDAPLinkSearchBase='dc=example,dc=com', LDAPLinkBindDN='mega',
LDAPLinkBindPswd='$megapassword$';
=> ALTER DATABASE MyDB1 SET PARAMETER LDAPLinkOn = '1';
-
运行 LDAP Link 会话以同步 LDAP 和 Vertica 用户。
-
通过步骤 1 更改一个或多个连接参数。只有更改 LDAPLinkURL 或 LDAPLinkSearchBase 参数之一,才能更改连接。如果新的和旧的 LDAPLinkURL 和 LDAPLinkSearchBase 包含相同的用户集,则用户不会变为孤立状态。
-
运行另一个 LDAP Link 会话。系统将尝试重新同步 LDAP 和 Vertica 用户。由于连接已更改,现有 Vertica 用户无法与来自新连接的 LDAP 用户同步。这些 Vertica 用户将变为孤立状态。
作为 dbadmin,您可以通过检查 USERS 系统表中的 is_orphaned_from_ldap 列来识别孤立用户:
=> SELECT is_orphaned_from_ldap FROM users;
字段值 t
表示该用户是孤立用户。孤立的 Vertica 用户无法连接到 LDAP 服务器,也无法使用 LDAP 身份验证登录 Vertica(但是,分配给该用户的其他身份验证方法仍然有效)。在这种情况下,您可以删除孤立的 Vertica 用户并运行 LDAP Link 服务,以重新同步用户。
重定父级的对象
当您从 LDAP 服务器中删除用户或组时,LDAP Link 服务会从 Vertica 中移除相同的用户和角色,但不会删除已删除的用户和角色拥有的对象。要为这些无主对象赋予新的所有者,请使用 GlobalHeirUsername 参数,此参数可将某个用户指定为最初由已删除用户拥有的所有对象的新父级。
例如,要将无主对象的所有权授予 user1(如果该用户不存在,则创建该用户):
=> ALTER DATABASE example_db SET PARAMETER GlobalHeirUsername=user1;
默认情况下,此参数设置为 <auto>
,可将对象的父级重定为 dbadmin 用户。
如果 GlobalHeirUsername 为空,则不会将对象的父级重定为其他用户。
有关详细信息,请参阅安全参数。
用户冲突
使用 LDAP Link 同步的 Vertica 用户和角色可能会发生冲突。例如,当您在 LDAP 服务器上创建新用户或组,而 Vertica 上存在另一个同名的用户或角色时,就会发生此类冲突。
作为 dbadmin,请使用以下参数之一解决用户冲突:
-
LDAPLinkConflictPolicy
-
LDAPLinkStopIfZeroUsers
LDAPLinkConflictPolicy
LDAPLinkConflictPolicy 用于控制 Vertica 在遇到冲突时的行为方式。对此参数的更改将在下一次同步期间生效。
例如,要设置参数:
=> ALTER DATABASE example_db SET PARAMETER LDAPLinkConflictPolcy='MERGE';
LDAPLinkStopIfZeroUsers
LDAPLinkStopIfZeroUsers 用于控制在同步期间 LDAP 服务器的用户为零时 Vertica 的行为方式。
监控 LDAP Link
使用 ldap_link_events 表监控 LDAP Link 同步:
=> SELECT transaction_id, event_type, entry_name, entry_oid FROM ldap_link_events;
transaction_id | event_type | entry_name | entry_oid
------------------+--------------------+------------+-----------
45035996273705317 | SYNC_STARTED | | 0
45066962732553589 | SYNC_FINISHED | | 0
45066988112255317 | PROCESSING_STARTED | | 0
23411234566789765 | USER_CREATED | tuser | 234548899
(4 rows)