/blog · publicaciones técnicas14 entradas · vídeos & notas largas

Cómo se rompen y se reparan los sistemas reales.

Material publicado en colaboración con Cardano Castellano, Techne Secure y notas propias de investigación. Lectura larga, sin humo.

// featured

id001
topicBlockchain
sourceCardano Castellano
kindvideo
date2024 · 10
read12 min
Blockchain

Ciberseguridad en Cardano: protegiendo datos on-chain

Vectores de ataque críticos en infraestructuras de registros distribuidos y cómo la arquitectura UTxO mitiga riesgos de concurrencia e inyecciones maliciosas.

ver en Cardano Castellano
Ponencia sobre Ciberseguridad y Cardano
Ponencia sobre Ciberseguridad y Cardano

Por qué Cardano cambia el modelo de amenaza

La mayor parte de la literatura de seguridad blockchain está escrita para máquinas de estados globales tipo Ethereum, donde cada transacción muta una variable compartida. Cardano hereda el modelo UTxO de Bitcoin y lo extiende con datums y scripts (eUTxO). Esto altera la superficie de ataque de raíz: no existe una variable global a la que un atacante pueda hacer race-condition, y la validación es determinista en el lado del cliente antes de enviar la transacción.

Esto elimina por construcción familias enteras de bugs — reentrancy, front-running clásico sobre balances mutables, doble contabilización — pero introduce otras: concurrencia entre transacciones que consumen el mismo UTxO, diseño incorrecto de datums, y validadores Plutus mal acotados que provocan DoS por saturación de presupuesto de ejecución.

Vectores reales observados en auditoría

Durante revisiones sobre nodos y dApps Plutus he visto cuatro patrones recurrentes. Primero, validadores que asumen un único UTxO de entrada cuando la transacción puede agrupar múltiples — lo que abre robos de fondos si el ScriptContext no se verifica de forma estricta. Segundo, datums sin esquema versionado que rompen compatibilidad y dejan UTxOs huérfanos. Tercero, métricas y RPC expuestos en validators sin autenticación, lo que permite enumerar la topología. Cuarto, gestión laxa de claves de pago (payment.skey) en pipelines CI sin HSM.

Hardening operativo de un stake pool

El bloque productor nunca debe ser accesible desde Internet. La topología recomendada es: 2-3 nodos relay en VPCs distintas con firewall stateful, productor en red privada accesible sólo por túnel WireGuard mutuo, y monitorización con Prometheus + Loki en un cuarto nodo bastión.

En el plano de claves: KES rotadas dentro del ciclo definido por el protocolo, cold keys offline en hardware dedicado (idealmente YubiHSM2 o Ledger), y firma de certificados de operador hecha en una máquina air-gapped. Todo lo demás es deuda de seguridad esperando explotación.

Checklist mínimo para una dApp Plutus

Antes de ir a mainnet exijo que el equipo demuestre: tests de propiedad sobre el validador (no sólo casos felices), límites explícitos al tamaño del datum, control de la lista completa de entradas y salidas en ScriptContext, presupuesto de ejecución medido bajo carga realista, y un plan de recuperación si un UTxO queda bloqueado por bug del validador. Sin esos cinco puntos, la dApp no está lista para custodiar valor real.

// archive · lectura completa

002
Seguridad
sourceTechne Secure
date2024 · 06
read10 min
ver en Techne Secure

Análisis de vectores de entrada y seguridad de nodos

Sesión metodológica sobre perímetros de red expuestos en validadores y pautas de mitigación ante amenazas de denegación de servicio a nivel de protocolo.

Sesión de pentesting con Kali Linux — Techne Secure
Sesión de pentesting con Kali Linux — Techne Secure

Modelo de amenaza para un nodo de consenso

Un nodo validador combina tres planos que normalmente se diseñan por separado: red P2P, almacenamiento de cadena y firma criptográfica. Un atacante puede aspirar a degradar cualquiera de ellos. Saturar el plano P2P con pares maliciosos provoca eclipse attacks; saturar el almacenamiento con bloques mal formados fuerza re-validación costosa; comprometer el plano de firma equivale a comprometer la identidad del validador.

Superficies de exposición típicas

En auditorías recurrentes encuentro RPC JSON sin allowlist, métricas Prometheus expuestas en 0.0.0.0:9100 sin TLS mutuo, SSH con autenticación por contraseña y puertos de gossip aceptando peers no firmados. Cualquiera de estos puntos es suficiente para construir una cadena de explotación.

