Pesquisa de sites

Como Instalar e Proteger o Redis no Ubuntu


Introdução

O Redis é um armazenamento de chave-valor em memória conhecido pela sua flexibilidade, desempenho e amplo suporte a linguagens. É frequentemente usado como base de dados, cache e intermediário de mensagens. Embora uma instalação padrão seja funcional, não é segura e deixa os seus dados e servidor expostos a ataques. Uma instância do Redis sem segurança pode levar a fugas de dados, acesso não autorizado e até comprometimento do servidor.

Este tutorial irá guiá-lo na instalação da versão mais recente do Redis num servidor Ubuntu e na implementação de uma configuração de segurança pronta para produção. Irá aprender a configurar o acesso dos utilizadores com Listas de Controlo de Acesso (ACLs), a encriptar o tráfego com TLS, a restringir o acesso à rede com um firewall e a aplicar medidas adicionais de reforço do sistema, abrangendo gestão de memória, persistência e configurações de rede seguras.

Principais Conclusões

  • Use ACLs para Autenticação Moderna: Utilize sempre Listas de Controlo de Acesso (ACLs) para gerir utilizadores em vez da desatualizada diretiva requirepass. Desative o utilizador default e crie utilizadores específicos com as permissões mínimas necessárias para maior segurança.
  • Criptografar Todo o Tráfego de Rede com TLS: Nunca transmita dados do Redis em texto simples. Implemente TLS para criptografar toda a comunicação entre os clientes e o servidor, protegendo informações sensíveis de serem interceptadas na rede.
  • Nunca exponha o Redis diretamente à Internet: Expor uma porta do Redis ao público é um grande risco de segurança. Para acesso remoto, utilize sempre alternativas seguras, como uma VPN (WireGuard/OpenVPN) ou um túnel SSH, para criar uma ligação privada e encriptada.
  • Implemente um Firewall Rigoroso: Um firewall é a sua primeira linha de defesa. Se precisar de permitir ligações remotas, configure o seu firewall (ufw) para aceitar tráfego apenas na porta do Redis a partir de endereços IP específicos e confiáveis.
  • Prevenir Ataques de Esgotamento de Memória: Proteja o seu servidor contra ataques de Negação de Serviço (DoS) definindo um limite de memória com a diretiva maxmemory na sua configuração. Além disso, defina uma maxmemory-policy para controlar como o Redis elimina chaves quando o limite é atingido.
  • Prefira ACLs em vez de renomear comandos: Evite a prática antiga de renomear comandos perigosos. É frágil e pode quebrar aplicações cliente e a replicação. Em vez disso, use regras ACL para restringir o acesso a estes comandos por utilizador (por exemplo, -@dangerous).
  • Utilize Sockets Unix para Conexões Locais: Para aplicações a correr no mesmo servidor que o Redis, utilize sockets Unix em vez de portas TCP. São mais rápidos e seguros, uma vez que contornam a pilha de rede e dependem das permissões do sistema de ficheiros.
  • Monitorize Ativamente os Registos em Busca de Ameaças: Monitorize regularmente os registos do sistema com journalctl e ative o registo lento do Redis. Esteja atento a padrões como autenticações falhadas repetidas, ligações de fontes desconhecidas ou comandos abusivos que possam indicar um problema de segurança ou de desempenho.
  • Proteja os Seus Dados em Repouso: Ative a persistência do Redis (RDB e/ou AOF) para evitar a perda de dados. Certifique-se de que os ficheiros de dados (dump.rdb, appendonly.aof) têm permissões de ficheiro rigorosas e estão incluídos na sua estratégia regular de backup encriptado e fora do local.
  • Aproveitar a Segurança Incorporada no Sistema: Tire partido das funcionalidades de segurança fornecidas pelo sistema operativo. No Ubuntu, um perfil AppArmor predefinido é automaticamente ativado para o servidor Redis, o que limita o processo e restringe os danos potenciais de uma vulnerabilidade.

Pré-requisitos

