2011-12-15 15 views
10

È possibile memorizzare un ticket Kerberos per utilizzarlo successivamente per impersonare l'utente?Memorizzazione dell'autenticazione Kerberos per la rappresentazione successiva

Ho lo scenario in cui un utente invoca direttamente un sistema esterno per elaborare alcuni dati. Il sistema esterno si basa sull'utente che viene rappresentato/autenticato correttamente nell'AD.

Ora il sistema chiamante deve cambiare in modo che una coda si trovi tra l'utente e il sistema esterno e il lavoro dalla coda venga trasferito al sistema esterno da quella coda da un servizio Windows. Questo servizio deve impersonare l'utente affinché il sistema esterno gestisca correttamente i diritti dell'utente.

Dato che non riesco a cambiare il sistema esterno e non posso memorizzare il nome utente e la password in coda, posso salvare un ticket Kerberos quando l'utente aggiunge nuovi elementi di lavoro alla coda e successivamente impersona l'utente tramite il servizio quando consegna i dati al sistema esterno. Come lo farei in C#?

+1

che tipo di coda utilizza il servizio? una coda di messaggi di sistema, un MSMQ? Perché se la coda che stai utilizzando è basata su RPC, il tuo servizio può impersonare l'utente finale. – JPBlanc

+0

Una coda di SQL Service Broker. – GaussZ

risposta

0

Potrebbe essere possibile salvarlo, ma penso che il biglietto sarà di breve durata. Sfortunatamente, eseguirai sicuramente lo Kerberos double-hop issue in cui l'autenticazione fallisce dal servizio al servizio, a meno che tu non abbia configurato correttamente la delega sulla tua rete. Ciò richiederà la configurazione di alcuni SPN (nomi principali del servizio) nella directory attiva per indicare ai server di fidarsi l'uno dell'altro.

Non ho mai provato a salvare i ticket Kerberos per un certo periodo di tempo, quindi anche dopo aver combattuto con la delega e SPN potrebbe non funzionare.

Ecco un post rapido su come configurare IIS7 to handle double hop Kerberos tickets e un altro articolo su handling it from the networks point of view.

Vorrei poter essere di maggiore aiuto e postare codice e non articoli, ma mentre indaghi vedrai che questa è la rovina dell'autenticazione Kerberos. In bocca al lupo!

+0

Grazie per il commento, ma il problema del doppio salto dovrebbe essere risolto. L'unico pezzo mancante è ottenere il ticket Kerberos nel codice e archiviarlo per una re-impersonificazione successiva. – GaussZ

+0

Quanto a lungo stai parlando di quando vuoi conservarlo? Un minuto, un paio d'ore? Se ricordo bene, il biglietto ha una durata di 5 minuti prima che scada. – Joshua

+0

La durata predefinita di un ticket Kerberos dovrebbe essere di 10 ore. Può essere prolungato anche rinnovandolo. Da dove hai preso il limite dei 5 minuti? – GaussZ

1
  • Edit: Questo è il più vicino che posso ottenere alla tua domanda reale: si può iniziare un thread separato sotto la rappresentazione, fare la richiesta da lì, tutto il tempo che ci vuole? Sotto le coperte questo farà ciò che è necessario (a meno che il processo di servizio non sia terminato, naturalmente).

Come un microsoft ci ha detto una volta "la sicurezza è la cosa che interrompe il funzionamento dell'applicazione quando la si distribuisce". (Il suo punto era di testare con una configurazione di sicurezza realistica).

Il ticket può avere una durata di 10 ore, ma è il momento da quando è stato emesso. Potrebbe avere solo una frazione di quello che rimane dal momento in cui l'utente effettua la richiesta.

Suggerisco di risolvere semplicemente il problema sottostante in un modo diverso.

