Skip to content

Configurar Redis com Certificados TLS no Laravel: Um Guia Completo de Segurança

Introdução

Redis é um poderoso armazenamento de estruturas de dados em memória amplamente usado para cache, armazenamento de sessões e filas de mensagens em aplicações Laravel. Por padrão, conexões Redis não são criptografadas, o que representa riscos de segurança ao transmitir dados sensíveis. Implementar TLS (Transport Layer Security) com certificados assinados garante que todos os dados transmitidos entre sua aplicação Laravel e o servidor Redis sejam criptografados e seguros.

Este guia irá levá-lo através do processo completo de configuração do Redis com certificados TLS no Laravel, incluindo manipulação de certificados, configuração e melhores práticas para ambientes de produção.

Pré-requisitos

Antes de começar, certifique-se de ter:

  • Aplicação Laravel (versão 8.0 ou superior recomendada)
  • Servidor Redis com suporte TLS habilitado
  • Arquivo de certificado CA do seu provedor Redis
  • Acesso aos arquivos de configuração do seu projeto Laravel
  • Compreensão básica de conceitos SSL/TLS

Passo 1: Obter seu Certificado TLS Redis

Primeiro, você precisa obter o certificado CA do seu provedor Redis. Isso pode ser:

  • Provedores de nuvem: AWS ElastiCache, Google Cloud Memorystore, Azure Cache para Redis
  • Serviços Redis gerenciados: Redis Cloud, Upstash, etc.
  • Redis auto-hospedado: Seu próprio certificado CA

Salve o arquivo de certificado (geralmente com extensão .crt ou .pem) - você precisará dele nos próximos passos.

Passo 2: Armazenar o Certificado com Segurança

Crie um diretório dedicado para certificados dentro da pasta storage da sua aplicação Laravel:

bash
mkdir -p storage/app/certs

Copie seu certificado CA para este diretório:

bash
cp /caminho/para/seu/ca-certificate.crt storage/app/certs/ca-certificate.crt

Nota de Segurança

Nunca commite arquivos de certificados no seu sistema de controle de versão se eles contiverem informações sensíveis. Para certificados CA públicos, isso geralmente é seguro, mas sempre verifique com sua equipe de segurança.

Passo 3: Atualizar .gitignore (Opcional)

Se seus certificados contiverem informações sensíveis, adicione-os ao seu arquivo .gitignore:

gitignore
# Arquivos de certificados (se sensíveis)
storage/app/certs/*.key
storage/app/certs/*.p12
# Manter arquivos .crt rastreados se forem certificados CA públicos

Passo 4: Configurar Variáveis de Ambiente

Adicione as seguintes variáveis de configuração Redis TLS ao seu arquivo .env:

bash
# Configuração Redis
REDIS_HOST=seu-redis-host.com
REDIS_USERNAME=seu-usuario
REDIS_PASSWORD=sua-senha
REDIS_PORT=6380
REDIS_PREFIX=sua_app_database_

# Configuração TLS
REDIS_SCHEME=tls
REDIS_VERIFY_PEER=true
REDIS_VERIFY_PEER_NAME=true

Atualize seu arquivo .env.example para incluir essas variáveis:

bash
# Redis
REDIS_HOST=127.0.0.1
REDIS_USERNAME=
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_PREFIX=localhost_database_
REDIS_SCHEME=tcp
REDIS_VERIFY_PEER=false
REDIS_VERIFY_PEER_NAME=false

Passo 5: Atualizar Configuração do Redis

Modifique seu arquivo config/database.php para incluir suporte TLS. Atualize a seção de configuração Redis:

php
'redis' => [
    'client' => env('REDIS_CLIENT', 'phpredis'),

    'options' => [
        'cluster' => env('REDIS_CLUSTER', 'redis'),
        'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        'scheme' => env('REDIS_SCHEME', 'tcp'),
        'ssl' => [
            'verify_peer' => env('REDIS_VERIFY_PEER', true),
            'verify_peer_name' => env('REDIS_VERIFY_PEER_NAME', true),
            'cafile' => storage_path('app/certs/ca-certificate.crt'),
        ],
    ],

    'default' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'username' => env('REDIS_USERNAME'),
        'password' => env('REDIS_PASSWORD'),
        'port' => env('REDIS_PORT', '6379'),
        'database' => env('REDIS_DB', '0'),
    ],

    'cache' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'username' => env('REDIS_USERNAME'),
        'password' => env('REDIS_PASSWORD'),
        'port' => env('REDIS_PORT', '6379'),
        'database' => env('REDIS_CACHE_DB', '1'),
    ],
],

Passo 6: Testar a Conexão

Crie um teste simples para verificar se sua conexão Redis TLS está funcionando:

php
// Em um controller ou sessão tinker
use Illuminate\Support\Facades\Redis;

try {
    Redis::set('test_key', 'Olá, Redis seguro!');
    $value = Redis::get('test_key');

    if ($value === 'Olá, Redis seguro!') {
        echo "✅ Conexão Redis TLS bem-sucedida!\n";
    }
} catch (Exception $e) {
    echo "❌ Conexão Redis falhou: " . $e->getMessage() . "\n";
}

Execute este teste usando Laravel Tinker:

bash
php artisan tinker

Em seguida, execute o código de teste acima.

Opções de Configuração Explicadas

Opções SSL/TLS

  • verify_peer: Quando true, verifica o certificado do peer contra o certificado CA
  • verify_peer_name: Quando true, verifica se o nome comum do certificado do peer corresponde ao hostname
  • cafile: Caminho para o arquivo de certificado CA para verificação

Variáveis de Ambiente

  • REDIS_SCHEME: Definir como tls para conexões criptografadas, tcp para não criptografadas
  • REDIS_VERIFY_PEER: Habilitar/desabilitar verificação de certificado do peer
  • REDIS_VERIFY_PEER_NAME: Habilitar/desabilitar verificação de hostname

Solucionando Problemas Comuns

Timeouts de Conexão

Possíveis causas:

  • Firewall bloqueando porta TLS
  • Configuração de porta incorreta
  • Problemas de conectividade de rede

Solução: Verificar conectividade de rede e configuração de portas.

Melhores Práticas de Segurança

  1. Sempre usar TLS em ambientes de produção
  2. Manter certificados atualizados e monitorar datas de expiração
  3. Usar configurações de verificação fortes (verify_peer=true, verify_peer_name=true)
  4. Restringir permissões de arquivos de certificados para somente leitura pelo servidor web
  5. Auditar regularmente sua configuração de segurança Redis
  6. Usar usuários Redis dedicados com permissões mínimas necessárias

Conclusão

Implementar certificados TLS para conexões Redis no Laravel melhora significativamente a postura de segurança da sua aplicação ao criptografar todos os dados em trânsito. Embora a configuração exija configuração cuidadosa e gerenciamento de certificados, os benefícios de segurança tornam isso essencial para aplicações de produção que lidam com dados sensíveis.

A abordagem de configuração demonstrada neste guia fornece uma configuração flexível e consciente do ambiente que pode se adaptar a diferentes cenários de implementação mantendo as melhores práticas de segurança. Monitoramento regular e manutenção da sua configuração TLS garantirão operação segura contínua das suas conexões Redis.

Lembre-se de testar completamente em seu ambiente de staging antes de implementar em produção, e sempre tenha um plano de rollback em caso de problemas de conectividade durante a implementação.