Domanda

Durante la progettazione di una API REST o servizio ci sono le migliori prassi per affrontare con sicurezza (Autenticazione, Autorizzazione, Gestione delle Identità) ?

Quando la costruzione di una SOAP API si dispone di WS-Security, come una guida, e gran parte della letteratura esistente sull'argomento.Ho trovato meno informazioni sulla protezione RESTO endpoint.

Mentre capisco il RESTO intenzionalmente non presentano caratteristiche analoghe a WS-* spero di buone pratiche o raccomandato modelli sono emerse.

Qualsiasi discussione o link ai documenti pertinenti sarebbe molto apprezzato.Se è importante, ci potrebbe essere l'utilizzo di WCF con POX/JSON serializzato messaggi per il nostro RIPOSO API/Servizi costruiti utilizzando v3.5 del .NET Framework.

È stato utile?

Soluzione

Come tweakt detto, Amazon S3 è un buon modello per lavorare con.La loro richiesta di firme hanno alcune caratteristiche (ad esempio incorporando un timestamp) che aiutano a protezione contro accidentali e dannoso richiesta di riproduzione.

La cosa bella di HTTP di Base è che praticamente tutti HTTP librerie di supporto.Sarà, naturalmente, è necessario richiedere SSL, in questo caso, perché l'invio di password in chiaro sulla rete è quasi sempre una brutta cosa.Di base è preferibile a Digerire quando si utilizza SSL, perché, anche se il chiamante si sa già che le credenziali sono necessarie, Digest richiede un extra di andata e ritorno di scambiare il valore nonce.Di Base, i chiamanti semplicemente invia le credenziali per la prima volta.

Una volta che l'identità del cliente è stabilito, l'autorizzazione è davvero solo un problema di implementazione.Tuttavia, è possibile delegare l'autorizzazione a qualche altro componente esistente con un modello di autorizzazione.Di nuovo la cosa bella di Base qui è il server termina con un chiaro copia della password del client che si può semplicemente passare ad un altro componente all'interno della vostra infrastruttura necessaria.

Altri suggerimenti

Non ci sono standard per il RESTO diverso da HTTP.Sono istituiti i servizi REST là fuori.Vi suggerisco di dare un'occhiata a loro e ottenere un tatto per come il lavoro.

Per esempio, abbiamo preso in prestito un sacco di idee da parte di Amazon S3 RESTO del servizio, quando lo sviluppo del proprio.Ma abbiamo scelto di non usare il più avanzato modello di sicurezza basato sulla richiesta di firme.L'approccio più semplice è l'autenticazione Base di HTTP su SSL.Dovete decidere che cosa funziona meglio nella vostra situazione.

Inoltre, mi raccomando il libro I Servizi Web RESTful da O'reilly.Spiega i concetti di base e di fornire alcune delle migliori pratiche.Di solito si può prendere il modello e la mappa per la propria applicazione.

Si potrebbe anche voler dare un'occhiata a OAuth, un nuovo protocollo aperto per il token di autorizzazione specificamente destinati http api.

È molto simile all'approccio adottato da flickr e remember the milk "resto" le api (non necessariamente buoni esempi di restful api, ma i buoni esempi del token-based approach).

C'è una grande lista di controllo trovato su Github:

Autenticazione

  • Non reinventare la ruota in fase di Autenticazione, la generazione dei token, di memorizzazione delle password.Utilizzare gli standard.

  • Utilizzare Max Retry in carcere e le funzionalità di Login.

  • Utilizzare la crittografia di tutti i dati sensibili.

JWT JSON (Web Token)

  • Utilizzare un casuale complicato chiave (JWT Segreto) per fare brute forcing il token molto difficile.

  • Non estrarre l'algoritmo dal payload.Forzare l'algoritmo di back-end (HS256 o RS256).

  • Fare di scadenza del token (TTL, RTTL) il più breve possibile.

  • Non conservare i dati sensibili in JWT payload, può essere facilmente decodificato.

