REST API Security Guide

La conoscenza di come proteggere le API REST è tanto importante quanto scrivere le API stesse. Per lo più le API REST sono basate sul protocollo HTTP e qualsiasi utente con connessione Internet può accedervi, così come gli utenti cattivi. È molto importante scrivere API sicure per proteggere il business.

Prima di iniziare a proteggere le API RESTful, capiamo quali sono tutte le nostre opzioni come sviluppatori? Che cosa sarà buona misura per il nostro usecase?

Table of Contents1. Authentication vs. Authorization2. Four Ways to Secure RESTful Web Services- BASIC Authentication- DIGEST Authentication- Client CERT Authentication- OAUTH2 API Keys3. RESTful Web Services Security Implementations- Using SecurityContext- Using Annotations4. Best Practices

Differenza tra autenticazione vs. autorizzazione

Prima di saltare nella discussione principale, rendiamo i nostri fatti dritti su cosa è l’autenticazione e cosa è l’autorizzazione.

In semplice inglese, l’autenticazione è il processo di accertamento che “l’utente è davvero qualcuno che afferma di essere”. In termini tecnici, è il processo di accesso al sistema tramite nome utente/password o qualsiasi meccanismo simile, ad esempio scansione di impronte digitali, token di sicurezza, domande di sicurezza o token SAML ricevuto dal login SSO. Ci deve essere qualcosa che possa identificare l’utente dagli altri.

Una volta che l’utente è all’interno del sistema, l’autorizzazione si riferisce a regole che determinano “quale utente è autorizzato a fare” e cosa non è, ad esempio un utente normale può pubblicare un messaggio in qualsiasi gruppo pubblico, ma gli utenti solo con il ruolo di editor saranno in grado di eliminare qualcosa. L’autorizzazione è spesso vista sia come impostazione introduttiva delle autorizzazioni da parte di un amministratore di sistema che come verifica dei valori di autorizzazione già impostati quando un utente accede al sistema.

Quando proteggiamo i servizi web RESTful, dobbiamo occuparci di entrambi i fattori. I due concetti sono completamente ortogonali e indipendenti, ma entrambi sono centrali per la progettazione della sicurezza e l’incapacità di ottenere uno dei due corretti aumenta le possibilità di compromissione del sistema..

Quattro modi per proteggere i servizi Web RESTful

Esistono diversi modi per proteggere un’API RESTful in Java. Passiamo attraverso 4 scelte più popolari:

2.1. Autenticazione DI BASE

È la più semplice di tutte le tecniche e probabilmente anche la più utilizzata. Si utilizzano i moduli di login / password – è solo l’autenticazione di base. Inserisci il tuo nome utente e password e invia il modulo al server, e l’applicazione ti identifica come utente – ti è consentito utilizzare il sistema-altrimenti ottieni errori.

Il problema principale di questa implementazione di sicurezza è che le credenziali vengono propagate in modo semplice dal client al server. Le credenziali sono semplicemente codificate con Base64 in transito, ma non crittografate o hash in alcun modo. In questo modo, qualsiasi sniffer potrebbe leggere i pacchetti inviati attraverso la rete.

HTTPS è, quindi, in genere preferito o utilizzato in combinazione con l’autenticazione di base che rende la conversazione con il server web interamente crittografata. La parte migliore è che nessuno può nemmeno indovinare dall’esterno che l’autenticazione di base sta avvenendo.

2.2. DIGEST Authentication

Questo metodo di autenticazione fa uso di algoritmi di hashing per crittografare la password (chiamata password hash) inserita dall’utente prima di inviarla al server. Questo, ovviamente, lo rende molto più sicuro del metodo di autenticazione di base, in cui la password dell’utente viaggia in testo semplice che può essere facilmente letta da chiunque la intercetti.

Per saperne di più: Generare password crittografate

Ci sono molti algoritmi di hashing in java anche, che può rivelarsi davvero efficace per la sicurezza delle password come MD5, SHA, BCrypt, SCrypt e PBKDF2WithHmacSHA1 algoritmi.

Si ricorda che una volta che questo hash della password viene generato e memorizzato nel database, non è possibile convertirlo di nuovo alla password originale. Ogni volta che l’utente accede all’applicazione, è necessario rigenerare nuovamente l’hash della password e abbinarlo all’hash memorizzato nel database. Quindi, se l’utente ha dimenticato la sua password, dovrai inviargli una password temporanea e chiedergli di cambiarla con la sua nuova password. Beh, e ‘ una tendenza comune ora al giorno.

2.3. Autenticazione client CERT

Si tratta di un meccanismo in cui viene stabilito un accordo di fiducia tra il server e il client tramite certificati. Devono essere firmati da un’agenzia istituita per garantire che il certificato presentato per l’autenticazione sia legittimo, che è noto come CA.

