这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

Kerberos 身份验证

Kerberos 身份验证使用以下组件来执行用户身份验证。

客户端程序包

Kerberos 5 客户端程序包用于与 KDC 服务器进行通信。此软件包并不作为 Vertica Analytics Platform 安装的一部分包含在内。Kerberos 软件内置在 Microsoft Windows 中。如果使用的是其他操作系统,必须获取并安装该客户端软件包。

如果您的系统上还没有 Kerberos 5 客户端程序包,请从 MIT Kerberos 分发页面下载。在 Kerberos 身份验证中使用的每个 Vertica 服务器和客户端上安装此程序包,KDC 本身除外。

有关安装说明,请参阅 Kerberos 文档

服务主体

服务主体由主机名、服务名称和分配了一组凭据的领域组成 (service/hostname@REALM)。这些凭据会连接到服务,即您通过网络连接并使用 KDC 进行身份验证的主机。

要创建领域名,请参阅指定 KDC 信息并配置领域。主机名必须与操作系统提供的值匹配。通常,它是一个完全限定主机名。如果主体的主机名部分与操作系统提供的值不匹配,Kerberos 身份验证会失败。

有些系统使用主机文件(/etc/hosts 或 /etc/hostnames)来定义主机名。主机文件可以为一个主机定义多个名称。操作系统提供了第一个条目,因此,请在主体中使用此条目。例如,如果主机文件包含:

192.168.1.101 v_vmart_node0001.example.com v_vmart_node0001

则将 v_vmart_node0001.example.com 作为主机名值。

将以下内容配置为 Kerberos 主体:

  • 每一个客户端(连接到 Vertica 的用户或应用程序)

  • Vertica 服务器

有关详细信息,请参阅以下主题:

Keytab 文件

主体存储在加密 Keytab 文件中。Keytab 文件包含 Vertica 主体的凭据。它有助于 Vertica 服务器向 KDC 验证自身身份。您需要使用 Keytab,这样 Vertica 分析型数据库就不会提示您输入密码。

请为群集中的每个节点创建一个服务主体。然后,您可以创建各个 Keytab 文件(每个节点一个,其中仅包含该节点的主体),或创建一个包含所有主体的 Keytab 文件。

  • 创建一个包含所有主体的 Keytab 文件 可简化设置:所有节点具有相同的文件,可简化初始设置。如果在以后添加节点,则可以更新(和重新分发)全局 Keytab 文件或为新节点创建单独的 Keytab。如果某个主体受损,则该主体在包含它的所有节点的 Keytab 文件中也会受损。

  • 在每个节点中创建单独的 Keytab 文件 可简化维护工作。不过,初始设置时的工作量较大,因为您必须在每个节点中创建不同的文件,但主体不会在各个节点之间共享。如果在以后添加节点,则可以在新节点中创建 Keytab。每个节点的 Keytab 仅包含一个主体,即用于此节点的主体。

票证授予票证

票证授予票证 (TGT) 用于检索对域中服务器的用户进行身份验证的服务票证。随后的登录请求将使用缓存的 HTTP 服务票证进行身份验证,除非该票证已到 krb5.conf 中的 ticket_lifetime 参数中设置的过期时间。

多领域支持

Vertica 使用 ALTER AUTHENTICATION 中的 SET param=value 参数(REALM 作为参数)为 Kerberos 身份验证提供多领域支持:

=> ALTER AUTHENTICATION krb_auth_users set REALM='USERS.COM';
=> ALTER AUTHENTICATION krb_auth_realmad set REALM='REALM_AD.COM';

这允许您分配不同的领域,以便其他领域的用户可以向 Vertica 验证身份。

多领域支持仅适用于 GSS 身份验证类型。每种身份验证方法可以有一个领域。如果您有多种身份验证方法,则每种方法都可以有自己的领域:

=> SELECT * FROM client_auth;
auth_oid | auth_name | is_auth_enabled | auth_host_type | auth_host_address | auth_method | auth_parameters     | auth_priority
---------+-----------+-----------------+----------------+-------------------+-------------+-----------------+-----------------
45035996 | krb001    |   True          |   HOST         |  0.0.0.0/0        |  GSS        | realm=USERS.COM     |  0
45035997 | user_auth |   True          |   LOCAL        |                   |  TRUST      |                     |  1000
45035737 | krb002    |   True          |   HOST         |  0.0.0.0/0        |  GSS        | realm=REALM_AD.COM  |  1

