Abbiamo implementato a metà la corretta gestione delle chiavi presso il nostro dev shop. Abbiamo un servizio Web SOAP (il servizio web di gestione delle chiavi ) che può essere utilizzato per recuperare le password per altri sistemi. Quindi, ad esempio, potrei fare una richiesta a questo servizio per la password, ad esempio, per un DB PostgreSQL di produzione. Colpisco il servizio web con le mie credenziali AD e determina se sono autorizzato a ricevere o meno la password del DB. Se lo sono, viene inviato nella risposta. Posso quindi utilizzare questo servizio su tutti gli altri componenti software invece di memorizzare la password del DB in un file di configurazione statico (come context.xml
di Tomcat, ecc.).
Il problema, naturalmente, è che con un processo automatizzato le credenziali AD passate nel servizio web devono essere memorizzate da qualche parte. Quindi, per ottenere la password per un DB (o qualsiasi altra risorsa protetta), è sufficiente accedere a ciò che viene utilizzato per memorizzare le credenziali AD e quindi inviarli a questo servizio Web, che quindi li autentica / autorizza e restituire la password per la risorsa richiesta. Classico problema di gestione delle chiavi.
Quindi, sto cercando di capire un modo per proteggere le credenziali AD utilizzate per accedere al servizio. Qualcuno ha parlato di Kerberos con me e ho iniziato a scavare un po '.
La mia comprensione è che, con Kerberos, ci sarebbero 3 componenti:
- Un client del servizio web di gestione delle chiavi
- Il servizio web di gestione delle chiavi
- Un server Kerberos (ticket che garantisce ticket, TGT )
La mia comprensione è questa:
- Il client (in qualche modo) ottiene un TGT da Kerberos
- Il client invia quindi una richiesta per alcune risorse, ad esempio un DB, al servizio web di gestione delle chiavi, ma non fornisce le credenziali AD, ma invece fornisce il TGT
- Il servizio web di gestione delle chiavi viene quindi riconfigurato per ricevere questo TGT e eseguire il ping del server Kerberos con un " questo TGT è valido? " - tipo richiesta
- Il server Kerberos risponde e dice " yes " (o "no") e onora la richiesta per la password del DB, inviandola al client nella risposta
Quindi, prima di tutto, se qualcosa sulla mia comprensione non è corretto, per favore inizia correggendomi!
Supponendo che sia più o meno corretto, allora ho alcune domande su questa configurazione:
- Come potrebbe il client ottenere prima il TGT da Kerberos?
- I TGT di Kerberos hanno date di scadenza? In che modo il client "richiede nuovamente" un nuovo TGT?
- Il servizio web di gestione delle chiavi deve implementare uno specifico protocollo TCP per parlare con Kerberos, oppure HTTP è sufficiente? Se Kerberos ha il proprio protocollo, esistono delle librerie Java che lo implementano? (So che è facile con Google "java kerberos" ma non sono sicuro di cosa sia esattamente la ricerca, perché di nuovo, non sono sicuro di aver capito l'architettura qui).