Como instalar e proteger o Redis no Rocky Linux 8

Introdução

O Redis é um armazenamento de dados de chave-valor em memória, de código aberto, que se destaca em caching. O Redis é um banco de dados não relacional conhecido por sua flexibilidade, desempenho, escalabilidade e amplo suporte a linguagens de programação.

O Redis foi projetado para uso por clientes confiáveis em um ambiente confiável e não possui robustos recursos de segurança próprios. No entanto, o Redis possui alguns recursos de segurança como autenticação por senha e a capacidade de renomear ou desabilitar alguns comandos. Este tutorial fornece instruções sobre como instalar o Redis e configurar esses recursos de segurança. Também aborda algumas outras configurações que podem aumentar a segurança de uma instalação standalone do Redis no Rocky Linux 8.

Observe que este guia não aborda situações em que o servidor Redis e as aplicações clientes estão em hosts diferentes ou em data centers diferentes. Instalações onde o tráfego do Redis precisa atravessar uma rede insegura ou não confiável exigirão um conjunto diferente de configurações, como configurar um proxy SSL ou uma VPN entre as máquinas Redis.

Você também pode usar o Serviço de Redis Gerenciado da DigitalOcean.

Pré-requisitos

Para completar este tutorial, você precisará de um servidor executando o Rocky Linux 8. Este servidor deve ter um usuário não root com privilégios administrativos e um firewall configurado com firewalld. Para configurar isso, siga nosso guia de Configuração Inicial do Servidor para Rocky Linux 8.

Passo 1 — Instalando e Iniciando o Redis

Você pode instalar o Redis com o gerenciador de pacotes DNF. Usando o DNF, você pode instalar o Redis, suas dependências e nano, um editor de texto amigável ao usuário. Você não precisa instalar o nano, mas o usaremos em exemplos ao longo deste guia:

  1. sudo dnf install redis nano

Este comando solicitará que você confirme se deseja instalar os pacotes selecionados. Pressione y e depois ENTER para fazer isso:

Output
. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y

Após isso, há uma mudança de configuração importante a ser feita no arquivo de configuração do Redis, que foi gerado automaticamente durante a instalação.

Abra este arquivo com seu editor de texto preferido. Aqui usaremos o nano:

  1. sudo nano /etc/redis.conf

Dentro do arquivo, encontre a diretiva supervised. Essa diretiva permite que você declare um sistema de inicialização para gerenciar o Redis como um serviço, fornecendo mais controle sobre sua operação. A diretiva supervised é definida como não por padrão. Como você está executando o Rocky Linux, que usa o sistema de inicialização systemd, altere isso para systemd:

/etc/redis.conf
. . .

# Se você executar o Redis a partir do upstart ou do systemd, o Redis pode interagir com sua 
# árvore de supervisão. Opções:
#   supervised no      - nenhuma interação de supervisão
#   supervised upstart - sinalizar upstart colocando o Redis no modo SIGSTOP
#   supervised systemd - sinalizar systemd escrevendo READY=1 em $NOTIFY_SOCKET
#   supervised auto    - detectar método upstart ou systemd com base em 
#                        variáveis de ambiente UPSTART_JOB ou NOTIFY_SOCKET
# Nota: esses métodos de supervisão apenas sinalizam "o processo está pronto."
#       Eles não habilitam pingos contínuos de vivacidade 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 o nano para editar o arquivo, salve e saia com CTRL + X, depois, quando solicitado, Y e depois Enter.

Depois de editar o arquivo, inicie o serviço Redis:

  1. sudo systemctl start redis.service

Se você quiser que o Redis seja iniciado no boot, pode ativá-lo com o comando enable:

  1. sudo systemctl enable redis

Observe que este comando não inclui o sufixo .service após o nome do arquivo de unidade. Geralmente, você pode deixar este sufixo de fora dos comandos do systemctl, pois ele pode ser automaticamente analisado a partir dos nomes dos serviços.

Você pode verificar o status do Redis executando o seguinte comando:

  1. sudo systemctl status redis
Output
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago Main PID: 14478 (redis-server) Tasks: 4 (limit: 11152) Memory: 6.6M CGroup: /system.slice/redis.service └─14478 /usr/bin/redis-server 127.0.0.1:6379

