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

返回本页常规视图.

为 Kerberos 身份验证配置客户端

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

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

Kerberos_Service_Name/Kerberos_Host_Name@Kerberos_Realm

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

Kerberos_Service_Name@Kerberos_Host_Name

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

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

此部分内容

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 - 在 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
    

另请参阅

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

另请参阅