Sicurezza del server Parse

Salve a tutti, in questo articolo parlerò della sicurezza nell’utilizzo di Parse Server su Back4App. Poiché la sicurezza non è un argomento che rende felici gli sviluppatori, sarò molto conciso e diretto. Il mio intento è quello di fornire una rapida checklist di sicurezza per esaminare la vostra applicazione prima di renderla un’applicazione di produzione.

Meccanismo di sicurezza del parse

Per configurare adeguatamente l’accesso di sicurezza alla propria applicazione, occorre innanzitutto comprendere alcuni meccanismi di sicurezza di base di Parse, i concetti di classi predefinite di Parse e i meccanismi di autorizzazione.

1-Parse le classi predefinite

Parse crea per impostazione predefinita 3 classi: Utenti, Ruoli e Sessioni. Queste classi sono completamente integrate con l’intero backend e vi faciliteranno la vita quando configurerete i meccanismi di autenticazione per proteggere la vostra applicazione.

Utente

Parse fornisce una classe utente specializzata, chiamata Parse.User, che gestisce automaticamente gran parte delle funzionalità richieste per la gestione degli account utente.

La classe Parse.User è protetta per impostazione predefinita. I dati memorizzati in un Parse.User possono essere modificati solo da quell’utente. Per impostazione predefinita, i dati possono essere letti da qualsiasi client. Pertanto, alcuni oggetti Parse.User sono autenticati e possono essere modificati, mentre altri sono di sola lettura.

Ruoli

Il ruolo è una classe che consente di associare utenti e altri ruoli a un nuovo ruolo. Una volta creato un ruolo, è possibile utilizzarlo per definire l’accesso di quel ruolo all’interno dell’applicazione, utilizzando CLP e ACL.

Sessione

Quando si accede a un utente tramite un metodo di login User, Parse crea automaticamente un nuovo oggetto Session senza restrizioni nel server Parse. Lo stesso vale per le iscrizioni e i login a Facebook/Twitter.

Meccanismo di autorizzazione 2-Parse

Quando si parla di accesso ai dati su Parse, è possibile controllare la sicurezza dell’applicazione a due livelli diversi:

  1. Classe/Tabella – Utilizzare le CLP (autorizzazioni a livello di classe) per limitare la creazione di nuove colonne e l’accesso generale ai dati per l’intera classe;
  2. Oggetto: utilizzare le ACL (Access Control List) per controllare l’accesso a un oggetto specifico;

Permessi a livello di classe – CLP

I permessi a livello di classe sono un meccanismo che controlla l’accesso di una classe e di tutti i suoi oggetti. Utilizzando le CLP è possibile configurare l’accesso in lettura/scrittura a un ruolo, a un utente o a un puntatore.

Con questo meccanismo è possibile limitare l’accesso alle seguenti operazioni:

  • Leggere
    • Get – Recupera le informazioni sugli oggetti per un determinato ObjectId;
    • Find – Interrogare tutti gli oggetti di questa classe (l’ObjectID non è necessario);
    • Count – Numero totale di oggetti della classe;
  • Scrivere
    • Create – Crea nuovi oggetti;
    • Update – Aggiorna l’oggetto esistente;
    • Delete – Cancella l’oggetto esistente;
  • Aggiungi
    • Aggiungi campo – Crea nuove colonne in questa classe;

Per accedere a queste opzioni di configurazione si deve andare sulla piccola icona a forma di scudo nel menu rapido in alto a destra.

Dopo aver fatto clic sull’icona dello scudo, verrà visualizzato il semplice menu con le opzioni di lettura/scrittura disponibili. Fare clic sull’icona in alto a destra della finestra per accedere a Configurazione avanzata dei CLP.

A questo punto viene visualizzata la finestra di configurazione completa del CLP.

Elenchi di controllo degli accessi – ACL

Le liste di controllo degli accessi consentono di controllare l’accesso a ciascun oggetto di una determinata Classe in modo diverso. È possibile creare una ACL per un oggetto e configurare l’accesso (lettura/scrittura) per ogni ruolo o utente.