El primer ejercicio que pido al cliente es un escaneo externo desde fuera de su VPC. Casi siempre aparece más superficie de la documentada — agentes de observabilidad heredados, paneles internos olvidados, balanceadores con políticas permisivas.

Mitigaciones que funcionan en producción

Segmentar el nodo productor detrás de relays dedicados, aplicar rate limiting por IP y por par criptográfico, exigir mTLS para todo plano de control, y firmar las release binarias del nodo con sigstore. Para DoS a nivel de protocolo, lo que mejor funciona es presupuesto de CPU/IO por par y desconexión agresiva de peers que excedan un umbral de mensajes malformados.

Y monitorización con alertas que tengan sentido operativo: tiempo desde el último bloque adoptado, profundidad de mempool, ratio de forks observados. Métricas que un humano puede accionar a las 03:00, no dashboards con cien series irrelevantes.

003
Cloud Security
sourceNotas de campo
date2024 · 04
read14 min

Hardening empresarial de Kubernetes y AWS en producción

Configuraciones esenciales para aislar pods, mitigar escaladas de privilegios en Service Accounts y auditoría automatizada de políticas IAM restrictivas.

El error más común: confiar en el default

Un cluster EKS recién creado con la configuración por defecto no es seguro para producción. El Service Account default monta su token automáticamente en cada pod, el PodSecurityPolicy ya no existe, y la mayoría de equipos pasan directamente a desplegar workloads sin definir un PodSecurityStandard, NetworkPolicies ni un OPA/Kyverno mínimo.

Ese pod compromisible — un sidecar de logs vulnerable, una imagen base con CVE conocido — se convierte en pivote dentro del cluster en cuestión de minutos. Y desde ahí, si el IRSA está mal acotado, el atacante salta al plano AWS con permisos que nadie revisó.

Aislamiento de pods que sí aguanta una auditoría

Cuatro controles mínimos: runAsNonRoot con un UID estable, readOnlyRootFilesystem siempre que el workload lo permita, seccompProfile RuntimeDefault, y allowPrivilegeEscalation: false. Sobre esa base, NetworkPolicies default-deny por namespace y egress controlado a una lista cerrada de destinos. Sin esto, hablar de Zero Trust dentro del cluster es marketing.

apiVersion: v1
kind: Pod
spec:
  automountServiceAccountToken: false
  securityContext:
    runAsNonRoot: true
    runAsUser: 10001
    seccompProfile: { type: RuntimeDefault }
  containers:
    - name: app
      image: registry.internal/app@sha256:...
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities: { drop: ["ALL"] }

IRSA bien hecho

El patrón correcto es: un Service Account por workload, un IAM Role por Service Account, y una política con acciones explícitas — nunca Action: "*". El trust policy del rol debe restringir el sub a system:serviceaccount:<ns>:<sa>, y la política debe acotar Resource con ARNs concretos, no con comodines de cuenta.

Un escaneo trimestral con AWS IAM Access Analyzer y prowler --compliance cis_2.0_aws debería ser parte del pipeline, no una tarea anual.

Detección que importa

CloudTrail con eventos de gestión y de datos habilitados, GuardDuty con findings enviados a un EventBridge bus dedicado, y reglas de detección sobre acciones IAM sensibles: CreateAccessKey, AttachUserPolicy, AssumeRole desde IPs fuera de la lista corporativa. En el cluster, Falco con un ruleset adaptado al negocio — no el default — y exfiltración bloqueada por defecto a nivel de NetworkPolicy.

004
DeFi
sourceInvestigación
date2024 · 02
read15 min

Patrones comunes de vulnerabilidades en smart contracts Solidity

Revisión de fallos clásicos detectados en auditorías reales: reentrada, desbordamiento matemático controlado y manipulación de oráculos de precio.

Función Solidity sendEtherTo — patrón require para transferencia segura
Función Solidity sendEtherTo — patrón require para transferencia segura

Reentrancy todavía existe en 2025

A pesar de quince años de literatura, sigo encontrando reentrancy explotables en auditorías nuevas. La razón es que el patrón clásico (call externo antes de actualizar estado) ha mutado: hoy aparece en hooks ERC-777, en callbacks de flash-loans, y especialmente en cross-function reentrancy donde la víctima no es la misma función que hace el call.

