Zpět na domů

Kerberos pro vývojáře: protokol a SSPI

Článek rozebírá protokol Kerberos pro AD: od impersonation a TGT po delegování a kódu v C++. Příklady SSPI, PKINIT, U2U pro testování na jednom počítači. Vhodné pro senior vývojáře.

Kerberos: TGT, delegování a kód C++ pro SSPI
Advertisement 728x90

# Protokol Kerberos: hluboká analýza pro vývojáře

Kerberos řeší úlohu impersonation: služba na stroji A obdrží požadavek od vzdáleného klienta a musí provést operace jménem tohoto klienta, včetně přístupu k lokálním zdrojům. Pro to se vytvoří nový access token na základě poskytnutých credentials. Bez Kerberosu by služba použila svůj vlastní token, což by blokovalo přístup k souborům vyžadujícím zvýšená práva.

V scénáři s chained requests služba A požaduje službu B. Delegování umožňuje vybrat: impersonate ze svého účtu nebo z původního klienta. Kerberos přenáší zašifrované tikety (tickets), obsahující SID uživatele, skupiny a PAC (Privilege Attribute Certificate).

Klíčové komponenty:

Google AdInline article slot
  • Principal: entita s heslem (uživatel, počítač, služba).
  • KDC (Key Distribution Center): ukládá hesla, vydává TGT (Ticket Granting Ticket) a service tickets.
  • SPN (Service Principal Name): identifikátor služby, často ukazující na účet, pod kterým je služba spuštěna.

Kerberos odlišuje autentizaci od autorizace: dešifrování tiketu potvrzuje identitu, token určuje práva.

Struktura zpráv a transport

Zprávy Kerberos používají ASN.1 (PER/DER encoding podle RFC 4120). Přenos přes UDP/TCP na port 88. UDP je vhodné pro krátké pakety (TGT ~1-2 KB), TCP pro velké (s PAC).

KDC v Active Directory spojuje AS (Authentication Service) a TGS (Ticket Granting Service). SRV záznamy (_kerberos._tcp.<domain>) ukazují na kontrolery domény.

Google AdInline article slot

Proces AS-Exchange (získání TGT):

  • Client → KDC: KRB_KDC_REQ (pre-auth s timestampem, zašifrovaným heslem nebo PKINIT).
  • KDC → Client: KRB_KDC_REP (TGT, zašifrovaný dlouhodobým klíčem klienta; session key v pre-auth).
  • Client ukládá TGT v LSA (Local Security Authority).

TGS-Exchange (service ticket):

  • Client → KDC: KRB_TGS_REQ (TGT + authenticator + jméno služby/SPN).
  • KDC → Client: KRB_TGS_REP (service ticket, session key služby).

AP-REQ (s service ticket) encapsulovaný v LDAP, HTTP Negotiate, SMB, RPC. Wireshark ukazuje: GSS-WRAP s tokenem NTLM/Kerberos.

Google AdInline article slot

Šifrování a klíče

Heslo se hashuje do long-term klíče (AES-256-CTs pro Windows). Session keys jsou dočasné, pro ochranu zpráv.

Příklad C++ kódu pro AES-šifrování Kerberos s CNG (Cryptography API: Next Generation):

#include <windows.h>
#include <ncrypt.h>
#include <ntstatus.h>

NTSTATUS EncryptKerberosAES(
    PUCHAR key, ULONG keyLen,
    PUCHAR plaintext, ULONG ptLen,
    PUCHAR* ciphertext, ULONG* ctLen) {
    NCRYPT_ALG_HANDLE hAlg = NULL;
    BCRYPT_KEY_HANDLE hKey = NULL;
    NTSTATUS status;

    status = BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, NULL, 0);
    if (!NT_SUCCESS(status)) return status;

    status = BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_CTS, sizeof(BCRYPT_CHAIN_MODE_CTS), 0);
    // Kerberos uses AES-CTS

    status = BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, key, keyLen);
    // ... encrypt logic with IV from Kerberos spec
    // Polnyy code oprzegapen for kratkosti

    BCryptCloseAlgorithmProvider(hAlg, 0);
    return status;
}

Kód demonstruje nastavení AES v režimu CTS (Cipher Text Stealing), specifickém pro Kerberos.

Typy delegování a testování

Kerberos podporuje constrained a unconstrained delegation.

Varianty delegování:

  • Simple: bez delegování (služba nepřenáší credentials dál).
  • Unconstrained: plný TGT forward (rizikové, zastaralé).
  • Constrained: S4U2Proxy — service ticket jen pro uvedené SPN.
  • Resource-based constrained: na straně služby (Windows Server 2012+).

Testování na jednom stroji: použijte klist, AcquireCredentialsHandle s SSPI. Příklad pro U2U (User-to-User):

CredHandle cred;
TimeStamp expiry;
AcquireCredentialsHandle(NULL, L"Kerberos", SECPKG_CRED_OUTBOUND, NULL, NULL, NULL, NULL, &cred, &expiry);
// U2U: impersonate bez KDC, directlyy exchange

Pro PKINIT: předání X.509 cert do AcquireCredentialsHandle s SECPKG_CRED_CERTIFICATE. GSS-API — wrapper pro SSPI v Windows.

Mezi-doménová autentizace a SPN

Trust accounts (jméno = doména) umožňují cross-domain. Client z domény A požaduje TGT pro trust principal v doméně B.

SPN nemá heslo — identifikuje host/user. Duplikáty SPN ukazují na jednoho principal. Systém určuje typ podle formátu: host/<fqdn>, HTTP/<fqdn>.

Správa více credentials:

  • ImpersonateHandleExplicit s logonem.
  • LSA policy pro multi-user SPN.
  • Custom GSS acceptor s kontrolou více klíčů.

Co je důležité

  • Kerberos — GSS-API vrstva pro single sign-on v AD; tikety obsahují PAC se SIDs/skupinami.
  • Delegování je kritické pro backend-to-backend; constrained minimalizuje rizika.
  • Testujte SSPI: 3-5 řádků pro AcquireCredentialsHandle místo boilerplate.
  • PKINIT a U2U rozšiřují scénáře bez hesla.
  • ASN.1 + AES-CTs — jádro protokolu; monitorujte v Wireshark na portu 88.

— Editorial Team

Advertisement 728x90

Číst dál