通过 LDAPS 或 LDAPI 使用 BIND DLZ

通过 LDAPS 或 LDAPI 使用 BIND DLZ

在强化此服务器之前,我已经使绑定 DNS 服务器正常运行,并通过 LDAP:// 使用 named.conf 下的以下配置将 DNS 数据库存储在 OpenLDAP 目录中:

dlz "ldap zone" {
database "ldap 2
v3 simple {uid=bind/test-machine.example.com,ou=Services,dc=example,dc=com} {secret} localhost ldap:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com???objectclass=dlzZone
ldap:///dlzHostName=\$record\$,dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com?dlzTTL,dlzType,dlzPreference,dlzData,dlzIpAddr?sub?(&(objectclass=dlzAbstractRecord)(!(dlzType=soa)))
ldap:///dlzHostName=@,dlzZoneName=\$zone\$,ou=dns,=dc=example,dc=com?dlzTTL,dlzType,dlzData,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,dlzMinimum?sub?(&(objectclass=dlzAbstractRecord)(dlzType=soa))
ldap:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com?dlzTTL,dlzType,dlzHostname,dlzPreference,dlzData,dlzIpAddr,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,dlzMinimum?sub?(&(objectClass=dlzAbstractRecord)(!(dlzType=soa)))
ldap:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com??sub?(&(objectclass=dlzXFR)(dlzIPAddr=\$client\$))";
}; 

由于一些安全要求,我必须配置 OpenLDAP 目录以强制执行 SSL,但 LDAPI:/// 套接字除外:

- olcSecurity: ssf=256
- olcLocalSSF: 256
- olcRequires: authc
- olcDisallow: bind_anon
- olcTLSVerifyClient: try

由于我找不到有关通过 LDAPS 或 LDAPI 使用 Bind-DLZ 的任何信息(两台服务器都在同一台机器上,因此使用本地套接字不会有问题),因此我尝试运行以下配置:

dlz "ldap zone" {
database "ldap 2
v3 simple {uid=bind/test-machine.example.com,ou=Services,dc=example,dc=com} {secret} localhost ldaps:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com???objectclass=dlzZone
ldaps:///dlzHostName=\$record\$,dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com?dlzTTL,dlzType,dlzPreference,dlzData,dlzIpAddr?sub?(&(objectclass=dlzAbstractRecord)(!(dlzType=soa)))
ldaps:///dlzHostName=@,dlzZoneName=\$zone\$,ou=dns,=dc=example,dc=com?dlzTTL,dlzType,dlzData,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,dlzMinimum?sub?(&(objectclass=dlzAbstractRecord)(dlzType=soa))
ldaps:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com?dlzTTL,dlzType,dlzHostname,dlzPreference,dlzData,dlzIpAddr,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,dlzMinimum?sub?(&(objectClass=dlzAbstractRecord)(!(dlzType=soa)))
ldaps:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com??sub?(&(objectclass=dlzXFR)(dlzIPAddr=\$client\$))";
};

我无法启动该服务。日志显示:

allow zone transfer query must not specify a port
SDLZ driver failed to load
DLZ driver failed to load
Loading configuration: failure
Exiting (due to fatal error)
Failed to start Berkeley Internet Name Domain (DNS)

因此我尝试使用以下配置,结果相同:

dlz "ldap zone" {
database "ldap 2
v3 simple {uid=bind/test-machine.example.com,ou=Services,dc=example,dc=com} {secret} localhost ldapi:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com???objectclass=dlzZone
ldapi:///dlzHostName=\$record\$,dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com?dlzTTL,dlzType,dlzPreference,dlzData,dlzIpAddr?sub?(&(objectclass=dlzAbstractRecord)(!(dlzType=soa)))
ldapi:///dlzHostName=@,dlzZoneName=\$zone\$,ou=dns,=dc=example,dc=com?dlzTTL,dlzType,dlzData,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,dlzMinimum?sub?(&(objectclass=dlzAbstractRecord)(dlzType=soa))
ldapi:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com?dlzTTL,dlzType,dlzHostname,dlzPreference,dlzData,dlzIpAddr,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,dlzMinimum?sub?(&(objectClass=dlzAbstractRecord)(!(dlzType=soa)))
ldapi:///dlzZoneName=\$zone\$,ou=dns,dc=example,dc=com??sub?(&(objectclass=dlzXFR)(dlzIPAddr=\$client\$))";
};

无法启动named.service:

allow zone transfer query must not specify a port
SDLZ driver failed to load
DLZ driver failed to load
Loading configuration: failure
Exiting (due to fatal error)
Failed to start Berkeley Internet Name Domain (DNS)

我在 bind-users 邮件列表上发布了我的问题,其中一位用户告诉我它应该可以工作,因为它使用 openldap 库作为 ldapsearch 查询。

我验证了二进制文件正在检索正确的库:

 # ldd /usr/sbin/named 

[...]
libldap_r-2.4.so.2 => /usr/lib64/libldap_r-2.4.so.2 (0x00007fc6d482d000) 
[...]  

对于所有库(如 libssl、libgssapi_krb5...)也是如此,没有任何“未找到”的库。我猜想,如果 libldap 库出现任何问题,named 也无法在没有 olcSecurity SSF 选项的情况下连接到 slapd。

使用的 Bind DLZ 是使用 SUSE 15 SP2 存储库中的 BIND 9.16.6(稳定版本)编译的。

编辑: 我正在检查 bind dlz 的源代码,因为我们需要使用 ldaps 而不是 ldap。我在 BIND DLZ 的源代码中发现了这一点:

If (ldap_url->lud_port != 389) {
    db->log(ISC_LOG_ERROR,"%s query must not specify a port", msg);
    result = ISC_R_FAILURE;
    goto cleanup;
}

我理解这个错误控制只涉及查询,而不涉及连接。

检查连接参数功能:

dbc->dbconn = ldap_init(dbi->hosts,LDAP_PORT);
if (dbc->dbconn == NULL) {
    return (ISC_R_NOMEMORY) ;
}

这使用了已弃用的 openldap 函数并发送一个常量作为端口(LDAP_PORT)。如果我们检查 ldap.h 中定义 ldap_init 的位置:

#define LDAP_PORT       389     /* ldap:///     default LDAP port */
#define LDAPS_PORT      636     /* ldaps:///    default LDAP over TLS port */

如果能得到一些帮助我将非常感激。

太感谢了。

问候。

相关内容