Parse richiede sempre una ACL per creare qualsiasi ruolo. Quindi, per creare il primo ruolo è necessario un utente. Creiamo un utente root per creare i primi ruoli nella nostra applicazione. Questo utente sarà l’unico a poter modificare i ruoli.

Per prima cosa, possiamo creare l’utente root riempiendo solo il nome utente e la password nella tabella Utenti.

Quindi copiare l’ObjectId dell’utente principale e andare alla Classe di ruolo. Creare un nuovo ruolo e fare doppio clic sul campo ACL per creare l’ACL. In questo caso, consentirò all’utente root di leggere/scrivere questa ACL, quindi riempiamo l’ACL con l’ObjectID dell’utente root e salviamo.

Dopo questo passaggio, diamo a questo ruolo il nome Admin e associamo gli utenti Alex e Alysson. Poiché la classe Ruolo ha una relazione con la classe Utente, è possibile fare clic su Panoramica relazione e aggiungere gli ID oggetto dell’utente che si desidera aggiungere a questa relazione.

Fare clic su Visualizza relazione
Compilare lelenco degli ID oggetto utente separati da virgola
Controllare il risultato finale

Ora avete un Role Admin con 2 utenti che potete usare per comporre nuovi Ruoli, per attribuire nuove ACL o CLP.

Lista di controllo delle app di sicurezza

Ora che conoscete i principali concetti di sicurezza di Parse, vorrei suggerirvi alcuni consigli per rendere più sicura la vostra applicazione.

1-Conservare la chiave principale al sicuro

La Master Key è il meccanismo di Parse per aggirare tutti gli altri livelli di sicurezza. Un buon paragone è che avere la Master Key per un’applicazione è come avere l’accesso root di un server.

Per questo motivo è necessario proteggere questa chiave e, quando necessario, utilizzarla solo tramite il codice cloud. Si dovrebbe evitare di usarla nel codice front-end, perché qualcuno potrebbe decompilare o, nel caso di JS, fare semplicemente clic su view source e copiare la chiave.

Un altro consiglio: quando si utilizza questa chiave in un codice cloud, assicurarsi di non eseguire il commit della chiave (che fa parte del codice cloud) in un repository di codice pubblico.

2-Disattivare la creazione della classe client

Quando si crea una nuova App su Back4App, la Parse Key allowClientClassCreation è abilitata. Ciò significa che chiunque abbia l’AppID e la Client Key può creare nuove classi nel database.

È possibile modificare questa configurazione su Back4App in Impostazioni del server->Impostazioni principali->Impostazioni del menu.

Basta scorrere verso il basso e deselezionare l’opzione “Allow Client Class Creation” (Consenti la creazione di classi client), come mostrato di seguito.

Si consiglia di mantenere questa opzione attiva durante lo sviluppo dell’applicazione e di rimuoverla una volta terminato.

3-Creare una struttura di ruoli

Come abbiamo iniziato nella sezione ACL, si può continuare a costruire una struttura di ruoli per controllare meglio l’accesso a tutte le classi e gli oggetti dell’applicazione. Supponiamo di costruire un’applicazione Uber-Clone e di avere tre accessi principali: Admin, Passeggeri, Autisti.

4-Configurare il CLP per gli utenti e i ruoli

Poiché User è una classe di Parse predefinita, chiunque abbia il nome della classe, la chiave API REST e l’ID dell’app può richiedere tutto l’elenco degli utenti con un singolo comando curl:

curl -X GET -H "X-Parse-Application-Id: FyebII2zNpA2i9DdZ8froWna9vIvJMcgjfmjS0iK" -H "X-Parse-REST-API-Key: hluEgfZ084RdR0MyyE8Y9v4RwsOsTIWlJeCc4qGw" https://parseapi.back4app.com/users

E recuperare l’elenco degli utenti:

È possibile evitarlo creando un CLP e limitando il potere di chi può leggere/scrivere la tabella degli utenti (è anche possibile creare una protezione utilizzando le ACL). In questo caso, consentirò solo agli utenti amministratori di leggere l’elenco completo degli utenti.

È possibile eseguire un processo simile alla classe di ruolo e rimuovere l’accesso dai ruoli/utenti che non hanno bisogno di leggere la classe completa.

La classe Session è protetta per impostazione predefinita, in quanto tutti gli oggetti Session sono dotati di una ACL creata automaticamente, che può essere letta e scritta solo da quell’utente.

5-Mettere le classi fisse in sola lettura

Se si dispone di tabelle/classi che si desidera modificare solo tramite Parse Dashboard, è possibile renderle di sola lettura utilizzando il CLP. Nel mio caso, ho costruito una classe che definisce la città in cui opererà la mia applicazione Uber-Clone.

Voglio modificare questa classe solo tramite Parse Dashboard, quindi rimuoverò i diritti di accesso in scrittura da tutti gli altri ruoli.

6-Consigli generali su CLP e ACL

La maggior parte delle classi dell’applicazione rientra in un paio di categorie facili da proteggere. Per i dati completamente pubblici, si possono usare i permessi a livello di classe per bloccare la tabella e renderla pubblicamente leggibile e scrivibile da nessuno. Per i dati completamente privati, si possono usare le ACL per assicurarsi che solo l’utente che possiede i dati possa leggerli.

A volte, però, ci si trova in situazioni in cui non si vogliono dati completamente pubblici o completamente privati. Ad esempio, si potrebbe avere un’applicazione sociale, in cui i dati di un utente dovrebbero essere leggibili solo dagli amici che hanno approvato. In questo caso, è necessaria una combinazione delle tecniche descritte in questa guida, per poter applicare esattamente le regole di condivisione desiderate.

Per maggiori dettagli, vedere questo video su Come creare una ACL.

7-Impostare la durata della sessione (solo alcuni casi)

Se si sta sviluppando un’applicazione che coinvolge informazioni molto sensibili (applicazione bancaria, applicazione sanitaria) e potrebbe essere necessario disconnettere gli utenti dopo un breve periodo di tempo.

Per limitare la durata della sessione, accedere a Impostazioni server->Impostazioni app personalizzate.

Nella casella di testo Opzioni di Parse personalizzate definire la durata della sessione in secondi. Nel caso seguente, definisco una sessione di 10 minuti. Quindi fare clic su Salva.

8-Utilizzare Https e SSL

Https è un protocollo sicuro per il trasferimento di informazioni dal browser del cliente al vostro server. È necessario per impedire agli hacker di accedere a informazioni sensibili con attacchi come il MITM.

Il consiglio è di usare Https su Http per stabilire connessioni con il server Parse. Di seguito è riportato un esempio che utilizza una connessione JS con Parse e che mostra come utilizzare correttamente https per stabilire una connessione attiva. Si noti che il modo sbagliato sarebbe quello di usare http:// invece di https://.

Parse.initialize("APP_ID", "JS_KEY");
Parse.serverURL = 'https://parseapi.back4app.com/'

Se si utilizza il Webhosting Back4App è importante notare che Back4App fornisce già una connessione https di default (è necessario utilizzare https:// nelle chiamate!).

Ma se volete usare il vostro nome di dominio e fare un reindirizzamento ai server di Back4App, assicuratevi che il vostro certificato SSL sia valido e correttamente installato e che facciate i reindirizzamenti a Back4App usando https.

Parole finali

Back4App e Parse offrono diversi modi per proteggere i dati nel cloud. Man mano che costruite la vostra applicazione e valutate i tipi di dati che intendete archiviare, potete decidere quale implementazione scegliere.

Ci auguriamo che utilizziate questi strumenti per fare tutto il possibile per mantenere sicuri i dati della vostra App e quelli dei vostri utenti. Insieme, possiamo rendere il web un luogo più sicuro.


Leave a reply

Your email address will not be published.