← Volver al listado de tecnologías

Seguridad en Valkey

Por: Artiko
valkeyseguridadacltlsautenticacion

Seguridad

Autenticación básica

Configurar contraseña

# valkey.conf
requirepass mi_password_seguro_123!
# Conectar con autenticación
valkey-cli -a mi_password_seguro_123!

# O autenticar después
valkey-cli
AUTH mi_password_seguro_123!

ACL (Access Control Lists)

Crear usuarios

# Ver usuarios
ACL LIST

# Usuario por defecto
ACL WHOAMI
# "default"

# Crear usuario con permisos específicos
ACL SETUSER app_user on >password123 ~app:* +@read +@write -@dangerous

# Desglose:
# on           - usuario activo
# >password123 - contraseña
# ~app:*       - acceso solo a claves "app:*"
# +@read       - comandos de lectura
# +@write      - comandos de escritura
# -@dangerous  - sin comandos peligrosos

Categorías de comandos

# Ver categorías disponibles
ACL CAT

# Ver comandos de una categoría
ACL CAT read
ACL CAT write
ACL CAT dangerous
ACL CAT admin

Categorías comunes:

Ejemplos de usuarios

# Usuario de solo lectura
ACL SETUSER readonly on >readonly123 ~* +@read -@all

# Usuario para cache
ACL SETUSER cache_user on >cache123 ~cache:* +GET +SET +DEL +EXPIRE

# Usuario admin
ACL SETUSER admin on >admin_secret ~* +@all

# Usuario para pub/sub
ACL SETUSER pubsub_user on >pubsub123 ~* +@pubsub

Gestión de ACL

# Ver permisos de usuario
ACL GETUSER app_user

# Modificar usuario
ACL SETUSER app_user +HGETALL

# Eliminar usuario
ACL DELUSER app_user

# Guardar ACL a archivo
ACL SAVE

# Cargar ACL desde archivo
ACL LOAD

Archivo ACL

# /etc/valkey/users.acl
user default off
user admin on >admin_password ~* +@all
user app on >app_password ~app:* +@read +@write
user readonly on >read_password ~* +@read
# valkey.conf
aclfile /etc/valkey/users.acl

TLS/SSL

Generar certificados

# Crear CA
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha256 -key ca.key \
    -days 3650 -subj "/CN=Valkey-CA" -out ca.crt

# Certificado del servidor
openssl genrsa -out valkey.key 2048
openssl req -new -sha256 -key valkey.key \
    -subj "/CN=valkey-server" -out valkey.csr
openssl x509 -req -sha256 -in valkey.csr \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -days 365 -out valkey.crt

# Certificado del cliente (opcional)
openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key \
    -subj "/CN=valkey-client" -out client.csr
openssl x509 -req -sha256 -in client.csr \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -days 365 -out client.crt

Configurar TLS

# valkey.conf
port 0
tls-port 6379

tls-cert-file /etc/valkey/tls/valkey.crt
tls-key-file /etc/valkey/tls/valkey.key
tls-ca-cert-file /etc/valkey/tls/ca.crt

# Requerir certificado de cliente
tls-auth-clients yes

# Cifrados permitidos
tls-ciphers DEFAULT:!MEDIUM

# Versión mínima de TLS
tls-protocols "TLSv1.2 TLSv1.3"

Conectar con TLS

valkey-cli --tls \
    --cert /etc/valkey/tls/client.crt \
    --key /etc/valkey/tls/client.key \
    --cacert /etc/valkey/tls/ca.crt

Configuración de red

# valkey.conf

# Solo escuchar en interfaces específicas
bind 127.0.0.1 192.168.1.100

# Desactivar si no necesitas acceso remoto
protected-mode yes

# Puerto personalizado
port 6380

# Timeout de conexiones inactivas
timeout 300

# Límite de clientes
maxclients 10000

Comandos peligrosos

Renombrar comandos

# valkey.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command DEBUG ""
rename-command CONFIG "CONFIG_b840fc02"
rename-command KEYS "KEYS_a1b2c3d4"

Deshabilitar comandos

# Deshabilitar completamente
rename-command SHUTDOWN ""
rename-command SLAVEOF ""

Buenas prácticas

Lista de verificación

#!/bin/bash
# security_check.sh

echo "=== Verificación de seguridad ==="

# 1. Contraseña configurada
if valkey-cli PING 2>&1 | grep -q "NOAUTH"; then
    echo "✓ Autenticación requerida"
else
    echo "✗ Sin autenticación"
fi

# 2. Protected mode
PROTECTED=$(valkey-cli CONFIG GET protected-mode | tail -1)
if [ "$PROTECTED" = "yes" ]; then
    echo "✓ Protected mode activo"
else
    echo "✗ Protected mode desactivado"
fi

# 3. Bind específico
BIND=$(valkey-cli CONFIG GET bind | tail -1)
if [ "$BIND" != "" ]; then
    echo "✓ Bind configurado: $BIND"
else
    echo "✗ Escuchando en todas las interfaces"
fi

Configuración recomendada

# valkey.conf - Producción segura

# Red
bind 127.0.0.1
protected-mode yes
port 6379
timeout 300

# Autenticación
requirepass "contraseña_muy_segura_y_larga_2024!"

# ACL
aclfile /etc/valkey/users.acl

# TLS (si es necesario)
tls-port 6380
tls-cert-file /etc/valkey/tls/server.crt
tls-key-file /etc/valkey/tls/server.key

# Comandos peligrosos
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command DEBUG ""
rename-command KEYS "KEYS_interno_12345"

# Límites
maxclients 5000
maxmemory 2gb
maxmemory-policy allkeys-lru

Conexión segura desde aplicaciones

Python

import valkey
import ssl

# Con contraseña
r = valkey.Valkey(
    host='localhost',
    port=6379,
    password='mi_password',
    decode_responses=True
)

# Con TLS
r = valkey.Valkey(
    host='localhost',
    port=6379,
    password='mi_password',
    ssl=True,
    ssl_certfile='client.crt',
    ssl_keyfile='client.key',
    ssl_ca_certs='ca.crt'
)

# Con usuario específico
r = valkey.Valkey(
    host='localhost',
    port=6379,
    username='app_user',
    password='app_password'
)

Node.js

import { createClient } from 'valkey';

// Con contraseña
const client = createClient({
    url: 'valkey://:password@localhost:6379'
});

// Con TLS
const secureClient = createClient({
    url: 'valkeys://localhost:6379',
    password: 'mi_password',
    socket: {
        tls: true,
        ca: fs.readFileSync('ca.crt'),
        cert: fs.readFileSync('client.crt'),
        key: fs.readFileSync('client.key')
    }
});

// Con usuario
const userClient = createClient({
    username: 'app_user',
    password: 'app_password',
    url: 'valkey://localhost:6379'
});

Auditoría

# Habilitar log de comandos
valkey-cli CONFIG SET slowlog-log-slower-than 0

# Ver comandos ejecutados
SLOWLOG GET 10

# Monitor en tiempo real (solo desarrollo)
MONITOR

Ejercicios

  1. Configura ACL con 3 usuarios de diferentes permisos
  2. Implementa TLS para conexiones cifradas
  3. Crea un script de auditoría de seguridad

Resumen