Uma versão anterior deste tutorial foi escrita por Justin Ellingwood.

Introdução

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.

Pré-requisitos

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.

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. 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:

/etc/redis/redis.conf
. . .

# 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.

Passo 2 — Testando o Redis

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
Output
PONG

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!"
Output
OK

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.

Passo 3 — Vinculando ao localhost

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):

/etc/redis/redis.conf
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
Output
tcp 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).

Passo 4 — Configurando uma Senha para o Redis

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:

/etc/redis/redis.conf
. . .
# 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:

/etc/redis/redis.conf
. . .
# 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:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Após copiar e colar o resultado desse comando como o novo valor para requirepass, ele deve mostrar:

/etc/redis/redis.conf
requirepass 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:

Output
OK

Após isso, executando o comando anterior novamente terá sucesso:

  • set key1 10
Output
OK

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.

Passo 5 — Renomeando Comandos Perigosos

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:

/etc/redis/redis.conf
. . .
# 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:

/etc/redis/redis.conf
. . .
# 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
Output
OK

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
Output
1) "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:

Output
NOAUTH 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:

/etc/redis/redis.conf
. . .
# 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.

Conclusão

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.

0 Comments

Creative Commons License