1 - 为 Kerberos 身份验证配置 Vertica

Kerberos 针对设备提供强大的加密身份验证,使客户端和服务器能够以更安全的方式进行通信。从而解决了网络安全问题。

您的系统必须安装和配置一个或多个 Kerberos 密钥分发中心 (KDC)。必须可以从 Vertica 分析型数据库群集中的每个节点访问 KDC。

KDC 必须使用 GSS-API 支持 Kerberos 5。有关详细信息,请参阅 MIT Kerberos 分发页面

此部分内容

1.1 - 在 Linux KDC 中创建 Vertica 主体和 Keytab

Vertica 使用服务主体进行系统级别的操作。这些主体用于标识 Vertica 服务,并按如下方式使用:

  • 当 Kerberized Vertica 客户端向数据库进行身份验证时,它们会请求访问此服务。

  • Tuple Mover 等系统进程向 Hadoop 等外部服务进行身份验证时,它们会使用此标识。

按如下所示创建主体和密钥:

  1. 启动 Kerberos 5 数据库管理实用程序(kadminkadmin.local)可在 Linux KDC 中创建 Vertica 主体。

    • 如果要访问远程服务器中的 KDC,请使用 kadmin。如果掌握 Kerberos 管理员密码,则可以在安装了 Kerberos 5 客户端包的任何计算机上使用 kadmin。启动 kadmin 时,实用程序会提示您输入 Kerberos 管理员密码。您可能需要具备客户端的 root 权限才能运行 kadmin

    • 在以下情况下可以使用 kadmin.local

      • KDC 位于您当前已登录的计算机中。

      • 您对该服务器具有 root 权限。

    kadmin.local 不需要管理员登录凭据。

    有关 kadminkadmin.local 命令的详细信息,请参阅 kadmin 文档

  2. 在每个节点中,为 Vertica 创建一个服务主体。主机名必须与操作系统提供的值匹配。以下示例为名为 vertica 的节点创建了服务主体 v_vmart_node0001.example.com

    $ sudo /usr/kerberos/sbin/kadmin.local
    kadmin.local add_principal vertica/v_vmart_node0001.example.com
    

    为每个主体重复执行一次 ktadd 命令。您可以为每个主体用户创建单独的 Keytab,也可以将它们全部添加到一个 Keytab 文件(例如 krb5.keytab)。如要使用一个文件,请参阅 MIT Kerberos 文档中有关 -glob 选项的文档。

    您必须为使用 Kerberos 身份验证的每个 Vertica 分析数据库用户创建一个用户主体。例如:

    $ sudo /usr/kerberos/sbin/kadmin.local
    kadmin.local add_principal [options] VerticaUser1
    
  3. 将每个 Keytab 文件复制到相应群集节点中的 /etc 文件夹。在所有节点中使用相同的路径和文件名。

  4. 在每个节点中,让 Keytab 文件可供正在运行数据库进程的文件所有者(通常是 Linux dbadmin 用户)读取。例如,您可以按照以下方式,将这些文件的所有权更改为 dbadmin:

    $ sudo chown dbadmin *.keytab
    

    创建 Keytab 文件之后,可以使用 klist 命令查看存储在文件中的密钥:

    $ sudo /usr/kerberos/bin/klist -ke -t
    Keytab name: FILE:/etc/krb5.keytab
    KVNO    Timestamp        Principal
    ---- ------------------- --------------------------------------------------------------------------
    4     08/15/2017 7:35:41 vertica/v_vmart_node0001.example.com@EXAMPLE.COM (aes256-cts-hmac-sha1-96)
    4     08/15/2017 7:35:41 vertica/v_vmart_node0001.example.com@EXAMPLE.COM (aes128-cts-hmac-sha1-96)
    
  5. 在 Vertica 上运行以下命令,以确保正确设置 Kerberos 参数:

    => select parameter_name, current_value from configuration_parameters where parameter_name like 'Ker%';
    parameter_name         |                      current_value
    -----------------------+---------------------------------------------------------------------
    KerberosHostname       | v_vmart_node0001.example.com
    KerberosKeytabFile     | /etc/krb5.keytab
    KerberosRealm          | EXAMPLE.COM
    KerberosTicketDuration | 0
    KerberosServiceName    | vertica
    (5 rows)
    
  6. 确保所有客户端都使用 gss 身份验证方法。

    从 Vertica:

    => CREATE USER bob;
    CREATE USER
    
    => CREATE AUTHENTICATION v_kerberos method 'gss' host '0.0.0.0/0';
    CREATE AUTHENTICATION
    
    => ALTER AUTHENTICATION v_kerberos enable;
    ALTER AUTHENTICATION
    
    => GRANT AUTHENTICATION v_kerberos to bob;
    GRANT AUTHENTICATION
    

    从操作系统命令行:

    $ kinit bob
    
    $ vsql -U bob -k vertica -K v_vmart_node0001.example.com -h v_vmart_node0001 -c "select client_authentication_name,
    authentication_method from sessions;"
     client_authentication_name | authentication_method--
    ----------------------------+-----------------------
     v_kerberos                 |    GSS-Kerberos
    
    (1 row)
    
  7. 在 Vertica 上,运行 KERBEROS_CONFIG_CHECK 以验证 Kerberos 配置。KERBEROS_CONFIG_CHECK 验证以下内容:

    • kinit 和 kb5.conf 文件是否存在。

    • keytab 文件是否存在且已设置

    • 数据库中设置的 Kerberos 配置参数:

      • KerberosServiceName

      • KerberosHostname

      • KerberosRealm

      • Vertica 主体

    • Kerberos 可以读取 Vertica 密钥

    • Kerberos 可以获得 Vertica 主体的票证

    • Vertica 可以使用 kinit 初始化密钥

