Qué cambió en la letra chica
Cada gotcha nuevo, corregido, re-verificado o eliminado, sacado del historial del repo. También como feed Atom para tu lector.
· fix(content): respalda con fuente o reformula los hallazgos de la verificación de centralized-audit-logging
commit 6d37065
- CorregidoAWSCloudTrail crea el trail de organización en las cuentas miembro aunque falle la validación del bucket o de la clave(cambiaron las fuentes)
Ver el cambio
CloudTrail crea el trail de organización en las cuentas miembro aunque falle la validación de un recurso; la documentación da como ejemplos una bucket policy incorrecta y permisos insuficientes para cifrar con una clave KMS. Que el apply termine bien no prueba que haya entrega. Revisá get-trail-status: si hay un problema con el bucket, el campo LatestDeliveryError muestra el error de S3 (solo aparece por problemas del bucket de destino, no por requests que expiran). Corregilo con la bucket policy, o creando otro bucket y llamando a update-trail.
- CorregidoAWSEn el ejemplo oficial, la bucket policy de un trail de organización necesita su propia sentencia y los logs son accesibles solo para management
Ver el cambio
Alcance de la fuente: el ejemplo oficial es de un bucket que pertenece a la cuenta de management de la organización; la documentación no cubre un bucket en otra cuenta (como la de log archive de este módulo), así que probalo en un entorno de prueba. El bucket de un trail de organización necesita una policy que deje a CloudTrail escribir los logs de la organización: el ejemplo oficial tiene tres sentencias (GetBucketAcl, PutObject en el prefijo de la cuenta de management y PutObject en el prefijo AWSLogs/o-<id de la organización>/). El aws:SourceArn tiene que ser el ARN de un trail de la cuenta de management, con el ID de esa cuenta. Esa policy no da acceso a usuarios de las cuentas miembro: por defecto, los logs de la organización son accesibles solo para la cuenta de management. Listá de forma explícita a quién querés dar lectura y no asumas que las cuentas miembro leen.
- CorregidoAWSSi la home Region de un trail multi-región es opt-in, solo envían actividad las cuentas que habilitaron esa región(cambiaron las fuentes)
Ver el cambio
Si el trail de organización es multi-región y su home Region es una región opt-in, las cuentas miembro no envían actividad al trail a menos que habiliten esa región; el ejemplo de la documentación es Europe (Spain): solo las cuentas que la habilitaron envían su actividad. Los trails de organización creados desde la consola son multi-región. Elegí como home Region una región habilitada por defecto, o verificá que cada cuenta habilitó la región; si una cuenta no aparece en el bucket, revisá este punto.
- CorregidoAWSUn trail mal configurado reintenta la entrega durante 30 días y esos intentos se cobran(cambiaron las fuentes)
Ver el cambio
Si el trail está mal configurado (por ejemplo, el bucket no es alcanzable), CloudTrail intenta reentregar los logs al bucket durante 30 días, y esos intentos de entrega se cobran como CloudTrail estándar. Para evitar los cargos de un trail mal configurado hay que borrarlo. Corregí la bucket policy y la key policy antes de crear el trail (en Terraform, con depends_on del trail sobre ambas) y revisá get-trail-status después.
· fix(content): respalda con fuente o reformula los hallazgos de la verificación de preventive-guardrails
commit 004f543
- CorregidoAWSProbá las SCP y las RCP en una OU o en cuentas de prueba antes de subir a la raíz; quitar FullAWSAccess sin reemplazo corta todas las acciones
Ver el cambio
AWS recomienda con énfasis no adjuntar una SCP a la raíz sin probar su impacto en las cuentas: crear una OU y mover las cuentas de a una, o en grupos chicos, para no dejar a nadie sin acceso a servicios clave. Para las RCP recomienda empezar por cuentas de prueba, subir por las OU y revisar en CloudTrail los errores de acceso denegado. Además, no hay que quitar la política FullAWSAccess sin modificarla o reemplazarla por otra con las acciones permitidas: si no, fallan todas las acciones de AWS de las cuentas miembro. Para una S3 policy, después de cada cambio revisá la política efectiva de cuentas representativas con DescribeEffectivePolicy.
· fix(content): respalda con fuente o reformula los hallazgos de la verificación de protected-origin-cdn
commit ff55dad
- CorregidoAzureCon Private Link al storage, un contenedor sin acceso anónimo requiere autorizar los pedidos, por ejemplo con SAS
Ver el cambio
La guía de Front Door para un origen de Storage indica que, si el blob o el contenedor no permiten acceso anónimo, los pedidos contra ellos deben autorizarse, por ejemplo con shared access signatures, y lista como error común no usar SAS contra una cuenta que no permite acceso anónimo. Según la misma guía, el acceso desde internet público a la cuenta queda deshabilitado una vez que se habilita el private endpoint.
Entonces hay queSielegir:el contenedorcon lectura anónima de blobs,noquepermitesoloaccesoseanónimo,alcanzanoporconectes elprivate endpoint, oorigenSASsinenautorizar los pedidos.Decidilo de forma explícita y no dejes el contenedor privado sin SAS. - CorregidoGCPSi el bucket sigue siendo público, las URLs firmadas no protegen el contenido
Ver el cambio
Para que las URLs firmadas protejan el contenido, el origen no debe dar acceso público: la documentación indica sacar los permisos de lectura de allUsers (y allAuthenticatedUsers, si aplica) del bucket, que es habitual dejar públicos durante las pruebas. Aun sin acceso público, quien ya tiene permiso sobre el bucket, por ejemplo OWNER, puede acceder a Cloud Storage sin URL firmada. Y una URL firmada da acceso por tiempo limitado a cualquiera que la tenga, sea o no usuario de Google. La misma página advierte que Cloud CDN no bloquea los pedidos sin parámetro Signature ni cookie Cloud-CDN-Cookie (rechaza los de parámetros inválidos) y que el origen debe validar las firmas y aceptar o rechazar los pedidos sin firma. Revisá que el bucket no tenga allUsers ni allAuthenticatedUsers antes de dar la entrada por cerrada, y firmá solo URLs HTTPS.
· feat(content): patrón borrador centralized-audit-logging con Terraform validado
commit 3a7ea88
- NuevoAzureEl Activity Log se borra a los 90 días; para conservarlo más hay que exportarlo con un diagnostic setting
- NuevoAzureUn diagnostic setting en el management group no captura todos los eventos de nivel suscripción
- NuevoAzureEl destino puede estar en otra suscripción si quien crea el setting tiene acceso RBAC a las dos
- NuevoAzureUn storage account de destino con redes virtuales exige permitir servicios de confianza y no puede ser Premium
- NuevoAzureExportar el Activity Log a Log Analytics no cobra ingesta; la retención se cobra solo después de los 90 días
- NuevoAWSCloudTrail crea el trail de organización en las cuentas miembro aunque falle la validación del bucket o de la clave
- NuevoAWSLa bucket policy de un trail de organización necesita su propia sentencia, y por defecto solo management lee los logs
- NuevoAWSSi la home Region de un trail multi-región es opt-in, solo envían actividad las cuentas que habilitaron esa región
- NuevoAWSLos logs cifrados con KMS solo los lee quien tiene kms:Decrypt: dalo antes de asociar la clave al trail
- NuevoAWSHabilitar la validación de integridad entrega archivos digest, pero no valida nada
- NuevoAWSUn trail mal configurado reintenta la entrega durante 30 días y esos intentos se cobran
- NuevoGCPUn sink de organización o carpeta con includeChildren en false solo exporta los logs del propio recurso padre
- NuevoGCPEl sink no exporta hasta que su writer identity tiene permiso de escritura sobre el destino
- NuevoGCPSi el destino es un proyecto, los Admin Activity y System Event no se guardan en él sin un sink propio
- NuevoGCPUn sink agregado que intercepta saca los logs de los sinks de los proyectos hijos
- NuevoGCPUn destino dentro de un perímetro de VPC Service Controls exige una regla de ingreso para la identidad del sink
- NuevoGCPLos Data Access logs se habilitan en el origen, a nivel de organización o carpeta; el sink solo enruta lo que existe
- NuevoGCPLa retención de un bucket en una organización o carpeta no se puede extender, y bloquear un bucket es irreversible
· feat(content): patrón preventive-guardrails (borrador) con Terraform validado
commit e42985e
- NuevoAzureCon deny, una cuenta existente que no cumple no admite cambios de configuración hasta que se corrija
- NuevoAzureCon efecto audit, la cuenta con acceso anónimo se crea igual
- NuevoAzureEn modo DoNotEnforce la asignación evalúa el cumplimiento sin aplicar el efecto
- NuevoAzureLa exemption de Azure Policy solo vence si le ponés expiresOn, y al vencer queda como registro
- NuevoAWSLas SCP no alcanzan a la cuenta de administración ni a las service-linked roles
- NuevoAWSUna SCP no frena a los principals externos que acceden a un bucket de la organización; para eso existen las RCP
- NuevoAWSUna S3 policy se aplica a todos los recursos S3 de las cuentas alcanzadas: la excepción se resuelve por OU o cuenta
- NuevoAWSCon la S3 policy, el acceso público que ya existía se ignora; no se elimina
- NuevoAWSProbá la política en una OU antes de adjuntarla a la raíz; quitar FullAWSAccess sin reemplazo corta todas las acciones
- NuevoAWSDeshabilitar el tipo de política SCP en una raíz desadjunta todas las SCP, y los attachments se pierden
- NuevoGCPCon la constraint enforced, los permisos para allUsers que ya existían quedan en su lugar, anulados
- NuevoGCPLa excepción a la constraint se hace por proyecto, y un bucket con el setting enforced sigue protegido
- NuevoGCPLa constraint storage.publicAccessPrevention no figura entre las que admiten dry-run
- NuevoGCPLa prevención tarda en aplicarse y no afecta a las URL firmadas
· feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes
commit 4b9b896
- NuevoAzureCon Private Link al storage, un contenedor sin acceso anónimo requiere autorizar los pedidos, por ejemplo con SAS
- NuevoAzureUn origin group no puede mezclar orígenes públicos y orígenes con Private Link
- NuevoAWSEl acceso de CloudFront al bucket se limita a tu distribución con la condición AWS:SourceArn
- NuevoAWSUn bucket configurado como website endpoint no puede usar OAC
- NuevoAWSCon SSE-KMS la distribución también necesita permiso sobre la clave
- NuevoGCPCloud CDN lee el bucket con su cuenta de servicio, que aparece al agregar la primera clave
- NuevoGCPSi el bucket sigue siendo público, las URLs firmadas no protegen el contenido
- NuevoGCPCloud CDN cachea las respuestas a pedidos firmados sin mirar el Cache-Control del origen
· fix(content): ajusta a su fuente las frases parciales de gcp que dejó la segunda verificación
commit 651a32f
- CorregidoGCPLos principals usan el número de proyecto, y los permisos tardan minutos en propagarse
Ver el cambio
El principalSetAlyotorgarelrolesworkload_identity_provideraqueidentidadesleexternaspasásseausalaelactionnúmerosondeprojects/NÚMERO/locations/global/...,proyecto, no elIDID:delelproyecto.principalSet es principalSet://iam.googleapis.com/projects/NÚMERO_DE_PROYECTO/locations/global/workloadIdentityPools/.... Además, un cambio de IAM suele aplicarse en 2 minutos pero puede tardar 7 omás, así que un pipeline que se acaba de configurar puede fallar en la primera corrida sin que nada esté mal.más. - CorregidoGCPHacia targets Type 1 y 2 las consultas salen desde 35.199.192.0/19; con Type 2, on-premises necesita ruta
Ver el cambio
Cloud DNS
nousaIPs deelturangoVPC35.199.192.0/19 parareenviar:todostodalosconsultaclientes, y es el origen de las consultas auntargetsforwardingTypetarget1saleydesdeType35.199.192.0/19.2El(IPfirewallinterna de VPC y on-premisestieneporqueVPNpermitiroUDPInterconnect).yLosTCPtargets53Typedesde3eseusanrango,los rangos de Google Public DNS, yon-premisesennecesitaTypeuna4rutael rango depende devueltalasporIPslosatúneleslasVPNqueoresuelveattachmentseldenombre.InterconnectParadeun target Type 2, on-premises necesita una ruta a 35.199.192.0/19 cuyo next hop esté en la mismaVPC.VPC,ConporBGPunesotúnelesCloudunVPNanuncioocustomundelattachmentClouddeRouter.Interconnect.SinConlaBGPruta,esoelesDNSunon-premisesanunciorecibedelarutaconsultacustomyen larespuestasesiónseBGPpierde.del Cloud Router. - CorregidoGCPPrivate Google Access da alcance a las APIs de Google; filtrar el origen del bucket es otro control(cambiaron las fuentes)
Ver el cambio
PrivateLasGoogleVMsAccessque solopermitetienenqueIPVMsinternasinpuedenIPusarpúblicaPrivatelleguenGoogle Access para llegar a las APIs y servicios de Google.ParaEso resuelve el alcance, no el filtrado de origen. Bucket IP filtering permite restringir elorigenaccesonecesitásal bucket según rangos de IPfilteringdeloclienteVPCyServiceredesControls.VPC, y funciona junto con IAM. - CorregidoGCP"Internal" es un control de red; la autenticación es IAM aparte
Ver el cambio
Con ingress internal, Cloud Run
rechazasolo acepta requestsquedenofuentesvengancomodelas VPCs del mismoproyectoproyecto,(oun perímetro de VPCSC)SC odeunotrosinternalserviciosApplication Load Balancer, y deGoogle,productosauncomousandoCloud Scheduler, Cloud Tasks, Eventarc, Pub/Sub o Workflows si están en el mismo proyecto o perímetro y usan la URLrun.app.run.app por defecto. Las demás fuentes, incluida internet, no llegan. Pero la autenticación IAM sigue aplicando: el cliente tiene que presentar un ID token y su cuenta de servicio necesita roles/run.invoker.
· fix(content): ajusta a su fuente las frases parciales de aws que dejó la segunda verificación
commit acdfa6c
- CorregidoAWSPara GitHub, IAM no usa el thumbprint para verificar (y no hace falta cargarlo)
Ver el cambio
IAM valida el certificado de GitHub contra su librería de CAs raíz confiables, así que thumbprint_list es opcional y, en el provider de Terraform, para IdPs como GitHub se guarda pero no se usa para verificar. Los thumbprints solo entran en juego si el IdP usa un certificado que no firma una de esas CAs, o si AWS no puede obtener el certificado TLS o se requiere TLS v1.3.
Muchos módulos viejos todavía hardcodean un thumbprint "que hay que actualizar": para GitHub no es lo que rompe el login. - CorregidoAWSReenviar desde on-premises a la IP .2 de la VPC no está soportado
Ver el cambio
El resolverAWSdeindicalaqueVPCreenviar(baseconsultasdelDNSCIDRprivadas+a2)cualquiercontestadirecciónabaselosdelrecursosCIDR de laVPC. AWS indica queVPCreenviarle+consultas2 desde on-premises u otros servidores DNS de VPC no está soportado y puede dar resultadosinestables, aunque a veces parezca funcionar. Para eso existe el inbound endpoint,inestables.igualEnquesuellugar,deAWSAzurerecomiendaousarlaun inboundpolicyendpoint deGCP.Resolver. - CorregidoAWSLa private hosted zone tiene que estar asociada a la VPC del inbound endpoint
Ver el cambio
El inbound endpoint resuelve con loPara queve suelVPC.ResolverSide lazona está asociada soloVPCaresuelva lasVPCs de aplicación, on-premises recibe NXDOMAINconsultasaunqueentrantesdesdeconlaslosVMsregistrostododeresuelvaunabien.privateEnhostedmulti-cuenta,zone, la zonatambiéntiene que estar asociada a la VPCdeldondehub.creaste el inbound endpoint. - CorregidoAWSBlock Public Access y ACLs deshabilitadas son default en buckets nuevos (pero declaralos igual)
Ver el cambio
DesdePor default, Object Ownership es BucketOwnerEnforced y todas las ACLs están deshabilitadas. AWS anunció que, a partir de abril de20232023, S3habilitahabilitaría Block Public Access ydeshabilitadeshabilitaría las ACLs en todos los bucketsnuevos (Object Ownership en BucketOwnerEnforced). Ya nonuevos,essin"la"cambiosdiferenciaparaconlosAzure.existentes. Igual declaralos en IaC:los buckets existentes no cambiaron, ydeclarar el estado evita drift si alguien los toca desde la consola. - CorregidoAWSEl token de IAM auth dura 15 minutos y solo sirve para abrir la conexión
Ver el cambio
El token vence a los 15 minutos y se usa solo para autenticar: no afecta la sesión una vez establecida, pero
un token vencido hace que se rechace una conexión nueva. Una app que abre una conexión por requestsitieneintentásqueconectartegenerarcon un tokenfresco cada vez; mantené un pool y renová el tokenvencido,allaabrirconexiónconexionessenuevas.rechaza. - CorregidoAWSFargate en subnet privada sin NAT necesita varios VPC endpoints pagos
Ver el cambio
Para bajar la imagen
y mandar logssin salida a internet, la tarea necesita interface endpoints de ECR (api ydkr) y CloudWatch Logs,dkr), más el gateway endpoint de S3 (donde ECR guarda las capas). Si usa el driver de logs awslogs, también necesita el interface endpoint de CloudWatch Logs. Cada interface endpoint se cobra por hora por AZ. La alternativa (NAT Gateway) también tiene cargo por hora y por GB. - CorregidoAWSHTTPS en un ALB interno igual necesita un certificado de servidor SSL
Ver el cambio
Para crear un listener HTTPS hay que desplegar al menos un certificado de servidor SSL (de ACM o de IAM). ACM
exige probar la propiedad del dominio de un certificado público por DNS, mail o HTTP, yno puede validar recursos en una private hosted zone de VPC ni en ningún otro dominio privado, aunque el ALB sea interno. ACM no valida la propiedad del dominio en certificados importados ni firmados por una CA privada. - CorregidoAWSQue la contraseña del master user la gestione Secrets Manager
Ver el cambio
Con manage_master_user_password = true, RDS genera la contraseña del master y la guarda en Secrets Manager. El provider de Terraform no permite combinarlo con password, y RDS no lo soporta en algunos escenarios (por ejemplo Blue/Green deployments), así que decidilo de entrada.
· fix(content): ajusta a su fuente las frases parciales de azure que dejó la segunda verificación
commit 6efb439
- CorregidoAzureLa regla de escalado se autentica con la propiedad identity, no con auth
Ver el cambio
KEDA consulta el largoParadeque lacola por su cuenta. Parareglaquedeloescaladohagauseconuna identidad administrada,la regla de escaladoseusaconfigura la propiedad identity en lugar de auth. El portal nopermiteloconfigurarlo:soporta: hacelo por IaC o CLI. - CorregidoAzureLos role assignments son por cuenta o contenedor; por prefijo hacen falta condiciones ABAC
Ver el cambio
EnAzureS3Storageacotásadmitelarolepolicyassignments aarn:...:bucket/incoming/* y en GCP usásnivelIAMdeConditionscuentaporyprefijo.deEncontenedor.AzureParaunacotarroleporassignmentprefijollegaocomorutamínimohacenalfaltacontenedor;condicionesparaABACacotarsobreporelrutarolenecesitásassignmentcondiciones(atributosABACBlobsobreprefixelyroleBlobassignment.path). Alternativa simple: un contenedor dedicado a la ingesta (lo que hace este módulo). - CorregidoAzurePrivate Endpoint sin zona DNS privada: el firewall del servicio puede responder 403
Ver el cambio
Crear el Private Endpoint no alcanza: el FQDN <cuenta>.blob.core.windows.net tiene que resolver a la IP privada vía la zona privatelink.blob.core.windows.net vinculada a la VNet (o a tu DNS híbrido). Si resuelve a la IP
pública,públicaelyfirewallladelcuentaserviciotiene firewall, este rechaza la request con 403 y parece un problema de permisos. - CorregidoAzurePor ARM se agregan administradores Entra; el rol de la app se crea con SQL
Ver el cambio
Terraform/ARMDesdeagregael portal de Azure o la ARM API se agregan principals Entra comoadministradoresadministradores.(azure_pg_admin,ConCREATEROLE,isAdmin=true,CREATEDB).pgaadauth_create_principal les da azure_pg_admin, CREATEROLE y CREATEDB. Para que la identidad de la app sea un usuario común, un admin Entra puede ejecutar pgaadauth_create_principal('<nombre>', false, false). Para identidades administradas y service principals el nombre es el display name. El módulo deja el SQL exacto como output. - CorregidoAzureDetener la base corta el cómputo, pero arranca sola a los 7 días
Ver el cambio
ACA puede bajar a cero réplicas, peroPostgreSQL Flexible factura cómputo mientras está encendido. Detenerlo corta el cobro de cómputo (no el de storage), pero el servicio lo vuelve a arrancar automáticamente a los 7 días. Para entornos de desarrollo, automatizá el stop en vez de confiar en un stop manual.
· fix(content): respalda o recorta los hallazgos de la verificación independiente de hub-and-spoke
commit 99b711a
- CorregidoAzureSpoke a spoke por el firewall exige una UDR en cada spoke y peerings que acepten tráfico reenviado
Ver el cambio
El peering entre VNets es una relación no transitiva: dos spokes peereados con el mismo hub no se ven entre sí. Para que el hub los conecte, las subnets de cada spoke necesitan una UDR que apunte al Azure Firewall como gateway por defecto, y los peerings tienen que aceptar tráfico reenviado.
Si falta cualquiera de las dos cosas, el tráfico entre spokes no llega o no pasa por el firewall.Cargá la UDR como parte del alta de cada spoke, no como un paso manual aparte. - CorregidoAWSSin appliance mode en el attachment de inspección, ida y vuelta pueden cruzar AZs distintas
Ver el cambio
Cuando el modo appliance no está habilitado, el Transit Gateway
mantieneintenta mantener el tráfico en la AZ de origen. Con el modo habilitado, elige una única interfaz de red de la VPC de inspección por flow hash para toda la vida del flujo y usa la misma para el retorno, de modo que el tráfico bidireccional es simétrico. Un firewall stateful necesita ver el pedido y la respuesta. Habilitalo en el attachment de la VPC de inspección(en Terraform, appliance_mode_support = "enable")y conectá un solo Transit Gateway a esa VPC: con varios, AWS no garantiza la persistencia del flujo. Cambiarlo en un attachment existente puede alterar su ruteo actual. - CorregidoGCPLas rutas hacia on-premises y las rutas estáticas custom no cruzan el peering salvo que activés export e import
Ver el cambio
Las rutas de subnet se intercambian siempre (salvo las de subnets con IPv4 públicas de uso privado), pero las rutas dinámicas y las estáticas IPv4 sin network tags con un next hop distinto del internet gateway por defecto no se exportan ni se importan por defecto. Se habilitan con --export-custom-routes en la VPC que las tiene y --import-custom-routes en la que las recibe. Las estáticas con network tags o con el internet gateway por defecto como next hop no se pueden exportar ni importar.
UnParaspokedar un camino desde on-premises hacia la VPC peereada, además hay quenoconfigurarimportaCloudlasRouterrutasendelmodohubcustomnoadvertisementllegaconaloson-premisesrangospordeelsubnethub.de la VPC peereada. - CorregidoGCPCon Network Connectivity Center el diseño cambia: hay límites al usar peering entre VPC spokes
Ver el cambio
Los VPC spokes de NCC
intercambianpueden exportar e importar todas las rutas de subnetconde los demásspokes delVPChub.spokes. No se puede usar VPC Network Peering entre dos VPC spokes queyatambién estén conectados por un hub de NCC, y el intercambio de rutas estáticas entre VPC spokes no estásoportadosoportado.ySíenselapuedetopologíatenerestrellaun VPC spoke de NCC peereado con una VPC separada que noconectaesentrepartesídeaNCC,losyspokesusardelpeeringedgeentregroup.dosElegíVPCelspokesmodelodelantesedge group decrearunlashubVPC,con topología estrella, porque NCC noseconectapuedenentremezclarsíentrea losmismosspokesspokes.de ese grupo. - CorregidoGCPEl firewall endpoint es zonal, una VPC se asocia a un solo endpoint por zona y solo inspecciona el tráfico que una regla selecciona
Ver el cambio
Un firewall endpoint es un recurso zonal, y la asociación lo vincula a una VPC en la misma zona. Una VPC puede asociarse a un solo endpoint por zona, sea de organización o de proyecto. Cloud NGFW redirige el tráfico al endpoint solo cuando coincide con una regla de política con la acción apply_security_profile_group.
ParaUncubrirendpointlassezonaspuededondeasociarcorrenalosunaworkloads,ocreámásunVPCendpointde la misma zona, y si unaasociaciónVPC abarca varias zonas se asocia un endpoint por zona; en una zonaysinporendpointVPC,asociadoynoverificáhay inspección de capa 7. Verificá que cada flujo a inspeccionar tenga su regla.
· fix(content): respalda o recorta los hallazgos de la verificación independiente de controlled-egress
commit df57e76
- CorregidoAzureSin un método de salida explícito la VM usa una IP que es de Microsoft y puede cambiar
Ver el cambio
Una VM sin método de salida explícito recibe una IP pública de salida por defecto. Esa IP es propiedad de Microsoft y puede cambiar sin aviso, así que no sirve para un allowlist de terceros. Para la versión de API publicada después del 31 de marzo de 2026, las subnets de las VNets nuevas tienen defaultOutboundAccess en false; las VNets existentes no cambian, y sus VMs nuevas siguen recibiendo la IP por defecto salvo que la subnet se haga privada. Las herramientas que fijan una versión de API anterior (la doc nombra a Terraform) dejan el valor en null, que permite la salida implícita. Declará un método explícito (NAT Gateway) y fijá la subnet como privada de forma explícita; las VMs que ya existen tienen que pasar por stop/deallocate para que el cambio les aplique.
SinEn una subnet privada sin salida explícita, Windows Update y la activación de Windows no funcionan. - CorregidoAzureNAT Gateway y Azure Firewall se cobran por hora, más por GB procesado
Ver el cambio
La página de precios del NAT Gateway cobra horas de recurso y datos procesados (tráfico de salida y de respuesta), y aclara que la tarifa por hora se cobra aunque el NAT Gateway no tenga subnets ni IPs asociadas; además aplican cargos de ancho de banda. Azure Firewall cobra una tarifa fija por hora por deployment, independiente de la escala, más un cargo por GB procesado.
Con los dos en el camino corren los dos medidores.Si no necesitás filtrar por destino, el NAT Gateway solo ya da la IP fija sin el firewall. - CorregidoAWSLa lista de dominios de Network Firewall se apoya en el SNI o el Host, no en las IPs, y por defecto mira el tráfico de su VPC
Ver el cambio
Para HTTPS Network Firewall usa el SNI del handshake TLS y para HTTP el encabezado Host; no pausa la conexión para hacer consultas DNS ni evalúa las IPs, así que se apoya en lo que declara el cliente. Una lista de dominios no puede acotar por puerto ni por un único protocolo: para eso hacen falta reglas Suricata o stateful de 5-tupla. Por defecto la inspección usa como HOME_NET el CIDR de la VPC donde está el firewall; para filtrar tráfico de otras VPCs (por ejemplo vía transit gateway) hay que definir HOME_NET con esos CIDR. Con la acción Allow el firewall deniega lo que no coincide solo si la política usa default action order; con strict order esa denegación no aplica. Si querés validar además el dominio por el que se resolvió la IP de destino, existe el target AWS_ROUTE_53_RESOLVED_DOMAIN.
- CorregidoGCPCloud NAT reparte puertos por VM: el mínimo por defecto es bajo y hay que dimensionar los puertos
Ver el cambio
Cada IP de NAT ofrece 64.512 puertos de origen TCP. Si no indicás el mínimo de puertos por VM se usa el valor por defecto, 64 con asignación estática y 32 con dinámica, y en Public NAT la asignación por defecto es la estática. Con asignación estática una VM no puede usar más que sus puertos asignados, ni siquiera en picos de tráfico.
Además, el gateway procesa hasta 1.024 conexiones simultáneas a cada 3-tupla de destino único.La doc recomienda la asignación dinámica si el uso de egress varía, pero no se puede combinar con endpoint-independent mapping y, mientras se asignan puertos adicionales, puede haber timeouts o latencia. Los paquetes descartadossolose registransicuandoactivásusás el logging deerroresClouddeNATCloudparaNAT.activar el logging de errores. El módulo habilita asignación dinámica y logging de errores. - CorregidoGCPCloud NAT suma cuatro cargos: gateway por hora, GiB procesado, IPs externas por hora y transferencia de salida(cambiaron las fuentes)
Ver el cambio
Para Public NAT, la página de precios define el costo total como el cargo por hora del gateway más el costo por GiB procesado por el gateway, el costo por hora de las IPs externas que usa y el costo de transferencia de datos saliente. El cargo por hora del gateway depende de la cantidad de VMs que lo usan y tiene un tope en 32 VMs. Al presupuestar, sumá las cuatro partes: con IPs estáticas reservadas para el allowlist, cada IP se cobra por hora. Aparte, la página de precios de Cloud NGFW indica que cuando un flujo se evalúa con una regla que contiene funciones de Cloud NGFW Standard se cobra procesamiento de datos, y presenta los FQDN objects entre esas funciones.
- CorregidoGCPLos FQDN objects se resuelven a IPs: sin comodines, con tope de 32 IPv4 y 32 IPv6, y no sirven para googleapis.com
Ver el cambio
Cloud NGFW resuelve periódicamente cada FQDN object a IPs, siguiendo el orden de resolución de nombres de Cloud DNS de la VPC. No admite comodines (`*`) ni dominios de primer nivel. Cada FQDN object se mapea a un máximo de 32 direcciones IPv4 y 32 IPv6, y las que sobran se descartan. Si la respuesta es NXDOMAIN, no trae IPs utilizables o el servidor DNS no responde, el objeto se ignora. La doc pide evitar registros A con TTL menor a 90 segundos y aclara que la mayoría de los dominios de Google, como googleapis.com, caen en estas situaciones: recomienda usar IPs o address groups. Tampoco se puede usar si la VPC tiene una outbound server
policy.policy con un servidor de nombres alternativo. Una consulta DNS puede devolver respuestas distintas según la ubicación del cliente, así que las IPs programadas pueden no incluir todas las del dominio. Usá FQDN para APIs de terceros con DNS estable y verificá el TTL de cada dominio. - CorregidoGCPEl tráfico a las APIs de Google no sale por Cloud NAT: va por Private Google Access
Ver el cambio
La doc de Cloud NAT dice que el tráfico hacia las APIs y servicios de Google se enruta por Private Google Access, incluso cuando la VM usa Public NAT.
Esas llamadas no salen con las IPs del NAT, así que un control que dependa de la IP de salida no aplica a esos destinos. No esperes ver la IP del NAT en esas llamadas, y tratáTratá los dominios de Google aparte en las reglas de egress.
· fix(content): respalda o recorta los hallazgos de la verificación independiente de app-secrets
commit 2c819ba
- CorregidoAzureEl Private Endpoint no alcanza: si la zona privada no está enlazada a la VNet, el vault resuelve a su IP pública
Ver el cambio
Para que la VNet llegue al vault por el Private Endpoint hace falta una zona privada llamada exactamente privatelink.vaultcore.azure.net, enlazada a esa VNet y con el registro A del vault. Si la zona no está enlazada, la consulta devuelve la IP pública. Con el acceso de red público deshabilitado y sin allow-list en el firewall, el servicio rechaza todas las solicitudes en ese
ingress, así que el síntoma es un error de acceso y no tráfico público.ingress. Desde on-premises hacen falta forwarders condicionales para vault.azure.net y vaultcore.azure.net hacia un resolver con acceso a la resolución de Azure (ver el patrón DNS privado híbrido). El nombre del vault sigue resolviendo en DNS público aunque sea privado: no pongas entorno ni cliente en el nombre si eso es parte de tu modelo de amenazas. - CorregidoAzureKey Vault avisa que el secreto está por vencer; cambiar la credencial en el tercero lo tenés que programar vos
Ver el cambio
Treinta días antes de la fecha de expiración de un secreto, Key Vault publica el evento SecretNearExpiry en Event Grid. Para rotar, tenés que crear la suscripción al evento y aportar la función que crea la versión nueva en el vault y actualiza el servicio externo. El tutorial de Microsoft lo muestra para una contraseña de SQL Server. Entre esos dos pasos puede haber un desfase en el que el secreto del vault no autentica, y si un paso falla Event Grid reintenta durante dos horas. El
evento depende de que el secreto tenga fecha de expiración. Si el vault es privado, la función tiene que llegar a él: eltemplate del tutorial de dos credenciales pide plan Premium solo cuando el vault está detrás de un firewall. - CorregidoAzureKey Vault cifra los secretos con una jerarquía de claves del servicio; en AWS y GCP elegís una clave tuya
Ver el cambio
Key Vault guarda todos los secretos como datos cifrados, con una jerarquía de claves del servicio, y la documentación aclara que ese cifrado es transparente y no requiere acción tuya. Las claves que guardás en Key Vault sirven, por ejemplo, como clave envolvente (BYOK) para cifrar datos de Azure Storage. En AWS, al crear un secreto podés elegir una clave administrada por el cliente de KMS, y en GCP una clave de Cloud KMS (CMEK). Si un requisito de cumplimiento exige controlar la clave del propio almacén de secretos, revisá que Key Vault lo cubra antes de elegirlo; el rol de clave de este patrón es parcial en Azure.
- CorregidoAWSSe cobra por secreto, por réplica, por clave KMS y por hora y AZ del endpoint
Ver el cambio
Secrets Manager cobra según la cantidad de secretos guardados y las llamadas a la API. Una réplica cuenta como un secreto distinto y se factura aparte; crear versiones nuevas al rotar no se cobra y un secreto marcado para borrado tampoco. Cada clave de KMS que creás tiene un costo mensual (prorrateado por hora), y el interface endpoint se factura por cada hora que permanece aprovisionado en cada AZ. Usá una subnet por AZ que realmente necesites, un secreto por credencial y réplicas solo si hay un requisito de otra región. Cada GetSecretValue es una llamada facturable: leé el secreto al arrancar o cacheá el valor.
- CorregidoGCPEl alias latest puede desplegar un valor malo de inmediato; en producción referenciá un número de versión
Ver el cambio
El alias latest apunta a la versión agregada más recientemente. Google lo describe como cómodo para desarrollo pero problemático para algunas cargas de producción, porque un valor malo puede desplegarse de inmediato y causar una caída de todo el servicio. La guía de best practices pide referenciar los secretos por número de versión y desplegar los cambios con tu proceso de release, y deshabilitar una versión antes de destruirla para que el paso sea reversible. Cada rotación agrega una
versión y mueve latest:versión: resolvé el número al rotar, guardalo en la configuración del deploy y leelo al arrancar. - CorregidoGCPLeer el valor del secreto es un Data Access log, y esos logs vienen apagados
Ver el cambio
AccessSecretVersion requiere un permiso DATA_READ y genera un Data Access audit log. Esos logs están deshabilitados por defecto para todos los servicios salvo algunos de BigQuery, así que hay que habilitarlos explícitamente.
Mientras tanto,LaslosoperacionesAdminqueActivitymodificanlogsversionesregistran(agregar,losdeshabilitar,cambiosdestruir)sobresoneldesecretotipoperoADMIN_WRITEnoyquiénvanleyóaelAdminvalor.Activity. La guía de best practices recomienda habilitar los data access logs para analizar los pedidos AccessSecretVersion, y hacerlo a nivel de carpeta u organización para no configurarlo en cada proyecto. - CorregidoGCPPrivate Google Access no cubre los endpoints regionales, que son los del servicio regional de Secret Manager
Ver el cambio
Private Google Access es un setting por subnet: deja que las VMs que solo tienen IP interna lleguen a las IPs externas de las APIs de Google, y no tiene efecto en instancias con IP externa. Si lo deshabilitás, esas VMs pierden el acceso. No soporta los endpoints regionales y multirregionales, los que terminan en rep.googleapis.com. El servicio regional de Secret Manager se accede con un endpoint regional (secretmanager.<location>.rep.googleapis.com en los ejemplos de la documentación) y sus secretos solo se pueden acceder desde esa región.
Para esoGooglehacedocumentafaltacómounusarendpointendpoints de Private Service Connecthaciapara llegar a los endpoints regionales.
· feat(content): borrador del patrón app-secrets (secretos de aplicación)
commit 120904b
- NuevoAzureUn vault borrado sigue ocupando su nombre durante la retención, y al recuperarlo se pierden los role assignments
- NuevoAzureCon access policies, quien puede escribir el vault puede darse acceso a los secretos; con RBAC no
- NuevoAzureEl Private Endpoint no alcanza: si la zona privada no está enlazada a la VNet, el vault resuelve a su IP pública
- NuevoAzureKey Vault avisa que el secreto está por vencer; cambiar la credencial en el tercero lo tenés que programar vos
- NuevoAzureSin un diagnostic setting, nadie registra quién leyó el secreto
- NuevoAzureEn Key Vault no elegís la clave que cifra los secretos; en AWS y GCP sí
- NuevoAzureCada lectura del secreto es una operación facturable, y el Private Endpoint se paga por hora
- NuevoAWSLa función de rotación tiene que llegar a Secrets Manager, y en una VPC sin internet eso es un endpoint
- NuevoAWSLa política por default del endpoint permite acceso total a Secrets Manager
- NuevoAWSExigir el endpoint en la política del secreto también deniega a quien lea desde fuera de la VPC
- NuevoAWSEl nombre, la descripción, los tags y la configuración de rotación del secreto no se cifran
- NuevoAWSCon una CMK propia, leer el secreto exige permiso sobre el secreto y sobre la clave
- NuevoAWSSe cobra por secreto, por réplica, por clave KMS y por hora y AZ del endpoint, aunque nadie lea
- NuevoGCPEl alias latest despliega un valor malo de inmediato; en producción referenciá un número de versión
- NuevoGCPSecret Manager no rota la credencial: publica un mensaje SECRET_ROTATE y alguien tiene que hacer el cambio
- NuevoGCPLeer el valor del secreto es un Data Access log, y esos logs vienen apagados
- NuevoGCPPrivate Google Access no cubre los endpoints regionales, que son los del servicio regional de Secret Manager
- NuevoGCPLa clave CMEK tiene que estar en la ubicación de la réplica, y si la deshabilitás o destruís el secreto queda ilegible
- NuevoGCPCon replicación definida por el usuario, una región caída hace fallar las escrituras, y las ubicaciones no se cambian
- NuevoGCPCada rotación agrega una versión activa, y una versión deshabilitada sigue facturando
· feat(content): add controlled-egress pattern draft (topology and gotchas)
commit a3a6bb6
- NuevoAzureSin un método de salida explícito la VM usa una IP que es de Microsoft y puede cambiar
- NuevoAzureUn NAT Gateway Standard es zonal, y pasar a StandardV2 obliga a cambiar las IPs de salida
- NuevoAzureUna ruta 0.0.0.0/0 hacia el firewall pisa al NAT Gateway de la subnet: va en AzureFirewallSubnet
- NuevoAzureLas reglas FQDN de red exigen DNS proxy y no admiten comodines; las de aplicación cubren solo HTTP/S y MSSQL
- NuevoAzureNAT Gateway y Azure Firewall se cobran por hora aunque no haya tráfico, más por GB procesado
- NuevoAWSUn NAT gateway zonal vive en una sola AZ: compartirlo entre AZs es un punto único de falla
- NuevoAWSCada IP del NAT gateway admite hasta 55.000 conexiones simultáneas al mismo destino
- NuevoAWSEl NAT gateway cobra por hora y por GB procesado; un NAT por AZ multiplica la parte fija
- NuevoAWSLa lista de dominios de Network Firewall mira solo HTTP/HTTPS, por SNI o Host, y solo el tráfico de su VPC
- NuevoAWSNetwork Firewall cobra por endpoint por AZ y por GB; con el NAT gateway en el mismo camino, AWS exime el cargo del NAT
- NuevoGCPCloud NAT reparte puertos por VM: el mínimo por defecto es bajo y cada destino tiene su tope de conexiones
- NuevoGCPCloud NAT suma cuatro cargos: gateway por hora, GiB procesado, IPs externas por hora y transferencia de salida
- NuevoGCPLa salida está permitida por regla implícita: Cloud NAT no es el control de destinos
- NuevoGCPLos FQDN objects se resuelven a IPs: sin comodines, con tope de 32 IPv4 y 32 IPv6, y no sirven para googleapis.com
- NuevoGCPEl tráfico a las APIs de Google no sale por Cloud NAT: va por Private Google Access
· feat(content): hub-and-spoke con inspección centralizada (borrador) y capability managed-firewall
commit 5732151
- NuevoAzureSpoke a spoke por el firewall exige una UDR en cada spoke y peerings que acepten tráfico reenviado
- NuevoAzureUna UDR resumida pierde contra la ruta de peering más específica, y el tráfico esquiva el firewall
- NuevoAzureLa subnet del firewall se llama AzureFirewallSubnet, es de /26 como mínimo y no admite NSG
- NuevoAzurePara que los spokes usen el gateway del hub hay tres flags de peering, y el spoke no puede tener gateway propio
- NuevoAzureAzure Firewall cobra una tarifa fija por hora por despliegue, más el procesamiento de datos
- NuevoAWSSin appliance mode en el attachment de inspección, ida y vuelta pueden cruzar AZs distintas
- NuevoAWSCon la route table por defecto todos los attachments se ven entre sí y la inspección no se ejecuta
- NuevoAWSSolo los recursos en AZs con una ENI del attachment alcanzan el Transit Gateway
- NuevoAWSUn firewall endpoint no filtra el tráfico de su propia subnet, y usar el de otra AZ genera cargos entre zonas
- NuevoAWSCada attachment y cada firewall endpoint se cobran por hora, y los datos se cobran por GB en los dos servicios
- NuevoGCPDos spokes peereados con el mismo hub no se ven entre sí: el peering no hace ruteo transitivo
- NuevoGCPLas rutas hacia on-premises y las rutas estáticas custom no cruzan el peering salvo que activés export e import
- NuevoGCPCon Network Connectivity Center el diseño cambia: no se combina con peering entre los mismos spokes
- NuevoGCPEl firewall endpoint es zonal, se asocia a una VPC por zona y solo inspecciona el tráfico que una regla selecciona
· fix(content): respalda la comparación con SQS, prolija el envoltorio y agrega la guía de setup del mantenedor
commit 073bfb8
· fix(content): respalda con fuente o recorta 17 gotchas parciales y sube el timeout del test del changelog
commit 82d0459
- CorregidoAWSLimitá la concurrencia del event source mapping, no solo la de la función
Ver el cambio
Antescaling_config.maximum_concurrency limita cuántas instancias concurrentes de la función puede invocar la cola. Es unpicosetting del event source mapping, independiente del reserved concurrency demensajeslaLambdafunciónescalayrápidosin cargo, ypuedeevitasaturarque una cola consuma toda labaseconcurrencia reservada o laAPIcuota dedestino.lascaling_configcuenta..maximum_concurrencyOjo:limitaelcuántasreservedinvocacionesconcurrencyconcurrentestienedisparaque ser mayor o igual que lacola,sumasinde losefectosmáximoscolateralesdedeltodosreservedlosconcurrencyevent sources de lafunciónfunción;(quesiademásno, Lambda puedeprovocarhacer throttlingydereintentos).tus mensajes. - CorregidoGCPEn push, el ack es la respuesta HTTP y tiene que llegar dentro del ack deadline
Ver el cambio
Pub/Sub considera procesado el mensaje cuando el endpoint responde
2xx.conSi102,el200,worker201,tarda202másoque204;elcualquierackotrodeadlinecódigo(máximoes600uns),nackPub/SubyloPub/Subreentregareenvíamientraselsiguemensaje.corriendo.LoAlineámismoack_deadline_secondspasaconsi eltimeout del servicio deworkerCloudtardaRunmásy,queparaeltrabajosacklargos,deadline:usáPub/SubpulllooreentregaCloudmientrasRunsigueJobs.corriendo. - CorregidoGCPPub/Sub ofrece exactly-once delivery, pero solo en suscripciones pull
Ver el cambio
Es el único de losPub/Subtressoportaserviciosexactly-oncedeldeliverypatrónsolo conexactly-once delivery nativo,suscripcionesperopull: push (lo que dispara a Cloud Run) no losoporta. Con push, igualsoporta,queporqueenelServiceclienteBusnoysabeSQSsiStandard,Pub/Subelrecibióworkerlatienerespuestaqueyserlaidempotente.procesó. - CorregidoAWSHay un solo OIDC provider por URL y por cuenta
Ver el cambio
Crear un segundo provider para token.actions.githubusercontent.com en la misma cuenta
fallafalla:conIAMEntityAlreadyExists.no permite registrar la misma URL dos veces en una cuenta. Si cada repo trae su propio stack de Terraform con el provider adentro, el segundo apply rompe. Crealo una vez (en el stack de la cuenta) y referencialo con el data source; el módulo lo permite con create_oidc_provider = false. - CorregidoAWSPara GitHub, el thumbprint ya no se usa (y no hace falta cargarlo)
Ver el cambio
IAM valida el certificado de GitHub contra su librería de CAs raíz confiables, así que thumbprint_list es opcional y, en el provider de
Terraform desde la 5.0Terraform,y,parasiIdPslocomocargás,GitHub se guarda pero no se usa para verificar. Los thumbprints solo entran en juego si el IdP usa un certificado que no firma una de esas CAs, o si AWS no puede obtener el certificado TLS o se requiere TLS v1.3. Muchos módulos viejos todavía hardcodean un thumbprint "que hay que actualizar": para GitHub no es lo que rompe el login. - CorregidoGCPLos identificadores usan el número de proyecto, y los permisos tardan minutos en propagarse
Ver el cambio
El principalSet y el workload_identity_provider que le pasás a la action son projects/NÚMERO/locations/global/..., no el ID del
proyecto: con el ID el token exchange falla.proyecto. Además, un cambio de IAM suele aplicarse en 2 minutos pero puede tardar 7 o más, así que un pipeline que se acaba de configurar puede fallar en la primera corrida sin que nada esté mal. - CorregidoAWSUna regla de forward le gana a una private hosted zone con el mismo nombre(cambiaron las fuentes)
Ver el cambio
Si en una VPC hay una regla FORWARD para corp.example.com y también una private hosted zone corp.example.com, gana la regla. Entre reglas gana la más específica, y con una regla SYSTEM excluís un subdominio del reenvío.
En Azure es al revés: la zona privada vinculada se consulta antes que el ruleset. - CorregidoGCPLas consultas reenviadas salen desde 35.199.192.0/19, y on-premises tiene que poder contestarle
Ver el cambio
Cloud DNS no usa IPs de tu VPC para reenviar: toda consulta a un forwarding target sale desde 35.199.192.0/19. El firewall on-premises tiene que permitir UDP y TCP 53 desde ese rango, y on-premises necesita una ruta de vuelta por los túneles VPN o attachments de Interconnect de la misma
VPC y región.VPC. Con BGP eso es un anuncio custom del Cloud Router. Sin la ruta, el DNS on-premises recibe la consulta y la respuesta sepierde: parece un timeout.pierde. - CorregidoAzurePrivate Endpoint sin zona DNS privada = 403 desde la VNet(cambiaron las fuentes)
Ver el cambio
Crear el Private Endpoint no alcanza: el FQDN <cuenta>.blob.core.windows.net tiene que resolver a la IP privada vía la zona privatelink.blob.core.windows.net vinculada a la VNet (o a tu DNS híbrido). Si resuelve a la IP pública,
conelaccesofirewallpúblicodeldeshabilitadoservicio rechaza la requestfallacon 403 y parece un problema de permisos. - CorregidoAWSLa expiración es asincrónica, pero el cobro se corta en la fecha de expiración(cambiaron las fuentes)
Ver el cambio
S3 encola las expiraciones y
puede tardar días en borrarlasfísicamente.procesaAdediferenciaformadeasincrónica:Azure,puedenopasarpagásdesdestoragedíasdehastaunsemanasobjetoentrevencidolaaunquefechatodavíadeaparezcaexpiracióneny ellistado. Igualborradoquereal.enNolasseotrascobranubes:lanoexpiraciónesniunelcontroltiempo deseguridad, el objeto siguestoragesiendodelegibleunhastaobjeto queseyaborra.venció. - CorregidoAWSLos multipart uploads incompletos se siguen cobrando(cambiaron las fuentes)
Ver el cambio
LasS3 retiene las partes de un multipart upload hasta quenuncalosecompletáscompletóoocupanlostorageabortás, ynoseaparecencobraalsulistarstorageobjetos.durante todo ese tiempo. Agregá siempre una reglaAbortIncompleteMultipartUpload; en un bucket deAbortIncompleteMultipartUpload:ingestaabortareseldondeuploadmásborraselasacumulan.partes. - CorregidoGCPPrivate Google Access no restringe quién accede al bucket
Ver el cambio
Private Google Access solo permite que VMs sin IP pública lleguen a las APIs de Google.
El bucket sigue aceptando requests autenticadas desde internet.Para restringir el origen necesitás bucket IP filtering o VPC ServiceControls; este último es a nivel organización y suele no estar al alcance de un equipo de aplicación.Controls. - CorregidoAzureDetener la base corta el cómputo, pero arranca sola a los 7 días(cambiaron las fuentes)
Ver el cambio
ACA puede bajar a cero réplicas, pero PostgreSQL Flexible factura cómputo mientras está encendido. Detenerlo corta el cobro de cómputo (no el de storage), pero el servicio lo vuelve a arrancar automáticamente a los 7 días. Para entornos de desarrollo, automatizá el stop en vez de confiar en un stop manual.
- CorregidoAWSFargate en subnet privada sin NAT necesita varios VPC endpoints pagos(cambiaron las fuentes)
Ver el cambio
Para bajar la imagen y mandar logs sin salida a internet, la tarea necesita interface endpoints de ECR (api y dkr) y CloudWatch Logs, más el gateway endpoint de S3 (donde ECR guarda las capas). Cada interface endpoint se cobra por hora por
AZ: es el costo fijo que en ACA y Cloud Run no existe.AZ. La alternativa (NAT Gateway) también tiene cargo por hora y por GB. - CorregidoGCPLa IP privada de Cloud SQL viaja por un VPC peering que no es transitivo
Ver el cambio
Private services access se implementa con VPC Network Peering hacia la red de Google.
OtraSoloVPCpermitepeereadaconexionescondesdelaunatuyaVPC,noyllegaelapeeringlanobase,ofreceyruteoparatransitivo:on-premisesotratenésVPCquepeereadaexportarconcustomlaroutestuyaennoelllegapeering.a la base. Si tu topología es hub-and-spoke, evaluá Private Service Connect en lugar de PSA.
· fix(content): respalda con fuente o recorta 11 gotchas de iam y security marcados como parciales
commit ca78528
- CorregidoAzureEl scaler también necesita identidad, no solo el contenedor
Ver el cambio
KEDA consulta el largo de la cola por su cuenta.
SiParaelquenamespacelotienehagalocalconauthidentidaddeshabilitada,administrada, la regla de escaladotiene que usarusa laidentidad administradapropiedad(identity_ididentity enla regla); con un connection stringlugarnodefunciona.auth. El portal no permite configurarlo: hacelo por IaC o CLI. - CorregidoAzureCon Contributor el pipeline no puede crear role assignments(cambiaron las fuentes)
Ver el cambio
Contributor no
tienepermiteMicrosoft.Authorization/roleAssignments/write.asignar roles en Azure RBAC (excluye Microsoft.Authorization/*/Write). Si tu Terraform asigna roles (por ejemplo, la identidad de una app sobre un Key Vault),el apply fallaContributorconnoAuthorizationFailed.alcanza. La salida rápida es darle Owner o User Access Administrator al pipeline, y es justo lo que no querés. La salida correcta es Role Based Access Control Administrator con una condición que limite qué roles puede asignar (y que excluya los roles privilegiados). - CorregidoAWSSi el job declara un environment, el sub deja de tener la rama(cambiaron las fuentes)
Ver el cambio
GitHub
armaincluye el environment en el subconcuandoprioridad:elenvironment,jobdespuéslo referencia; pull_request yreciénladespuésreflasoloref.entran si el job no referencia un environment. Un job en main con environment production presenta repo:org/repo:environment:production, así que una trust policy que espera repo:org/repo:ref:refs/heads/main rechaza el AssumeRoleWithWebIdentity.Pasa lo mismo en Azure y GCP; acá el error es "Not authorized to perform sts:AssumeRoleWithWebIdentity". - CorregidoAzureEl scope mínimo de RBAC es el contenedor, no el prefijo(cambiaron las fuentes)
Ver el cambio
En S3 acotás la policy a arn:...:bucket/incoming/* y en GCP usás IAM Conditions por prefijo. En Azure un role assignment llega como mínimo al contenedor; para acotar por ruta necesitás condiciones ABAC sobre el role assignment. Alternativa simple: un contenedor dedicado a la ingesta (lo que hace este módulo).
- CorregidoAWSBlock Public Access y ACLs deshabilitadas ya son default (pero declaralos igual)(cambiaron las fuentes)
Ver el cambio
Desde abril de 2023
losS3bucketshabilitanuevosBlocksePubliccreanAccessconyBlockdeshabilitaPubliclasAccessACLsactivoenytodosObjectlos buckets nuevos (Object Ownership enBucketOwnerEnforced.BucketOwnerEnforced). Ya no es "la" diferencia con Azure. Igual declaralos en IaC: los bucketsviejosexistentes no cambiaron, y declarar el estado evita drift si alguien los toca desde la consola. - CorregidoAzurePor ARM se agregan administradores Entra; el rol de la app se crea con SQL
Ver el cambio
Terraform/ARM agrega principals Entra como administradores (azure_pg_admin, CREATEROLE, CREATEDB). Para que la identidad de la app
tengaseapermisosunmínimos,usuario común, un admin Entratiene quepuede ejecutar pgaadauth_create_principal('<nombre>', false,false) y después los GRANT.false). Para identidades administradas y service principals el nombre es el display name. El módulo deja el SQL exacto como output. - CorregidoAWSHTTPS en un ALB interno igual necesita un certificado de un dominio que controles
Ver el cambio
ElPara crear un listener HTTPSrequierehay que desplegar al menos un certificadoendeACM.servidorUnSSLcertificado(depúblicoACM o de IAM). ACMseexigevalidaprobarcontralaDNSpropiedadodelmaildominio de undominio real aunquecertificadoelpúblicoALBporseaDNS,interno;maillaoalternativaHTTP,esyAWSnoPrivatepuedeCA,validarquerecursostieneencargounamensual.privateEnhostedACAzoneydeCloudVPCRunnielencertificadoningúndelotro dominioporprivado,defectoaunqueloelgestionaALBlaseaplataforma.interno. - CorregidoAWSEl master user existe siempre; que su contraseña la gestione Secrets Manager(cambiaron las fuentes)
Ver el cambio
Con manage_master_user_password = true, RDS genera la contraseña del master y la guarda en Secrets
Manager: nunca pasa por variables ni porManager.elElestadoprovider deTerraform. Es incompatibleTerraformconnopasarpermitepasswordcombinarloaconmano,password, y RDS noestálosoportadosoporta en algunos escenarios (por ejemplo Blue/Green deployments), así que decidilo de entrada. - CorregidoGCP"Internal" es un control de red; la autenticación es IAM aparte(cambiaron las fuentes)
Ver el cambio
Con ingress internal, Cloud Run rechaza requests que no vengan de VPCs del mismo proyecto (o perímetro de VPC SC) o de otros servicios de Google, aun usando la URL run.app. Pero
además,laporautenticacióndefaultIAMexigesiguerun.routes.invoke:aplicando: el cliente tiene quemandarpresentar un ID tokende una identidad con roles/run.invoker. En ACAyen el ALB interno la red es el único control salvo quesuagreguescuentaauthdeenserviciolanecesitaapp.roles/run.invoker.
· fix(content): corrige dos gotchas de AWS señalados por la pre-verificación
commit d6e8bba
- CorregidoAWSReenviar desde on-premises a la IP .2 de la VPC no está soportado(cambiaron las fuentes)
Ver el cambio
El resolver de la VPC (base del CIDR + 2) contesta a los recursos de la VPC. AWS indica que reenviarle consultas desde on-premises u otros DNS no está soportado y puede dar resultados inestables, aunque a veces parezca funcionar. Para eso existe el inbound endpoint, igual que el de Azure o la inbound policy de GCP.
- NuevoAWSEl token de IAM auth dura 15 minutos y solo sirve para abrir la conexión
- EliminadoAWSIAM auth tiene un límite de conexiones nuevas por segundo
· feat(patterns): hybrid private DNS (on-premises <-> cloud)
commit a5321b0
- NuevoAzureCada endpoint necesita su propia subnet delegada, y el resolver queda atado a una VNet y una región
- NuevoAzureEn Azure la zona privada vinculada gana sobre el ruleset; en AWS es al revés
- NuevoAzureLinkear el ruleset al hub, con una regla que apunta a su propio inbound endpoint, arma un loop
- NuevoAzureUna regla comodín "." tiene que resolver nombres públicos, y 168.63.129.16 no sirve como destino
- NuevoAzureDNS Private Resolver no es compatible con Azure Lighthouse ni con ExpressRoute FastPath
- NuevoAWSCada IP de un endpoint es una ENI que se paga por hora, y el mínimo son dos por endpoint
- NuevoAWSReenviar desde on-premises a la IP .2 de la VPC no está soportado
- NuevoAWSLa private hosted zone tiene que estar asociada a la VPC del inbound endpoint
- NuevoAWSUna regla de forward le gana a una private hosted zone con el mismo nombre
- NuevoAWSSon 10.000 QPS por IP, pero con connection tracking pueden ser 1.500
- NuevoGCPLas consultas reenviadas salen desde 35.199.192.0/19, y on-premises tiene que poder contestarle
- NuevoGCPCon routing estándar, un destino que no es RFC 1918 se consulta por internet
- NuevoGCPLa inbound policy toma una IP de cada subnet, no una por región ni dos por endpoint
· feat(patterns): secretless CI/CD deployments with OIDC federation
commit c33734d
- NuevoAzureEl subject tiene que coincidir exacto, sin comodines, y hay un máximo de 20 credenciales por identidad
- NuevoAzureUna credencial recién creada puede fallar con AADSTS70021 durante unos minutos
- NuevoAzureCrear varias credenciales en paralelo sobre la misma identidad da 409
- NuevoAzureCon Contributor el pipeline no puede crear role assignments
- NuevoAzureDesde el 15/07/2026, los repos nuevos, renombrados o transferidos usan otro formato de sub
- NuevoAWSIAM exige una condición sobre sub, pero acepta una que igual abre la puerta
- NuevoAWSSi el job declara un environment, el sub deja de tener la rama
- NuevoAWSHay un solo OIDC provider por URL y por cuenta
- NuevoAWSPara GitHub, el thumbprint ya no se usa (y no hace falta cargarlo)
- NuevoAWSLa sesión dura 1 hora por default, y encadenar roles la limita a 1 hora sí o sí
- NuevoGCPSin attribute_condition, el issuer compartido de GitHub deja entrar a cualquier repo
- NuevoGCPCondicioná sobre los IDs numéricos, no sobre los nombres de org y repo
- NuevoGCPUn pool borrado bloquea su ID durante unos 30 días
- NuevoGCPEl acceso directo sin service account no funciona con todos los servicios
- NuevoGCPLos identificadores usan el número de proyecto, y los permisos tardan minutos en propagarse
· feat(content): two new patterns, 26 capabilities and pattern scaffolder
commit 1277919
- NuevoAzurePeek-lock es at-least-once, no exactly-once
- NuevoAzureLa dead-letter queue ocupa la cuota de la cola si nadie la vacía
- NuevoAzureEl scaler también necesita identidad, no solo el contenedor
- NuevoAWSEl visibility timeout de la cola tiene que ser al menos 6 veces el timeout de la Lambda
- NuevoAWSSin ReportBatchItemFailures, un mensaje fallido reintenta todo el lote
- NuevoAWSEn colas Standard, el mensaje expira en la DLQ según cuándo entró a la cola original
- NuevoAWSLimitá la concurrencia del event source mapping, no solo la de la función
- NuevoGCPEl dead-letter no funciona sin permisos para el service agent de Pub/Sub
- NuevoGCPUn dead-letter topic sin suscripción descarta los mensajes
- NuevoGCPEn push, el ack es la respuesta HTTP y tiene que llegar dentro del ack deadline
- NuevoGCPPub/Sub ofrece exactly-once delivery, pero solo en suscripciones pull
- NuevoAzureLa subnet de ACA no se puede agrandar y su tamaño mínimo depende del tipo de environment
- NuevoAzureUn environment interno no resuelve su propio dominio desde la VNet
- NuevoAzureEn PostgreSQL Flexible, VNet integration vs. Private Endpoint se elige una sola vez
- NuevoAzurePor ARM solo podés crear administradores Entra; el rol de la app se crea con SQL
- NuevoAzureEl token de Entra para PostgreSQL no se pide para el FQDN del servidor
- NuevoAzureLa base no escala a cero, y si la detenés arranca sola a los 7 días
- NuevoAWSEl usuario IAM de la base se crea con SQL, y con rds_iam deja de aceptar contraseña
- NuevoAWSIAM auth tiene un límite de conexiones nuevas por segundo
- NuevoAWSFargate en subnet privada sin NAT necesita varios VPC endpoints pagos
- NuevoAWSHTTPS en un ALB interno igual necesita un certificado de un dominio que controles
- NuevoAWSEl master user existe siempre; que su contraseña la gestione Secrets Manager
- NuevoGCPEn Postgres, el usuario IAM de una Service Account va sin ".gserviceaccount.com"
- NuevoGCPA diferencia de Azure y AWS, el login IAM se crea por API, sin SQL
- NuevoGCPLa IP privada de Cloud SQL viaja por un VPC peering que no es transitivo
- NuevoGCP"Internal" es un control de red; la autenticación es IAM aparte
- NuevoGCPForzá el uso de connectors para que nadie se conecte "por fuera"
· feat(content): content-as-code schema, validator and object-storage-ttl pattern
commit 7276221
- NuevoAzureLa policy tarda hasta 24 h en aplicarse y corre en background
- NuevoAzureCon soft delete activo, "borrar" no libera capacidad
- NuevoAzureEn Azure el prefijo del filtro incluye el nombre del contenedor
- NuevoAzureEl scope mínimo de RBAC es el contenedor, no el prefijo
- NuevoAzurePrivate Endpoint sin zona DNS privada = 403 desde la VNet
- NuevoAWSLa expiración es asincrónica, pero el cobro se corta en la fecha de expiración
- NuevoAWSEn un bucket versionado, Expiration no borra nada
- NuevoAWSLos multipart uploads incompletos se cobran y no se ven
- NuevoAWSBlock Public Access y ACLs deshabilitadas ya son default (pero declaralos igual)
- NuevoAWSEl Gateway Endpoint es gratis, pero solo sirve dentro de la VPC y la región
- NuevoAWSUn Deny por aws:SourceVpce también te deja afuera a vos
- NuevoGCPSoft delete viene activo por default (7 días) y encarece los datos efímeros
- NuevoGCPLos cambios de lifecycle pueden tardar hasta 24 h y la acción es asincrónica
- NuevoGCProles/storage.objectCreator no alcanza para sobrescribir
- NuevoGCPPrivate Google Access no restringe quién accede al bucket
- NuevoGCPUniform bucket-level access + public access prevention son el par a declarar