Kerberos 身份验证故障排除

这些提示有助于您避免 Vertica 的 Kerberos 身份验证的相关问题,并对产生的任何问题进行故障排除。

JDBC 客户端身份验证失败

如果在 JDBC 客户端上进行 Kerberos 身份验证失败,请检查 JAAS 登录配置文件是否存在语法问题。如果语法不正确,身份验证会失败。

未配置工作域名服务 (DNS)

确认网络上的 DNS 条目和系统主机文件 (/etc/hosts or /etc/hostnames) 均针对您的环境进行了适当的配置。如果您使用的是完全限定域名,请确保其也已正确配置。有关详细信息,请参阅适用于您的平台的 Kerberos 文档。

系统时钟不同步

您网络中的系统时钟必须保持同步,Kerberos 身份认证才能正常进行。如果您访问 HDFS 中的数据,则 Vertica 节点还必须与 Hadoop 同步。

除 Red Hat 7/CentOS 7 之外的所有系统

要保持系统时钟同步,请执行以下操作:

  1. 在 Kerberos 服务器 (KDC) 上安装 NTP。

  2. 在您网络中的每台服务器上安装 NTP。

  3. 针对所有参与 Kerberos 领域,距离 KDC 以及其他每台服务器相隔仅数分钟的所有机器,同步其系统时钟

对于需要与 Windows Time Service 同步的 Linux 虚拟机,可能会存在时钟偏差问题。采用以下步骤保持时间同步:

  1. 使用任意文本编辑器,打开 /etc/ntp.conf

  2. Undisciplined Local Clock 部分下方,添加 Vertica 服务器的 IP 地址。然后,删除现有服务器条目。

  3. 以 root 身份登录到服务器,并设置一个 cron 作业,用来与添加的 IP 地址同步时间,每半小时同步一次或按需要的频率同步。例如:

    # 0 */2 * * * /etc/init.d/ntpd restart
    
  4. 或者,运行以下命令来强制立即同步时钟:

    $ sudo /etc/init.d/ntpd restart
    

有关详细信息,请参阅启用网络时间协议 (NTP)网络时间协议网站

Red Hat 7/CentOS 7 系统

在 Red Hat 7/CentOS 7 中,为了更侧重于 chrony,弃用了 ntpd。要使您网络中的系统时钟保持同步,以便 Kerberos 身份验证能正常进行,请执行以下操作:

  1. 在 Kerberos 服务器 (KDC) 上安装 chrony

  2. 在您网络中的每台服务器上安装 chrony

  3. 针对所有参与 Kerberos 领域,距离 KDC 以及其他每台服务器相隔仅数分钟的所有机器,同步其系统时钟。

Linux 虚拟机上的时钟偏差

对于需要与 Windows Time Service 同步的 Linux 虚拟机,可能会存在时钟偏差问题。采用以下步骤保持时间同步:

  1. 使用任意文本编辑器,打开 /etc/chrony.conf

  2. Undisciplined Local Clock 部分下方,添加 Vertica 服务器的 IP 地址。然后,删除现有服务器条目。

  3. 以 root 身份登录到服务器,并设置一个 cron 作业,用来与添加的 IP 地址同步时间,每半小时同步一次或按需要的频率同步。例如:

    # 0 */2 * * * systemctl start chronyd
    
  4. 或者,运行以下命令来强制立即同步时钟:

    $ sudo systemctl start chronyd
    

有关详细信息,请参阅 Red Hat chrony 指南

Kerberos 票证有效,但 Hadoop 访问失败

Vertica 使用 Kerberos 票证获取 Hadoop 令牌。然后使用 Hadoop 令牌访问 Hadoop 数据。Hadoop 令牌会在一段时间后过期,所以 Vertica 会定期刷新。但是,如果您的 Hadoop 群集设定使得令牌频繁过期,则令牌可能无法及时刷新。如果令牌过期,您将无法访问数据。

通过设置 HadoopFSTokenRefreshFrequency 配置参数,您可以指定 Vertica 刷新令牌的频率。指定值(以秒为单位)应该小于设置的 Hadhoop 到期期限。例如:

=> ALTER DATABASE exampledb SET HadoopFSTokenRefreshFrequency = '86400';

有关 Hadoop 访问失败的另一个原因,请参阅系统时钟不同步

加密算法选项

Kerberos 基于对称加密。要确保 Kerberos 领域中使用的 Kerberos 各方都同意使用某加密算法。如果不同意,身份验证就会失败。您可以在 vertica.log 中查看异常。

在 Windows 客户端上,要确保加密类型与在 Active Directory 上设置的类型相匹配。请参阅为 Kerberos 身份验证配置 Vertica

请注意,Kerberos 仅用于保护登录进程的安全。在登录进程完成后,客户端和服务器之间的信息传输默认不加密。如果您想要对信息传输进行加密,请使用 SSL。有关详细信息,请参阅实施 SSL

Kerberos 密码未能识别

如果您更改了 Kerberos ,则必须重新创建所有的 keytab 文件。

使用 ODBC 数据源配置实用程序

