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

Se você roda Laravel e Redis na sua própria infraestrutura, eu usoVultr.Link patrocinado. Novos clientes elegíveis podem receber até US$ 300 em crédito promocional.

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.