1.2 - 指定 KDC 信息并配置领域

Kerberos 领域中的每个客户端和 Vertica 分析型数据库服务器都必须具有有效且配置相同的 Kerberos 配置 (krb5.conf) 文件。如果没有该文件,客户端不知道如何到达 KDC。

如果使用 Microsoft Active Directory,则无需执行此步骤。请参阅适用于您的平台的 Kerberos 文档,详细了解有关在 Active Directory 上的 Kerberos 配置文件信息。

您至少需要在 krb5.conf 文件中配置以下部分。

  • [libdefaults]—Kerberos 5 库使用的设置
  • [realms]—领域专用联系信息和设置
  • [domain_realm]—将服务器主机名映射到 Kerberos 领域

请参阅 Kerberos 文档,了解有关此配置文件中其它部分的信息。

您必须更新 /etc/krb5.conf 文件以反映您的站点的 Kerberos 配置。在 Kerberos 领域中的所有客户端与服务器当中强制执行一致性的最简单办法,就是从 KDC 复制 /etc/krb5.conf 文件。然后,将该文件放入每个 Vertica 群集节点上的 /etc 目录内。

1.3 - 通知 Vertica 有关 Kerberos 主体的信息

按照以下步骤通知 Vertica 有关主体名称和 keytab 位置的信息。

有关您在此过程中需要设置的参数的信息,请参阅 Kerberos 参数

  1. 以管理员身份(通常为 dbadmin)登录到数据库。

  2. 设置 KerberosKeyTabFile 配置参数,以指向 keytab 文件的位置:

    => ALTER DATABASE DEFAULT SET PARAMETER KerberosKeytabFile = '/etc/krb5.keytab';
    

    在所有节点上,keytab 文件必须在相同位置(在此示例中为 /etc/krb5.keytab)。

  3. 设置 Vertica 主体的服务名称;例如,vertica

    => ALTER DATABASE DEFAULT SET PARAMETER KerberosServiceName = 'vertica';
    
  4. 提供主体的领域部分,例如,EXAMPLE.COM

    => ALTER DATABASE DEFAULT SET PARAMETER KerberosRealm = 'EXAMPLE.COM'
    

1.4 - 为所有客户端配置身份验证方法

