La seguente soluzione di autenticazione è sicura o mi manca qualcosa?

4

Contesto:

Ho due server Web ServerA (stack LAMP) e ServerB (stack ASP.NET). Penso che la tecnologia (si spera) non abbia importanza. Entrambi i server richiedono l'autenticazione e presumibilmente fanno bene il loro lavoro, se non è fuori ambito in questa domanda.

Task:

Vorrei implementare una pagina con contenuti iframe. ServerA serve il contenuto esterno ServerB serve il contenuto interno (l'iframe). I server si trovano nel dominio diverso . Quando l'utente X accede a ServerA e naviga verso la pagina, mi piacerebbe mostrare un contenuto personale e sensibile proveniente da ServerB nell'iframe. Il contenuto appartiene all'identità dell'utente X nel server B.

Soluzione proposta:

  • ServerA e ServerB hanno un segreto condiviso (lato server)
  • Gli utenti vengono replicati da ServerA a ServerB. I nomi utente corrispondono, le password su ServerB sono generate casualmente e non vengono utilizzate affatto. (continua a leggere)
  • ServerA autentica l'utente tramite https utilizzando un'autenticazione basata su modulo
  • La pagina esterna contiene il seguente frode html in cui l'estensione .any nell'url è configurata per eseguire e rispondere nel server, ad esempio .aspx o .cshtml o .php, ecc .:

.

<img src="https://serverb.com/dummy.any?parameter=crypted_username_and_date_using_thesecret" style="display:none;" />
  • In ServerB quando una richiesta viene ricevuta sul dummy.any url decrittografa il parametro, qualche controllo poi nella risposta imposta un cookie criptato contenente con il nome utente. La chiave di criptazione potrebbe essere il segreto condiviso o meglio può essere il segreto privato di ServerB.

  • In ServerB quando una richiesta ricevuta nella pagina interna (l'iframe) deve contenere il cookie, cosa è stato impostato per questo stesso dominio ( link ) se il cookie è presente e l'utenteX è esistente e dice 5 minuti che il timeframe è tutto OK, ServerB utilizza il suo sottosistema di autenticazione per accedere all'utente a livello di programmazione (nessuna password fornita). (il sottosistema di autenticazione imposta i propri cookie o qualsiasi altra cosa, questa si spera scatola nera nel nostro punto di vista)

  • Dopo questo ServerB viene pubblicato un contenuto sensibile che appartiene a userX.

Si noti che sono uno sviluppatore e non un esperto di sicurezza. Ecco perché ti sto chiedendo prima di implementare un buco di sicurezza.

    
posta g.pickardou 22.03.2016 - 14:16
fonte

2 risposte

2

Non sono sicuro che questa dovrebbe essere una risposta, ma ho troppo da scrivere per un commento ...

Quello che stai suggerendo mi sembra OK, con alcune ipotesi:

  • Il segreto condiviso è buono - no 'test123' ecc.
  • La cripto che usi è buona. No ROT13;)
  • I nomi utente fanno distinzione tra maiuscole e minuscole, sembra ovvio, ma posso immaginare di registrare l'utente abc e di accedere alle informazioni dell'utente aBc

Come preside penso che funzioni. L'unica cosa che posso pensare è se un utente è in qualche modo in grado di registrare un account sul server A che già esiste sul server B, ma sono sicuro che ci hai pensato.

Ovviamente se hai altri problemi di sicurezza (vulns su uno dei server, i soliti attacchi web ecc.) allora tutte le scommesse sono disattivate.

    
risposta data 22.03.2016 - 15:41
fonte
2

Il problema per me è che, in assenza di gestione delle sessioni, la richiesta al serverB è suscettibile di riprodurre gli attacchi. Speriamo che TUTTE le comunicazioni tra server e client siano tramite HTTPS, non solo l'autenticazione (altrimenti si tratta di un grosso problema di sicurezza) in modo da ridurre la possibilità di intercettazione. Tuttavia, 5 minuti sono molto lunghi perché il token sia valido sul server remoto. Significa anche che dovrai assicurarti che gli orologi sui server siano sincronizzati.

Non sarebbe più semplice passare un singolo token con data e ora in scadenza nell'URL iframe?

Una soluzione alternativa sarebbe che serverA richieda una password unica da serverB quando viene richiesta la pagina esterna e la includa nell'URL per l'iframe. Ma questo non si ridimensiona così facilmente.

    
risposta data 22.03.2016 - 17:48
fonte

Leggi altre domande sui tag