Depois de confirmar que o Redis está em execução, você pode testar sua funcionalidade com este comando:

  1. redis-cli ping

Isso deve imprimir PONG como resposta:

Output
PONG

Se este for o caso, significa que agora você tem o Redis em execução no seu servidor e pode começar a configurá-lo para melhorar sua segurança.

Passo 2 — Configurando o Redis e Protegendo com um Firewall

Uma maneira eficaz de proteger o Redis é garantir que o servidor em que ele está sendo executado esteja seguro. Você pode fazer isso garantindo que o Redis esteja vinculado apenas ao localhost ou a um endereço IP privado e também que o servidor tenha um firewall em funcionamento.

No entanto, se você optou por configurar o Redis usando outro tutorial, 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 ou a um IP privado.

Para corrigir isso, abra novamente o arquivo de configuração do Redis com seu editor de texto preferido:

  1. sudo nano /etc/redis.conf

Localize a linha que começa com bind e certifique-se de que não esteja comentada ou desativada, removendo o sinal # no início da linha, se necessário:

/etc/redis.conf
. . .
bind 127.0.0.1

Se precisar vincular o Redis a outro endereço IP (como em casos em que você acessará o Redis de um host separado), considere fortemente vinculá-lo a um endereço IP privado. Vincular a um endereço IP público aumenta a exposição da sua interface Redis a partes externas:

/etc/redis.conf
. . .
bind your_private_ip

Após confirmar que a diretiva bind não está comentada, você pode salvar e fechar o arquivo.

Se você seguiu o tutorial pré-requisito de Configuração Inicial do Servidor e instalou firewalld no seu servidor, e não planeja se conectar ao Redis de outro host, então não precisa adicionar regras de firewall extras para o Redis. Afinal, todo tráfego de entrada será descartado por padrão, a menos que explicitamente permitido pelas regras de firewall. Como uma instalação autônoma padrão do servidor Redis está ouvindo apenas na interface de loopback (127.0.0.1 ou localhost), não deve haver preocupação com tráfego de entrada na porta padrão.

No entanto, se você planeja acessar o Redis de outro host, precisará fazer algumas alterações na configuração do seu firewalld usando o comando firewall-cmd. Novamente, você só deve permitir acesso ao seu servidor Redis a partir de seus hosts usando seus endereços IP privados para limitar o número de hosts aos quais seu serviço está exposto.

Para começar, adicione uma zona dedicada do Redis à sua política firewalld:

  1. sudo firewall-cmd --permanent --new-zone=redis

Em seguida, especifique qual porta você deseja deixar aberta. O Redis usa a porta 6379 por padrão:

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

Em seguida, especifique quais endereços IP privados devem ser permitidos a passar pelo firewall e acessar o Redis:

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

Após executar esses comandos, recarregue o firewall para implementar as novas regras:

  1. sudo firewall-cmd --reload

Sob essa configuração, quando o firewall encontrar um pacote do endereço IP do seu cliente, aplicará as regras na zona Redis dedicada a essa conexão. Todas as outras conexões serão processadas pela zona padrão public. Os serviços na zona padrão se aplicam a todas as conexões, não apenas aquelas que não correspondem explicitamente, portanto, não é necessário adicionar outros serviços (por exemplo, SSH) à zona Redis, porque essas regras serão aplicadas à conexão automaticamente.

Tenha em mente que qualquer ferramenta de firewall funcionará, seja você usando firewalld, ufw ou iptables. O importante é que o firewall esteja ativado e em funcionamento para que indivíduos desconhecidos não possam acessar seu servidor. No próximo passo, você configurará o Redis para ser acessível apenas com uma senha forte.

Passo 3 — Configurando uma Senha Redis

Configurar uma senha para o Redis ativa uma de suas funcionalidades de segurança integradas – o comando auth – que exige que os clientes se autentiquem antes de terem acesso ao banco de dados. Assim como a configuração bind, a senha é configurada diretamente no arquivo de configuração do Redis, /etc/redis.conf. Reabra esse arquivo:

  1. sudo nano /etc/redis.conf