La defensa estructural es Checks-Effects-Interactions estricto y, cuando el flujo lo permite, un ReentrancyGuard. Pero más importante: modelar explícitamente qué funciones comparten estado y cuáles pueden ser reentrantes entre sí.

// MAL
function withdraw(uint amount) external {
    require(balances[msg.sender] >= amount);
    (bool ok,) = msg.sender.call{value: amount}("");
    require(ok);
    balances[msg.sender] -= amount; // tarde
}

// BIEN
function withdraw(uint amount) external nonReentrant {
    require(balances[msg.sender] >= amount);
    balances[msg.sender] -= amount;          // effects
    (bool ok,) = msg.sender.call{value: amount}(""); // interaction
    require(ok, "transfer failed");
}

Oráculos: el vector más rentable

La mayoría de explotaciones de ocho cifras de los últimos dos años no han sido bugs de lógica del contrato auditado, sino manipulación de la fuente de precio que ese contrato consultaba. Un Uniswap V2 spot price es trivialmente manipulable dentro del mismo bloque mediante flash-loan; usarlo como referencia para liquidaciones es entregar el protocolo.

La regla: TWAP de ventana suficientemente amplia, o feeds Chainlink con validación de staleness (block.timestamp - updatedAt < heartbeat) y de desviación contra una segunda fuente. Nunca un único oráculo, nunca precio instantáneo de un AMM para decisiones financieras.

Aritmética: Solidity 0.8 no es una bala de plata

El built-in overflow check de 0.8 cubre el caso obvio, pero no protege contra pérdida de precisión por divisiones prematuras, ni contra rounding direction equivocado en favor del usuario en lugar del protocolo. En vaults y curvas de bonding, el orden de operaciones decide quién gana micro-arbitrajes acumulados a lo largo de millones de transacciones.

Regla operativa: multiplicar antes de dividir, redondear siempre en contra del usuario en operaciones de mint/redeem, y testear con fuzzing — Foundry y Echidna deberían formar parte del ciclo, no de la auditoría final.

Lo que un auditor mira primero

Antes de leer una línea de lógica reviso: control de acceso (¿hay onlyOwner sobre funciones que mueven valor?), inicialización (¿hay riesgo de re-init en proxies?), pausabilidad y planes de upgrade, y el grafo de llamadas externas. Si esos cuatro puntos están bien, la auditoría se vuelve productiva. Si están mal, no hace falta leer más para emitir un informe accionable.

005
SecOps
sourceNotas de campo
date2025 · 01
read9 min

Hardening de entornos n8n enterprise: el perímetro oculto

Análisis exhaustivo de superficies de ataque en integraciones de automatización en la nube. Configuración segura de webhooks y encriptación de credenciales.

Beneficios de un negocio que cuenta con ciberseguridad — Techne Secure
Beneficios de un negocio que cuenta con ciberseguridad — Techne Secure

Por qué n8n se convierte en un objetivo de alto valor

Una instancia de n8n productiva acumula credenciales hacia decenas de SaaS: Slack, GitHub, AWS, Stripe, bases de datos, CRM. Comprometer el host equivale a comprometer todo ese set de integraciones a la vez. Y, sin embargo, la mayoría de despliegues que reviso están detrás de un Cloudflare Tunnel sin autenticación adicional, con N8N_ENCRYPTION_KEY en un .env versionado y webhooks públicos sin validación de firma.

Controles mínimos no negociables

Autenticación SSO obligatoria delante de la UI (Cloudflare Access, Authentik o similar), N8N_ENCRYPTION_KEY rotada y custodiada en un secret manager (no en variables de entorno persistidas), base de datos externa con TLS, y ejecución de workflows en modo queue con workers aislados por red del scheduler.

Para webhooks expuestos: firma HMAC obligatoria validada en el primer nodo del workflow, allowlist de IPs cuando el proveedor lo permite, y rate limiting en la capa de ingreso. Un webhook sin firma es una RPC anónima sobre tu infraestructura.

Aislamiento de workflows

El nodo Execute Command y el nodo Code en modo unrestricted son RCE por diseño cuando los usa un operador con acceso a la UI. En entornos multi-equipo desactivo ambos a nivel de instancia y obligo a que cualquier integración custom pase por un nodo HTTP contra un microservicio interno auditado, donde la lógica vive en un repo con revisión de código y firma de imagen.

