Introdução
O Redis é um armazenamento de chave-valor em memória conhecido por sua flexibilidade, desempenho e amplo suporte a idiomas. Este tutorial demonstra como instalar, configurar e proteger o Redis em um servidor Ubuntu 22.04.
Pré-requisitos
Para concluir este guia, você precisará de acesso a um servidor Ubuntu 22.04 que tenha um usuário não-root com privilégios de sudo
e um firewall configurado com ufw
. Você pode configurar isso seguindo nosso Guia de Configuração Inicial do Servidor para Ubuntu 22.04.
Passo 1 — Instalando e Configurando o Redis
Vamos usar o gerenciador de pacotes APT para instalar o Redis a partir dos repositórios oficiais do Ubuntu. Até o momento desta escrita, a versão disponível nos repositórios padrão é 6.0.16.
Comece atualizando o cache de pacotes local do apt
:
Em seguida, instale o Redis digitando:
Isso irá baixar e instalar o Redis e suas dependências. Após isso, há uma importante mudança de configuração a ser feita no arquivo de configuração do Redis, que foi gerado automaticamente durante a instalação.
Abra este arquivo com o seu editor de texto preferido:
No arquivo, encontre a diretiva supervised
. Esta diretiva permite que você declare um sistema init para gerenciar o Redis como um serviço, fornecendo mais controle sobre sua operação. A diretiva supervised
é definida como no
por padrão. Como você está executando o Ubuntu, que usa o sistema init systemd, altere isso para systemd
:
. . .
# Se você executa o Redis a partir do upstart ou systemd, o Redis pode interagir com sua
# árvore de supervisão. Opções:
# supervised no - sem interação de supervisão
# supervised upstart - sinalize o upstart colocando o Redis no modo SIGSTOP
# supervised systemd - sinalize o systemd escrevendo READY=1 em $NOTIFY_SOCKET
# supervised auto - detecte o método upstart ou systemd com base em
# UPSTART_JOB ou variáveis de ambiente NOTIFY_SOCKET
# Nota: esses métodos de supervisão apenas sinalizam "o processo está pronto."
# Eles não habilitam pings contínuos de vitalidade de volta para o seu supervisor.
supervised systemd
. . .
Essa é a única alteração que você precisa fazer no arquivo de configuração do Redis neste momento, então salve e feche-o quando terminar. Se você usou nano
para editar o arquivo, faça isso pressionando CTRL + X
, Y
, depois ENTER
.
Em seguida, reinicie o serviço do Redis para refletir as alterações feitas no arquivo de configuração:
Com isso, você instalou e configurou o Redis e ele está em execução em sua máquina. Antes de começar a usá-lo, no entanto, é prudente verificar primeiro se o Redis está funcionando corretamente.
Passo 2 — Testando o Redis
Assim como com qualquer software recém-instalado, é uma boa ideia garantir que o Redis esteja funcionando conforme o esperado antes de fazer mais alterações em sua configuração. Neste passo, vamos cobrir algumas maneiras de verificar se o Redis está funcionando corretamente.
Comece verificando se o serviço do Redis está em execução:
Se estiver em execução sem erros, este comando produzirá uma saída semelhante à seguinte:
Output● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-04-20 20:40:52 UTC; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 2899 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 2327)
Memory: 2.5M
CPU: 65ms
CGroup: /system.slice/redis-server.service
└─2899 "/usr/bin/redis-server 127.0.0.1:6379
. . .
Essa saída indica que o Redis está em execução e já está habilitado, o que significa que está configurado para iniciar toda vez que o servidor é inicializado.
Observação: Essa configuração é desejável para muitos casos de uso comuns do Redis. No entanto, se preferir iniciar o Redis manualmente toda vez que o servidor for inicializado, você pode configurar isso com o seguinte comando:
Para testar se o Redis está funcionando corretamente, conecte-se ao servidor usando o redis-cli
, o cliente de linha de comando do Redis:
Na linha de comando que segue, teste a conectividade com o comando ping
:
OutputPONG
Esta saída confirma que a conexão com o servidor está ativa. Em seguida, verifique se você consegue definir chaves executando:
OutputOK
Recupere o valor digitando:
Supondo que tudo esteja funcionando, você será capaz de recuperar o valor que armazenou:
Output"It's working!"
Após confirmar que pode buscar o valor, saia do prompt do Redis para voltar ao shell:
Como teste final, verificaremos se o Redis é capaz de persistir dados mesmo depois de ser interrompido ou reiniciado. Para fazer isso, primeiro reinicie a instância do Redis:
Em seguida, conecte-se novamente com o cliente de linha de comando:
E confirme se o valor de teste ainda está disponível:
O valor da sua chave ainda deve ser acessível:
Output"It's working!"
Saia novamente para o shell quando terminar:
Com isso, sua instalação do Redis está totalmente operacional e pronta para uso. No entanto, algumas das configurações padrão são inseguras e oferecem oportunidades para ataques de atores maliciosos e acesso ao seu servidor e seus dados. Os próximos passos neste tutorial cobrem métodos para mitigar essas vulnerabilidades, conforme prescrito pelo site oficial do Redis. Embora essas etapas sejam opcionais e o Redis ainda funcione se você optar por não segui-las, é altamente recomendável que você as conclua para fortalecer a segurança do seu sistema.
Passo 3 — Vinculando ao localhost
Por padrão, o Redis só é acessível a partir do localhost. No entanto, se você instalou e configurou o Redis seguindo um tutorial diferente deste, você pode ter atualizado o arquivo de configuração para permitir conexões de qualquer lugar. Isso não é tão seguro quanto vincular ao localhost.
Para corrigir isso, abra o arquivo de configuração do Redis para edição:
Localize esta linha e certifique-se de que ela está descomentada (remova o #
se existir):
. . .
bind 127.0.0.1 ::1
. . .
Salve e feche o arquivo quando terminar (pressione CTRL + X
, Y
, depois ENTER
).
Em seguida, reinicie o serviço para garantir que o systemd leia suas alterações:
Para verificar se essa alteração entrou em vigor, execute o seguinte comando netstat
:
Outputtcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server
tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server
Nota: O comando netstat
pode não estar disponível em seu sistema por padrão. Se este for o caso, você pode instalá-lo (juntamente com uma série de outras ferramentas úteis de rede) com o seguinte comando:
Esta saída mostra que o programa redis-server
está vinculado ao localhost (127.0.0.1
), refletindo a alteração que você acabou de fazer no arquivo de configuração. Se houver outro endereço IP nesta coluna (0.0.0.0
, por exemplo), você deve verificar novamente se descomentou a linha correta e reiniciar o serviço do Redis novamente.
Agora que sua instalação do Redis está apenas ouvindo em localhost, será mais difícil para atores maliciosos fazerem solicitações ou ganharem acesso ao seu servidor. No entanto, o Redis atualmente não está configurado para exigir que os usuários se autentiquem antes de fazerem alterações em sua configuração ou nos dados que ele armazena. Para remediar isso, o Redis permite que você exija que os usuários se autentiquem com uma senha antes de fazerem alterações via cliente Redis (redis-cli
).
Passo 4 — Configurando uma Senha para o Redis
Configurar uma senha para o Redis habilita uma de suas duas características de segurança integradas — o comando auth
, que exige que os clientes se autentiquem para acessar o banco de dados. A senha é configurada diretamente no arquivo de configuração do Redis, /etc/redis/redis.conf
, então abra esse arquivo novamente com o seu editor preferido:
Role até a seção SECURITY
e encontre uma diretiva comentada que diz:
. . .
# requirepass foobared
. . .
Descomente-a removendo o #
, e mude foobared
para uma senha segura.
Observação: Acima da diretiva requirepass
no arquivo redis.conf
, há um aviso comentado:
. . .
# Aviso: como o Redis é bastante rápido, um usuário externo pode tentar até
# 150 mil senhas por segundo em um bom sistema. Isso significa que você deve
# usar uma senha muito forte, caso contrário será muito fácil de quebrar.
#
. . .
Portanto, é importante que você especifique um valor muito forte e muito longo como sua senha. Em vez de criar uma senha você mesmo, você pode usar o comando openssl
para gerar uma aleatória, como no exemplo a seguir. Ao encaminhar a saída do primeiro comando para o segundo comando openssl
, conforme mostrado aqui, ele removerá quebras de linha produzidas pelo primeiro comando:
Este comando retornará uma saída como esta:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Após copiar e colar a saída desse comando como o novo valor para requirepass
, ele deverá ficar assim:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Depois de definir a senha, salve e feche o arquivo. Em seguida, reinicie o Redis:
Para testar se a senha funciona, abra o cliente Redis:
A seguir, é mostrada uma sequência de comandos usados para testar se a senha do Redis funciona. O primeiro comando tenta definir uma chave com um valor antes da autenticação:
Isso não funcionará porque você não se autenticou, então o Redis retorna um erro:
Output(error) NOAUTH Authentication required.
O próximo comando autentica com a senha especificada no arquivo de configuração do Redis:
O Redis confirma:
OutputOK
Depois disso, executar novamente o comando anterior terá sucesso:
OutputOK
get key1
consulta o Redis para o valor da nova chave.
Output"10"
Depois de confirmar que consegue executar comandos no cliente Redis após autenticar, pode sair do redis-cli
:
Em seguida, vamos revisar a renomeação de comandos do Redis que, se inseridos por engano ou por um agente malicioso, podem ter sérias consequências para os seus dados.
Passo 5 — Renomeando Comandos Perigosos
O outro recurso de segurança integrado ao Redis envolve renomear ou desativar completamente certos comandos considerados perigosos.
Quando executados por usuários não autorizados, tais comandos podem ser usados para reconfigurar, destruir ou, de outra forma, apagar seus dados. Assim como a senha de autenticação, a renomeação ou desativação de comandos é configurada na mesma seção SECURITY
do arquivo /etc/redis/redis.conf
.
Alguns dos comandos considerados perigosos incluem: FLUSHDB
, FLUSHALL
, KEYS
, PEXPIRE
, DEL
, CONFIG
, SHUTDOWN
, BGREWRITEAOF
, BGSAVE
, SAVE
, SPOP
, SREM
, RENAME
e DEBUG
. Esta não é uma lista abrangente, mas renomear ou desativar todos os comandos dessa lista é um bom ponto de partida para aumentar a segurança do seu servidor Redis.
Se você deve desabilitar ou renomear um comando depende das suas necessidades específicas ou das do seu site. Se você souber que nunca usará um comando que possa ser abusado, então você pode desabilitá-lo. Caso contrário, pode ser do seu melhor interesse renomeá-lo.
Para renomear ou desabilitar comandos do Redis, abra o arquivo de configuração mais uma vez:
Aviso: Os passos a seguir mostrando como desabilitar e renomear comandos são exemplos. Você só deve optar por desabilitar ou renomear os comandos que fizerem sentido para você. Você pode revisar a lista completa de comandos por si mesmo e determinar como eles podem ser mal utilizados em redis.io/commands.
Para desabilitar um comando, renomeie-o para uma string vazia (indicada por um par de aspas sem caracteres entre elas), como mostrado abaixo:
. . .
# Também é possível eliminar completamente um comando renomeando-o para
# uma string vazia:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
Para renomear um comando, dê-lhe outro nome conforme mostrado nos exemplos abaixo. Os comandos renomeados devem ser difíceis para os outros adivinharem, mas fáceis para você lembrar:
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
Salve suas alterações e feche o arquivo.
Após renomear um comando, aplique a alteração reiniciando o Redis:
Para testar o novo comando, entre na linha de comando do Redis:
Então, autentique-se:
OutputOK
Vamos supor que você renomeou o comando CONFIG
para ASC12_CONFIG
, como no exemplo anterior. Primeiro, tente usar o comando original CONFIG
. Deverá falhar, porque você o renomeou:
Output(error) ERR unknown command `config`, with args beginning with:
Chamar o comando renomeado, no entanto, será bem-sucedido. Não diferencia maiúsculas de minúsculas:
Output1) "requirepass"
2) "your_redis_password"
Finalmente, você pode sair do redis-cli
:
Observe que se você já estiver usando a linha de comando do Redis e depois reiniciar o Redis, será necessário reautenticar. Caso contrário, você receberá este erro se digitar um comando:
OutputNOAUTH Authentication required.
Aviso: Em relação à prática de renomear comandos, há uma declaração de cautela no final da seção SECURITY
no arquivo /etc/redis/redis.conf
que diz:
. . .
# Por favor, note que mudar o nome de comandos que são registrados no
# arquivo AOF ou transmitidos para réplicas pode causar problemas.
. . .
Nota: O projeto Redis opta por usar os termos “mestre” e “escravo”, enquanto a DigitalOcean geralmente prefere as alternativas “primário” e “secundário”. Para evitar confusão, escolhemos usar os termos usados na documentação do Redis aqui.
Isso significa que se o comando renomeado não estiver no arquivo AOF, ou se estiver mas o arquivo AOF não tiver sido transmitido para as réplicas, então não deve haver problema.
Portanto, tenha isso em mente quando estiver tentando renomear comandos. O melhor momento para renomear um comando é quando você não está usando persistência AOF, ou logo após a instalação, ou seja, antes que sua aplicação que use o Redis tenha sido implantada.
Ao usar AOF e lidar com uma instalação mestre-escravo, considere esta resposta da página de problemas do GitHub do projeto. O seguinte é uma resposta à pergunta do autor:
Os comandos são registrados no AOF e replicados para o escravo da mesma forma que são enviados, então se você tentar reproduzir o AOF em uma instância que não tenha o mesmo renomeamento, você pode enfrentar inconsistências, pois o comando não pode ser executado (o mesmo vale para escravos).
Assim, a melhor maneira de lidar com renomeações em casos como esse é garantir que comandos renomeados sejam aplicados a todas as instâncias em instalações mestre-escravo.
Conclusão
Neste tutorial, você instalou e configurou o Redis, validou que sua instalação do Redis está funcionando corretamente e usou seus recursos de segurança integrados para torná-lo menos vulnerável a ataques de atores maliciosos.
Tenha em mente que, uma vez que alguém está logado no seu servidor, é muito fácil contornar os recursos de segurança específicos do Redis que implementamos. Portanto, o recurso de segurança mais importante no seu servidor Redis é o seu firewall (que você configurou se seguiu o tutorial Configuração Inicial do Servidor), pois isso torna extremamente difícil para os atores maliciosos ultrapassarem essa barreira.
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04