Limitazione della velocità in un'API REST OAuth: per token o per consumatore?

2

Sto creando un'API REST e intendo utilizzare la limitazione della velocità (utilizzando l'algoritmo del bucket leaky) come metodo per proteggersi dalla scansione e dall'enumerazione. L'API verrà utilizzata da un'app mobile / tablet (installata su molti dispositivi) e da client server-server (alcuni interni, alcuni esterni).

Consentendo agli utenti di installare l'app sui propri telefoni (rendendo i dati esposti dalla conoscenza pubblica dell'API) mentre si limitano ancora la scansione e l'enumerazione da parte dei tecnici inversi ho elaborato questa strategia:

  • Al primo avvio, l'app genera un ID casuale abbastanza grande da essere considerato univoco
  • Quando si richiede un token per l'accesso all'API, l'app si autentica con quell'ID.
  • Qualsiasi richiesta di token per lo stesso ID applicazione riceve risposta con lo stesso token (purché non sia scaduto)
  • Qualsiasi richiesta di token per lo stesso indirizzo IP riceve lo stesso token (purché non sia scaduto), ignorando completamente l'ID dell'app.

Questa politica non si applica ai client server-to-server poiché questi dovranno impostare un contratto con la mia azienda per poter utilizzare l'API.

Ora, per valutare la limitazione:

È preferibile una di queste strategie? Se: quali sono i pro e i contro?

  1. assicura che nessuna entità che consuma entri in possesso di più di un token valido alla volta (sostanzialmente uguale a quello delle APP). Aggancia il secchio che perde ai token.
  2. concedere tanti token a un'entità che richiede. Condividi il bucket che perde tra tutti i token concessi a un'entità.

Inoltre: se l'opzione 1 è preferibile: come deve essere applicata la politica 1-token-per-entity?

  1. Concedi nuovi token solo dopo che quelli precedenti sono scaduti. Fornisci un'interfaccia che consenta alle entità di revocare / invalidare il loro token corrente.
  2. Quando viene richiesto un nuovo token, revoca tutti i token precedenti.

Sono particolarmente preoccupato per le condizioni di gara tra

  • istanze multiple del server dello stesso appaltatore (quindi tutte soggette allo stesso limite di velocità)
  • più installazioni di app in esecuzione che condividono un indirizzo IP (WiFi pubblico, più utenti che condividono una connessione Internet, ...)
posta marstato 19.04.2016 - 14:19
fonte

1 risposta

1

Dopo un sacco di avanti e indietro e discussioni con i colleghi ho risolto con l'opzione 2. Ecco perché:

Le strategie sono uguali in termini di funzionalità. Le condizioni della gara sono ciò che causa problemi. Prevediamo che queste condizioni di gara si verifichino:

  1. Più dispositivi della stessa entità richiedono inizialmente un token [in un intervallo di tempo molto piccolo]
  2. Più dispositivi della stessa entità richiedono un nuovo token [in un intervallo molto piccolo] perché quelli precedenti sono scaduti

Mentre nel primo caso le due strategie sono di uguale qualità, la strategia 2 presenta diversi vantaggi nel secondo caso:

I dispositivi potrebbero voler richiedere un nuovo token prima quello corrente scade, solo per giocare sicuri

  • non concedere un nuovo token a meno che quelli precedenti non siano consentiti.
  • invalidare un token precedente, ancora valido per ottenerne uno nuovo molto probabilmente causerà problemi: altri dispositivi della stessa entità tenteranno di utilizzare il token appena invalidato e quindi ricevere risposte di errore
  • Se l'impostazione dell'ora dei dispositivi client è leggermente diversa dall'ora del server (sono sufficienti 15 secondi), i client possono entrambi
    • riceve token che sembrano loro già scaduti
    • non richiede un nuovo token in tempo (perché il token appare ancora valido mentre è effettivamente scaduto)
  • questo problema ottiene veramente weired se le nostre istanze del server non vengono eseguite esattamente nello stesso momento

Impossibile disconnettere / disconnettere per dispositivo

I singoli dispositivi potrebbero voler "disconnettersi" e assicurarsi che il loro token non sia stato mischiato. Questo è impossibile anche usando la strategia 1.

Alcuni dispositivi potrebbero non richiedere tutte le autorizzazioni concesse alla loro entità

Se un dispositivo non ha bisogno di tutte le possibili autorizzazioni possibili è auspicabile che non ottenga un token con più autorizzazioni del necessario. Anche questo è impossibile usando la strategia 1.

    
risposta data 20.04.2016 - 16:56
fonte

Leggi altre domande sui tag