Para completar este guia, precisará de acesso a um servidor Ubuntu que tenha um utilizador não-root com privilégios sudo e um firewall configurado com ufw. Pode configurar isto seguindo o nosso guia de Configuração Inicial do Servidor para Ubuntu.

Passo 1 — Instalar e Configurar o Redis

Vamos usar o gestor de pacotes APT para instalar o Redis a partir dos repositórios oficiais do Ubuntu. À data de escrita, a versão disponível nos repositórios padrão é a 7.0.15.

Comece por atualizar a cache de pacotes apt local:

sudo apt update

Em seguida, instale o Redis digitando:

sudo apt install redis-server

Isto irá descarregar e instalar o Redis e as suas dependências. Após a conclusão da instalação, é uma boa prática verificar a versão instalada:

redis-server --version

A seguir, há uma alteração importante de configuração a fazer no ficheiro de configuração do Redis, que foi gerado automaticamente durante a instalação.

Abra este ficheiro com o seu editor de texto preferido:

sudo nano /etc/redis/redis.conf

Dentro do ficheiro, encontre a diretiva supervised. Esta diretiva permite-lhe declarar um sistema init para gerir o Redis como um serviço, proporcionando-lhe mais controlo sobre a sua operação. A diretiva supervised está definida como no por defeito. Como está a usar o Ubuntu, que utiliza o sistema init systemd, altere isto 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 precisas de fazer no ficheiro de configuração do Redis neste momento, por isso guarda-o e fecha-o quando terminares. Se usaste o nano para editar o ficheiro, faz isso premindo CTRL + X, Y e depois ENTER.

Em seguida, reinicie o serviço Redis para refletir as alterações feitas no ficheiro de configuração:

sudo systemctl restart redis.service

Com isso, instalou e configurou o Redis e ele está a correr no seu computador. Antes de começar a usá-lo, no entanto, é aconselhável verificar primeiro se o Redis está a funcionar correctamente.

Passo 2 — Testar o Redis

Como acontece com qualquer software recém-instalado, é uma boa ideia garantir que o Redis está a funcionar como esperado antes de fazer quaisquer alterações adicionais na sua configuração. Nesta etapa, vamos rever algumas formas de verificar se o Redis está a funcionar corretamente.

Comece por verificar se o serviço Redis está a funcionar:

sudo systemctl status redis

Se estiver a correr sem quaisquer erros, este comando irá produzir uma saída semelhante à seguinte:

● 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, pode ver que o Redis está em execução e já está ativado, o que significa que está configurado para iniciar sempre que o servidor arranca.

Nota: Esta configuração é desejável para muitos casos de uso comuns do Redis. No entanto, se preferir iniciar o Redis manualmente cada vez que o seu servidor arranca, pode configurar isto com o seguinte comando:

sudo systemctl disable redis

Para testar se o Redis está a funcionar corretamente, ligue-se ao servidor utilizando o redis-cli, o cliente de linha de comandos do Redis:

redis-cli

No prompt que se segue, teste a conectividade com o comando ping:

ping
PONG

Esta saída confirma que a ligação ao servidor ainda está activa. De seguida, verifique se é capaz de definir chaves executando:

set test "It's working!"
OK

Recupere o valor digitando:

get test

Assumindo que tudo esteja a funcionar, poderá recuperar o valor que armazenou:

"It's working!"

Após confirmar que consegue obter o valor, saia do prompt do Redis para voltar ao shell:

exit

Como teste final, vamos verificar se o Redis é capaz de persistir dados mesmo depois de ter sido interrompido ou reiniciado. Para isso, primeiro reinicie a instância do Redis:

sudo systemctl restart redis

Em seguida, ligue-se novamente com o cliente de linha de comandos:

redis-cli

E confirme que o seu valor de teste ainda está disponível

get test

O valor da sua chave ainda deve estar acessível:

"It's working!"

Saia novamente para o shell quando tiver terminado:

exit