Qual è il motivo per cui ora è necessario fare la coda? Semplicemente perché il servizio esterno è strozzato nelle ore di punta?

  • Riesci a rinforzare o scalare l'hardware? Di solito il modo più economico.
  • Avete effettivamente autorizzazioni completamente separate o gli utenti inseriscono un numero finito di ruoli? Se i ruoli potessero registrare il ruolo in cui si trovava l'utente e utilizzare nomi utente appositamente creati per accedere al servizio esterno, uno per ciascun ruolo.
  • Il servizio esterno è tuo?Puoi aggiungere un'opzione "fingere di essere Bob" che non si basa su Windows Impersonation?
  • È possibile avviare un thread separato sotto la rappresentazione, effettuare la richiesta da lì, per quanto tempo impiega? Quindi rispediscilo all'utente? (Sì, questo avverrà sotto le copertine, facendo quello che chiedi)
  • Infine, potresti mettere l'utente in una "coda di razionamento" del browser. Cioè emettili con un numero, poi fai in modo che il browser si aggiorni ogni 10 secondi (o usi Ajax) per dire loro quante persone ci sono davanti in coda. Quando è il loro turno, effettua la richiesta effettiva sotto falsa identità. (Ciò impone loro di mantenere aperta la finestra del browser durante l'attesa in coda e richiede inoltre di tenere traccia delle richieste in sospeso e dei browser attivi rispetto ai browser obsoleti). Cattivo, ma funzionerà.

Senza conoscere il problema reale, è difficile consigliarlo, oltre a dire non farlo in questo modo: troppi trucchi.

+0

La coda è stata scelta a causa di più requisiti/restrizioni (il servizio non è disponibile 24 ore su 24, ma gli articoli devono essere aggiunti alla coda, la coda deve essere affidabile (che include sopravvivere a un riavvio), il servizio esterno è strozzato, il il client deve aggiungere lavoro per il servizio esterno ma può disconnettersi prima dell'avvio o del termine del lavoro) Il servizio esterno non è sotto il mio controllo, quindi non è possibile aggiungere alcuna opzione "fingere di essere Bob". E mentre il biglietto può avere una durata inferiore, può ancora essere rinnovato al di sopra del massimo di 10 ore. TL; DR: La coda è un requisito, qualsiasi soluzione deve sopravvivere al riavvio – GaussZ

+0

@GaussZ: Una soluzione che sopravvive a un riavvio è un orrendo buco di sicurezza. Pensaci. C'è una ragione per cui è difficile da fare - perché non è una buona idea. So che hai detto TL; DR ai miei altri suggerimenti, ma forse dovresti prenderti il ​​tempo. I suggerimenti 1 o 2 sono le tue migliori scommesse. – Ben

+0

Ovviamente non dovrebbe essere un buco di sicurezza per tutti gli accessi. Questo è il motivo per cui l'approccio token Kerberos è favorito. Se qualcuno è in grado di compromettere il server e utilizzare i token Kerberos memorizzati in una coda, è già in grado di compromettere i servizi Web e utilizzare i token inviati a loro. Vorrei anche usare un altro approccio e sono grato per i vostri suggerimenti, ma poiché le restrizioni sono quello che sono (specialmente l'incapacità di modificare il sistema esterno) questa idea mi ha colpito come l'opzione migliore. – GaussZ

0

Questa soluzione è dotato di un enorme avvertimento, ma invece di memorizzare gettoni/biglietti, è possibile utilizzare la funzione LsaLogonUser e delega vincolata ad ottenere un token per la rappresentazione senza credenziali che forniscono, in questo momento il lavoro è pronto per essere rimosse dalla coda.

In questo modo viene implementata la transizione del protocollo, in cui le credenziali non Windows (ad esempio su un sito Web pubblico) possono essere mappate a un utente di dominio che viene rappresentato per l'accesso alle risorse interne.

L'avvertenza è, questo è ovviamente un enorme buco di sicurezza potenziale, e l'account che esegue il processo che chiama LsaLogonUser deve essere concesso SeTcbPrivilege ("Agisci come parte del sistema operativo").

Se c'è un modo di conservare un biglietto, sarebbe ovviamente molto meglio, ma la prima cosa che ho pensato quando ho visto la domanda era il problema del tempo di scadenza che @Ben ha menzionato.

Modifica: A couple di excellent articles sulla transizione del protocollo e sulla delega vincolata, con ampia copertura dei rischi coinvolti.

Problemi correlati