006
Sysadmin
sourceNotas de campo
date2013 · 05
read11 min

Bastionado de servidores Linux en producción: del default a CIS

Guía operativa para endurecer un servidor Debian/CentOS recién provisionado siguiendo controles del CIS Benchmark, con énfasis en SSH, auditd y módulos del kernel.

Estación de trabajo con terminal Kali — bastionado y auditoría de servidores
Estación de trabajo con terminal Kali — bastionado y auditoría de servidores

El problema con la imagen por defecto

Una instalación limpia de Debian o CentOS deja activos servicios, módulos del kernel y permisos que no son aceptables para un servidor expuesto. rpcbind escuchando en todas las interfaces, /tmp sin noexec, módulos como cramfs, freevxfs, jffs2 o usb-storage cargables a demanda y SSH aceptando root con contraseña son la norma, no la excepción.

El primer paso disciplinado es ejecutar un baseline contra CIS Benchmark — entonces con Bastille y lynis, hoy con OpenSCAP — y tratar cada desviación como un ticket. La mayoría se resuelve con un puñado de cambios en /etc/ssh/sshd_config, /etc/sysctl.conf, /etc/security/limits.conf y un par de unit files de systemd.

SSH: el único puerto que debería estar abierto

Reglas no negociables: PermitRootLogin no, PasswordAuthentication no, AllowUsers acotado a la cuenta operativa, MaxAuthTries 3, LoginGraceTime 20, y Protocol 2 explícito. Las claves del cliente, ed25519 — RSA de 2048 ya no se considera prudente para nuevos despliegues.

Sobre esa base, fail2ban con jail específico para sshd y un puerto no estándar reducen el ruido de los logs en uno o dos órdenes de magnitud. No es seguridad por oscuridad — es economía operativa: menos eventos para auditar.

# /etc/ssh/sshd_config
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers ops
MaxAuthTries 3
LoginGraceTime 20
ClientAliveInterval 300
ClientAliveCountMax 0
X11Forwarding no
AllowTcpForwarding no

auditd, sysctl y particiones

auditd con un ruleset que cubra ejecuciones bajo /tmp, modificaciones a /etc/passwd, /etc/shadow, /etc/sudoers y carga de módulos del kernel. /tmp, /var/tmp y /home montados con nodev, nosuid y noexec donde el workload lo permita. En sysctl: kernel.randomize_va_space=2, net.ipv4.conf.all.rp_filter=1, net.ipv4.tcp_syncookies=1 y desactivación de redirects ICMP. Son cambios baratos que cierran clases completas de ataques.

007
Networking
sourceNotas de campo
date2014 · 09
read10 min

Construcción de un perímetro defensivo con pfSense y Snort

Diseño práctico de un firewall perimetral en una pyme: segmentación VLAN, IDS inline con Snort, OpenVPN para acceso remoto y políticas de egress por defecto cerradas.

Techne Secure — perímetro defensivo y consultoría de redes
Techne Secure — perímetro defensivo y consultoría de redes

Topología mínima viable

Tres VLANs como punto de partida: LAN corporativa, servidores internos (DMZ interna) y wifi de invitados, cada una con su propio rango y reglas. El error común es tratar el firewall como puerta de entrada y dejar el tráfico este-oeste sin control. En una pyme real, el 80% del riesgo está en el tráfico interno: portátiles infectados, impresoras con firmware sin parchear, dispositivos IoT olvidados.

Reglas por defecto cerradas, también hacia fuera

Egress allowlist por VLAN es el cambio que más reduce impacto de incidentes. La mayoría de malware necesita salir a un C2 por HTTPS arbitrario; si la VLAN de servidores sólo puede hablar contra repositorios de paquetes y endpoints internos, ese vector se cierra. Para usuarios, proxy explícito con categorización y registro.

Snort en modo inline en la interfaz WAN con el ruleset Emerging Threats y un ajuste periódico para reducir falsos positivos. Sin ese ajuste, el operador deja de mirar las alertas en una semana — y entonces no sirve para nada.

Acceso remoto: OpenVPN, no port-forward

Cualquier RDP, SSH o panel administrativo expuesto a Internet acaba en una botnet. La regla en una pyme es: cero servicios administrativos públicos, acceso remoto sólo por OpenVPN con certificados por usuario, MFA opcional con Google Authenticator, y revocación inmediata cuando un empleado deja la compañía. Es mucho más barato que limpiar un ransomware.

