È necessaria la firma della richiesta (digerire il corpo della richiesta) in una API REST?

14

Attualmente sono impegnato in un dibattito e mi sono chiesto quale fosse l'opinione della comunità su questo.

  1. Vediamo API REST che richiedono solo l'autenticazione di base (forse HTTP) o OAuth.

  2. Vediamo API REST che richiedono anche una firma; contenente il / i segreto / i, data / ora, forse un nonce.

  3. Occasionalmente vediamo API REST che richiedono anche i parametri di richiesta (assemblati in un modo specifico) da includere nella firma.

Il numero 3 offre una sicurezza completa (sebbene nella realtà e nella pratica ci sia molto di sbagliato con il primo?), tuttavia, aggiunge una maggiore complessità di implementazione - assemblare i parametri di richiesta in un modo specifico crea una grande opportunità per rovinare tutto e puoi dire addio a "testare rapidamente" l'API.

Il mio responsabile della sicurezza direbbe 'vai con il numero 3, idiota', ma il mio capo usabilità dice 'che è un PITA completo, il numero 2 è sufficiente nel mondo reale e se è usato correttamente - cioè sopra https - non c'è niente da sbagliare '.

    
posta Jamie Edwards 15.03.2013 - 17:46
fonte

2 risposte

7

Dal server, potresti volere due cose:

  1. per assicurarti che il client che invia la richiesta sia effettivamente quello che rivendicano;
  2. per poter dimostrare a terzi che chiunque abbia inviato una determinata richiesta sia effettivamente un'entità client specifica.

Le firme digitali sono più o meno necessarie per raggiungere il secondo obiettivo. Per il primo obiettivo, è sufficiente l'autenticazione semplice; HTTP "Autenticazione di base", riprodotto all'interno di SSL (HTTPS), è sufficiente. Il tuo metodo "tipo 2" è un tipo di autenticazione che si basa su un certificato client; un altro metodo altrettanto valido, e più semplice da attivare, consiste nell'utilizzare i certificati client a livello SSL (le librerie SSL gestiscono quindi le attività di firma non-timestamp stesse).

Nessun metodo 1 o 2 fornisce una prova che potrebbe essere utilizzata durante il contenzioso. L'autenticazione convince il server che il client giusto si trova all'altro capo della linea, ma il server non riceve nulla che possa convincere un giudice. Per questo, hai davvero bisogno di una firma sulla richiesta stessa, cioè il tuo "metodo 3". Non è che il metodo 3 sia "più sicuro"; piuttosto, il metodo 3 fornisce una funzionalità aggiuntiva che può essere utile o meno al tuo caso specifico.

Inoltre, tieni presente che la richiesta firmata non sostituisce completamente l'autenticazione, se non altro a causa di attacchi di riproduzione .

    
risposta data 15.03.2013 - 18:26
fonte
1

Se il server parla con HTTPS (con solo certificati attendibili!), non vi è alcun motivo diretto per utilizzare uno dei metodi più complessi. Una semplice autenticazione di base della password in testo semplice è sufficiente e sicura.

Se il canale di comunicazione è non fidato, ad esempio se si concedono proxy aziendali man-in-the-middle o certificati non attendibili, tutte le parti della richiesta devono essere incluse nella "firma" ", compresa una qualche forma di protezione di riproduzione. Inoltre, la "firma" non deve rivelare il segreto di autenticazione.

Il punto che Thomas solleva sulla provabilità delle richieste dei clienti è buono. Tuttavia, la "firma" nella maggior parte delle API REST che ho incontrato non è affatto una firma: è un autenticatore simmetrico che non presta nulla per la provabilità (lo stesso autenticatore può essere e deve essere computabile dal server).

Quindi, a meno che non si abbiano effettivamente certificati client per i client, il metodo per assicurarsi che il client sia effettivamente quello che rivendicano è di scarsa rilevanza.

    
risposta data 18.03.2013 - 11:47
fonte

Leggi altre domande sui tag