← Volver al listado de tecnologías
Seguridad en Valkey
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:
@read: GET, MGET, HGET, LRANGE…@write: SET, DEL, HSET, LPUSH…@dangerous: FLUSHALL, DEBUG, KEYS…@admin: CONFIG, ACL, SHUTDOWN…@pubsub: SUBSCRIBE, PUBLISH…
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
- Configura ACL con 3 usuarios de diferentes permisos
- Implementa TLS para conexiones cifradas
- Crea un script de auditoría de seguridad
Resumen
requirepasspara autenticación básica- ACL para control granular de permisos
- TLS para cifrado de conexiones
rename-commandpara ocultar comandos peligrososbindyprotected-modepara seguridad de red