为了确保所有客户端均使用 gss 身份验证方法,请运行以下语句:

=> CREATE AUTHENTICATION <method_name> METHOD 'gss' HOST '0.0.0.0/0';
=> GRANT AUTHENTICATION <method_name> TO Public;

有关详细信息,请参阅实施客户端身份验证

1.5 - 在 Active Directory 中创建主体和 Keytab

Active Directory 存储有关 Windows 域成员的信息,包括用户和主机。

Vertica 使用 Kerberos 协议访问此信息,以便对 Vertica 数据库的 Windows 用户进行身份验证。Kerberos 协议使用主体来识别用户,并使用 keytab 文件来存储他们的加密信息。您需要将 keytab 文件安装到 Vertica 中,使 Vertica 数据库能够以加密方式验证 Windows 用户。

此过程描述:

  • 创建 Vertica 服务主体。

  • 导出这些主体的 keytab 文件

  • 在 Vertica 数据库中安装 keytab 文件。这将允许 Vertica 对 Windows 用户进行身份验证,并授予其访问 Vertica 数据库的权限。

  1. 为 Vertica 服务创建一个 Windows 帐户(主体),并为群集中的每个节点/主机创建一个 Vertica 主机。此过程将为在该节点上运行的主机 verticanode01 和服务 vertica 创建 Windows 帐户。

    创建这些帐户时,请选择以下选项:

    • 用户无法更改密码

    • 密码永不过期

  2. 如果您在 HDFS 上使用受 Kerberos 身份验证保护的外部表,则必须启用“委派 (Delegation)”。为此,请访问 Active Directory 用户和计算机对话框,右键单击 Vertica 服务的 Windows 帐户(主体),然后选择“委派 (Delegation)”。信任此用户以委派给任何服务。

  3. 运行以下命令为主机 verticanode01.dc.com 节点/主机创建密钥表:

    $ ktpass -out ./host.verticanode01.dc.com.keytab -princ host/verticanode01.dc.com@DC.COM -mapuser verticanode01
     -mapop set -pass secret  -ptype KRB5_NT_SRV_HST
    
  4. 运行以下命令为 vertica 服务创建 Keytab:

    $ ktpass -out ./vertica.verticanode01dc.com.keytab -princ vertica/verticanode01.dc.com@DC.COM -mapuser vertica
     -mapop set -pass secret  -ptype KRB5_NT_PRINCIPAL
    

    有关 Keytab 文件的详细信息,请参阅 Technet.Microsoft.com

  5. 运行以下命令以验证服务主体名称是否正确映射。您必须为群集中的每个节点运行以下命令:

    $ setspn -L vertica
        Registered ServicePrincipalNamefor CN=vertica,CN=Users,DC=dc,DC=com
          vertica/verticanode01.dc.com
    
    $ setspn -L verticanode01
        Registered ServicePrincipalNamefor CN=verticanode01,CN=Users,DC=dc,DC=com
          host/verticanode01.dc.com
    
  6. 将您刚才创建的密钥表 vertica.verticanode01.dc.com.keytabhost.verticanode01.dc.com.keytab 复制到 Linux 主机 verticanode01.dc.com

  7. 将多个 Keytab 文件组合成一个 Keytab:

    
    [release@vertica krbTest]$ /usr/kerberos/sbin/ktutil
    ktutil:  rkt host.verticanode01.dc.com.keytab
    ktutil:  rkt vertica.verticanode01.dc.com.keytab
    ktutil:  list
    slot KVNO Principal
    ---- ---- ---------------------------------------------------------------------
      1    3  host/verticanode01.dc.com@DC.COM
      2   16  vertica/verticanode01.dc.com@DC.COM
    ktutil:  wkt verticanode01.dc.com.keytab
    ktutil:  exit
    

    这将创建一个 Keytab 文件,其中包含用于身份验证的服务器主体。

  8. 将新的 Keytab 文件复制到编录目录。例如:

    $ cp verticanode01.dc.com.keytab /home/dbadmin/VMart/v_vmart_nodennnn_catalog
    
  9. 测试 Keytab 文件检索票证的能力,确保它可以从 Vertica 节点运行:

    
    $ kinit vertica/verticanode01.dc.com -k -t verticanode01.dc.com.keytab
    $ klist
    
    Ticket cache: KFILE:/tmp/krb_ccache_1003
    Default principal: vertica/verticanode01.dc.com@DC.COM
    
    Valid starting Expires Service principal
    04/08/2017 13:35:25 04/08/2017 23:35:25 krbtgt/DC.COM@DC.COM
                    renew until 04/15/2017 14:35:25
    

    当票证过期或未自动取回时,您需要手动运行 kinit 命令。请参阅获取 Kerberos 票证并对 Vertica 进行身份验证

  10. 对 Keytab 文件设置正确的权限和所有权:

    $ chmod 600 verticanode01.dc.com.keytab
    $ chown dbadmin:verticadba verticanode01.dc.com.keytab
    
  11. 使用 ALTER DATABASE 设置以下 Kerberos 参数 通知 Vertica 有关 Kerberos 主体的信息:

    KerberosKeytabFile=<CATALOGDIR>/verticanode01.dc.com.keytab
    KerberosRealm=DC.COM
    KerberosServiceName=vertica
    KerberosTicketDuration = 0
    KerberosHostname=verticanode01.dc.com
    
  12. 重新启动 Vertica 服务器。

  13. 按如下所示测试 Kerberos 设置,确保所有客户端都使用 gss 身份验证方法。

    从 Vertica:

    => CREATE USER windowsuser1;
    CREATE USER
    
    => CREATE AUTHENTICATION v_kerberos method 'gss' host '0.0.0.0/0';
    CREATE AUTHENTICATION
    
    => ALTER AUTHENTICATION v_kerberos enable;
    ALTER AUTHENTICATION
    
    => GRANT AUTHENTICATION v_kerberos to windowsuser1;
    GRANT AUTHENTICATION
    

    从操作系统命令行:

    $ kinit windowsuser1
    
    $ vsql -U windowsuser1 -k vertica -K verticanode01.dc.com -h verticanode01.dc.com -c "select client_authentication_name,
    authentication_method from sessions;"
     client_authentication_name | authentication_method--
    ----------------------------+-----------------------
     v_kerberos                 |    GSS-Kerberos
    
    (1 row)
    
  14. 运行 KERBEROS_CONFIG_CHECK 以验证 Kerberos 配置。KERBEROS_CONFIG_CHECK 验证以下内容:

    • kinit 和 kb5.conf 文件是否存在。

    • keytab 文件是否存在且已设置

    • 数据库中设置的 Kerberos 配置参数:

      • KerberosServiceName

      • KerberosHostname

      • KerberosRealm

      • Vertica 主体

    • Kerberos 可以读取 Vertica 密钥

    • Kerberos 可以获得 Vertica 主体的票证

    • Vertica 可以使用 kinit 初始化密钥