Role até a seção SECURITY e procure por uma diretiva comentada que diz:

/etc/redis.conf
. . .
# requirepass foobared

Remova o comentário, removendo o #, e altere foobared para uma senha muito forte de sua escolha.

Nota: Em vez de criar uma senha por conta própria, você pode usar uma ferramenta como apg ou pwgen para gerar uma. Se você não quiser instalar um aplicativo apenas para gerar uma senha, no entanto, você pode usar o comando abaixo. Este comando ecoa um valor de string e o redireciona para o seguinte comando sha256sum, que exibirá o checksum SHA256 da string.

Tenha em mente que inserir este comando conforme escrito gerará a mesma senha toda vez. Para criar uma senha única, altere a string entre aspas para qualquer outra palavra ou frase:

  1. echo "digital-ocean" | sha256sum

Embora a senha gerada não seja memorável, ela será muito forte e longa, que é exatamente o tipo de senha necessário para o Redis. Após copiar e colar a saída desse comando como o novo valor para requirepass, ele deverá ficar assim:

/etc/redis.conf
. . .
requirepass password_copied_from_output

Como alternativa, se preferir uma senha mais curta, você pode usar a saída de outro checksum. Novamente, altere a palavra entre aspas para que não gere a mesma senha que este comando:

  1. echo "digital-ocean" | sha1sum

Depois de definir a senha, salve e feche o arquivo e depois reinicie o Redis:

  1. sudo systemctl restart redis

Para testar se a senha funciona, abra o cliente Redis:

  1. redis-cli

Aqui está uma sequência de comandos usados para testar se a senha do Redis funciona. O primeiro comando tenta definir uma chave para um valor antes da autenticação:

  1. set key1 10

Isso não funcionará, pois você ainda não se autenticou, então o Redis retorna um erro:

Output
(error) NOAUTH Authentication required.

O comando a seguir autentica com a senha especificada no arquivo de configuração do Redis:

  1. auth your_redis_password

O Redis reconhecerá que você foi autenticado:

Output
OK

Depois disso, executar novamente o comando anterior deverá ter sucesso:

  1. set key1 10
Output
OK

O comando get key1 consulta o Redis para o valor da nova chave:

  1. get key1
Output
"10"

Este último comando sai do redis-cli. Você também pode usar exit:

  1. quit

Agora, deve ser muito difícil para usuários não autorizados acessarem sua instalação do Redis. Esteja ciente de que se você já estiver usando o cliente de linha de comando do Redis e depois reiniciar o Redis, será necessário reautenticar. Além disso, observe que sem SSL ou uma VPN, esta senha ainda pode ser interceptada por partes externas se você estiver se conectando ao Redis remotamente.

Em seguida, este guia irá explicar como renomear os comandos do Redis para proteger ainda mais o Redis de atores maliciosos.

Passo 4 — Renomear Comandos Perigosos

Outra funcionalidade de segurança incorporada ao Redis permite renomear ou desativar completamente certos comandos considerados perigosos. Quando executados por usuários não autorizados, esses comandos podem ser usados para reconfigurar, destruir ou de outra forma limpar seus dados. Alguns dos comandos considerados perigosos incluem:

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM
  • RENAME
  • DEBUG

Esta não é uma lista completa, mas renomear ou desativar todos os comandos nesta lista pode ajudar a melhorar a segurança do seu armazenamento de dados. Se você souber que nunca usará um comando que possa ser abusado, então pode desativá-lo. Caso contrário, você deve renomeá-lo.

Assim como a senha de autenticação, renomear ou desativar comandos é configurado na seção SECURITY do arquivo /etc/redis.conf. Para habilitar ou desabilitar comandos do Redis, abra o arquivo de configuração para edição mais uma vez:

  1. sudo nano /etc/redis.conf

NOTA: Estes são exemplos. Você deve optar por desabilitar ou renomear os comandos que fazem sentido para você. Você pode aprender mais sobre os comandos do Redis e determinar como eles podem ser mal utilizados em redis.io/commands.

Para desabilitar ou eliminar um comando, renomeie-o para uma string vazia, como este:

/etc/redis.conf
# 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 como nos exemplos abaixo. Os comandos renomeados devem ser difíceis para outros adivinharem, mas fáceis para você lembrar:

/etc/redis.conf
# Também é possível eliminar completamente um comando renomeando-o para
# uma string vazia:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

Salve suas alterações e feche o arquivo. Em seguida, aplique as alterações reiniciando o Redis:

  1. sudo systemctl restart redis.service

Para testar seus novos comandos, entre na linha de comando do Redis:

  1. redis-cli

Autentique-se usando a senha que você definiu anteriormente:

  1. auth your_redis_password
Output
OK

Supondo que você tenha renomeado o comando CONFIG para ASC12_CONFIG, tentar usar o comando config falhará:

  1. config get requirepass
Output
(error) ERR unknown command 'config'

Chamar o comando renomeado será bem-sucedido. Note que os comandos do Redis não diferenciam maiúsculas de minúsculas:

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

Por fim, você pode sair do redis-cli:

  1. exit

Aviso: Em relação à renomeação de comandos, há uma declaração cautelar no final da seção SEGURANÇA no arquivo /etc/redis.conf, que diz:

/etc/redis.conf
. . .

# Por favor, note que alterar o nome dos comandos que são registrados no arquivo
# AOF ou transmitidos para réplicas pode causar problemas.

. . .

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 deverá haver problema. Tenha isso em mente ao 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 seu aplicativo que usa Redis tenha sido implantado).

Passo 5 — Definindo a Propriedade do Diretório de Dados e Permissões de Arquivo

Este passo passará por algumas mudanças de propriedade e permissões que você pode precisar fazer para melhorar o perfil de segurança da sua instalação do Redis. Isso envolve garantir que apenas o usuário que precisa acessar o Redis tenha permissão para ler seus dados. Esse usuário é, por padrão, o usuário redis.

Você pode verificar isso usando grep para o diretório de dados do Redis em uma listagem longa de seu diretório pai. Este comando e sua saída são dados abaixo:

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 6 22:22 redis

Esta saída indica que o diretório de dados do Redis é de propriedade do usuário redis, com acesso secundário concedido ao grupo redis. Essa configuração de propriedade é segura, assim como as permissões da pasta, que, usando a notação octal, estão definidas como 750.

Se o diretório de dados do Redis tiver permissões inseguras, você pode garantir que apenas o usuário e o grupo Redis tenham acesso à pasta e ao seu conteúdo executando o comando chmod. O exemplo a seguir altera as permissões dessa pasta para 770:

  1. sudo chmod 770 /var/lib/redis

Outra permissão que você pode precisar alterar é a do arquivo de configuração do Redis. Por padrão, ele tem permissão de arquivo 640 e é de propriedade do usuário root, com propriedade secundária pelo grupo root:

  1. ls -l /etc/redis.conf
Output
-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf

Essa permissão (640) significa que o arquivo de configuração do Redis só pode ser lido pelo usuário redis e pelo grupo root. Como o arquivo de configuração contém a senha não criptografada configurada na Etapa 4, redis.conf deve ser de propriedade do usuário redis, com propriedade secundária pelo grupo redis. Para configurar isso, execute o seguinte comando:

  1. sudo chown redis:redis /etc/redis.conf

Em seguida, altere as permissões para que apenas o proprietário do arquivo possa ler e escrever nele:

  1. sudo chmod 600 /etc/redis.conf

Você pode verificar a nova propriedade e permissões executando novamente os comandos ls anteriores:

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
  1. ls -l /etc/redis.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf

Finalmente, reinicie o Redis para refletir essas alterações:

  1. sudo systemctl restart redis

Com isso, sua instalação do Redis foi segura.

Conclusão

Tenha em mente que uma vez que alguém está conectado ao seu servidor, é possível contornar as características de segurança específicas do Redis que você implementou. É por isso que o recurso de segurança mais importante abordado neste tutorial é o firewall, pois isso impede que usuários desconhecidos se conectem ao seu servidor em primeiro lugar.

Se você estiver tentando garantir a comunicação do Redis em uma rede não confiável, será necessário empregar um proxy SSL, conforme recomendado pelos desenvolvedores do Redis no guia de segurança oficial do Redis.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-rocky-linux-8