Segurança do Redis

A configuração padrão do Redis é insegura. Esta lição aborda como proteger sua instância Redis.

Riscos de Segurança do Redis

Riscos da configuração padrão:

⚠️ Atenção: Expor o Redis à internet pública é muito perigoso! Houve ataques em larga escala ao Redis.

Autenticação por Senha

Definindo uma Senha (Antes do Redis 6.0)

CONF
# redis.conf
requirepass sua_senha_forte_aqui

Autenticando ao conectar:

REDIS
# Método 1: especificar senha na conexão
redis-cli -a sua_senha_forte_aqui

# Método 2: autenticar após conectar
redis-cli
AUTH sua_senha_forte_aqui
OK
⚠️ Observação: Usar o parâmetro -a na linha de comando expõe a senha no histórico de comandos — não recomendado.

Definindo Senha no Arquivo de Configuração

CONF
# redis.conf
requirepass "P@ssw0rd!2026#Redis"

Definindo Senha Dinamicamente

REDIS
CONFIG SET requirepass "nova_senha"
OK

# Reautenticação necessária
AUTH nova_senha
OK

Controle de Acesso ACL (Redis 6.0+)

Redis 6.0 introduziu ACL (Access Control List) para controle de permissão mais granular.

Visualizando Lista de Usuários

REDIS
ACL LIST
1) "user default on nopass ~* &* +@all"

Criando Usuários

REDIS
# Criar usuário com senha
ACL SETUSER alice on >password123 ~* +@all
OK

# Criar usuário somente leitura
ACL SETUSER bob on >password456 ~* +@read +@connection
OK

# Criar usuário com acesso a chaves específicas apenas
ACL SETUSER app on >apppass ~app:* +@all
OK

Sintaxe do Comando ACL

ACL SETUSER nome_usuario 
    on|off           # Habilitar ou desabilitar
    >senha           # Definir senha
    ~padrão          # Chaves permitidas (~* significa todas as chaves)
    &padrão          # Canais Pub/Sub permitidos
    +@categoria      # Permitir categoria de comando
    -@categoria      # Negar categoria de comando
    +comando         # Permitir comando específico
    -comando         # Negar comando específico

Categorias de Comando

Categoria Descrição Inclui
@all Todos os comandos Todos
@read Comandos de leitura GET, HGET, LRANGE, etc.
@write Comandos de escrita SET, HSET, LPUSH, etc.
@admin Comandos administrativos CONFIG, DEBUG, etc.
@dangerous Comandos perigosos FLUSHALL, SHUTDOWN, etc.
@connection Comandos de conexão AUTH, PING, QUIT, etc.
@string Comandos de string SET, GET, INCR, etc.
@hash Comandos de hash HSET, HGET, etc.
@list Comandos de lista LPUSH, LPOP, etc.
@set Comandos de conjunto SADD, SREM, etc.
@sortedset Comandos de conjunto ordenado ZADD, ZREM, etc.

Criando Usuários com Diferentes Permissões

REDIS
# Administrador: todas as permissões
ACL SETUSER admin on >admin123 ~* +@all

# Usuário somente leitura
ACL SETUSER readonly on >read123 ~* +@read +@connection

# Usuário de aplicação: só pode acessar chaves app:*
ACL SETUSER app on >app123 ~app:* +@all

# Usuário de estatísticas: somente leitura em chaves stats:*
ACL SETUSER stats on >stats123 ~stats:* +@read +@connection

# Usuário seguro: todos os comandos exceto admin e perigosos
ACL SETUSER safe on >safe123 ~* +@all -@admin -@dangerous

Visualizando Permissões do Usuário

REDIS
# Visualizar todos os usuários
ACL LIST

# Visualizar usuário específico
ACL GETUSER alice
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "hash_password"
5) "keys"
6) "~*"
7) "commands"
8) "+@all"

Deletando um Usuário

REDIS
ACL DELUSER alice
(integer) 1

Salvando Configuração ACL

REDIS
# Salvar configuração ACL em arquivo
ACL SAVE
OK

Especifique o arquivo ACL em redis.conf:

CONF
aclfile /etc/redis/users.acl

Renomeação de Comandos

Renomeie ou desabilite comandos perigosos.

Desabilitando Comandos

CONF
# redis.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
rename-command SHUTDOWN ""
rename-command KEYS ""

Renomeando Comandos

CONF
# Renomear comandos perigosos para nomes complexos
rename-command FLUSHALL "FLUSHALL_abc123xyz"
rename-command CONFIG "CONFIG_secret789"

Usando o comando renomeado:

REDIS
# Comando original não funciona mais
FLUSHALL
(error) ERR unknown command 'FLUSHALL'

