JDBC客戶機上的Kerberos身份驗證使用Java身份驗證和授權服務(JAAS)獲取初始Kerberos憑證。JAAS是一個API框架,它隱藏特定於平臺的身份驗證細節,併爲其他應用程序提供一致的接口。
您可以通過JAAS登錄配置文件指定客戶機登錄過程。這個文件包含指定Kerberos的身份驗證方法和其他設置的選項。一個名爲LoginModule的類在配置文件中定義了有效的選項。
JDBC客戶端principal 被設計爲JDBC -username@server-from-connection-string。
Implement the LoginModule
Vertica建議您使用JAAS公共類com.sun.security.auth.module。Krb5LoginModul在Java運行時環境(JRE)中提供。
Krb5LoginModule使用Kerberos協議對用戶進行身份驗證,它在非Windows和Windows平臺上的實現方式不同:
- 在非windows平臺上
Krb5LoginModule依賴於一個本地Kerberos客戶機實現。因此,可以使用與在Linux、HP-UX、AIX和MAC OSX平臺上配置ODBC和vsql客戶機相同的/etc/krb5.conf設置。 - 在Windows平臺上
Krb5LoginModule使用與Java運行時環境(JRE)綁定的自定義Kerberos客戶端實現。Windows設置存儲在%WINDIR%\krb5.ini文件中,該文件具有與非Windows krb5.conf文件類似的語法和約定。您可以將krb5.conf從非windows客戶端複製到%WINDIR%\krb5.ini。
Create the JAAS Login Configuration
JAASConfigName連接屬性標識包含Krb5LoginModule及其設置的JAAS配置中的特定配置。JAASConfigName設置允許具有不同Kerberos設置的多個JDBC應用程序在一個主機上共存。默認的配置名是verticajdbc。
重點:仔細構造JAAS登錄配置文件。如果語法不正確,身份驗證將失敗。
您可以在java中配置與jaas相關的設置。安全主安全屬性文件。這個文件位於JRE的lib/security目錄中。
Create a JDBC Login Context
下面的示例演示如何在JDBC客戶機上爲Kerberos身份驗證創建登錄上下文。客戶端使用verticajdbc的默認JAASConfigName,並指定:
- 將從票證緩存中獲取票證授予票證
- 如果無法從緩存、keytab文件或通過共享狀態獲得憑據,則不會提示用戶輸入密碼。
verticajdbc {
com.sun.security.auth.module.Krb5LoginModule
required
useTicketCache=true
doNotPrompt=true;
};
JDBC Authentication Request and Connection
您可以配置Krb5LoginModule來使用緩存的票據或keytab。如果調用用戶提供了密碼,驅動程序還可以自動獲取票據或keytab。
在前面的示例中,登錄過程使用一個緩存的票證,並且不提示輸入密碼,因爲useTicketCache和doNotPrompt都被設置爲true。如果doNotPrompt=false,並且在登錄過程中提供了用戶名和密碼,則驅動程序將該信息提供給LoginModule。然後驅動程序代表您調用kinit實用程序。
- 在JDBC客戶機上,調用kinit實用程序獲得一個票據:
$ kinit kuser@EXAMPLE.COM
- 連接到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);
Have the Driver Acquire a Ticket
有時,您可能希望自己不調用kinit實用程序,但仍然使用加密的相互身份驗證。在這種情況下,您可以選擇向驅動程序傳遞一個明文密碼,以便從KDC獲取票據。密碼在通過網絡發送時進行加密。例如,在下面的例子中,useTicketCache和doNotPrompt都爲false。因此,調用用戶的憑證不是通過票據緩存或keytab獲得的。
$ verticajdbc {
com.sun.security.auth.module.Krb5LoginModule
required
useTicketCache=false
doNotPrompt=false;
};
前面的示例演示了JAAS的靈活性。driver不再尋找緩存的票,你不需要調用kinit。相反,驅動程序接受密碼和用戶名,並代表您調用kinit。