008
Sysadmin
sourceNotas de campo
date2015 · 11
read13 min

Diseño de una infraestructura LAMP de alta disponibilidad

Arquitectura de referencia para servir aplicaciones PHP críticas: Apache/Nginx detrás de HAProxy, replicación MySQL maestro-réplica, GlusterFS para archivos compartidos y monitorización con Nagios.

Capas y responsabilidades

Una pila LAMP en alta disponibilidad razonable se compone de cuatro capas independientes: balanceo (HAProxy o keepalived + nginx), aplicación (Apache/PHP-FPM en N nodos sin estado), base de datos (MySQL con replicación maestro-réplica y promoción automática mediante MHA o orchestrator) y almacenamiento compartido para uploads (GlusterFS o NFS con DRBD). Cada capa debe poder perder un nodo sin que el servicio se degrade más allá de lo aceptable.

Sesiones, caché y el error de la afinidad

Configurar el balanceador con sticky sessions parece una solución sencilla, pero ata la disponibilidad al nodo concreto. Las sesiones PHP deben ir a un almacén externo — Redis o Memcached con replicación — y el balanceo puede entonces ser puramente round-robin con health-check. Lo mismo para caché de aplicación: APCu por nodo está bien para opcode, pero la caché de datos debe ser compartida.

Monitorización útil para guardias nocturnas

Nagios o Zabbix con checks que reflejen la salud del servicio, no sólo de los procesos: latencia HTTP percentil 95, número de conexiones activas en MySQL, lag de replicación, espacio libre en /var/log, y un health-check sintético que simule un login real. Una guardia útil se mide por cuántas alertas requieren acción humana real — debería tender a cero si el sistema está bien dimensionado.

009
DevOps
sourceNotas de campo
date2016 · 06
read10 min

De cron y bash a Ansible: automatización idempotente de servidores

Por qué los scripts bash dejaron de escalar a partir de la tercera máquina y cómo modelar la infraestructura con Ansible: roles, inventarios, vault y ejecución segura desde un nodo de control.

El punto de inflexión

Una flota de tres servidores se puede gestionar con bash y SSH. A partir del cuarto, los scripts empiezan a divergir: una máquina tiene la versión vieja de un parche, otra olvida un usuario, otra mantiene un cron que ya nadie recuerda haber añadido. La salida disciplinada es declarar el estado deseado, no las acciones, y ejecutarlo de forma idempotente.

Organización de roles e inventario

Un layout que envejece bien: inventories/{prod,staging}/hosts.ini con group_vars por entorno, roles/ con un rol por responsabilidad (common, ssh, mysql, nginx, app) y playbooks de alto nivel que sólo componen roles. Las credenciales viven en ansible-vault con la clave fuera del repositorio; cualquier secreto en texto plano en un playbook es un incidente esperando a ocurrir.

# site.yml
- hosts: web
  become: true
  roles:
    - common
    - ssh-hardening
    - { role: nginx, tags: ['nginx'] }
    - { role: app,   tags: ['deploy'] }

Idempotencia real, no aparente

Un módulo que reporta changed=true en cada ejecución porque compara timestamps o re-renderiza un template idéntico es un bug. Antes de considerar un rol terminado, ejecutarlo dos veces seguidas debe dejar el segundo run con changed=0 en todas las tareas relevantes. Esa disciplina hace que las ejecuciones contra producción dejen de dar miedo.

010
Containers
sourceNotas de campo
date2017 · 10
read11 min

Adopción de Docker en producción: lecciones de los primeros despliegues

Qué se hace mal cuando un equipo pasa de máquinas virtuales a contenedores: imágenes obesas, secretos en variables de entorno, falta de límites de recursos y dependencia del host.

La imagen no es un tar de tu home

Las primeras imágenes que un equipo construye suelen pesar 1-2 GB porque parten de ubuntu:latest, instalan build-essential y dejan dentro caches de apt, archivos de compilación y herramientas de desarrollo. Una imagen de producción debería ser multi-stage: una etapa para compilar, otra mínima (alpine o distroless) que sólo contenga el binario, sus librerías y los certificados.

FROM golang:1.19 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app ./cmd/app

FROM gcr.io/distroless/static:nonroot
COPY --from=build /out/app /app
USER nonroot:nonroot
ENTRYPOINT ["/app"]