1.6 - 获取 Kerberos 票证并对 Vertica 进行身份验证

如果您的机构使用 Kerberos 作为登录过程的一部分,在登录时会自动检索 Kerberos 票证。否则,您需要运行 kinit 来检索 kerberos 票证。

以下示例显示如何使用 kinit 命令检索票证并通过 KDC 对 Vertica 分析型数据库进行身份验证。域名为 EXAMPLE.COM。您必须使用该域名及您的用户名来检索 Kerberos 票证。请参阅指定 KDC 信息并配置领域

$ kinit
Password for principal_user@EXAMPLE.COM: kpasswd

将会提示您当您创建主体和密钥文件(请参阅 在 Linux KDC 中创建 Vertica 主体和 Keytab)时创建的主体用户名的密码。

Kerberos 票证在预设时间长度内被缓存。请参阅 Kerberos 文档中的票证管理获取有关过期参数设置的更多信息。

过期后,您需要再次运行 kinit 指令来检索另外一张 Kerberos 票证。

2 - 为 Kerberos 身份验证配置客户端

各个支持的平台使用不同的安全框架。因此,不同客户端中配置和执行 Kerberos 身份验证所需的步骤也不尽相同。

在服务器端,需使用以下格式构建 Vertica Kerberos 服务名称主体:

Kerberos_Service_Name/Kerberos_Host_Name@Kerberos_Realm