OAuth

  • Sempre convalida redirect_uri lato server per consentire solo nella white list Url.

  • Sempre cercare di cambio di codice e non di token (non consentono response_type=token).

  • Utilizzare il parametro di stato con un casuale hash per evitare CSRF sul OAuth processo di autenticazione.

  • Definire l'ambito predefinito, e convalidare ambito di parametri per ogni applicazione.

Accesso

  • Limitare le richieste (Limitazione) per evitare un attacco DDoS / forza bruta attacchi.

  • L'utilizzo di HTTPS sul lato server per evitare il MITM (Man In The Middle Attack)

  • Utilizzare HSTS intestazione con SSL per evitare SSL Striscia di attacco.

Ingresso

  • Uso di un metodo HTTP, secondo l'operazione: GET (leggere), POST (creare), PUT/PATCH (sostituire/aggiornare), e DELETE (per eliminare un record), e rispondere con 405 Method Not Allowed se il metodo non è appropriato per la risorsa richiesta.

  • Convalidare content-type su richiesta Accept intestazione (Negoziazione dei Contenuti per consentire solo il formato supportato (ad es. application/xml, application/json, etc) e di rispondere con 406 Not Acceptable risposta se non abbinati.

  • Convalida content-type dei dati pubblicati, come si accetta (ad es. application/x-www-form-urlencoded, multipart/form-data, application/json, etc).

  • Convalidare l'input dell'Utente per evitare di vulnerabilità comuni (ad es.XSS, SQL-Injection, l'Esecuzione di Codice Remoto, ecc).

  • Non utilizzare dati sensibili (credenziali, Password, token di sicurezza, o di chiavi API) nell'URL, ma l'uso standard Authorization di intestazione.

  • Utilizzare un Gateway API di servizio per attivare la memorizzazione nella cache Rate Limit politiche (ad es.Quota di Spike Arresto, in concomitanza Limite di velocità) e distribuire le Api di risorse in modo dinamico.

Elaborazione

  • Controllare se tutti gli endpoint sono protetti da autenticazione per evitare rotto processo di autenticazione.

  • Proprio ID di risorsa deve essere evitato.Uso /me/ordini invece di /utente/654321/ordini.

  • Non auto-incremento Id.Utilizzare UUID.

  • Se sei il parsing di file XML, assicurarsi entità di analisi non è abilitata per evitare XX (XML entità esterna attacco).

  • Se sei il parsing di file XML, assicurarsi di espansione di entità non è abilitata per evitare di Miliardi Ride/XML bomba in via esponenziale espansione di entità attacco.

  • Utilizzare un CDN per l'upload dei file.

  • Se avete a che fare con grandi quantità di dati, utilizzare i Lavoratori e le Code di processo quanto più possibile in background e ritorno di risposta veloce per evitare HTTP Blocco.

  • Non dimenticare di accendere il DEBUG modalità OFF.

Uscita

  • Inviare X-Content-Type-Options: nosniff di intestazione.

  • Inviare X-Frame-Options: deny di intestazione.

  • Inviare Content-Security-Policy: default-src 'none' di intestazione.

  • Rimuovere impronte headers - X-Powered-By, Server, X-AspNet-Version ecc.

  • Forza content-type per la vostra risposta, se si torna application/json quindi la tua risposta content-type è application/json.

  • Non restituire i dati sensibili come le credenziali, Password, token di sicurezza.

  • Restituire il corretto codice di stato secondo l'operazione è stata completata.(ad es. 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed, etc).

Io sono un po ' sorpreso SSL con i certificati client non è stato ancora citato.Concesso, questo approccio è realmente utile solo se si può contare su una comunità di utenti individuati con i certificati.Ma un certo numero di governi/aziende fare li rilasciano ai loro utenti.L'utente non deve preoccuparsi di creare ancora un'altra combinazione nome utente/password, e l'identità è fondata su ogni connessione in modo che la comunicazione con il server può essere interamente stateless, non di sessioni utente richiesto.(Non implica che qualsiasi/tutte le altre soluzioni di cui richiedere sessioni)

Tutti in queste risposte, ha trascurato il vero controllo di accesso / autorizzazione.

Se, per esempio, Api REST / servizi web di Pubblicazione / GETing documentazione medica, si possono definire di controllo di accesso policie su chi può accedere ai dati e in quali circostanze.Per esempio:

  • i medici possono OTTENERE la cartella clinica di un paziente hanno una relazione di cura con
  • nessuno può POSTARE i dati medici al di fuori di ore di pratica (ad es.9 a 5)
  • gli utenti finali possono OTTENERE informazioni mediche di loro proprietà o cartelle cliniche dei pazienti per i quali essi sono il guardiano
  • gli infermieri possono AGGIORNARE la cartella clinica di un paziente che appartiene alla stessa unità come l'infermiera.

Al fine di definire e implementare quelle a grana fine, autorizzazioni, sarà necessario utilizzare un attributo di controllo di accesso basato su un linguaggio chiamato XACML, eXtensible di Controllo di Accesso Linguaggio di Markup.

Altri standard sono i seguenti:

  • OAuth:id.la federazione e la delega di autorizzazione ad es.lasciando un servizio atto a mio nome su un altro servizio (Facebook dei post a mio Twitter)
  • SAML:la federazione di identità / web SSO.SAML è molto su chi è l'utente.
  • WS-Security / standard WS -*:questi focus sulla comunicazione tra servizi SOAP.Sono specifiche per il livello di applicazione di messaggistica formato (SAPONE) e hanno a che fare con aspetti di messaggistica ad es.l'affidabilità, la sicurezza, la riservatezza, l'integrità, l'atomicità, la gestione degli eventi...Nessuna copertura di controllo di accesso e tutte le specifiche per SAPONE.

XACML è indipendenti dalla tecnologia.Può essere applicato per le applicazioni java, .NET, Python, Ruby...web services, REST Api, e di più.

I seguenti sono risorse interessanti:

Ho usato OAuth un paio di volte, e anche alcuni altri metodi (di BASE/DIGEST).Con tutto il cuore mi suggeriscono OAuth.Il link che segue è il miglior tutorial che ho visto su utilizzando OAuth:

http://hueniverse.com/oauth/guide/

Uno dei migliori post che abbia mai incontrato in materia di Sicurezza in relazione a RIPOSO è superiore a 1 Goccia di pioggia.Il MySpace API è possibile utilizzare OAuth anche per la sicurezza e hai pieno accesso ai loro canali personalizzati in RestChess codice, che ho fatto un sacco di esplorazione.Questa era la demo sarebbe di Mix e si può trovare la registrazione qui.

Grazie per gli ottimi consigli.Abbiamo finito per usare un custom header HTTP per passare un token di identità da parte del cliente al servizio, in preparazione per integrare le nostre API RESTful con il prossimo Zermatt Identità framework di Microsoft.Ho descritto il problema qui e la nostra soluzione qui.Ho anche preso tweakt's consulenza e comprato I Servizi Web RESTful - un libro molto bello, se si sta costruendo un RESTful API di qualsiasi tipo.

OWASP(Open Web Application Security Project) ha qualche cheat lastre copertura su tutti gli aspetti di sviluppo di Applicazioni Web.Questo è un Progetto molto valido e affidabile fonte di informazioni.Per quanto riguarda i servizi REST è possibile controllare questo: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet

Vorrei raccomandare OAuth 2/3.Potete trovare ulteriori informazioni http://oauth.net/2/

Ho cercato un sacco su riposante ws security e abbiamo anche finito con l'utilizzo di token tramite cookie dal client al server per autenticare le richieste .Ho usato la molla di sicurezza per l'autorizzazione delle richieste di servizio, perché ho dovuto autenticare e autorizzato ogni richiesta sulla base di specifici criteri di sicurezza che è già stato in DB.

Il fatto che il SAPONE mondo è abbastanza ben coperto con gli standard di sicurezza non significa che è sicuro per impostazione predefinita.In primo luogo, le norme sono molto complesso.La complessità non è un buon amico di sicurezza e di attuazione vulnerabilità Firma XML avvolgimento attacchi sono endemiche qui.

Come per l' .Ambiente di rete non mi aiuta molto, ma “La creazione di servizi web con Java” (un mattone con ~10 autori) mi ha aiutato un sacco nella comprensione WS-* architettura di sicurezza e, soprattutto, per la sua peculiarità.

RESTO di per sé non offre standard di sicurezza, ma cose come OAuth e SAML stanno rapidamente diventando le norme di questo spazio.Tuttavia, l'autenticazione e l'autorizzazione sono solo una piccola parte di ciò che è necessario considerare.Molte delle vulnerabilità note relative alle applicazioni web applicare molto di api REST.Devi considerare la validazione dell'input, sessione di cracking, inappropriato messaggi di errore, dipendente interno vulnerabilità e così via.Si tratta di un grande soggetto.

Voglio aggiungere(in linea con stinkeymatt), soluzione più semplice sarebbe quella di aggiungere i certificati SSL per il tuo sito.In altre parole, assicurarsi che l'url HTTPS://.Che coprirà la vostra sicurezza del trasporto (bang per il dollaro).Con url RESTful, la idea è di mantenere le cose semplici (a differenza di WS* sicurezza/SAML), è possibile utilizzare oAuth2/openID connect o anche Basic Auth (nei casi più semplici).Ma sarà ancora bisogno di SSL/HTTPS.Si prega di controllare ASP.NET Web API di sicurezza 2 qui: http://www.asp.net/web-api/overview/security (Articoli e Video)

Come @Nathan si è conclusa con un semplice Header HTTP, e alcuni avevano detto OAuth2 e lato client certificati SSL.L'essenza di esso è questo...il RESTO API non si dovrebbe avere per gestire la sicurezza che in realtà dovrebbe essere al di fuori dell'ambito delle API.

Invece un livello di sicurezza dovrebbe essere messo su di esso, se si tratta di un'Intestazione HTTP dietro un proxy web (un approccio comune come SiteMinder, Zermatt o anche Apache HTTPd), o complicato come OAuth 2.

La cosa fondamentale è che le richieste dovrebbe funzionare senza alcuna interazione con l'utente finale.Tutto ciò che è necessario è quello di garantire che la connessione al RESTO API è autenticato.In Java EE abbiamo la nozione di userPrincipal che possono essere ottenuti su un HttpServletRequest.È anche riuscito nel descrittore di distribuzione che un modello di URL può essere sicuro in modo che il RESTO API codice non è più necessario verificare.

In WCF mondo, vorrei utilizzare ServiceSecurityContext.Current per ottenere l'attuale contesto di sicurezza.È necessario configurare l'applicazione per richiedere l'autenticazione.

C'è una sola eccezione alla dichiarazione che ho avuto in precedenza e che l'uso di un nonce per evitare replay (che può essere attacchi o solo qualcuno di presentare due volte gli stessi dati).La parte può essere trattata solo a livello applicativo.

Per la Sicurezza delle Applicazioni Web, si dovrebbe dare un'occhiata a OWASP (https://www.owasp.org/index.php/Main_Page), che fornisce cheatsheets per i vari attacchi alla sicurezza.Si può comprendere come molte misure possibili per garantire la vostra Applicazione.Rispetto alle API di sicurezza (autorizzazione, autenticazione, gestione delle identità), ci sono diversi modi come già detto (di Base,Digerire e OAuth).Ci sono i fori del ciclo in OAuth1.0, in modo che è possibile utilizzare OAuth1.0a (OAuth2.0 non è ampiamente adottato a causa di problemi con la specifica)

È stato un po 'ma la questione è ancora rilevante, anche se la risposta potrebbe aver cambiato un po'.

Un Gateway API sarebbe un flessibile e altamente configurabile soluzione.Ho provato e usato KONG un bel po ' e piaciuto molto quello che ho visto.KONG fornisce un admin REST API che è possibile utilizzare per gestire gli utenti.

Express-gateway.io è più recente ed è anche un Gateway API.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top