Utilizzando questa tecnica, quando il client tenta di accedere a una risorsa protetta, invece di fornire un nome utente o una password, presenta il certificato al server. Il certificato contiene le informazioni utente per l’autenticazione, incluse le credenziali di sicurezza, oltre a una coppia di chiavi privata-pubblica univoca. Il server determina quindi se l’utente è legittimo tramite la CA. Inoltre, deve verificare se l’utente ha accesso alla risorsa. Questo meccanismo deve utilizzare HTTPS come protocollo di comunicazione in quanto non abbiamo un canale sicuro per impedire a chiunque di rubare l’identità del cliente.

Puoi trovare un tutorial completo per la generazione di certificati di sicurezza nei documenti ufficiali oracle.

2.4. OAUTH2 API Keys

Se hai mai sviluppato applicazioni che interagiscono con altre applicazioni su cloud, ad esempio l’integrazione di Facebook o l’autenticazione di Twitter, ecc. allora hai già usato questo. Richiedono di fornire la chiave API e il segreto API per identificarti correttamente. Queste API key e secret sono una stringa codificata a caso che è impossibile indovinare.

Per capire come funziona, supponiamo che tu stia usando un Flickr (photo sharing application) e desideri pubblicare alcune delle tue foto usando la sua API REST. Costruisci la richiesta come documentato nei documenti di Flickr, quindi inviala.

Quindi, quando si riceve la richiesta, Flickr autentica l’utente leggendo le informazioni dalla chiave API con la chiave segreta che appartiene all’utente. Una volta che queste convalide hanno esito positivo, il server fornisce la risposta al client. Così, otteniamo una risposta con tutte le foto che sono state recentemente pubblicate all’interno di Flickr.

Come si noterà, in questo modo, è possibile creare facilmente applicazioni utilizzando l’API del provider. Inoltre, il provider ti consentirà di autenticare, accedere alle informazioni pubbliche.

Se qualcuno inizia a mancare di rispetto agli accordi, ad esempio inviando traffico indesiderato o qualsiasi violazione delle norme, il provider ritira la chiave API e impedisce l’uso abusivo delle sue API.

Implementazioni di sicurezza API REST

Oltre ai concetti di cui sopra, di solito è necessario proteggere le API RESTful nella propria azienda utilizzando i metodi seguenti.

3.1. JAX-RS SecurityContext instance

L’interfaccia javax.ws.rs.core.SecurityContextfornisce l’accesso alle informazioni relative alla sicurezza per una richiesta ed è molto simile a javax.servlet.http.HttpServletRequest.

Si accede a SecurityContext iniettando un’istanza in un campo di classe, metodo setter o parametro del metodo utilizzando l’annotazione javax.ws.rs.core.Context, ad esempio nel seguente codice sc.isUserInRole() viene utilizzato per verificare l’autorizzazione per l’utente.

3.2. Annotazioni JAR-RS per autorizzazione a livello di metodo

Questa tecnica è ampiamente utilizzata nelle applicazioni aziendali e utilizzata per verificare i ruoli e le responsabilità di un usato autenticato per qualsiasi determinata operazione. JAX-RS fornisce sotto annotazioni per questo scopo.

  • @PermitAll
  • @DenyAll
  • @RolesAllowed

Un esempio di utilizzo dell’annotazione può essere:

Leggi di più : Esempio di autenticazione e autorizzazione JAX-RS

REST API Security Best practice

Prendiamo nota di alcuni punti importanti durante la progettazione della sicurezza per i servizi web RESTful.

  1. Usa solo il protocollo HTTPS in modo che l’intera comunicazione sia sempre crittografata.
  2. Non inviare mai credenziali di autenticazione o chiavi API come parametro di query. Essi appaiono in URL e possono essere registrati o monitorati facilmente.
  3. Usa sempre il livello di crittografia più difficile. Aiuterà ad avere più fiducia.
  4. Per le risorse esposte dai servizi Web RESTful, è importante assicurarsi che qualsiasi richiesta PUT, POST e DELETE sia protetta dalla contraffazione di richieste cross Site.
  5. Convalidare sempre i dati di input al più presto ricevuti nel metodo server. Utilizzare solo dati primitivi come parametro di input il più possibile.
  6. Si basano sulle funzionalità di convalida fornite dal framework in quanto sono già testate da una grande comunità.

Fammi sapere i tuoi pensieri ed esperienze su come proteggere i servizi web RESTful nella tua organizzazione.

Buon apprendimento !!

Questo post è stato utile?

Fateci sapere se ti è piaciuto il post. E ‘ l’unico modo per migliorare.
No

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

More: