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 nos repositórios oficiais do Ubuntu. No momento desta escrita, a versão disponível nos repositórios padrão é 6.0.16.
Comece atualizando o cache local de pacotes 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:
Dentro do 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ê estiver executando o Redis a partir do upstart ou systemd, o Redis pode interagir com sua
# árvore de supervisão. Opções:
# supervised no - nenhuma interação de supervisão
# supervised upstart - sinaliza upstart colocando o Redis no modo SIGSTOP
# supervised systemd - sinaliza systemd escrevendo READY=1 em $NOTIFY_SOCKET
# supervised auto - detecta o método upstart ou systemd baseado em
# variáveis de ambiente UPSTART_JOB ou NOTIFY_SOCKET
# Nota: esses métodos de supervisão apenas sinalizam "processo está pronto."
# Eles não habilitam pings de vitalidade contínuos de volta para 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
, e então 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. Vamos examinar algumas maneiras de verificar se o Redis está funcionando corretamente neste passo.
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
. . .
Esta 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 é inicializado, você pode configurar isso com o seguinte comando:
Para testar se o Redis está funcionando corretamente, conecte-se ao servidor usando redis-cli
, o cliente de linha de comando do Redis:
No prompt que aparecer, 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ê é capaz de definir chaves executando:
OutputOK
Recupere o valor digitando:
Assumindo que tudo está funcionando, você será capaz de recuperar o valor que você armazenou:
Output"It's working!"
Após confirmar que você pode buscar o valor, saia do prompt do Redis para voltar ao shell:
Como último teste, vamos verificar se o Redis é capaz de persistir dados mesmo depois de ter sido parado ou reiniciado. Para fazer isso, primeiro reinicie a instância do Redis:
Depois, conecte-se novamente com o cliente de linha de comando:
E confirme que seu 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 de suas configurações padrão são inseguras e fornecem oportunidades para atacantes maliciosos obterem acesso ao seu servidor e seus dados. Os próximos passos deste tutorial cobrem métodos para mitigar essas vulnerabilidades, conforme prescrito pelo site oficial do Redis. Embora esses passos sejam opcionais e o Redis ainda funcionará se você optar por não segui-los, é altamente recomendado que você os 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, 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 teve efeito, 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 for o caso, você pode instalá-lo (junto com uma série de outras ferramentas de rede úteis) 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), então 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 não está atualmente configurado para exigir que os usuários se autentiquem antes de fazerem alterações em sua configuração ou nos dados que ele contém. 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 do Redis
Configurar uma senha do Redis habilita um de seus dois recursos de segurança embutidos — o comando auth
, que requer 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 seu editor preferido:
Role até a seção SECURITY
e encontre uma diretiva comentada que diz:
. . .
# requirepass foobared
. . .
Remova o comentário removendo o #
, e altere foobared
para uma senha segura.
Nota: 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 contra um bom servidor. 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 enviar a saída do primeiro comando para o segundo comando openssl
, como 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
Após definir a senha, salve e feche o arquivo. Em seguida, reinicie o Redis:
Para testar se a senha funciona, abra o cliente Redis:
O seguinte mostra 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 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 o comando anterior novamente será bem-sucedido:
OutputOK
get chave1
consulta o Redis para o valor da nova chave.
Output"10"
Depois de confirmar que você é capaz de executar comandos no cliente Redis após autenticar, você pode sair do redis-cli
:
Em seguida, vamos revisar a renomeação de comandos Redis que, se inseridos por engano ou por um ator malicioso, poderiam ter sérios impactos em seus dados.
Passo 5 — Renomear Comandos Perigosos
O outro recurso de segurança incorporado ao Redis envolve renomear ou desabilitar 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 limpar seus dados. Assim como a senha de autenticação, renomear ou desabilitar comandos é configurado 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 desabilitar 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ê sabe que nunca usará um comando que possa ser abusado, então você pode desabilitá-lo. Caso contrário, pode ser do seu interesse renomeá-lo.
Para renomear ou desabilitar comandos do Redis, abra o arquivo de configuração mais uma vez:
Aviso: Os seguintes passos que mostram como desabilitar e renomear comandos são exemplos. Você só deve escolher desabilitar ou renomear os comandos que façam 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 matar completamente um comando renomeando-o para
# uma string vazia:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
Para renomear um comando, dê a ele outro nome, conforme mostrado nos exemplos abaixo. Os comandos renomeados devem ser difíceis de serem adivinhados por outros, mas fáceis de serem lembrados por você:
. . .
# 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 mudança reiniciando o Redis:
Para testar o novo comando, entre na linha de comando do Redis:
Em seguida, autentique-se:
OutputOK
Vamos assumir que você renomeou o comando CONFIG
para ASC12_CONFIG
, como no exemplo anterior. Primeiro, tente usar o comando original CONFIG
. Deverá falhar, pois 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 alterar o nome de comandos que são registrados no
# arquivo AOF ou transmitidos para réplicas pode causar problemas.
. . .
Observação: 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 utilizados 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 os escravos, então não deverá haver problema algum.
Portanto, tenha isso em mente ao tentar renomear comandos. O melhor momento para renomear um comando é quando você não está usando a persistência AOF, ou logo após a instalação, ou seja, antes que sua aplicação que usa o Redis tenha sido implantada.
Quando você estiver usando AOF e lidando 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 slave da mesma forma que são enviados, então se você tentar reproduzir o AOF em uma instância que não tenha a mesma renomeação, pode enfrentar inconsistências, já que o comando não pode ser executado (o mesmo vale para slaves).
Portanto, a melhor maneira de lidar com a renomeação em casos como esse é garantir que os comandos renomeados sejam aplicados a todas as instâncias em instalações master-slave.
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.
Lembre-se de que uma vez que alguém esteja 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 pré-requisito Configuração Inicial do Servidor), pois isso torna extremamente difícil para atores maliciosos ultrapassarem essa barreira.
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04