Manager, Developer Education
Uma versão anterior deste tutorial foi escrita por Justin Ellingwood.
O Redis é um armazenamento de dados de chave-valor na memória, conhecido pela sua flexibilidade, desempenho e amplo suporte de linguagens. Este tutorial demonstra como instalar, configurar e proteger o Redis em um servidor Ubuntu 20.04.
Para completar este guia, você precisará ter acesso a um servidor Ubuntu 20.04, que tenha um usuário não root com privilégios sudo
e um firewall configurado.com o ufw
. Você pode configurar isto seguindo o nosso Guia de Configuração Inicial de Servidor para Ubuntu 20.04.
Vamos usar o gerenciador de pacotes APT para instalar o redis a partir dos repositórios oficiais do Ubuntu. No momento da escrita desse artigo, a versão disponível nos repositórios padrão é a 5.0.7.
Comece atualizando seu cache de pacotes local do apt
:
- sudo apt update
Em seguida, instale o Redis digitando:
- sudo apt install redis-server
Isso irá baixar e instalar o Redis e suas dependências. Em seguida, há uma alteração importante na configuração a ser feita no arquivo de configuração do Redis, que foi gerada automaticamente durante a instalação.
Abra este arquivo com seu editor de texto preferido:
- sudo nano /etc/redis/redis.conf
No arquivo, encontre a diretiva supervised
. Esta diretiva permite que você declare um sistema init para gerenciar o Redis como um serviço, fornecendo a você mais controle sobre a sua operação. A diretiva supervised é configurada
como não
por padrão. Uma vez que você está executando o Ubuntu, que usa o sistema systemd init, altere isso para systemd
:
. . .
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd
. . .
Essa é a única alteração que você precisa fazer no arquivo de configuração do Redis neste ponto, então salve e feche-o quando você terminar. Se você usou o nano
para editar o arquivo, faça isso pressionando CTRL + X
, Y
, depois ENTER
.
Então, reinicie o serviço Redis para refletir as alterações feitas no arquivo de configuração:
- sudo systemctl restart redis.service
Com isso, você instalou e configurou o Redis e ele está funcionando na sua máquina. No entanto, antes de você começar a usá-lo, é prudente verificar primeiro se o Redis está funcionando corretamente.
Como com qualquer software recém-instalado, é uma boa ideia garantir que o Redis esteja funcionando como esperado antes de fazer outras alterações na sua configuração. Vamos analisar várias maneiras de verificar se o Redis está funcionando corretamente neste passo.
Comece por verificar se o serviço Redis está funcionando:
- sudo systemctl status redis
Se ele estiver funcionando sem erros, este comando irá produzir resultados semelhantes aos seguintes:
Output● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 36561 (redis-server)
Tasks: 4 (limit: 2345)
Memory: 1.8M
CGroup: /system.slice/redis-server.service
└─36561 /usr/bin/redis-server 127.0.0.1:6379
. . .
Aqui, você pode ver que o Redis está funcionando e já está ativo, o que significa que ele está definido para iniciar sempre que o servidor inicializar.
Nota: esta configuração é desejável para muitos casos de uso comuns do Redis. No entanto, se você preferir iniciar o Redis manualmente sempre que seu servidor inicializar, você pode configurar isso com o comando a seguir:
- sudo systemctl disable redis
Para testar se o Redis está funcionando corretamente, conecte-se ao servidor usando o redis-cli
, o cliente de linha de comando do Redis:
- redis-cli
No prompt que segue, teste a conectividade com o comando ping
:
- ping
OutputPONG
Este resultado confirma que a conexão com o servidor ainda está viva. A seguir, verifique se você é capaz de definir chaves executando:
- set test "It's working!"
OutputOK
Recupere o valor digitando:
- get test
Supondo que tudo esteja funcionando, você será capaz de recuperar o valor que você armazenou:
Output"It's working!"
Após confirmar que você pode obter o valor, saia do prompt do Redis para voltar ao shell:
- exit
Como um teste final, verificaremos se o Redis é capaz de manter dados mesmo após ter sido interrompido ou reiniciado. Para fazer isso, primeiro reinicie a instância do Redis:
- sudo systemctl restart redis
Em seguida, conecte-se com o cliente de linha de comando novamente:
- redis-cli
E confirme que seu valor de teste ainda está disponível.
- get test
O valor da sua chave ainda deve estar acessível:
Output"It's working!"
Saia novamente para o shell quando terminar:
- exit
Com isso, sua instalação do Redis está totalmente operacional e pronta para que você a use. No entanto, algumas de suas definições de configurações padrão são inseguras e proporcionam a indivíduos maliciosos oportunidades de atacar e obter acesso ao seu servidor e seus dados. Os passos restantes neste tutorial cobrem métodos para mitigar essas vulnerabilidades, como prescrito no site oficial do Redis. Embora esses passos sejam opcionais e o Redis ainda funcionará se você escolher não segui-los, é fortemente recomendado que você os complete para fortalecer a segurança do seu sistema.
Por padrão, o Redis apenas é acessível 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 o vínculo ao localhost.
Para corrigir isso, abra o arquivo de configuração do Redis para edição:
- sudo nano /etc/redis/redis.conf
Localize esta linha e certifique-se de que ela esteja descomentada (remova o #
se ele existir):
bind 127.0.0.1 ::1
Salve e feche o arquivo quando terminar (pressione CTRL + X
, Y
, então ENTER
).
Então, reinicie o serviço para garantir que o systemd leia suas alterações:
- sudo systemctl restart redis
Para verificar se essa alteração entrou em vigor, execute o comando netstat
a seguir:
- sudo netstat -lnp | grep redis
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 esse o caso, você pode instalá-lo (juntamente com uma série de outras ferramentas de rede úteis) com o seguinte comando:
- sudo apt install net-tools
Este resultado mostra que o programa redis-server
se encontra vinculado ao localhost (127.0.0.1
), refletindo a alteração que você acabou de fazer no arquivo de configuração. Se você ver outro endereço IP na coluna (0.0.0.0
, por exemplo), então você deve verificar de novo se você descomentou a linha correta e reiniciar o serviço do Redis novamente.
Agora que sua instalação do Redis está escutando apenas o localhost, será mais difícil para indivíduos maliciosos fazerem solicitações ou obter acesso ao seu servidor. No entanto, o Redis atualmente não está definido para exigir que os usuários se autentiquem antes de fazer alterações na sua configuração ou nos dados que ele possui. Para remediar isso, o Redis permite que você exija que os usuários autentiquem-se com uma senha antes de realizarem alterações pelo cliente do Redis (redis-cli
).
Configurar uma senha para o Redis habilita uma de suas duas características integradas de segurança — o comando auth
, que exige que os clientes autentiquem-se para acessar o banco de dados. A senha é configurada diretamente no arquivo de configuração do Redis, /etc/redis/redis.conf
, assim abra esse arquivo novamente com seu editor preferido:
- sudo nano /etc/redis/redis.conf
Role até a seção SECURITY
e procure uma diretiva comentada que mostre:
. . .
# requirepass foobared
. . .
Descomente-a removendo o #
, e modificando o foobared
para uma senha segura.
Nota: acima da diretiva requirepass
no arquivo redis.conf
, há um aviso comentado:
. . .
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
. . .
Assim, é importante que você especifique um valor muito forte e longo como sua senha. Ao invés de criar uma senha você mesmo, você pode usar o comando openssl
para gerar uma aleatória, como no exemplo a seguir. Canalizando o resultado do primeiro comando para o segundo comando openssl
, como mostrado aqui, ele removerá quaisquer quebras de linha produzidas pelo primeiro comando:
- openssl rand 60 | openssl base64 -A
Seu resultado deve se parecer com esse:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Após copiar e colar o resultado desse comando como o novo valor para requirepass
, ele deve mostrar:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Após configurar a senha, salve e feche o arquivo, então reinicie o Redis:
- sudo systemctl restart redis.service
Para testar se a senha funciona, abra o cliente Redis:
- redis-cli
A seguir encontra-se uma sequência de comandos usada para testar se a senha do Redis funciona. O primeiro comando tenta definir uma chave para um valor antes da autenticação:
- set key1 10
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-se com a senha especificada no arquivo de configuração do Redis:
- auth your_redis_password
O Redis reconhece:
OutputOK
Após isso, executando o comando anterior novamente terá sucesso:
- set key1 10
OutputOK
get key1
consulta o Redis para o valor da nova chave.
- get key1
Output"10"
Após confirmar que você é capaz de executar comandos no cliente Redis após a autenticação, você pode sair do redis-cli
:
- quit
A seguir, vamos ver como renomear comandos do Redis que, se inseridos por engano ou por um indivíduo malicioso, podem causar danos graves na sua máquina.
A outra característica de segurança embutida no Redis envolve renomear ou desativar completamente determinados comandos que são considerados perigosos.
Quando executados por usuários não autorizados, esses comandos podem ser usados para reconfigurar, destruir ou até limpar seus dados. Assim como a senha de autenticação, renomear ou desativar comandos é configurado na mesma seção SECURITY
do arquivo /etc/redis/redis.conf
.
Alguns comandos que são considerados perigosos incluem: FLUSHDB
, FLUSHALL
, KEYS
, PEXPIRE
, DEL
, CONFIG
, SHUTDOWN
, BGREWRITEAOF
, BGSAVE
, SAVE
, SPOP
, SREM
, RENAME
, e DEBUG
. Esta não é uma lista completa, mas renomear ou desativar todos os comandos nessa lista é um bom ponto de partida para melhorar a segurança do seu servidor do Redis.
Se você deve desativar ou renomear um comando depende de suas necessidades específicas ou daquelas do seu site. Se você sabe que nunca usará um comando que possa ser abusado, então você pode desativá-lo. Caso contrário, pode ser do seu melhor interesse renomeá-lo.
Para renomear ou desativar comandos do Redis, abra novamente o arquivo de configuração:
- sudo nano /etc/redis/redis.conf
Aviso: os passos a seguir mostrando como desativar e renomear comandos são exemplos. Você deve apenas escolher desativar ou renomear os comandos que fizerem sentido para você. Você pode rever a lista completa de comandos por conta própria e determinar como eles poderiam ser usados de forma errada com o redis.io/commands.
Para desativar um comando, simplesmente renomeie-o para uma string vazia (representado por um par de aspas sem caracteres entre elas), como mostrado abaixo:
. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
Para renomear um comando, dê a ele outro nome como mostrado nos exemplos abaixo. Os comandos renomeados devem ser difíceis para que outros possam adivinhar, mas fácil 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:
- sudo systemctl restart redis.service
Para testar o novo comando, acesse a linha de comando do Redis:
- redis-cli
Então, autentique-se:
- auth your_redis_password
OutputOK
Vamos supor que você renomeou o comando CONFIG
para ASC12_CONFIG
, como no exemplo anterior. Primeiro, tente usar o comando original CONFIG
. Ele deve falhar, porque você o renomeou:
- config get requirepass
Output(error) ERR unknown command `config`, with args beginning with:
Chamar o comando renomeado, no entanto, será bem-sucedido. Não é sensível a maiúsculas e minúsculas:
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
Finalmente, você pode sair do redis-cli
:
- exit
Observe que se você já estiver usando a linha de comando do Redis e então reiniciar o Redis, você precisará autenticar-se novamente. Caso contrário, você receberá este erro se digitar um comando:
OutputNOAUTH Authentication required.
Com relação à prática de renomeação de comandos, há uma declaração segurança ao final da seção SECURITY
no /etc/redis/redis.conf
que diz o seguinte:
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .
Nota: o projeto Redis escolhe usar os termos “master” e “slave”, 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 ele estiver, mas o arquivo AOF não for transmitido aos slaves, então não deve haver problemas.
Então, lembre-se disso quando você estiver tentando renomear comandos. A melhor hora para renomear um comando é quando você não estiver usando a persistência do AOF, ou logo após a instalação, ou seja, antes do seu aplicativo que utiliza o Redis for implantado.
Quando você estiver usando o AOF e lidando com uma instalação master-slave, considere essa resposta na página do GitHub do projeto. A seguir está uma resposta à pergunta do autor:
Os comandos são logados no AOF e reproduzidos para o slave da mesma forma que eles são enviados, então, se você tentar replicar o AOF em uma instância que não tenha a mesma renomeação, você pode enfrentar inconsistências já que o comando não pode ser executado (igualmente para slaves).
Assim, a melhor maneira de lidar com renomeações em casos como esse é garantir que os comandos renomeados sejam aplicados a todas as instâncias em instalações master-slave.
Neste tutorial, você instalou e configurou o Redis, garantiu que sua instalação do Redis está funcionando corretamente, e usou suas características integradas de segurança para torná-lo menos vulnerável a ataques de indivíduos maliciosos.
Lembre-se de que uma vez que alguém estiver logado no seu servidor, é muito fácil contornar as características específicas de segurança do Redis que colocamos. Portanto, a característica mais importante de segurança no seu servidor Redis é seu firewall (que você configurou se seguiu o tutorial pré-requisito Configuração Inicial do Servidor), uma vez que isso torna extremamente difícil para indivíduos maliciosos pular esta cerca.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!