在所有平台上配置 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

另请参阅