Com isso, a sua instalação do Redis está totalmente operacional e pronta para ser utilizada. No entanto, algumas das suas configurações padrão são inseguras e podem oferecer oportunidades a atores maliciosos para atacar e aceder ao seu servidor e aos seus dados. Os passos restantes neste tutorial abordam métodos para mitigar estas vulnerabilidades, conforme recomendado pelo site oficial do Redis. Embora estes passos sejam opcionais e o Redis continue a funcionar caso decida não segui-los, é fortemente recomendado que os complete de forma a reforçar a segurança do seu sistema.

Passo 3 — Ligação ao localhost

Por defeito, o Redis só é acessível a partir do localhost. No entanto, se instalou e configurou o Redis seguindo um tutorial diferente deste, poderá ter atualizado o ficheiro de configuração para permitir ligações de qualquer lugar. Isto não é tão seguro como ligar apenas ao localhost.

Para corrigir isto, abra o ficheiro de configuração do Redis para edição:

sudo nano /etc/redis/redis.conf

Localize esta linha e certifique-se de que não está comentada (remova o # se existir):

bind 127.0.0.1 ::1

Guarde e feche o ficheiro quando terminar (prima CTRL + X, Y, e depois ENTER).

Em seguida, reinicie o serviço para garantir que o systemd leia as suas alterações:

sudo systemctl restart redis

Para verificar se esta alteração entrou em vigor, execute o seguinte comando netstat:

sudo netstat -lnp | grep redis
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 no seu sistema por defeito. Caso assim seja, pode instalá-lo (juntamente com várias outras ferramentas de rede úteis) com o seguinte comando:

sudo apt install net-tools

Esta saída mostra que o programa redis-server está ligado a localhost (127.0.0.1), refletindo a alteração que acabou de fazer no ficheiro de configuração. Se vir outro endereço IP nessa coluna (0.0.0.0, por exemplo), deve verificar novamente se desbloqueou a linha correta e reiniciar o serviço Redis novamente.

Agora que a sua instalação do Redis está a ouvir apenas em localhost, será mais difícil para atores mal-intencionados fazerem pedidos ou acederem ao seu servidor. No entanto, o Redis atualmente não está configurado para exigir que os utilizadores se autentiquem antes de fazer alterações à sua configuração ou aos dados que contém. Para corrigir isso, o Redis permite que exija que os utilizadores se autentiquem com uma palavra-passe antes de fazer alterações através do cliente Redis (redis-cli).

Passo 4 — Garantir o Redis com Listas de Controlo de Acesso (ACLs)

A partir do Redis 6, as Listas de Controlo de Acesso (ACLs) são o método preferido para gerir o acesso e as permissões dos utilizadores. As ACLs substituem a antiga diretiva requirepass por um sistema mais flexível que permite definir múltiplos utilizadores com palavras-passe distintas e permissões de comando.

Gerar uma Palavra-passe Segura

Primeiro, gere uma palavra-passe forte para o seu utilizador. Pode usar o comando openssl para criar uma string longa e aleatória.

openssl rand 60 | openssl base64 -A

Copie a saída, pois irá utilizá-la como a palavra-passe para o seu novo utilizador Redis.

A Configurar um Novo Utilizador

Agora, abra novamente o ficheiro de configuração do Redis.

sudo nano /etc/redis/redis.conf

Desloque-se até à secção ACL. Para criar um novo utilizador, irá adicionar uma diretiva user. Também é uma boa prática de segurança desativar o utilizador default, que por defeito não tem palavra-passe e possui permissões totais.

Adicione as seguintes linhas à sua configuração:

# Disable the default user.
user default off

# Create a new user with a strong password and full permissions.
user myuser on >your_generated_password ~* &* +@all

Aqui está uma explicação da nova regra para utilizadores:

  • myuser: O nome de utilizador.
  • on: Ativa o utilizador.
  • >your_generated_password: Define a palavra-passe do utilizador.
  • ~* &* +@all: Uma regra que permite ao utilizador executar todos os comandos (+@all) em todos os keyspaces (~*) e em todos os canais Pub/Sub (&*).

Guarde e feche o ficheiro, depois reinicie o Redis.

sudo systemctl restart redis.service

A verificar a configuração da ACL

Para verificar se as alterações funcionaram, tente ligar-se com redis-cli e executar um comando sem autenticação.

redis-cli ping

Porque o utilizador default está agora desativado, o Redis irá devolver um erro de autenticação.

NOAUTH Authentication required.

Isto confirma que o acesso não autenticado está bloqueado. Agora, teste o novo utilizador. Usar a opção --askpass é mais seguro do que digitar a senha diretamente, pois impede que a senha seja armazenada no historial do seu shell.

redis-cli --user myuser --askpass

Introduza a palavra-passe que gerou quando solicitado. Uma vez ligado, tente executar um comando.

ping

O Redis deve retornar PONG. A sua configuração de ACL está a funcionar corretamente.

Passo 5 — Encriptar as Comunicações do Redis com TLS

As ACLs protegem a sua instância Redis contra acessos não autorizados, mas não protegem os dados transmitidos numa rede. O TLS (Transport Layer Security) encripta este tráfego, evitando a escuta entre o cliente e o servidor.

Gerar Certificados TLS

Primeiro, crie um diretório para armazenar os seus certificados.

sudo mkdir /etc/redis/tls

Em seguida, use openssl para gerar uma autoridade certificadora (CA) autoassinada, uma chave de servidor e um certificado de servidor. Ser-lhe-á pedido para inserir informações (Nome do País, Nome da Organização, etc.).

# Generate CA Key and Certificate

sudo openssl genrsa -out /etc/redis/tls/ca.key 4096

sudo openssl req -x509 -new -nodes -key /etc/redis/tls/ca.key -sha256 -days 365 -out /etc/redis/tls/ca.crt



# Generate Server Key and Certificate Signing Request (CSR)

sudo openssl genrsa -out /etc/redis/tls/redis.key 2048

sudo openssl req -new -key /etc/redis/tls/redis.key -out /etc/redis/tls/redis.csr



# Sign the server certificate with the CA

sudo openssl x509 -req -in /etc/redis/tls/redis.csr -CA /etc/redis/tls/ca.crt -CAkey /etc/redis/tls/ca.key -CAcreateserial -out /etc/redis/tls/redis.crt -days 365 -sha256

Defina as permissões corretas para garantir que apenas o utilizador redis possa aceder a estes ficheiros sensíveis.

sudo chmod 640 /etc/redis/tls/*

sudo chown redis:redis /etc/redis/tls/*

Aviso: Certificados autoassinados são adequados para desenvolvimento, testes ou serviços internos onde pode distribuir de forma segura o certificado CA a todos os clientes. Para ambientes de produção a ligar através da internet pública, utilize certificados emitidos por uma Autoridade Certificadora (CA) de confiança, como o Let’s Encrypt.

Configurando o Redis para TLS

Abra o ficheiro de configuração do Redis.

sudo nano /etc/redis/redis.conf

Adicione ou modifique as seguintes linhas para ativar o TLS. A melhor prática é desativar a porta não encriptada definindo port 0 e usar apenas a porta com TLS ativado.

# Disable the non-encrypted TCP port.
port 0

# Enable the TLS port on the standard Redis port.
tls-port 6379

# Point to your certificate files.
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt

Guarde o ficheiro e reinicie o Redis.

sudo systemctl restart redis.service

A testar a ligação TLS

Para se ligar ao redis-cli, agora precisa de especificar os parâmetros TLS.

redis-cli --user myuser --askpass --tls --cacert /etc/redis/tls/ca.crt

Após a autenticação, a sua ligação ao Redis está totalmente encriptada.

Opcional: Configurar Mutual TLS (mTLS)

Para um nível de segurança ainda mais elevado, pode configurar TLS mútuo (mTLS), onde o cliente também deve apresentar um certificado válido ao servidor.

Primeiro, gere uma chave e um certificado de cliente, assinados pela sua CA.

# Generate client key and CSR

openssl genrsa -out client.key 2048

openssl req -new -key client.key -out client.csr



# Sign the client certificate with your CA

sudo openssl x509 -req -in client.csr -CA /etc/redis/tls/ca.crt -CAkey /etc/redis/tls/ca.key -CAcreateserial -out client.crt -days 365 -sha256

A seguir, ative a autenticação do cliente em /etc/redis/redis.conf.

tls-auth-clients yes

Reinicie o Redis. Agora, os clientes devem apresentar o seu certificado e chave para se conectarem.

redis-cli --user myuser --askpass --tls \

  --cacert /etc/redis/tls/ca.crt \

  --cert client.crt \

  --key client.key

Passo 6 — Configuração de Regras de Firewall e Acesso Remoto Seguro

Um firewall é uma camada crítica de segurança que restringe o tráfego de rede para o seu servidor. Por padrão, o Redis apenas escuta na interface de loopback local (127.0.0.1), pelo que não está exposto à internet pública. Se precisar de se ligar a partir de um servidor externo, deve configurar o Redis para escutar no seu IP público e definir regras de firewall rigorosas.

Aviso: Expor uma instância Redis diretamente à internet pública é um risco de segurança significativo. É fortemente recomendado utilizar alternativas mais seguras para acesso remoto.

Regras de Firewall para um Servidor Remoto

Se for necessário permitir ligações directas, utilize ufw para permitir o tráfego na porta TLS do Redis (6379) apenas a partir de um endereço IP específico e de confiança.

sudo ufw allow from your_trusted_ip/32 to any port 6379 proto tcp

Substitua your_trusted_ip pelo endereço IP estático do seu servidor de aplicações.

Certifique-se sempre de que a sua porta SSH está autorizada.

sudo ufw allow OpenSSH

Por fim, ative o firewall se ainda não estiver ativo.

sudo ufw enable

Alternativas mais seguras para acesso remoto

Em vez de abrir a porta do Redis para o mundo, considere estes métodos mais seguros:

  • VPN: Configure uma rede privada utilizando uma VPN como o WireGuard ou o OpenVPN. O seu servidor de aplicações e o servidor Redis podem então comunicar através de um canal seguro e privado, sem exposição pública.
  • Túnel SSH: Crie um túnel SSH encriptado a partir do seu computador cliente para o servidor Redis. Isto encaminha uma porta local no seu cliente para a porta do Redis no servidor através da ligação segura SSH.

Exemplo de criação de um túnel SSH:

ssh -L 8000:127.0.0.1:6379 user@your_redis_server_ip

Pode então ligar o seu cliente Redis local a localhost:8000, e o tráfego será encaminhado de forma segura para o servidor Redis.

Passo 7 — Aplicar Técnicas Adicionais de Endurecimento

Pode reforçar ainda mais a segurança da sua instância Redis com estas medidas adicionais.

Restringir Comandos com ACLs (A Abordagem Moderna)

Em vez de renomear comandos perigosos (uma prática mais antiga), use regras ACL para os restringir com base em cada utilizador. Isto proporciona um controlo mais granular e não compromete os clientes ou ferramentas de monitorização do Redis.

Por exemplo, para impedir que myuser utilize comandos que possam causar danos significativos (como FLUSHALL, DEBUG, SHUTDOWN), pode modificar a sua regra ACL removendo a categoria @all e adicionando outras mais específicas, ao mesmo tempo que bloqueia explicitamente comandos perigosos.

# Example of a more restrictive user
user myuser on >your_generated_password ~* &* +@read +@write +@connection -@dangerous -FLUSHALL

Esta regra permite ao utilizador executar comandos de leitura, escrita e de ligação, mas bloqueia explicitamente a categoria de comandos @dangerous e o comando FLUSHALL.

Renomeação de Comandos (Método Antigo - Não Recomendado)

A prática de renomear comandos é, em grande parte, obsoleta e deve ser evitada em favor das ACLs. Renomear comandos pode quebrar bibliotecas cliente, complicar a manutenção e causar problemas com persistência (AOF) e replicação.

Se encontrar um sistema a usar este método, os comandos são renomeados em /etc/redis/redis.conf da seguinte forma:

# rename-command FLUSHALL ""
# rename-command CONFIG MY_SECURE_CONFIG_COMMAND

Gestão de Memória e Segurança

Um atacante poderia tentar um ataque de Negação de Serviço (DoS) ao preencher a memória do seu servidor. Configure o Redis para definir um limite de memória para prevenir isto.

No /etc/redis/redis.conf, descomente e defina as diretivas maxmemory e maxmemory-policy:

maxmemory 2gb
maxmemory-policy allkeys-lru
  • maxmemory: Define um limite rígido para a quantidade de memória que o Redis pode usar.
  • maxmemory-policy: Indica ao Redis o que fazer quando o limite é atingido. allkeys-lru elimina as chaves menos usadas recentemente, sendo uma escolha comum para caches.

Configuração de Rede e Tempos de Espera

  • Sockets Unix: Para aplicações a correr na mesma máquina que o Redis, usar um socket Unix é mais seguro do que uma porta TCP porque contorna a pilha de rede. Ative-o em redis.conf:

    unixsocket /var/run/redis/redis.sock
    unixsocketperm 770

    Depois ligue-se com redis-cli -s /var/run/redis/redis.sock.

  • /etc/redis/redis.conf

  • Tempos de Inatividade: Fechar automaticamente as ligações inativas para libertar recursos e reduzir a superfície de ataque.

    timeout 300

    Isto irá fechar as ligações que estiverem inactivas durante 300 segundos.

  • /etc/redis/redis.conf

AppArmor

O Ubuntu inclui o AppArmor, um módulo de segurança que limita os programas a um conjunto restrito de recursos. O pacote redis-server vem com um perfil AppArmor predefinido que é ativado automaticamente.

Pode verificar o seu estado com:

sudo aa-status | grep redis

Este perfil fornece uma camada importante de defesa ao restringir o que o processo Redis pode fazer no sistema. Noutras distribuições Linux, como o CentOS, o SELinux serve um propósito semelhante.

Passo 8 — Monitorização da Atividade e dos Registos do Redis

Monitorizar regularmente os registos é importante para detectar erros, problemas de desempenho e atividades suspeitas.

Registos do Sistema

Pode visualizar os registos em tempo real geridos pelo systemd com o journalctl.

sudo journalctl -u redis-server.service -f

Fique atento a padrões como:

  • Um grande número de novas ligações provenientes de IPs desconhecidos.
  • Falhas de autenticação repetidas (NOAUTH).
  • Erros relacionados com comandos que você restringiu.

Para sistemas de produção, encaminhe estes registos para uma plataforma de registo centralizada (como uma stack ELK) para configurar alertas automáticos para padrões suspeitos.

Registo Lento do Redis

O registo lento do Redis regista consultas que excedem um tempo de execução especificado. É útil para identificar gargalos de desempenho e também pode ajudar a identificar comandos abusivos ou ineficientes dos clientes.

Ative-o em /etc/redis/redis.conf:

slowlog-log-slower-than 10000
slowlog-max-len 128
  • slowlog-log-slower-than: Regista comandos que demorem mais do que este valor em microssegundos (10000=10ms).
  • slowlog-max-len: O número máximo de entradas no registo lento.

Veja o registo lento com redis-cli:

redis-cli SLOWLOG GET

Passo 9 — Configurar a Persistência e os Backups do Redis

Por defeito, o Redis mantém todos os dados na memória. Os mecanismos de persistência guardam estes dados no disco, protegendo-os de serem perdidos caso o servidor reinicie.

Opções de Persistência

O Redis oferece dois principais modos de persistência:

  • RDB (Base de Dados Redis): Realiza instantâneos do seu conjunto de dados em pontos específicos no tempo, em intervalos definidos. Geralmente é mais rápido.
  • AOF (Ficheiro Apenas de Acrescentar): Regista todas as operações de escrita recebidas pelo servidor. Oferece maior durabilidade, mas pode resultar em ficheiros maiores.

Pode ativar um ou ambos em /etc/redis/redis.conf. A configuração por defeito ativa o RDB. Para ativar o AOF:

appendonly yes

Proteção de Ficheiros de Dados e Cópias de Segurança

Os ficheiros de dados do Redis (dump.rdb, appendonly.aof) são armazenados, por defeito, em /var/lib/redis/. Certifique-se de que esta diretoria e os seus ficheiros são propriedade do utilizador redis e não são legíveis por outros utilizadores.

sudo ls -l /var/lib/redis

Para a recuperação de desastres, deve fazer cópia de segurança destes ficheiros.

  • Armazenamento Seguro: Guarde as cópias de segurança num local seguro e remoto (como um bucket de armazenamento de objetos).
  • Criptografia: Encripte os seus ficheiros de backup utilizando uma ferramenta como gpg antes de os transferir para fora do servidor.
  • Teste de Recuperação: Teste regularmente os seus procedimentos de recuperação, restaurando uma cópia de segurança para um servidor de teste, para garantir que as cópias de segurança são válidas e que o processo funciona como esperado.

Perguntas Frequentes

1. Por que devo usar ACLs do Redis em vez do método antigo requirepass?

As Listas de Controlo de Acesso (ACLs) do Redis, introduzidas no Redis 6, são o padrão moderno para gerir permissões de utilizador. Ao contrário da única senha fornecida pelo requirepass, as ACLs permitem criar múltiplos utilizadores com senhas únicas e permissões detalhadas. Pode controlar quais os comandos que um utilizador pode executar, a quais chaves pode aceder e quais canais Pub/Sub pode utilizar. Este “princípio do menor privilégio” é uma prática de segurança fundamental, pois limita os danos potenciais que um atacante pode causar caso as credenciais de um único utilizador sejam comprometidas.

2. É seguro expor a minha instância Redis diretamente à internet pública?

Não, é fortemente desaconselhado. Expor o Redis diretamente, mesmo com uma senha e TLS, torna-o um alvo para ataques de força bruta e potenciais vulnerabilidades zero-day. Os métodos mais seguros para acesso remoto envolvem uma rede privada. Deveria usar uma VPN (como WireGuard ou OpenVPN) ou um túnel SSH para criar um canal seguro e encriptado entre o seu servidor de aplicações e a sua instância Redis, sem nunca expor a porta do Redis à Internet pública.

3. Qual é a diferença entre a persistência RDB e AOF, e qual devo usar?

Tanto o RDB como o AOF são métodos para guardar os seus dados do Redis em memória no disco.

  • RDB (Base de Dados Redis): Cria snapshots do seu conjunto de dados em pontos específicos no tempo, em intervalos definidos (por exemplo, a cada 5 minutos se houver pelo menos uma escrita). É geralmente mais rápido para criar backups e reiniciar o Redis.
  • AOF (Ficheiro Apenas de Acrescentamento): Regista cada operação de escrita recebida pelo servidor. Isto fornece uma durabilidade de dados muito melhor, pois corre-se o risco de perder, no máximo, um segundo de dados em caso de falha, mas os ficheiros de log podem tornar-se maiores.

Para a maioria dos casos de utilização em produção, é recomendado ativar ambos os métodos de persistência para obter os benefícios da durabilidade (AOF) e backups convenientes (RDB).

4. Como posso proteger o Redis de ficar sem memória?

Um atacante poderia lançar um ataque de Negação de Serviço (DoS) escrevendo dados continuamente até a memória do seu servidor se esgotar. Para prevenir isto, deve definir um limite de memória no seu ficheiro redis.conf usando a diretiva maxmemory (por exemplo, maxmemory 2gb). Deve também definir uma maxmemory-policy (como allkeys-lru) para indicar ao Redis como eliminar chaves uma vez atingido esse limite.

5. Devo renomear comandos perigosos do Redis por questões de segurança?

Renomear comandos é uma prática de segurança antiga que já não é recomendada. A abordagem moderna e mais eficaz é utilizar ACLs do Redis para restringir o acesso a comandos perigosos por utilizador. Renomear comandos é difícil de manter, pode quebrar bibliotecas de clientes e ferramentas de monitorização, e provoca complicações na replicação e na persistência AOF.

6. Tenho uma palavra-passe definida com ACLs. Porque é que também preciso de TLS?

ACLs e passwords protegem o seu servidor Redis de acessos não autorizados (autenticação), mas não protegem os dados enquanto estes viajam através da rede. Sem TLS (Transport Layer Security), todos os seus dados — incluindo comandos e respostas — são enviados em texto simples. Um atacante na rede poderia interceptar este tráfego para roubar informações sensíveis. O TLS encripta toda a ligação, garantindo que toda a comunicação entre o seu cliente e o servidor Redis é privada e segura.

7. Como posso monitorizar a minha instância Redis para atividades suspeitas?

Deves monitorizar tanto os registos do sistema como o log lento do Redis.

  • Registos do Sistema (journalctl -u redis-server.service): Verifique estes para um elevado número de tentativas de autenticação falhadas, ligações inesperadas de endereços IP desconhecidos ou erros relacionados com comandos bloqueados.
  • Registo Lento do Redis: Ative esta funcionalidade para registar consultas que demoram muito a ser executadas. Embora seja principalmente para otimização de desempenho, também pode revelar comandos abusivos ou mal escritos de um cliente comprometido que possam fazer parte de um ataque.

Para sistemas de produção, estes registos devem ser enviados para uma plataforma de registo centralizada, onde pode configurar alertas automáticos para estes padrões.

8. O que é o AppArmor e preciso configurá-lo para o Redis?

O AppArmor é um módulo de segurança do Linux incluído no Ubuntu que limita os programas a um conjunto restrito de recursos do sistema. O pacote redis-server vem com um perfil AppArmor pré-configurado que é ativado por defeito. Este perfil restringe os ficheiros e as capacidades de rede que o processo Redis pode aceder, fornecendo uma camada crítica de defesa caso um atacante descubra uma vulnerabilidade no próprio Redis. Para uma instalação padrão, não é necessária configuração adicional.

9. Como posso ligar-me de forma segura ao Redis a partir de uma aplicação no mesmo servidor?

Quando a sua aplicação e o Redis estão a correr na mesma máquina, o método de ligação mais seguro é um socket Unix, e não uma porta TCP. Um socket Unix é um ficheiro no sistema de ficheiros usado para comunicação entre processos, e evita completamente a pilha de rede. Isto é mais rápido e seguro porque está sujeito às permissões do sistema de ficheiros e não pode ser acedido a partir do exterior do servidor.

10. Configurei o TLS com certificados autoassinados. Isto está bem para produção?

Certificados autoassinados são aceitáveis para desenvolvimento, testes ou serviços internos onde é possível distribuir de forma segura a sua Autoridade Certificadora (CA) gerada por si a todos os clientes. No entanto, para aplicações que se ligam através da internet pública ou em ambientes de produção maiores e mais complexos, é fortemente recomendado utilizar certificados TLS emitidos por uma Autoridade Certificadora pública e de confiança, como a Let’s Encrypt. Isto simplifica a gestão de certificados e evita problemas de confiança com os clientes.

Conclusão

Neste tutorial, instalou e configurou o Redis, validou que a sua instalação do Redis está a funcionar corretamente e utilizou as suas funcionalidades de segurança integradas para torná-lo menos vulnerável a ataques de agentes maliciosos.

Tenha em mente que, uma vez que alguém esteja autenticado no seu servidor, é muito fácil contornar as funcionalidades de segurança específicas do Redis que implementámos. Portanto, a funcionalidade de segurança mais importante no seu servidor Redis é o seu firewall (que configurou se seguiu o tutorial inicial Pré-requisitos de Configuração do Servidor), pois isso torna extremamente difícil que atores maliciosos ultrapassem essa barreira.

Embora este guia o ajude a começar a instalar e proteger o Redis, recomendamos vivamente consultar a documentação oficial para uma maior segurança:

  • Administração do Redis
  • Segurança do Redis
  • Configuração do Redis

Obrigado por aprender com a comunidade Linux-Console.net.