对于每个客户端,GSS 库要求 Vertica 服务主体采用以下格式:

Kerberos_Service_Name@Kerberos_Host_Name

可以省略主体的领域部分,因为 GSS 库使用配置的默认 (Kerberos_Realm) 领域的领域名称。

有关客户端连接字符串的信息,请参阅以下主题:

此部分内容

2.1 - 在非 Windows 平台上配置 ODBC 和 vsql 客户端

要在 Linux 或 MAC OSX 上配置 ODBC 或 vsql 客户端,必须首先安装 Kerberos 5 客户端软件包。请参阅 配置 Kerberos 身份验证。

安装 Kerberos 5 客户端软件包后,必须向客户端提供有效的 Kerberos 配置文件 (krb5.conf)。要与 KDC 通信,参与 Kerberos 身份验证的每个客户端必须拥有配置相同的有效 krb5.conf 文件。Kerberos 配置文件的默认位置为 /etc/krb5.conf。

Kerberos 配置 (krb5.conf) 文件包含 Kerberos 特定的信息,包括:

  • 如何连接 KDC

  • 默认领域名称

  • 指向日志文件的路径

  • DNS 查询

  • 要使用的加密类型

  • 票证使用期限

Kerberos 配置文件的默认位置为 /etc/krb5.conf

如果配置正确,客户端可以使用 Kerberos 进行身份验证并通过 kinit 实用程序检索票证(请参阅以下获取 ODBC 身份验证请求和连接)。同样,服务器则可以使用 ktutil 在 keytab 文件中存储其凭据

在非 Windows 平台上对 ODBC 和 vsql 客户端进行身份验证

ODBC 和 vsql 使用 kinit 建立的客户端票证执行 Kerberos 身份验证。这些客户端依赖于安全库的默认机制来查找票证文件和 Kerberos 配置文件。

要按照 Kerberos 进行身份验证,请调用 kinit 实用程序以便从 Kerberos KDC 服务器获取票证。以下两个示例显示了如何使用 ODBC 和 vsql 客户端发送票证请求。

获取 ODBC 身份验证请求和连接

  1. 在 ODBC 客户端上,通过调用 kuser 实用程序获取 kinit 用户的票证。

    $ kinit kuser@EXAMPLE.COM
    Password for kuser@EXAMPLE.COM:
    
  2. 连接到 Vertica,并在连接字符串中提供主体:

    char outStr[100];
    SQLLEN len;
    SQLDriverConnect(handle, NULL, "Database=VMart;User=kuser;
    Server=myserver.example.com;Port=5433;KerberosHostname=vcluster.example.com",
    SQL_NTS, outStr, &len);
    

获取 vsql 身份验证请求和连接

如果 vsql 客户端位于您所连接的同一台计算机中,vsql 将通过 UNIX 域套接字连接。此连接将绕过 Kerberos 身份验证。当使用 Kerberos 进行身份验证时,特别是客户端身份验证方法配置为“本地”时,必须包括 -h 主机名选项。请参阅命令行选项

  1. 在 vsql 客户端上,调用 kinit 实用程序:

    $ kinit kuser@EXAMPLE.COM
    Password for kuser@EXAMPLE.COM:
    
  2. 连接到 Vertica,并在连接字符串中提供主机和用户主体:

    $ ./vsql -K vcluster.example.com -h myserver.example.com -U kuser
    Welcome to vsql, the Vertica Analytic Database
    interactive terminal.
    
    Type:  \h or \? for help with vsql commands
    \g or terminate with semicolon to execute query
    \q to quit
    

将来,以 kuser 身份登录 vsql 时,vsql 将使用您缓存的票证,而不提示您输入密码。

验证身份验证方法

通过查询 SESSIONS 系统表可以验证身份验证方法:

=> SELECT authentication_method FROM sessions;
 authentication_method
-----------------------
GSS-Kerberos
(1 row)

另请参阅

2.2 - 在 Windows 上配置 ADO.NET、ODBC 和 vsql 客户端

Vertica 客户端驱动程序支持使用 Windows SSPI 库进行 Kerberos 身份验证。Windows Kerberos 配置存储在注册表中。

