Como Instalar e Segurar o Redis no Rocky Linux 8

Introdução

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

O Redis foi projetado para ser usado por clientes confiáveis em um ambiente confiável e não possui recursos robustos 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 desativar 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 reforçar a segurança de uma instalação independente do Redis no Rocky Linux 8.

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

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

Pré-requisitos

Para concluir 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 alteração 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, localize a diretiva supervised. Esta diretiva permite declarar 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 no 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 systemd, o Redis pode interagir com sua
# árvore de supervisão. Opções:
#   supervised no      - nenhuma interação de supervisão
#   supervised upstart - sinalize upstart colocando o Redis no modo SIGSTOP
#   supervised systemd - sinalize systemd escrevendo READY=1 em $NOTIFY_SOCKET
#   supervised auto    - detecte o método upstart ou systemd baseado 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 vida 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 quando terminar. Se você usou nano para editar o arquivo, salve e saia com CTRL + X, então, quando solicitado, Y e depois Enter.

Após editar o arquivo, inicie o serviço Redis:

  1. sudo systemctl start redis.service

Se você deseja que o Redis inicie na inicialização, você pode habilitá-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 systemctl, pois ele pode ser analisado automaticamente a partir dos nomes dos serviços.

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

  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á realmente 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 você agora 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-o 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, então pode ter atualizado o arquivo de configuração para permitir conexões de qualquer lugar. Isso não é tão seguro quanto a vinculação 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 está comentada ou desativada, removendo o sinal # do 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 estará acessando o Redis de um host separado), você deve considerar fortemente vinculá-lo a um endereço IP privado. Vincular a um endereço IP público aumenta a exposição da interface do seu 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 de Configuração Inicial do Servidor e instalou o firewalld no seu servidor, e não planeja se conectar ao Redis de outro host, então não precisa adicionar nenhuma regra de firewall extra para o Redis. Afinal, qualquer tráfego de entrada será descartado por padrão, a menos que seja explicitamente permitido pelas regras do firewall. Como uma instalação padrão independente do servidor Redis está ouvindo apenas na interface 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 planeja acessar o Redis de outro host, será necessário fazer algumas alterações na configuração do firewalld usando o comando firewall-cmd. Novamente, você só deve permitir acesso ao seu servidor Redis a partir dos seus hosts usando os 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 de Redis dedicada à sua política do firewalld:

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

Em seguida, especifique qual porta você gostaria de ter 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 esta configuração, quando o firewall encontra 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, então você não precisa adicionar outros serviços (por exemplo, SSH) à zona Redis porque essas regras serão aplicadas automaticamente a essa conexão.

Lembre-se de que qualquer ferramenta de firewall funcionará, seja você usando firewalld, ufw, ou iptables. O importante é que o firewall esteja ativado e em execução para que pessoas desconhecidas 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 para o Redis

Configurar uma senha do Redis permite uma de suas características de segurança integradas — o comando auth — que requer que os clientes se autentiquem antes de serem permitidos o 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

Descomente removendo o #, e altere foobared para uma senha muito forte de sua escolha.

Nota: Em vez de criar uma senha você mesmo, 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 ao inserir este comando como está escrito, ele 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ária para o Redis. Após copiar e colar a saída desse comando como o novo valor para requirepass, ele deve ficar assim:

/etc/redis.conf
. . .
requirepass password_copied_from_output

Alternativamente, se você preferir uma senha mais curta, você poderia usar a saída de um checksum diferente. Novamente, mude a palavra entre aspas para que não gere a mesma senha que este comando:

  1. echo "digital-ocean" | sha1sum

Após definir a senha, salve e feche o arquivo e, em seguida, reinicie o Redis:

  1. sudo systemctl restart redis

Para testar se a senha está funcionando, abra o cliente Redis:

  1. redis-cli

A seguir, uma sequência de comandos usados para verificar se a senha do Redis está funcionando. 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. Portanto, o Redis retornará um erro:

Output
(error) NOAUTH Authentication required.

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

  1. auth your_redis_password

O Redis confirmará que você foi autenticado:

Output
OK

Depois disso, executar novamente o comando anterior deve ser bem-sucedido:

  1. set key1 10
Output
OK

O comando get key1 consulta o Redis para obter 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 reiniciar o Redis, será necessário se autenticar novamente. 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 abordará a renomeação dos comandos do Redis para proteger ainda mais contra agentes maliciosos.

Passo 4 — Renomear Comandos Perigosos

Outra característica de segurança incorporada ao Redis permite renomear ou desabilitar 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 apagar 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 abrangente, mas renomear ou desabilitar 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 poderá desabilitá-lo. Caso contrário, você deve renomeá-lo.

Assim como a senha de autenticação, renomear ou desabilitar 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 escolher 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 matar um comando, renomeie-o para uma string vazia, como isto:

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

/etc/redis.conf
# Também é possível matar 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. Então aplique as mudanças 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

Assumindo que você renomeou 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 em vez disso será bem-sucedido. Note que os comandos do Redis não são sensíveis a maiúsculas:

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

Finalmente, você pode sair do redis-cli:

  1. exit

Aviso: A respeito de renomear comandos, há uma declaração cautelosa no final da seção SECURITY no arquivo /etc/redis.conf, que diz:

/etc/redis.conf
. . .

# Por favor, note que alterar o nome de 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 foi 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 — Configurando 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 de sua instalação 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 pelo comando grep no diretório de dados do Redis em uma listagem longa de seu diretório pai. Este comando e sua saída estã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 grupo do Redis tenham acesso à pasta e seu conteúdo executando o comando chmod. O seguinte exemplo altera as permissões desta pasta para 770:

  1. sudo chmod 770 /var/lib/redis

A 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 é legível apenas pelo usuário redis e pelo grupo root. Como o arquivo de configuração contém a senha não criptografada que você configurou na Etapa 4, redis.conf deve ser de propriedade do usuário redis, com propriedade secundária pelo grupo redis. Para definir 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 mudanças:

  1. sudo systemctl restart redis

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

Conclusão

Tenha em mente que, uma vez que alguém está logado no seu servidor, é possível contornar as características de segurança específicas do Redis que você implementou. Por isso, a característica de segurança mais importante abordada neste tutorial é o firewall, pois isso impede que usuários desconhecidos entrem no seu servidor em primeiro lugar.

Se você estiver tentando garantir a comunicação do Redis por meio de uma rede não confiável, será necessário utilizar 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