Secretos, recursos y persistencia

Tres errores recurrentes: pasar contraseñas por ENV (quedan en el manifiesto, en docker inspect y en los logs del orquestador), no fijar memory/cpu limits (un contenedor mata al host en producción) y escribir datos en el filesystem del contenedor (se pierden en cada redeploy). Las soluciones son conocidas: secrets gestionados, requests/limits explícitos y volúmenes para todo dato persistente.

Observabilidad en un mundo efímero

Un contenedor reiniciado pierde sus logs locales. Stdout/stderr a un colector central (Fluentd, Loki, journald-remote), métricas expuestas en /metrics y trazas con un identificador de correlación que sobreviva al ciclo de vida del contenedor. Sin esto, debugar un incidente en producción se convierte en arqueología.

011
AppSec
sourceInvestigación
date2018 · 03
read12 min

OWASP Top 10 2017: lo que sigue rompiendo aplicaciones web

Lectura crítica de los diez riesgos más comunes en aplicaciones web — inyección, autenticación rota, exposición de datos sensibles, XXE — con ejemplos extraídos de auditorías reales.

Volcado de base de datos con sqlmap — explotación de inyección SQL
Volcado de base de datos con sqlmap — explotación de inyección SQL

Inyección sigue siendo A1 por una razón

La concatenación de strings para construir SQL no es un problema de hace veinte años — sigue apareciendo en auditorías nuevas, especialmente en capas internas de servicios que el equipo asume seguras porque no están expuestas. Cualquier punto donde una entrada cruza una frontera de confianza necesita parametrización: prepared statements, ORM bien usado o, en última instancia, escapado explícito documentado.

-- MAL
query = "SELECT * FROM users WHERE email = '" + email + "'";

-- BIEN
PreparedStatement ps = con.prepareStatement(
    "SELECT * FROM users WHERE email = ?");
ps.setString(1, email);

Autenticación rota y gestión de sesiones

Cookies de sesión sin HttpOnly ni Secure, identificadores de sesión predecibles, no rotar el ID tras login, recuperación de contraseña por preguntas secretas, contadores de intentos sólo en el cliente. Cada uno por separado parece menor; combinados son una toma de cuenta a un paso.

La regla simple: usar el módulo de sesión del framework, configurarlo con valores explícitos (no defaults), rotar el ID en cada cambio de privilegio y registrar todo intento fallido con suficiente contexto para detectar password spraying.

Datos sensibles en tránsito y en reposo

TLS 1.2+ con ciphersuites modernas y HSTS preload son el mínimo en tránsito. En reposo: bcrypt/argon2 para contraseñas (nunca SHA-x sin sal), cifrado a nivel de columna para PII, y un proceso documentado de gestión de claves. Cifrar la base de datos entera con el mismo KMS que la aplicación usa para todo no aporta gran cosa si el atacante ya tiene la aplicación.

012
PKI
sourceNotas de campo
date2019 · 07
read11 min

PKI interna con HashiCorp Vault: emisión automática de certificados

Diseño de una CA intermedia gestionada por Vault para emitir certificados x509 efímeros a servicios internos, con rotación automática y revocación trazable.

Cadena de confianza — emisión y rotación de certificados x509
Cadena de confianza — emisión y rotación de certificados x509

Por qué dejar de emitir certificados a mano

Las CAs internas gestionadas con OpenSSL y un README envejecen mal: claves privadas en pendrives, certificados emitidos por dos años porque rotarlos cuesta, expiraciones que tiran el servicio un viernes por la tarde. Una CA intermedia en Vault, firmada por una CA raíz offline, permite emitir certificados con TTL corto (24-72h) a través de una API autenticada — y el operador deja de ser el cuello de botella.

Roles, políticas y trazabilidad

Cada servicio recibe un AppRole con permisos para emitir certificados de un solo dominio interno y un TTL acotado. Vault registra cada emisión con metadata del solicitante; revocar es un endpoint, no una página de wiki. La CA raíz vive offline en un host air-gapped y sólo se activa para firmar la renovación anual de la intermedia.

# Configurar el rol de emisión
vault write pki_int/roles/web \
    allowed_domains="svc.internal" \
    allow_subdomains=true \
    max_ttl="72h"

# Emitir desde el servicio
vault write pki_int/issue/web \
    common_name="api.svc.internal" \
    ttl="24h"

