Java

設置 kerberos ktpass ktab 所有 JAAS

  • March 5, 2014

我有幾個關於 Windows 上的 Kerberos 的問題。

我想了解使用 ktpass 將使用者映射到服務的目的是什麼。

例如,我在 Windows 上執行 ktpass,如下所示:

ktpass -out <keytab location> -princ <host/domain.com> -mapUser userA@domain.com -mapOp add .........

當我們將使用者映射到 時,-princ是否意味著只有“userA”才能對服務進行身份驗證?我們如何使用-addand-set選項?有什麼不同?

我的問題是這樣的:

我有:

  • 許多使用者想要使用我擁有的服務,並通過 kerberos (JASS Krb5LoginModule) 進行身份驗證

但:

  • 我不想在 jaas.config 文件中指定許多使用者主體名稱。

所以我正在考慮改用SPN,並映射到userA,而userA只能使用該服務。但我不確定此映射是否也用於授權目的。

對於 sun java 的 Krb5LoginModule,有一個選項 useTicketCache。

如果我將此設置為 true,是否意味著如果某些使用者登錄,Krb5loginmodule 將使用儲存在他們電腦記憶體中的他/她的 kerberoes 憑據?

我問這個是因為在 Krb5loginmodule 的其他一些實現中,

例如:IBM 的,沒有 useTicketCache,但有 useCcache,但 useCcache 需要指定票證位置;我不想指定這個位置。

在 IBm 的 krb5loginmodule 版本中如何實現?

我可以這樣做:

通常密鑰表文件用於服務主體,但我可以使用此密鑰表來儲存使用者憑據。

例如:ktab -k mykeytab.keytab -a userA@REALM.COM ?不做setspnktpass

在 AD 中,Kerberos 服務主體作為 servicePrincipalName LDAP 屬性與 AD 使用者或電腦對象相關聯,因此您必須指定應將主體添加到的帳戶。這並不能確定哪些使用者可以對服務進行身份驗證*(*正如您所猜測的那樣),而是確定服務本身應該在哪個 AD 帳戶下執行(如果它在 Windows 上執行)。這是因為服務需要該主體的密鑰才能驗證使用者將發送的 Kerberos 票證,並且如果它在主體所附加的帳戶下執行,它將有權訪問密鑰。這在 Windows 上自動發生;在 Unix 上,它通常由管理員手動安排,創建一個包含密鑰的 keytab 文件,並配置服務以使用它。

對於 sun java 的 Krb5LoginModule,有一個選項 useTicketCache。如果我將此設置為 true,是否意味著如果某些使用者登錄,Krb5loginmodule 將使用儲存在他們電腦記憶體中的他/她的 kerberoes 憑據?

就是這個想法,儘管由於 Java 選擇在 JDK 中嵌入完整的 Kerberos 實現而不是使用主機提供的實現而效果不佳(後者有一個選項,但僅在 Unix 上,大多數人不知道)關於或使用它)。在 Unix 上,Java Kerberos 包可以讀取 MIT 樣式的 ccache,但不能寫入。在 Windows 上,它可以讀取 SSPI ccache(使用者的登錄憑據),但您需要設置系統資料庫項:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters\allowtgtsessionkey = DWORD 1

…以便 Java 可以獲取 TGT 的會話密鑰以使用它。這是預設限制的,通常不需要,因為 Windows 程序通常會要求 SSPI 執行需要會話密鑰的操作,而不是自己執行。

通常密鑰表文件用於服務主體,但我可以使用此密鑰表來儲存使用者憑據。

密鑰表儲存一組(主體,密鑰)對;主體是使用者還是服務的主體並不重要。您可以將與您的密碼對應的密鑰儲存在 keytab 中(例如使用 MIT“ktutil”程序),然後使用 keytab 進行身份驗證,而不是輸入您的密碼(例如使用“kinit -k -t”)。但是,請記住,這與將密碼放入文件中基本相同,所有這些都涉及安全性。

引用自:https://serverfault.com/questions/573881