对于 Windows 和 ADO.NET 上的 ODBC 和 vsql 客户端 Kerberos 身份验证,可以选择两种不同的设置方案:

在 Active Directory 中使用 Windows 内置 Kerberos 客户端和 Vertica 的 Windows KDC

在 Windows 上的 Kerberos 身份验证通常搭配 Active Directory(Microsoft 的企业目录服务/Kerberos 实施)使用。通常,由组织的网络或 IT 管理员执行设置。

Windows 客户端的 Kerberos 身份验证内置于身份验证进程中。无需任何其他软件。

在执行以下操作时,登录凭据可对您连接 Kerberos 服务器 (KDC) 进行身份验证:

  • 从客户机登录到 Windows

  • 使用配置为通过 Active Directory 使用 Kerberos 的 Windows 实例

要在 Windows 客户端上使用 Kerberos 身份验证,请以 REALM\user 身份登录。

使用 Windows 内置 Kerberos 客户端和 Vertica 的 Linux KDC

一种简单但不太常见的方案是配置 Windows 对非 Windows KDC 进行身份验证。在此实施中,使用 ksetup 实用程序在非 Active Directory KDC 中指出 Windows 操作系统本机 Kerberos 功能。通过登录到 Windows,可获取许可票证,与 Active Directory 实施类似。但在这种情况下,Windows 在内部与 Linux KDC 通信。有关详细信息,请参阅 Microsoft Windows Server Ksetup 页面

当数据库/Windows 用户登录到 Windows 计算机(或在 Windows 上执行 kinit 之后)时,Kerberos 票证必须设置 ok_as_delegate 和 forwardable 标志才能访问基于 webhdfs 的外部表,如下所示:

$ CMD \> klist
#2>     Client: release @ VERTQA.LOCAL
Server: vertica/vqatest108.verticacorp.com @ VERTQA.LOCAL
KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
Ticket Flags 0x40a50000 forwardable renewable pre_authent ok_as_delegate name_canonicalize
Start Time: 9/27/2017 13:24:43 (local)
End Time:   9/27/2017 20:34:45 (local)
Renew Time: 10/3/2017 15:04:45 (local)
Session Key Type: RSADSI RC4-HMAC(NT)
Cache Flags: 0
Kdc Called: ADKDC01

配置 Windows 客户端以执行 Kerberos 身份验证

根据要配置的实施,请参阅 Microsoft Server 网站上的下列页面之一:

客户端身份验证和连接

KDC 可对 ADO.NET 和 a vsql 客户端进行身份验证。

验证 ADO.NET 身份验证请求和连接

本示例显示如何使用 IntegratedSecurity=true 设置指定通过 ADO.NET 驱动程序对呼叫用户的 Windows 凭据进行身份验证:

VerticaConnection conn = new
VerticaConnection("Database=VMart;Server=host.example.com;
Port=5433;IntegratedSecurity=true;
KerberosServiceName=vertica;KerberosHostname=vcluster.example.com");
conn.open();

验证 vsql 身份验证请求和连接

  1. 例如,以 EXAMPLE\kuser 身份登录到您的 Windows 客户端。

  2. 运行 vsql 客户端,并向 Vertica 提供连接字符串:

    C:\Users\kuser\Desktop>vsql.exe -h host.example.com -K vcluster -U kuser
    
    Welcome to vsql, the Vertica Analytic Database interactive terminal.
    Type:  \h or \? for help with vsql commands
    \g or terminate with semicolon to execute query
    \q to quit
    

另请参阅

2.3 - 在所有平台上配置 JDBC 客户端

JDBC 客户端上的 Kerberos 身份验证采用 Java 身份验证和授权服务 (JAAS) 获得初始 Kerberos 凭据。JAAS 是一种 API 框架,可隐藏平台特定的身份验证详细信息并为其他应用程序提供一致的界面。

通过 JAAS 登录配置文件可指定客户端登录过程。此文件包含指定用于 Kerberos 的身份验证方法和其他设置的选项。名为 LoginModule 的类定义配置文件中的有效选项。

JDBC 客户端主体设计为 jdbc-username@server-from-connection-string

实施 LoginModule

Vertica 建议您使用 Java 运行时环境 (JRE) 中提供的 JAAS 公共类 com.sun.security.auth.module.Krb5LoginModul

Krb5LoginModule 使用 Kerberos 协议验证用户身份,并且在非 Windows 和 Windows 平台上的实施方式不同:

  • 在非 Windows 平台上: Krb5LoginModule 遵从本机 Kerberos 客户端实施。因此,您可以使用用于在 Linux 和 MAC OSX 平台上配置 ODBC 和 vsql 客户端的相同 /etc/krb5.conf 设置。
  • 在 Windows 平台上: Krb5LoginModule 采用 Java 运行时环境 (JRE) 捆绑的自定义 Kerberos 客户端实施。Windows 设置存储在 %WINDIR%\krb5.ini 文件中,该文件的语法和约定与非 Windows krb5.conf 文件类似。可以从非 Windows 客户端复制 krb5.conf%WINDIR%\krb5.ini 中。

您可以在 com.sun.security.auth 程序包和 Krb5LoginModule 网页上找到 LoginModules 的文档。

创建 JAAS 登录配置

JAASConfigName 连接属性用于标识包含 Krb5LoginModule 及其设置的 JAAS 配置中的特定配置。JAASConfigName 设置允许多个具有不同 Kerberos 设置的 JDBC 应用程序在一个主机中共存。默认配置名称为 verticajdbc

您可以在 java.security 主安全属性文件中配置 JAAS 相关的设置。此文件位于 JRE 的 lib/security 目录中。有关详细信息,请参阅《JavaTM 身份验证和授权服务 (JAAS) 参考指南》中的附录 A

创建 JDBC 登录上下文

以下示例显示如何为 JDBC 客户端上的 Kerberos 身份验证创建登录上下文。该客户端使用 JAASConfigName 的默认 verticajdbc,并指定:

  • 从票证缓存中获得许可票证

  • 如果无法从缓存、keytab 文件或通过共享状态获得凭据,系统不会提示用户输入密码。

verticajdbc {
  com.sun.security.auth.module.Krb5LoginModule
  required
  useTicketCache=true
  doNotPrompt=true;
};

JDBC 身份验证请求和连接

可以将 Krb5LoginModule 配置为使用缓存的票证或 keytab。另外,如果呼叫用户提供密码,驱动程序也可以自动获得票证或 keytab。

在上一示例中,登录进程之所以使用缓存的票证且不提示输入密码,是因为 useTicketCachedoNotPrompt 均设置为 true。如果设置 doNotPrompt=false 并在登录过程中提供用户名和密码,则驱动程序会向 LoginModule 提供该信息。然后,该驱动程序将代表您调用 kinit 实用程序。

  1. 在 JDBC 客户端上,调用 kinit 实用程序以获得票证:

    $ kinit kuser@EXAMPLE.COM
    

    如果您希望使用密码而不调用 kinit 实用程序,请参阅下一节。

  2. 连接到 Vertica:

    Properties props = new Properties();
    props.setProperty("user", "kuser");
    props.setProperty("KerberosServiceName", "vertica");
    props.setProperty("KerberosHostName", "vcluster.example.com");
    props.setProperty("JAASConfigName", "verticajdbc");
    Connection conn = DriverManager.getConnection
    "jdbc:vertica://myserver.example.com:5433/VMart", props);
    

通过驱动程序获取票证

有时,您可能希望自己绕过调用 kinit 实用程序,但仍使用加密的双向身份验证。在这些情况下,可以选择向驱动程序传递明文密码以便从 KDC 获取票证。密码在网络中发送时为加密状态。例如,在以下示例中,useTicketCachedoNotPrompt 均为 false。因此,无法通过票证缓存或 keytab 获得呼叫用户的凭据。

$ verticajdbc  {
  com.sun.security.auth.module.Krb5LoginModule
  required
  useTicketCache=false
  doNotPrompt=false;
};

上一示例演示了 JAAS 的灵活性。驱动程序不再查找缓存的票证,而您无需调用 kinit。相反,驱动程序将使用密码和用户名并代表您调用 kinit

另请参阅

3 - 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 节点的主机名的名称。有关详细信息,请参阅以下主题: