Segurança do servidor Parse
Olá a todos, neste artigo vou falar sobre segurança ao usar o Parse Server no Back4App. Como segurança não é um tópico que deixa os desenvolvedores felizes, serei muito conciso e direto. Minha intenção aqui é fornecer uma lista de verificação de segurança rápida para revisar seu aplicativo antes de torná-lo um aplicativo de produção.
Contents
- 1 Mecanismo de segurança de Parse
- 2 Lista de verificação do aplicativo de segurança
- 2.1 1-Mantenha a chave mestra segura
- 2.2 2-Desmarcar a criação de classes de clientes
- 2.3 3 – Crie uma estrutura de funções
- 2.4 4-Configurar o CLP para usuários e funções
- 2.5 5 – Tornar as classes fixas somente leitura
- 2.6 6 – Recomendações gerais sobre CLP e ACL
- 2.7 7 – Defina a duração de sua sessão (apenas alguns casos)
- 2.8 8-Use Https e SSL
- 3 Palavras finais
Mecanismo de segurança de Parse
Para configurar corretamente o acesso de segurança adequado ao seu aplicativo, você deve primeiro entender alguns conceitos dos mecanismos básicos de segurança do Parse, as classes padrão do Parse e os mecanismos de autenticação.
1-Parse classes padrão
Por padrão, o Parse cria 3 classes: Usuários, Funções e Sessões. Essas classes são totalmente integradas a todo o backend e também facilitarão sua vida ao configurar os mecanismos de autenticação para proteger seu aplicativo.
Usuário
O Parse fornece uma classe de usuário especializada chamada Parse.User
que lida automaticamente com grande parte da funcionalidade necessária para o gerenciamento de contas de usuário.
A classe Parse.User
é protegida por padrão. Os dados armazenados em um Parse.User
só podem ser modificados por esse usuário. Por padrão, os dados ainda podem ser lidos por qualquer cliente. Assim, alguns objetos Parse.User
são autenticados e podem ser modificados, enquanto outros são somente leitura.
Funções
A função é uma classe na qual você pode associar usuários e outras funções a uma nova função. Depois de criar uma função, você pode usá-la para definir o que essa função acessará em seu aplicativo usando CLPs e ACLs.
Sessão
Ao fazer o login de um usuário por meio de um método de login de usuário
, o Parse criará automaticamente um novo objeto Session
irrestrito no Parse Server. O mesmo vale para registros e logins no Facebook/Twitter.
Mecanismo de autenticação 2-Parse
Ao falar sobre acesso a dados no Parse, você pode controlar a segurança do aplicativo em dois níveis diferentes:
- Classe/tabela – Use CLPs (permissões de nível de classe) para restringir a criação de novas colunas e o acesso geral aos dados para toda a classe;
- Objeto – Use ACL (Access Control Lists) para controlar o acesso a um objeto específico;
Permissões de nível de classe – CLPs
As permissões de nível de classe são um mecanismo que controla o acesso de uma classe e de todos os seus objetos. Usando CLPs, você pode configurar o acesso de leitura/gravação a uma função, a um usuário ou a um ponteiro.
Com esse mecanismo, você pode restringir o acesso às seguintes operações:
- Ler
- Get – Obtém informações de objetos para um determinado ObjectId;
- Find – Consulta a todos os objetos dessa classe (o ObjectID não é necessário);
- Count – Número total de objetos da classe;
- Escrever
- Create – Criar novos objetos;
- Update – Atualizar objeto existente;
- Delete – Excluir objeto existente;
- Adicionar
- Add Field (Adicionar campo) – Cria novas colunas nesta classe;
Para acessar essas opções de configuração, vá até o pequeno ícone de escudo no menu rápido no canto superior direito.
Depois de clicar no ícone do escudo, você verá o menu simples apenas com opções de leitura/gravação disponíveis. Clique no ícone superior direito da janela para acessar Advanced CLPs Configuration.
Em seguida, você verá a janela de configuração completa do CLP.
Listas de controle de acesso – ACLs
As listas de controle de acesso permitem controlar o acesso a cada objeto de uma determinada classe de forma diferente. É possível criar uma ACL para um objeto e configurar o acesso (leitura/gravação) para cada função ou usuário.
O Parse sempre exige uma ACL para criar qualquer função. Portanto, para criar a primeira função, você precisará de um usuário. Vamos criar um usuário root para criar as primeiras funções em nosso aplicativo. Esse usuário será o único que poderá editar essas funções.
Primeiro, podemos criar o usuário root preenchendo apenas o nome de usuário e uma senha na tabela User.
Em seguida, copie o ObjectId do usuário raiz e vá para a classe de função. Crie uma nova função e clique duas vezes no campo ACL para criar a ACL. Nesse caso, vou permitir que o usuário root leia/grave essa ACL, portanto, vamos preencher a ACL com o ObjectID do usuário root e salvá-la.
Após essa etapa, vamos dar a essa função o nome Admin e associar os usuários Alex e Alysson. Como a classe Role tem uma relação com a classe User, você pode clicar em overview relation (visão geral da relação) e adicionar os ObjectIDs do usuário que deseja adicionar a essa relação.
Agora você tem uma função de administrador com 2 usuários que podem ser usados para compor novas funções, atribuir novas ACLs ou CLPs.
Lista de verificação do aplicativo de segurança
Agora que você já conhece os principais conceitos de segurança do Parse, gostaria de sugerir alguns conselhos para tornar seu aplicativo mais seguro.
1-Mantenha a chave mestra segura
A chave mestra é o mecanismo do Parse para contornar todas as outras camadas de segurança. Uma boa comparação é que ter a chave mestra de um aplicativo é como ter o acesso à raiz de um servidor.
É por isso que você deve proteger essa chave e, quando necessário, usá-la somente por meio do código de nuvem. Evite usá-la em seu código de front-end, pois alguém pode descompilar ou, no caso do JS, simplesmente clicar em visualizar código-fonte e copiar sua chave.
Outra recomendação é que, ao usar essa chave em um código de nuvem, certifique-se de que você não irá enviar a chave (que faz parte do seu código de nuvem) para nenhum repositório de código público.
2-Desmarcar a criação de classes de clientes
Quando você cria um novo aplicativo no Back4App, a Parse Key allowClientClassCreation é ativada. Isso significa que qualquer pessoa com o AppID e a Client Key pode criar novas classes em seu banco de dados.
Você pode alterar essa configuração no Back4App na opção de menu Server Settings->Core Settings->Settings.
Basta rolar a tela para baixo e desmarcar a opção “Allow Client Class Creation” (Permitir a criação de classes de clientes), conforme mostrado abaixo.
A recomendação aqui é manter essa opção ativada enquanto você desenvolve o aplicativo e, quando terminar, removê-la.
3 – Crie uma estrutura de funções
Como começamos na seção ACL, você pode continuar e criar uma estrutura de função para controlar melhor o acesso a todas as classes e objetos do seu aplicativo. Digamos que você esteja criando um aplicativo Uber-Clone e tenha 3 acessos principais: Administrador, Passageiros, Motoristas.
4-Configurar o CLP para usuários e funções
Como User é uma classe padrão do Parse, qualquer pessoa com o nome da classe, a chave da API REST e o ID do aplicativo pode solicitar toda a sua lista de usuários com um único comando curl:
curl -X GET -H "X-Parse-Application-Id: FyebII2zNpA2i9DdZ8froWna9vIvJMcgjfmjS0iK" -H "X-Parse-REST-API-Key: hluEgfZ084RdR0MyyE8Y9v4RwsOsTIWlJeCc4qGw" https://parseapi.back4app.com/users
E recupere a lista de usuários:
Você pode evitar isso criando um CLP e limitando o poder de quem pode ler/gravar sua tabela de usuários (também é possível fazer proteção usando ACLs). Nesse caso, permitirei que somente os usuários administradores leiam a lista completa de usuários.
Você pode fazer um processo semelhante ao da classe de função e remover o acesso de funções/usuários que não precisarão ler a classe completa.
A classe Session é protegida por padrão porque todos os objetos Session
têm uma ACL criada automaticamente que é lida e gravada somente por esse usuário.
5 – Tornar as classes fixas somente leitura
Se você tiver tabelas/classes que deseja alterar somente por meio do Parse Dashboard, poderá torná-las somente leitura usando o CLP. No meu caso, criei uma classe que define a cidade onde meu aplicativo Uber-Clone-App vai operar.
Quero alterar essa classe somente por meio do Parse Dashboard, portanto, removerei os direitos de acesso de gravação de todas as outras funções.
6 – Recomendações gerais sobre CLP e ACL
A maioria das classes em seu aplicativo se enquadrará em uma das duas categorias fáceis de proteger. Para dados totalmente públicos, você pode usar permissões em nível de classe para bloquear a tabela e torná-la publicamente legível e gravável por ninguém. Para dados totalmente privados, você pode usar ACLs para garantir que somente o usuário que possui os dados possa lê-los.
Mas, ocasionalmente, você se deparará com situações em que não deseja que os dados sejam totalmente públicos ou totalmente privados. Por exemplo, você pode ter um aplicativo social em que os dados de um usuário só podem ser lidos por amigos aprovados por ele. Para isso, você precisará de uma combinação das técnicas discutidas neste guia para habilitar exatamente as regras de compartilhamento que deseja.
Para obter mais detalhes, assista a este vídeo sobre Como criar ACL.
7 – Defina a duração de sua sessão (apenas alguns casos)
Se você estiver desenvolvendo um aplicativo que envolva informações muito confidenciais (aplicativo bancário, aplicativo de assistência médica), talvez seja necessário fazer o logout dos usuários após um curto período de tempo.
Para limitar a duração da sessão, vá para Server Settings->Custom App Settings.
Na caixa de texto Custom Parse Options (Opções de análise personalizadas), defina a duração da sessão em segundos. No caso abaixo, estou definindo uma sessão de 10 minutos. Em seguida, clique em Save (Salvar).
8-Use Https e SSL
Https é um protocolo seguro para a transferência de informações do navegador do cliente para o servidor. Ele é necessário para evitar que hackers acessem informações confidenciais com ataques como o MITM.
A recomendação aqui é usar Https sobre Http para fazer conexões com o Parse Server. Abaixo está um exemplo usando uma conexão JS com o Parse que mostra como usar o https corretamente para estabelecer uma conexão ativa. Observe que a maneira errada seria usar http:// em vez de https://.
Parse.initialize("APP_ID", "JS_KEY"); Parse.serverURL = 'https://parseapi.back4app.com/'
Se você estiver usando o Back4App Webhosting, é importante observar que o Back4App já fornece uma conexão https por padrão (você deve usar https:// em suas chamadas!).
Mas se você quiser usar seu próprio nome de domínio e redirecionar para os servidores da Back4App, certifique-se de que seu certificado SSL seja válido e esteja instalado corretamente e que você esteja fazendo os redirecionamentos para a Back4App usando https.
Palavras finais
O Back4App e o Parse oferecem várias maneiras de proteger os dados na nuvem. À medida que você cria seu aplicativo e avalia os tipos de dados que armazenará, pode tomar a decisão sobre qual implementação escolher.
Esperamos que você use essas ferramentas para fazer tudo o que puder para manter os dados do seu aplicativo e os dados dos seus usuários seguros. Juntos, podemos tornar a Web um lugar mais seguro.