Kerberos 簡介與安裝

今天要來介紹一隻可愛的小狗:Kerberos,傳說中的幽冥的守門員。而在現實世界中,是 MIT 提出來的一個認證協定,能爲網路通訊提供嚴格的身份驗證。

在提到 Kerberos 是如何爲通訊雙方提供信任基礎之前,我們可以先複習一下 HTTPS 等服務是如何進行身份驗證的。

PKI 的驗證機制與 Kerberos 的信任機制

各位可以回憶一下 PKI(Public key infrastructure) 是如何做到驗證機制的,這個世界上的 HTTPS 伺服器那麼多,我們不可能去記錄每一臺的憑證,因此我們勢必要使用到「具備公信力的第三人」的角色。

在 PKI 中,這個具備公信力的第三人,就是被大家信任的 CA(certificate authority),CA 若是信任這個服務,CA 便會去簽署某個人的公鑰,爲它頒佈憑證。我們只需要使用 CA 的公鑰,就可以判斷該憑證是否是被該 CA 信任。

然而因爲我們信任該 CA,因此我們也可以判定說我們信任那位被該 CA 信任的人,這就是信任鏈(chain of trust)。

而 Kerberos 的機制和 PKI 明顯不同,一個是中央化的認證機制,一個是分散式的基礎設施,但 Kerberos 本身就是類似 CA 那個作爲「具備公信力的第三人」而存在的角色。

Kerberos 的原理介紹

Kerberos 協定:A 要對 B 進行請求,B 要藉由 Kerberos 對 A 進行認證

在 Kerberos 協定中,存在三個角色:

因此,流程如下:

  1. A 想要對 B 發送請求;
  2. A 向 AS 請求 TGT,注意 A 無法解密 TGT;
  3. A 將 TGT 提交給 TGS,TGS 提供給 A 針對 B 的 Ticket;
  4. A 對 B 發送請求,並使用 Ticket 證明自己的身份。

架設過程

sudo apt update
sudo apt install krb5-kdc krb5-admin-server krb5-config

它會要求輸入 Kerberos Realm 的名稱,預設的 Realm 是 Host FQDN 的大寫形式。

接着編輯 /etc/krb5.conf

[libdefaults]
    default_realm = EXAMPLE.COM
    dns_lookup_realm = false
    dns_lookup_kdc = false

[realms]
    EXAMPLE.COM = {
        kdc = kerberos.example.com
        admin_server = kerberos.example.com
    }

[domain_realm]
    .example.com = EXAMPLE.COM
    example.com = EXAMPLE.COM

在理想情況下,最好真的有 DNS Record 將 kerberos.example.com 指向到你的 Kerberos 伺服器。

編輯 /etc/krb5kdc/kadm5.acl:控制哪些使用者可以管理 Kerberos 資料庫。

最後,啓動 Kerberos:

sudo systemctl start krb5-kdc
sudo systemctl start krb5-admin-server
sudo systemctl enable krb5-kdc
sudo systemctl enable krb5-admin-server
測試

使用 sudo kadmin.local 操作 Kerberos 資料庫,輸入:addprinc user,來創建使用者 user

輸入 kinit user 來測試登入,它會要求你輸入密碼。

最後用 klist 來輸出你 Tickets。

$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: user@TEST.NASA

Valid starting     Expires            Service principal
10/22/24 08:58:38  10/22/24 18:58:38  krbtgt/TEST.NASA@TEST.NASA

其它 Issues

Pre-Authentication

如果攻擊者拿到了 AS 的回覆封包,他會拿到一個特殊的加密值,該加密值是使用使用者密碼進行加密的,因此可以在攻擊者電腦本地進行暴力破解。

基於這種情況,我們可以爲使用者開啓 Pre-Authentication,使用者一開始會發送一個由使用者密碼雜湊值加密的時間戳,最終,AS 回應的也是使用者密碼的雜湊值加密的資訊。

因此,攻擊者就沒辦法拿到使用者的原始密碼。

Clock Skew

如果 Kerberos 伺服器的時間不準的話,它可能會拒絕認證它所簽發的 Tickets。