# Usar o novo comando
FLUSHALL_abc123xyz
OK
💡 Caso de uso: Desabilitar ou renomear comandos perigosos para evitar operações acidentais ou ataques maliciosos.

Segurança de Rede

Vinculando Endereço IP

CONF
# redis.conf

# Acesso local apenas
bind 127.0.0.1

# Permitir IPs específicos
bind 127.0.0.1 192.168.1.100

# Permitir todos os IPs (perigoso!)
bind 0.0.0.0
⚠️ Atenção: bind 0.0.0.0 permite todos os IPs — você deve definir uma senha!

Modo Protegido

CONF
# redis.conf

# Habilitar modo protegido (padrão)
protected-mode yes

Comportamento do modo protegido:

Alterando a Porta

CONF
# Usar uma porta não padrão
port 6380
💡 Caso de uso: Usar uma porta não padrão reduz ataques automatizados de varredura.

Configuração de Firewall

BASH
# Linux iptables
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP

# CentOS firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="6379" accept'
firewall-cmd --reload

Criptografia TLS/SSL (Redis 6.0+)

Redis 6.0 suporta conexões criptografadas TLS.

Configurando TLS

CONF
# redis.conf
tls-port 6379
port 0  # Desabilitar porta não TLS

tls-cert-file /caminho/para/redis.crt
tls-key-file /caminho/para/redis.key
tls-ca-cert-file /caminho/para/ca.crt

tls-auth-clients optional
tls-protocols "TLSv1.2 TLSv1.3"

Conectando com TLS

BASH
redis-cli --tls --cert /caminho/para/client.crt --key /caminho/para/client.key --cacert /caminho/para/ca.crt

Melhores Práticas de Segurança

1. Definir uma Senha Forte

CONF
# Use uma senha forte (pelo menos 16 caracteres, mistura de maiúsculas, minúsculas, dígitos, caracteres especiais)
requirepass "Xk9#mP2$vL5@nQ8&wR4!"

2. Usar ACL para Controle de Permissão

REDIS
# Criar diferentes usuários para diferentes aplicações
ACL SETUSER webapp on >webpass ~web:* +@all
ACL SETUSER batch on >batchpass ~batch:* +@all
ACL SETUSER readonly on >readpass ~* +@read +@connection

3. Desabilitar Comandos Perigosos

CONF
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""

4. Restringir Acesso de Rede

CONF
bind 127.0.0.1
protected-mode yes

5. Usar um Firewall

BASH
# Permita apenas IPs específicos para acessar a porta Redis
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP

6. Auditoria Regular

REDIS
# Visualizar conexões atuais de clientes
CLIENT LIST

# Visualizar permissões de usuário
ACL LIST

# Visualizar comandos executados (use com cuidado)
MONITOR

Lista de Verificação de Segurança

□ Definir senha forte (requirepass ou ACL)
□ Vincular a IP interno (bind 127.0.0.1 ou IP interno)
□ Habilitar modo protegido (protected-mode yes)
□ Desabilitar comandos perigosos (FLUSHALL, CONFIG, etc.)
□ Usar firewall para restringir acesso
□ Usar porta não padrão
□ Atualizar versão do Redis regularmente
□ Monitorar conexões e comandos suspeitos
□ Usar ACL para permissões granulares (Redis 6.0+)
□ Considerar criptografia TLS (Redis 6.0+)

❓ Perguntas Frequentes

P Como funcionava o controle de acesso antes do Redis 6.0?
R Apenas requirepass estava disponível — todos os clientes compartilhavam a mesma senha e tinham as mesmas permissões.
P Como desabilito o comando KEYS?
R Use rename-command KEYS "" para desabilitá-lo, ou renomeie para um nome complexo.
P bind 0.0.0.0 é seguro?
R Não! Você também deve definir uma senha forte e firewall. É recomendado vincular apenas a IPs internos.
P Como evito que o Redis seja atacado?
R Defina uma senha forte, vincule a IP interno, desabilite comandos perigosos, use firewall e atualize regularmente.
P Como persisto a configuração ACL?
R Use ACL SAVE para escrever em um arquivo, ou especifique aclfile em redis.conf.

📖 Resumo

📝 Atividades

  1. Autenticação por senha: Defina uma senha Redis e teste conexões autenticadas
  2. Configuração ACL: Crie usuários com diferentes permissões (admin, somente leitura, usuário de aplicação)
  3. Desabilitação de comando: Desabilite os comandos FLUSHALL e CONFIG e verifique que não funcionam mais
  4. Verificação de segurança: Percorra a lista de verificação de segurança para sua configuração Redis

Próxima Lição

Na próxima lição, nós aprenderemos sobre Teste de Desempenho do Redis, abordando a ferramenta redis-benchmark.

100%