12.12. 使用语法验证

通过语法验证,Directory 服务器会检查属性值是否遵循该属性的定义中给出的语法规则。例如,语法验证将确认新的 telephoneNumber 属性实际上具有其值的有效电话号码。
重要
红帽建议不要禁用语法验证。

12.12.1. 关于语法验证

与架构检查一样,验证会检查任何目录修改并拒绝违反语法的更改。可以选择性地配置其他设置,使语法验证可以记录关于语法违规消息,然后拒绝修改或允许修改过程成功。
这个功能会验证所有属性语法,但二进制语法(无法验证)和非标准语法(没有定义所需的格式)和非标准语法除外。语法会根据 RFC 4514 进行验证。

12.12.2. 语法验证和其他目录服务器操作

语法验证与标准 LDAP 操作主要相关,如创建条目(添加)或编辑属性(modify)。但是,验证属性语法可能会影响其他目录服务器操作。

数据库加密

对于普通 LDAP 操作,属性仅在将值写入数据库之前加密。这意味着,加密会在验证属性语法进行。

加密的数据库(如 第 10 章 配置属性加密所述)可以被导出和导入。通常,强烈建议使用带有 db2ldifldif2db-E 标志进行这些导出和导入操作,这样就能对导入操作进行正常验证。但是,如果加密数据库在没有使用 -E 标志(不支持)的情况下导出,那么会创建一个带有加密值的 LDIF。当导入此 LDIF 后,无法验证加密的属性,则会记录警告,并在导入的条目中跳过属性验证。

同步

对于 Windows Active Directory 条目和 Red Hat Directory Server 条目中的属性,允许或强制的语法可能会有区别。在这种情况下,Active Directory 值无法正确同步,因为语法验证在 Directory Server 条目中强制实施 RFC 标准。

复制

如果 Directory Server 11 实例是将其更改复制到消费者的供应商,则无法使用语法验证没有问题。但是,如果复制中的供应商是旧版本的目录服务器或禁用语法验证,则不应在消费者上使用语法验证,因为 Directory Server 11 使用者可能会拒绝供应商允许的属性值。

12.12.2.1. 使用命令行打开语法验证和关闭

要打开和关闭语法验证,请设置 nsslapd-Syntaxcheck 参数的值。例如,禁用语法验证:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-syntaxcheck=off
Successfully replaced "nsslapd-syntaxcheck"
有关 nsslapd-Syntaxcheck 参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述

12.12.2.2. 使用 Web 控制台打开语法验证开启和关闭

使用 Web 控制台启用或禁用语法验证:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings,然后选择 Server Settings 条目。
  4. 打开 Advanced Settings 选项卡。
  5. 要启用属性语法检查,请选中 Enable Attribute Syntax Checking 复选框。要禁用该功能,请清除复选框。
  6. 点击 Save

12.12.3. 为 DN 启用或禁用严格语法验证

启用语法验证后,会验证区分名称(DN),如 RFC 4514 的第 3 节中所述。DN 语法验证会单独启用,因为后续标准的严格性可能会导致具有不同语法的旧 DN 无效,因此目录树。
注意
如果启用了严格的 DN 验证,并且 DN 值不符合所需语法,则操作会失败,并带有 LDAP 结果代码 34INVALID_DN_SYNTAX

12.12.3.1. 使用命令行为 DN 启用或禁用严格语法验证

要为 DN on 和 off 打开严格的语法验证,请设置 nsslapd-dn-validate-strict 参数的值。例如,为 DN 禁用严格的语法验证:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-dn-validate-strict=off
Successfully replaced "nsslapd-dn-validate-strict"
有关 nsslapd-Syntaxcheck 参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述

12.12.3.2. 使用 Web 控制台为 DN 启用或禁用严格语法验证

