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:
- 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
:
- 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
:
. . .
# 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:
- sudo systemctl start redis.service
Se você deseja que o Redis inicie na inicialização, você pode habilitá-lo com o comando enable
:
- 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:
- 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:
- redis-cli ping
Isso deve imprimir PONG
como resposta:
OutputPONG
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:
- 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:
. . .
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:
. . .
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:
- 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:
- 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:
- 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:
- 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:
- sudo nano /etc/redis.conf
Role até a seção SECURITY
e procure por uma diretiva comentada que diz:
. . .
# 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:
- 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:
. . .
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:
- echo "digital-ocean" | sha1sum
Após definir a senha, salve e feche o arquivo e, em seguida, reinicie o Redis:
- sudo systemctl restart redis
Para testar se a senha está funcionando, abra o cliente Redis:
- 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:
- 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:
- auth your_redis_password
O Redis confirmará que você foi autenticado:
OutputOK
Depois disso, executar novamente o comando anterior deve ser bem-sucedido:
- set key1 10
OutputOK
O comando get key1
consulta o Redis para obter o valor da nova chave:
- get key1
Output"10"
Este último comando sai do redis-cli
. Você também pode usar exit
:
- 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:
- 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:
# 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:
# 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:
- sudo systemctl restart redis.service
Para testar seus novos comandos, entre na linha de comando do Redis:
- redis-cli
Autentique-se usando a senha que você definiu anteriormente:
- auth your_redis_password
OutputOK
Assumindo que você renomeou o comando CONFIG
para ASC12_CONFIG
, tentar usar o comando config
falhará:
- 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:
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
Finalmente, você pode sair do redis-cli
:
- 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:
. . .
# 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:
- ls -l /var/lib | grep redis
Outputdrwxr-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
:
- 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:
- 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:
- 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:
- sudo chmod 600 /etc/redis.conf
Você pode verificar a nova propriedade e permissões executando novamente os comandos ls
anteriores:
- ls -l /var/lib | grep redis
Outputtotal 40
drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
- ls -l /etc/redis.conf
Outputtotal 40
-rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf
Finalmente, reinicie o Redis para refletir essas mudanças:
- 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