Integración con el ciclo de vida del servicio

Un sidecar (consul-template, vault-agent) renueva el certificado al 60% de su vida útil y manda un SIGHUP al servicio para recargar TLS sin downtime. El servicio nunca persiste la clave privada en disco fuera de tmpfs. Resultado operativo: rotación silenciosa, ningún incidente por expiración y revocación inmediata si una clave se sospecha comprometida.

013
Seguridad
sourceNotas de campo
date2020 · 12
read9 min

Respuesta a incidentes en remoto durante 2020: lo que cambió y lo que no

Lecciones aprendidas gestionando incidentes de seguridad con equipos 100% distribuidos: cadena de custodia digital, comunicación segura fuera de banda y reconstrucción de timeline.

José Gómez Vega — notas de campo sobre respuesta a incidentes
José Gómez Vega — notas de campo sobre respuesta a incidentes

El war-room ya no es físico

Durante años, la respuesta a incidentes asumía una sala con personas frente a pantallas. En 2020 eso desapareció en una semana. Lo que sustituyó al war-room funcionó si y sólo si tres cosas estaban previamente preparadas: un canal de comunicación fuera de banda (porque el corporativo puede estar comprometido), un repositorio central de evidencias con control de acceso y un runbook que asume que la persona que toma una decisión no está en la misma zona horaria que quien la ejecuta.

Cadena de custodia digital sin acceso físico

Imágenes forenses tomadas en remoto sobre EDR o agentes de IR, hashes SHA-256 firmados y registrados con timestamp confiable, transferencia por canal cifrado con doble custodia. Cada acción ejecutada en la máquina comprometida queda registrada en un live response document que es la fuente única de verdad si el incidente acaba en un juzgado.

Lo que no cambia

El método sigue siendo el mismo: contener, erradicar, recuperar, lecciones aprendidas. Lo único que cambia es la latencia de cada paso y la presión sobre la documentación. Un equipo distribuido que documenta bien responde mejor que un equipo presencial que improvisa.

014
Cloud Security
sourceInvestigación
date2022 · 03
read12 min

Zero Trust en una organización multi-cloud: más allá del marketing

Implementación práctica de los principios Zero Trust en una arquitectura con cargas en AWS, GCP y on-premise: identidad como perímetro, dispositivos verificados y políticas continuas.

Escudo digital — identidad como perímetro en arquitecturas Zero Trust
Escudo digital — identidad como perímetro en arquitecturas Zero Trust

Qué significa realmente Zero Trust

El término ha sido vaciado por el marketing. La definición operativa útil — la del NIST SP 800-207 — es: ninguna confianza implícita basada en ubicación de red; cada solicitud se evalúa contra identidad, postura del dispositivo, sensibilidad del recurso y contexto, y la decisión se reevalúa de forma continua. No es un producto, es un patrón arquitectónico.

Identidad como nuevo perímetro

Un IdP central (Okta, Entra ID, Google Workspace) federado contra AWS IAM Identity Center y GCP Workforce Identity, MFA resistente a phishing (WebAuthn, no SMS), y SCIM para desaprovisionamiento automático. El día que un empleado deja la empresa, su acceso a todo el estate desaparece en minutos, no en semanas.

Postura del dispositivo y acceso por aplicación

Cloudflare Access, Google BeyondCorp o equivalentes publican aplicaciones internas sin VPN, evaluando en cada request: identidad, MDM/EDR del dispositivo, geolocalización, hora. El usuario nunca entra a una red corporativa — entra a aplicaciones concretas, con un token de corta vida. La VPN tradicional se reserva para casos de acceso a infraestructura, y aun ahí con MFA y segmentación estricta.

Lo más difícil: workloads no humanos

El 80% del esfuerzo va a aplicar los mismos principios a comunicación servicio-a-servicio: SPIFFE/SPIRE para identidad criptográfica de cargas, mTLS por defecto en la malla de servicios, y políticas de autorización (OPA, Cedar) versionadas como código. Sin esto, el Zero Trust del usuario es un escaparate y la red interna sigue siendo plana para los atacantes que llegan al primer pod.

// contact

¿Evaluando la seguridad de tu infraestructura?

Auditorías de arquitectura cloud, análisis forense, simulaciones Red Team o proyectos de automatización segura.

jgomezsecure@protonmail.com →