使用 Web 控制台为 DN 启用或禁用严格的语法验证:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings,然后选择 Server Settings 条目。
  4. 打开 Advanced Settings 选项卡。
  5. 根据您要启用或禁用该功能,选择或取消选择 Strict DN 语法验证 选项。
  6. 点击 Save

12.12.4. 启用语法验证日志记录

默认情况下,语法验证会拒绝任何添加或修改操作,其中属性值违反了所需的语法。但是,违反本身默认不会记录到错误日志中。nsslapd-Syntaxlogging 属性为任何语法违反启用错误日志记录。
注意
语法验证脚本发现的语法违反情况,任务会在 Directory Server 错误日志中记录。
如果同时启用了 nsslapd-Syntaxloggingnsslapd-Syntaxcheck 参数,则任何无效的属性修改都会被拒绝,并将消息写入日志。如果启用了 nsslapd-Syntaxlogging,但禁用了 nsslapd-Syntaxcheck,则允许操作成功,但警告消息仍然被写入错误日志中。

12.12.4.1. 使用命令行启用语法验证日志记录

要启用语法验证日志记录,请将 nsslapd-Syntaxlogging 参数的值设置为 on
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-syntaxlogging=on
Successfully replaced "nsslapd-syntaxlogging"
有关 nsslapd-Syntaxlogging 参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述

12.12.4.2. 使用 Web 控制台启用语法验证日志记录

使用 Web 控制台启用验证日志:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings,然后选择 Server Settings 条目。
  4. 打开 Advanced Settings 选项卡。
  5. 选择 Enable Attribute Syntax Logging 选项。
  6. 点击 Save

12.12.5. 验证现有属性值的语法

在某些情况下,您可能需要手动验证现有值的语法。例如:
目录服务器将语法验证任务的结果记录到 /var/log/dirsrv/slapd-instance_name/errors 文件中。例如:
  • 如果所有验证的值都有效:
    [28/Jun/2017:12:52:43.669867966 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Starting (base: "dc=example,dc=com", filter: "(objectclass=*)") ...
    [28/Jun/2017:12:52:43.696850129 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Complete.  Found 0 invalid entries.
  • 如果找到无效的条目:
    [28/Jun/2017:12:54:05.736087520 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Starting (base: "dc=example,dc=com", filter: "(objectclass=*)") ...
    [28/Jun/2017:12:54:05.754195607 +0200] - ERR - syntax-plugin - syntax_validate_task_callback - Entry "cn=user,ou=People,dc=example,dc=com" violates syntax.
    description: value #0 invalid per syntax
    [28/Jun/2017:12:54:05.759905671 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Complete.  Found 1 invalid entries.
    注意
    语法验证任务仅识别语法违反情况。您必须手动修复不正确的值。

12.12.5.1. 使用 dsconf schema validate-Syntax 命令创建语法验证任务

使用 dsconf schema validate-Syntax 命令创建语法验证 任务。例如,要创建一个任务来验证 ou=People,dc=example,dc=com 子树中与 (objectclass=inetorgperson) 过滤器匹配的所有值的语法,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema validate-syntax -f '(objectclass=inetorgperson)' ou=People,dc=example,dc=com

12.12.5.2. 使用 cn=tasks Entry 创建语法验证任务

Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动语法验证操作,请在 cn=Syntax validate,cn=tasks,cn=config 条目中创建任务。
例如,要创建一个任务来验证 ou=People,dc=example,dc=com 子树中所有值的语法,其与 (objectclass=inetorgperson) 过滤器匹配:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=example_syntax_validate,cn=syntax validate,cn=tasks,cn=config
objectclass: extensibleObject
cn: cn=example_syntax_validate
basedn: ou=People,dc=example,dc=com
filter: (objectclass=inetorgperson)
任务完成后,该条目将从目录配置中删除。
有关 cn=syntax validate,cn=tasks,cn=config 条目的详细信息,请参阅 Red Hat Directory Server 配置、命令和文件参考中的 cn=schema 重新加载任务部分。