在 Windows vsql 客户端上,您可以选择使用 ODBC 数据源配置实用程序并为客户端提供数据源。若如此,请务必在“客户端设置 (Client Settings)”选项卡中输入 Kerberos 主机名,以避免客户端无法连接 Vertica 分析型数据库服务器。

备份、还原或管理工具身份验证失败

若配置中各 Vertica 节点使用其各自的 Kerberos 主体,则可能产生这个问题。(推荐此配置。)使用 VBR 或 admintools 时,您可能会看到诸如以下的错误:

$ vsql: GSSAPI continuation error: Miscellaenous failure
GSSAPI continuation error: Server not found in Kerberos database

备份/还原以及管理工具将使用用于验证的 Kerberos 主体中的 KerberosHostname 值(若设置了此值)。所有节点都使用相同的值。如果您如推荐的那样,为每个节点都定义了一个 Kerberos 主体,此值将不匹配。要予以更正,请取消设置 KerberosHostname 参数:

=> ALTER DATABASE DEFAULT CLEAR KerberosHostname;

服务器的主体名与主机名不匹配

若配置中所有节点都使用同一个 Kerberos 主体,则可能产生这个问题。Vertica 不推荐对所有节点使用同一个 Kerberos 主体。相反,请为每个节点使用不同的主体,而且不要设置 KerberosHostname 参数。

在某些情况下,连接客户端时,Vertica 服务器的主体名可能与连接字符串中的主机名不匹配。(另请参阅本主题中的使用 ODBC 数据源配置实用程序。)

在 Windows vsql 客户端上,您可以选择使用 ODBC 数据源配置实用程序并为客户端提供数据源。若如此,请务必在“客户端设置 (Client Settings)”选项卡中输入 Kerberos 主机名,以避免客户端无法连接 Vertica 服务器。

在 ODBC、JDBC 和 ADO.NET 客户端上,使用 KerberosHostName 连接字符串设置服务器主体的主机名部分。

主体/主机不匹配问题和解决方案

如果主体和主机不匹配,可能会出现以下问题。

KerberosHostName 配置参数被覆盖

例如,考虑以下连接字符串:

jdbc:vertica://v_vmart_node0001.example.com/vmart?user=kuser

由于此连接字符串不包含显式 KerberosHostName 参数,驱动程序默认其为 URL (v_vmart_node0001.example.com) 下的主机。如果您覆盖服务器端 KerberosHostName 参数,使之为“abc”,客户端将生成不正确的主体。

要解决这个问题,请将客户端 KerberosHostName 显式设置为连接字符串,如本例所示:

jdbc:vertica://v_vmart_node0001.example.com/vmart?user=kuser&kerberoshostname=abc

连接负载均衡功能已启用 ,但客户端进行验证的节点可能不是连接字符串中的节点。

在这种情况下,请考虑更改所有节点,以使用相同的 KerberosHostName 设置。当您使用最初在连接字符串中指定的默认主机时,负载均衡将无法干扰 Kerberos 身份验证。

DNS 名与 Kerberos 主机名不匹配

例如,假定群集中有六台服务器,您想让 hr-serversfinance-servers 连接到 Vertica 群集中的不同节点。但 Kerberos 身份验证发生在单个(相同的)KDC 上。在以下示例中,服务器的 Kerberos 服务主机名为 server.example.com

假设您拥有下列示例服务器:

server1.example.com 192.16.10.11
server2.example.com 192.16.10.12
server3.example.com 192.16.10.13
server4.example.com 192.16.10.14
server5.example.com 192.16.10.15
server6.example.com 192.16.10.16

现在,假定您拥有下列 DNS 条目:

finance-servers.example.com 192.168.10.11, 192.168.10.12, 192.168.10.13
hr-servers.example.com 192.168.10.14, 192.168.10.15, 192.168.10.16

当您连接到 finance-servers.example.com 时,指定:

  • Kerberos -h 主机名选项为 server.example.com

  • hr-servers.example.com-K 主机选项

例如:

$ vsql -h finance-servers.example.com -K server.example.com

未在客户端计算机上设置 DNS ,所以您只能通过 IP 连接

要解决这个问题,指定:

  • 该 IP 地址的 Kerberos -h 主机名选项

  • server.example.com-K 主机选项

例如:

$ vsql -h 192.168.1.12 -K server.example.com

涉及到负载均衡器(虚拟 IP) ,但 VIP 没有 DNS 名

指定:

  • Virtual IP 地址的 Kerberos -h 主机名选项

  • server.example.com-K 主机选项

例如:

$ vsql -h <virtual IP> -K server.example.com

您使用 IP 地址连接到 Vertica ,但没有用来构建 Kerberos 主体名的主机名。

通知 Vertica 有关 Kerberos 主体的信息中所述,为 Vertica 提供实例或主机名

将服务器端 KerberosHostName 配置参数设置为 Vertica 节点主机名之外的名称 ,但客户端无法仅根据连接字符串中的主机名来确定主机名。

重置 KerberosHostName,以匹配 Vertica 节点的主机名的名称。有关详细信息,请参阅以下主题: