<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
  <id>https://cloud-rosetta-stone.vercel.app/es/changes/</id>
  <title>Letra Chica — Qué cambió en la letra chica</title>
  <link rel="self" href="https://cloud-rosetta-stone.vercel.app/es/feed.xml"/>
  <link href="https://cloud-rosetta-stone.vercel.app/es/changes/"/>
  <updated>2026-10-24T00:00:00Z</updated>
  <rights>CC BY-SA 4.0</rights>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#6d37065-centralized-audit-logging-aws-org-trail-validation-failures-dont-block</id>
    <title>[Corregido] [AWS] CloudTrail crea el trail de organización en las cuentas miembro aunque falle la validación del bucket o de la clave</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-org-trail-validation-failures-dont-block"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#6d37065-centralized-audit-logging-aws-org-bucket-policy-needs-org-statement</id>
    <title>[Corregido] [AWS] En el ejemplo oficial, la bucket policy de un trail de organización necesita su propia sentencia y los logs son accesibles solo para management</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-org-bucket-policy-needs-org-statement"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">&lt;ins&gt;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. &lt;/ins&gt;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-&amp;lt;id de la organización&amp;gt;/). 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.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#6d37065-centralized-audit-logging-aws-opt-in-home-region</id>
    <title>[Corregido] [AWS] Si la home Region de un trail multi-región es opt-in, solo envían actividad las cuentas que habilitaron esa región</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-opt-in-home-region"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#6d37065-centralized-audit-logging-aws-misconfigured-trail-redelivery-charges</id>
    <title>[Corregido] [AWS] Un trail mal configurado reintenta la entrega durante 30 días y esos intentos se cobran</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-misconfigured-trail-redelivery-charges"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#004f543-preventive-guardrails-aws-test-in-an-ou-before-the-root</id>
    <title>[Corregido] [AWS] Probá 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</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#aws-test-in-an-ou-before-the-root"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#ff55dad-protected-origin-cdn-azure-private-link-origin-needs-anonymous-or-sas</id>
    <title>[Corregido] [Azure] Con Private Link al storage, un contenedor sin acceso anónimo requiere autorizar los pedidos, por ejemplo con SAS</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#azure-private-link-origin-needs-anonymous-or-sas"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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. &lt;del&gt;Entonces hay que&lt;/del&gt;&lt;ins&gt;Si&lt;/ins&gt; &lt;del&gt;elegir:&lt;/del&gt;&lt;ins&gt;el&lt;/ins&gt; contenedor &lt;del&gt;con lectura anónima de blobs,&lt;/del&gt;&lt;ins&gt;no&lt;/ins&gt; &lt;del&gt;que&lt;/del&gt;&lt;ins&gt;permite&lt;/ins&gt; &lt;del&gt;solo&lt;/del&gt;&lt;ins&gt;acceso&lt;/ins&gt; &lt;del&gt;se&lt;/del&gt;&lt;ins&gt;anónimo,&lt;/ins&gt; &lt;del&gt;alcanza&lt;/del&gt;&lt;ins&gt;no&lt;/ins&gt; &lt;del&gt;por&lt;/del&gt;&lt;ins&gt;conectes&lt;/ins&gt; el &lt;del&gt;private endpoint, o&lt;/del&gt;&lt;ins&gt;origen&lt;/ins&gt; &lt;del&gt;SAS&lt;/del&gt;&lt;ins&gt;sin&lt;/ins&gt; &lt;del&gt;en&lt;/del&gt;&lt;ins&gt;autorizar&lt;/ins&gt; los pedidos.&lt;del&gt; Decidilo de forma explícita y no dejes el contenedor privado sin SAS.&lt;/del&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#ff55dad-protected-origin-cdn-gcp-public-bucket-defeats-signed-urls</id>
    <title>[Corregido] [GCP] Si el bucket sigue siendo público, las URLs firmadas no protegen el contenido</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#gcp-public-bucket-defeats-signed-urls"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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. &lt;ins&gt;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. &lt;/ins&gt;Revisá que el bucket no tenga allUsers ni allAuthenticatedUsers antes de dar la entrada por cerrada, y firmá solo URLs HTTPS.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-azure-activity-log-default-retention</id>
    <title>[Nuevo] [Azure] El Activity Log se borra a los 90 días; para conservarlo más hay que exportarlo con un diagnostic setting</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#azure-activity-log-default-retention"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Azure Monitor recolecta el Activity Log sin configuración, pero retiene los eventos 90 días y después los borra. Para conservarlos más tiempo hay que crear un diagnostic setting que los envíe a otro destino (un workspace de Log Analytics, un storage account o Event Hubs). Importa por un dato en particular: el Activity Log es el único lugar donde se guarda quién creó un recurso. Si ya exportabas con log profiles (el método heredado), deshabilitá esa configuración al crear el diagnostic setting.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-azure-management-group-setting-misses-subscription-events</id>
    <title>[Nuevo] [Azure] Un diagnostic setting en el management group no captura todos los eventos de nivel suscripción</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#azure-management-group-setting-misses-subscription-events"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Un diagnostic setting de un management group exporta los eventos de ese grupo y de los que tiene debajo, pero no todos los de nivel suscripción: Azure Resource Manager escribe una propiedad de jerarquía que no es obligatoria, y los resource providers fuera de ARM no la completan. Los eventos de suscripción sin esa propiedad no llegan a un setting de management group, ni siquiera al del root. Creá además un diagnostic setting por suscripción con todas las categorías. Si los dos exportan al mismo destino vas a recibir eventos duplicados: se combinan con una consulta que use un hash de todos los campos.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-azure-destination-in-another-subscription-needs-rbac</id>
    <title>[Nuevo] [Azure] El destino puede estar en otra suscripción si quien crea el setting tiene acceso RBAC a las dos</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#azure-destination-in-another-subscription-needs-rbac"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">El destino de un diagnostic setting no tiene que estar en la misma suscripción que el recurso que envía los logs, siempre que quien configura el setting tenga el acceso RBAC adecuado sobre ambas suscripciones. Para un destino en otro tenant de Microsoft Entra, la documentación indica usar Azure Lighthouse. El destino también tiene que existir antes de crear el setting. Planificá los permisos de la identidad que aplica el Terraform sobre la suscripción central y sobre cada suscripción de origen.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-azure-storage-destination-requirements</id>
    <title>[Nuevo] [Azure] Un storage account de destino con redes virtuales exige permitir servicios de confianza y no puede ser Premium</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#azure-storage-destination-requirements"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Los diagnostic settings no pueden acceder a un storage account con redes virtuales habilitadas, salvo que actives &amp;quot;Allow trusted Microsoft services to bypass this firewall&amp;quot; en la cuenta. Los storage accounts Premium no se admiten como destino; los Standard sí. Para archivar el Activity Log (auditoría, análisis estático o backup), la documentación de diagnostic settings recomienda enviar los datos a almacenamiento inmutable para evitar que se modifiquen, con una política de inmutabilidad configurada en la cuenta.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-azure-activity-log-ingestion-cost</id>
    <title>[Nuevo] [Azure] Exportar el Activity Log a Log Analytics no cobra ingesta; la retención se cobra solo después de los 90 días</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#azure-activity-log-ingestion-cost"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">No hay cargos de ingesta de datos por los activity logs en un workspace de Log Analytics, y los cargos de retención aplican solo al período que excede los 90 días por defecto. La regla es sobre el Activity Log: no la extiendas a otros datos que mandes al mismo workspace. Como alternativa, la documentación de diagnostic settings indica que un storage account puede ser más barato que otras opciones y conservarse indefinidamente.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-aws-org-trail-validation-failures-dont-block</id>
    <title>[Nuevo] [AWS] CloudTrail crea el trail de organización en las cuentas miembro aunque falle la validación del bucket o de la clave</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-org-trail-validation-failures-dont-block"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-aws-org-bucket-policy-needs-org-statement</id>
    <title>[Nuevo] [AWS] La bucket policy de un trail de organización necesita su propia sentencia, y por defecto solo management lee los logs</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-org-bucket-policy-needs-org-statement"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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-&amp;lt;id de la organización&amp;gt;/). 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.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-aws-opt-in-home-region</id>
    <title>[Nuevo] [AWS] Si la home Region de un trail multi-región es opt-in, solo envían actividad las cuentas que habilitaron esa región</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-opt-in-home-region"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-aws-kms-decrypt-before-enabling</id>
    <title>[Nuevo] [AWS] Los logs cifrados con KMS solo los lee quien tiene kms:Decrypt: dalo antes de asociar la clave al trail</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-kms-decrypt-before-enabling"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Los usuarios con permiso para cifrar pero sin permiso de descifrado no pueden leer los logs cifrados; la documentación indica dar permisos de descifrado a todos los usuarios que los necesiten antes de agregar la clave a la configuración del trail. Además, si el trail tiene cifrado y la clave está deshabilitada o su policy no está bien configurada para CloudTrail, CloudTrail no puede entregar los logs. La key policy necesita GenerateDataKey* para CloudTrail con aws:SourceArn, kms:DescribeKey, el descifrado del servicio y kms:Decrypt para los lectores con la condición del contexto de cifrado aws:cloudtrail:arn.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-aws-log-file-validation-is-not-automatic</id>
    <title>[Nuevo] [AWS] Habilitar la validación de integridad entrega archivos digest, pero no valida nada</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-log-file-validation-is-not-automatic"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Con la validación de integridad habilitada, CloudTrail crea un hash por cada log que entrega y, cada hora, entrega al bucket un archivo digest firmado, en una carpeta separada de la de los logs. Habilitarla no valida la integridad de los archivos: eso se hace después, con la AWS CLI o con una herramienta propia. La CLI valida los archivos en el lugar donde CloudTrail los entregó; si movés los logs a otro lugar, necesitás tu propia herramienta. Definí quién corre la validación y cada cuánto.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-aws-misconfigured-trail-redelivery-charges</id>
    <title>[Nuevo] [AWS] Un trail mal configurado reintenta la entrega durante 30 días y esos intentos se cobran</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#aws-misconfigured-trail-redelivery-charges"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-gcp-include-children-defaults-to-false</id>
    <title>[Nuevo] [GCP] Un sink de organización o carpeta con includeChildren en false solo exporta los logs del propio recurso padre</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#gcp-include-children-defaults-to-false"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">includeChildren aplica solo a sinks de organizaciones y carpetas, y su valor por defecto es false: en ese caso solo los logs del recurso padre del sink están disponibles para exportar, no los de los proyectos que contiene. Con true, los logs de todos los proyectos, carpetas y cuentas de facturación hijos también quedan disponibles, y que una entrada se exporte depende del filtro del sink. Ponelo en true de forma explícita (en gcloud, --include-children) y, si querés limitar los hijos, filtrá por la parte del proyecto del nombre del log.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-gcp-writer-identity-needs-destination-access</id>
    <title>[Nuevo] [GCP] El sink no exporta hasta que su writer identity tiene permiso de escritura sobre el destino</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#gcp-writer-identity-needs-destination-access"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">El writerIdentity del sink tiene que tener permiso de escritura sobre el destino o las entradas no se exportan. Logging crea y administra esa cuenta de servicio, y los permisos del destino los otorgás vos (no hacen falta si el destino es un log bucket del mismo proyecto del sink; acá está en otro proyecto, así que sí). Para todos los destinos se pide Logs Writer (roles/logging.logWriter, con el permiso logging.logEntries.route) y, para un log bucket, Logs Bucket Writer (roles/logging.bucketWriter). Para otorgarlos hace falta Owner sobre el proyecto que contiene el destino. Logging usa la misma cuenta de servicio para todos los sinks de un mismo recurso (proyecto, carpeta, organización o cuenta de facturación).&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-gcp-admin-activity-not-stored-in-destination-project</id>
    <title>[Nuevo] [GCP] Si el destino es un proyecto, los Admin Activity y System Event no se guardan en él sin un sink propio</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#gcp-admin-activity-not-stored-in-destination-project"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Los Admin Activity y System Event audit logs se almacenan en el bucket _Required del proyecto que los generó, y no se pueden configurar, excluir ni deshabilitar. Si los enrutás a otro proyecto, no pasan por los sinks _Default ni _Required del proyecto de destino y, por lo tanto, no se guardan ahí. Para guardarlos hay que crear un sink en el proyecto de destino o actualizar su sink _Default. Un log bucket como destino es distinto: no es un destino que reenvíe las entradas, así que los sinks del proyecto que lo aloja no las reprocesan. La documentación recomienda un proyecto como destino de un sink agregado; este patrón apunta directo al bucket.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-gcp-intercepting-sink-hides-logs-from-child-sinks</id>
    <title>[Nuevo] [GCP] Un sink agregado que intercepta saca los logs de los sinks de los proyectos hijos</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#gcp-intercepting-sink-hides-logs-from-child-sinks"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Un sink agregado que intercepta evita que las entradas lleguen a los sinks de los recursos hijos, salvo los _Required de donde se originan; uno que no intercepta no cambia cómo se enrutan hacia los demás sinks. Un sink que intercepta exige includeChildren en true y un proyecto como destino. Si un equipo necesita controlar por su cuenta cómo enruta ciertos logs, verificá que el sink que intercepta no se los lleve. La guía de aggregated sinks recomienda probar la configuración primero con uno que no intercepta y poner datos de contacto en la descripción del que intercepta.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-gcp-vpc-sc-ingress-for-sink-identity</id>
    <title>[Nuevo] [GCP] Un destino dentro de un perímetro de VPC Service Controls exige una regla de ingreso para la identidad del sink</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#gcp-vpc-sc-ingress-for-sink-identity"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Enrutar entradas a un recurso protegido por un service perimeter exige agregar al perímetro una regla de ingreso que permita el acceso desde la cuenta de servicio del sink. Si un sink agregado enruta a un bucket de Cloud Storage dentro de un perímetro, el tipo de identidad de la regla tiene que ser ANY_IDENTITY: no se pueden usar ANY_SERVICE_ACCOUNT ni ANY_USER_ACCOUNT para ese destino. Los sinks no agregados no necesitan esa regla. Si el proyecto central va a estar en un perímetro, agregá la regla antes de crear el sink.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-gcp-data-access-logs-enabled-at-the-source</id>
    <title>[Nuevo] [GCP] Los Data Access logs se habilitan en el origen, a nivel de organización o carpeta; el sink solo enruta lo que existe</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#gcp-data-access-logs-enabled-at-the-source"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Salvo BigQuery, los Data Access audit logs están deshabilitados por defecto y hay que habilitarlos de forma explícita; se escriben en el proyecto cuyos datos se acceden. Habilitarlos en una organización aplica a todos los proyectos y carpetas existentes y nuevos, y en un proyecto no se puede deshabilitar un log habilitado en su organización padre. Habilitarlos puede generar cargos por uso de logs adicional. El sink agregado no cambia esa configuración: filtra y enruta las entradas que existen. El gotcha data-access-logs-off-by-default del patrón app-secrets cubre el caso de Secret Manager.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#3a7ea88-centralized-audit-logging-gcp-bucket-retention-and-lock</id>
    <title>[Nuevo] [GCP] La retención de un bucket en una organización o carpeta no se puede extender, y bloquear un bucket es irreversible</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/centralized-audit-logging/all/#gcp-bucket-retention-and-lock"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">No se puede extender la retención de un log bucket que está en una carpeta u organización; la alternativa documentada es un sink que enrute a un bucket de un proyecto y configurar la retención ahí, como hace este patrón. Si extendés la retención, las reglas aplican hacia adelante y no de forma retroactiva, y los logs no se pueden recuperar cuando termina la retención aplicable. Bloquear un bucket es irreversible: bloquea también su política de retención y no se puede borrar hasta que cada entrada cumpla el período. Para evitar borrar por accidente un proyecto con un bucket bloqueado, agregale un lien. La consola no permite bloquear: se hace con gcloud (--locked) o con la API. La región del bucket no se puede cambiar después de crearlo.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-azure-deny-blocks-changes-on-noncompliant-accounts</id>
    <title>[Nuevo] [Azure] Con deny, una cuenta existente que no cumple no admite cambios de configuración hasta que se corrija</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#azure-deny-blocks-changes-on-noncompliant-accounts"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">El efecto deny impide la request de crear o actualizar un recurso que coincide con la regla: vuelve como 403 (Forbidden) antes de llegar al resource provider. Al evaluar los recursos que ya existían, los que coinciden con la regla se marcan como no conformes. La documentación de Azure Storage agrega la consecuencia: con esta política asignada, nadie puede hacer cambios de configuración en una cuenta existente cuyo acceso anónimo no cumple, hasta que allowBlobPublicAccess pase a false. Antes de asignar con deny, inventariá las cuentas no conformes y corregilas, para que el primer cambio de configuración de un equipo no falle con un 403.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-azure-audit-does-not-block</id>
    <title>[Nuevo] [Azure] Con efecto audit, la cuenta con acceso anónimo se crea igual</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#azure-audit-does-not-block"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">El efecto audit crea una advertencia cuando un recurso no cumple, pero no detiene la request. Si la asignación queda en audit, la cuenta de almacenamiento se crea con acceso anónimo y solo figura como no conforme en el informe de cumplimiento, que según la documentación puede tardar varios minutos en estar disponible tras crear la asignación. Usá audit para medir y deny para prevenir. El módulo toma el efecto de un parámetro (effect) y por defecto deniega.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-azure-donotenforce-evaluates-without-blocking</id>
    <title>[Nuevo] [Azure] En modo DoNotEnforce la asignación evalúa el cumplimiento sin aplicar el efecto</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#azure-donotenforce-evaluates-without-blocking"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">enforcementMode controla el resultado de una política sobre los recursos sin iniciar el efecto. Con DoNotEnforce el efecto no se aplica al crear o actualizar un recurso y no se escriben entradas en el Activity log; la documentación lo recomienda para probar una asignación nueva, revisar el impacto en el cumplimiento o validar la lógica antes de aplicarla. Consecuencia: mientras dure ese modo las requests que violan la regla no se rechazan, y no hay denegaciones en el Activity log para revisar: el impacto se lee en el informe de cumplimiento. Asigná primero con enforce = false, revisá qué cuentas salen no conformes y pasá a enforce = true cuando el resultado sea el esperado.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-azure-exemption-expiry-is-optional</id>
    <title>[Nuevo] [Azure] La exemption de Azure Policy solo vence si le ponés expiresOn, y al vencer queda como registro</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#azure-exemption-expiry-is-optional"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">expiresOn es una propiedad opcional que define cuándo el recurso o la jerarquía deja de estar exento. Al llegar la fecha la exemption no se borra: se conserva como registro, pero ya no se honra. El metadata admite campos propios (la documentación ejemplifica requestedBy, approvedBy, approvedOn y ticketRef) y, para crearla, hace falta además de Microsoft.Authorization/policyExemptions/write el verbo exempt/Action sobre la asignación. La documentación recomienda las exemptions para escenarios acotados en el tiempo, donde el recurso debe seguir bajo seguimiento; notScopes, en cambio, excluye el scope de la evaluación. Exigí expiresOn y metadata de quién la pidió y la aprobó (el módulo los pide), reservá exempt/Action para quien aprueba y revisá las exemptions con regularidad, borrando las vencidas.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-aws-scp-skips-management-account-and-slr</id>
    <title>[Nuevo] [AWS] Las SCP no alcanzan a la cuenta de administración ni a las service-linked roles</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#aws-scp-skips-management-account-and-slr"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Las SCP afectan solo a las cuentas miembro: no restringen a los usuarios ni a los roles de la cuenta de administración y no afectan a ninguna service-linked role. Tampoco se puede restringir con una SCP una acción hecha con los permisos de una service-linked role. Consecuencia: un recurso creado desde la cuenta de administración queda fuera del guardrail. Mantené los workloads fuera de la cuenta de administración. La documentación de declarative policies agrega que, a diferencia de las SCP y de las RCP, gobiernan las service-linked roles; si ese hueco te importa, evaluá una política declarativa para esa configuración.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-aws-scp-does-not-cover-external-principals</id>
    <title>[Nuevo] [AWS] Una SCP no frena a los principals externos que acceden a un bucket de la organización; para eso existen las RCP</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#aws-scp-does-not-cover-external-principals"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Las SCP restringen a los usuarios y roles de las cuentas de la organización y no afectan a los de cuentas fuera de ella. En el ejemplo de la documentación, el bucket policy del bucket de la cuenta A (dentro de la organización) da acceso a usuarios de la cuenta B (externa): la SCP de A no se aplica a esos usuarios. Una RCP sí se aplica al bucket de A aunque lo acceda la cuenta B. La documentación indica usar una SCP para limitar a los principals de tus cuentas y una RCP para restringir a los principals externos que acceden a recursos de tus cuentas, y Amazon S3 figura entre los servicios que soportan RCP. Las RCP tampoco afectan a los recursos de la cuenta de administración. Para exposición hacia fuera de la organización, una SCP sola no alcanza.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-aws-s3-policy-scope-is-the-exception</id>
    <title>[Nuevo] [AWS] Una S3 policy se aplica a todos los recursos S3 de las cuentas alcanzadas: la excepción se resuelve por OU o cuenta</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#aws-s3-policy-scope-is-the-exception"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Una S3 policy define la configuración de todos los recursos de Amazon S3 de las cuentas dentro de su alcance y sobrescribe la configuración a nivel de cuenta. Con @@assign en &amp;quot;all&amp;quot; se habilitan juntas las cuatro opciones de Block Public Access (BlockPublicAcls, BlockPublicPolicy, IgnorePublicAcls, RestrictPublicBuckets); la documentación describe solo los valores &amp;quot;all&amp;quot; y &amp;quot;none&amp;quot;. La guía de buenas prácticas indica que, si hay cuentas que necesitan buckets públicos por una razón legítima (por ejemplo, un sitio estático), uses attachments a nivel de OU o de cuenta para excluirlas, o concentres esa necesidad en cuentas dedicadas. Y si querés administrar Block Public Access a nivel de cuenta, hay que deshabilitar el tipo de política S3 en la organización. Diseñá las OU para que una excepción sea una OU o cuenta propia, no un bucket suelto en una cuenta general.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-aws-s3-policy-ignores-existing-public-access-does-not-remove-it</id>
    <title>[Nuevo] [AWS] Con la S3 policy, el acceso público que ya existía se ignora; no se elimina</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#aws-s3-policy-ignores-existing-public-access-does-not-remove-it"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">BlockPublicAcls y BlockPublicPolicy no cambian los permisos que ya otorgan acceso público a recursos de S3. IgnorePublicAcls ignora todas las ACL que dan acceso público y RestrictPublicBuckets ignora el acceso público y entre cuentas de los buckets o access points con policies que otorgan acceso público. Si la S3 policy se desadjunta, las cuentas vuelven a su configuración previa a nivel de cuenta, así que lo que hoy se ignora puede volver a tener efecto según cómo estuviera esa configuración. Inventariá y corregí los permisos públicos en vez de confiar solo en que se ignoran.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-aws-test-in-an-ou-before-the-root</id>
    <title>[Nuevo] [AWS] Probá la política en una OU antes de adjuntarla a la raíz; quitar FullAWSAccess sin reemplazo corta todas las acciones</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#aws-test-in-an-ou-before-the-root"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-aws-disabling-scp-type-detaches-everything</id>
    <title>[Nuevo] [AWS] Deshabilitar el tipo de política SCP en una raíz desadjunta todas las SCP, y los attachments se pierden</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#aws-disabling-scp-type-detaches-everything"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Al deshabilitar el tipo de política SCP en una raíz, todas las SCP se desadjuntan automáticamente de todas las entidades de Organizations (OU, organización y cuentas). Si volvés a habilitarlas, la raíz queda solo con la política FullAWSAccess que se adjunta por defecto a todas las entidades; los attachments anteriores se pierden y no se recuperan automáticamente, aunque se pueden readjuntar a mano. Consecuencia: los guardrails basados en SCP dejan de aplicar de un momento a otro. Restringí quién puede deshabilitar tipos de política y, después de rehabilitar el tipo, verificá los attachments.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-gcp-existing-public-grants-are-overridden-not-removed</id>
    <title>[Nuevo] [GCP] Con la constraint enforced, los permisos para allUsers que ya existían quedan en su lugar, anulados</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#gcp-existing-public-grants-are-overridden-not-removed"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Con public access prevention aplicada, las requests autorizadas con allUsers y allAuthenticatedUsers fallan con un 401 o 403, y las IAM policies y ACL existentes que otorgan acceso a esos principals quedan en su lugar pero anuladas. Si más adelante se desactiva la prevención para el proyecto, la carpeta o la organización, esos permisos existentes entran en vigencia y los datos quedan accesibles al público. En sentido inverso, aplicarla sobre recursos existentes puede romper una aplicación que dependa de allUsers. Antes de aplicarla, inventariá los recursos públicos (Cloud Asset Inventory muestra las policies de todos los buckets de un proyecto, carpeta u organización; los usage logs ayudan a ver quién los lee) y limpiá los bindings públicos en vez de dejarlos anulados.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-gcp-exception-is-per-project-and-bucket-setting-wins</id>
    <title>[Nuevo] [GCP] La excepción a la constraint se hace por proyecto, y un bucket con el setting enforced sigue protegido</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#gcp-exception-is-per-project-and-bucket-setting-wins"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Para hacer excepciones en una organización que aplica public access prevention (por ejemplo, para un bucket de static website hosting), la documentación indica desactivarla en el proyecto que contiene el bucket. Un bucket solo puede estar en estado enforced o inherited: si es inherited, la prevención la determina la constraint del proyecto, y si en el proyecto está en false no se aplica a ese bucket. Los buckets con el setting enforced siguen con la prevención aunque la desactives en el proyecto, la carpeta o la organización. Consecuencia: la excepción alcanza a todos los buckets inherited del proyecto, no solo al que la motivó, y no sirve para un bucket enforced. Poné los buckets públicos legítimos en un proyecto propio, con el bucket en inherited, y revisá ese proyecto como una excepción de todo el proyecto.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-gcp-no-dry-run-for-public-access-prevention</id>
    <title>[Nuevo] [GCP] La constraint storage.publicAccessPrevention no figura entre las que admiten dry-run</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#gcp-no-dry-run-for-public-access-prevention"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Una organization policy en modo dry-run registra las violaciones en los audit logs sin denegar las acciones. La documentación lista como únicas constraints disponibles para dry-run las custom, las managed y cuatro legacy (Restrict service usage, Restrict endpoint usage, Restrict TLS versions y Restrict TLS cipher suites), y aclara que crear una policy en dry-run con cualquier otra constraint da error. El catálogo de constraints incluye storage.publicAccessPrevention entre las legacy managed, y no está en esa lista. Entonces el impacto no se mide con dry-run: usá antes el inventario de recursos públicos y los usage logs que recomienda la documentación de public access prevention.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#e42985e-preventive-guardrails-gcp-enforcement-delay-and-signed-urls</id>
    <title>[Nuevo] [GCP] La prevención tarda en aplicarse y no afecta a las URL firmadas</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/preventive-guardrails/all/#gcp-enforcement-delay-and-signed-urls"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">La documentación indica que el enforcement puede tardar hasta 10 minutos en aplicarse y que, una vez que empieza, los objetos pueden seguir accesibles públicamente desde una caché de internet durante un tiempo que depende de su Cache-Control (con el max-age por defecto de 3600 segundos, ese tiempo). Las URL firmadas, que dan acceso acotado en el tiempo a quien las use, no se ven afectadas por public access prevention, y el acceso a buckets privados a través de Cloud Load Balancing y Cloud CDN tampoco. Esa documentación explica que el acceso de estas funciones se otorga con permisos acotados de service account. No cuentes con un efecto inmediato, y controlá quién puede firmar URLs revisando esos permisos.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-azure-premium-private-link-pending-approval</id>
    <title>[Nuevo] [Azure] Private Link al origen está en Front Door Premium y la conexión del private endpoint hay que aprobarla</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#azure-premium-private-link-pending-approval"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">La tabla de comparación de niveles marca &amp;quot;Private Link connection to origin&amp;quot; en Front Door Premium y no en Standard. Al habilitar Private Link en un origen, Front Door crea un private endpoint de su red regional administrada y llega al origen una solicitud pendiente: hay que aprobar la conexión antes de que el tráfico pase de forma privada, desde el portal, la CLI o PowerShell. Tras aprobarla, la conexión puede tardar unos minutos en establecerse y, mientras tanto, los pedidos al origen reciben un mensaje de error de Front Door. Planificá la aprobación como un paso del despliegue y no esperes contenido hasta que la conexión figure establecida.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-azure-private-link-origin-needs-anonymous-or-sas</id>
    <title>[Nuevo] [Azure] Con Private Link al storage, un contenedor sin acceso anónimo requiere autorizar los pedidos, por ejemplo con SAS</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#azure-private-link-origin-needs-anonymous-or-sas"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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 que elegir: contenedor con lectura anónima de blobs, que solo se alcanza por el private endpoint, o SAS en los pedidos. Decidilo de forma explícita y no dejes el contenedor privado sin SAS.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-azure-no-mixed-public-private-origin-group</id>
    <title>[Nuevo] [Azure] Un origin group no puede mezclar orígenes públicos y orígenes con Private Link</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#azure-no-mixed-public-private-origin-group"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Front Door no permite mezclar orígenes públicos y privados en el mismo origin group; la guía lista como error común agregar un origen con Private Link a un grupo que ya tiene orígenes públicos. Si se habilita Private Link en más de un origen público del mismo grupo a la vez, la operación puede fallar con &amp;quot;Origin Group can only have origins with private links or origins without private links. They cannot have a mix of both&amp;quot;, porque los orígenes se actualizan de a uno. Mantené los públicos en un grupo y los privados en otro, y si migrás un grupo existente, habilitá Private Link de a un origen: dejá uno solo, habilitalo y aprobá su conexión, y recién después sumá el siguiente.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-azure-premium-base-fee-for-private-link</id>
    <title>[Nuevo] [Azure] Private Link al origen implica el nivel Premium, que tiene un cargo base mayor</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#azure-premium-base-fee-for-private-link"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Cada perfil de Front Door cobra una tarifa por hora, por cada hora o fracción en que el perfil está desplegado, y la tarifa depende del nivel. Premium tiene un cargo base y un cargo de procesamiento de pedidos mayores. La documentación aclara que no se paga extra por el tráfico de Private Link frente al de un endpoint público del origen, ni por los conjuntos de reglas administrados de WAF en Premium. Si el origen no necesita Private Link, comprobá antes de elegir Premium qué usás realmente del nivel.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-aws-sourcearn-condition-scopes-the-origin</id>
    <title>[Nuevo] [AWS] El acceso de CloudFront al bucket se limita a tu distribución con la condición AWS:SourceArn</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#aws-sourcearn-condition-scopes-the-origin"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Con origin access control, la policy del bucket da permiso al principal de servicio cloudfront.amazonaws.com. AWS indica usar un elemento Condition para que CloudFront acceda al bucket solo cuando el pedido es en nombre de la distribución que contiene el origen S3; el ejemplo oficial usa StringEquals sobre AWS:SourceArn con el ARN de esa distribución. La condición es lo que limita el acceso a esa distribución. La policy se agrega después de crear la distribución y antes de sumar el OAC al origen. Además, con OAC sobre un bucket S3 el Object Ownership tiene que ser Bucket owner enforced (el valor por defecto de los buckets nuevos), o Bucket owner preferred si necesitás ACLs. Incluí la condición en la policy del bucket con el ARN de tu distribución.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-aws-website-endpoint-cannot-use-oac</id>
    <title>[Nuevo] [AWS] Un bucket configurado como website endpoint no puede usar OAC</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#aws-website-endpoint-cannot-use-oac"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Si el origen es un bucket S3 configurado como website endpoint, hay que configurarlo en CloudFront como custom origin, y eso significa que no se puede usar OAC (ni OAI). La documentación pide que el origen sea un bucket regular, no uno configurado como website endpoint. Además, OAC no admite origin redirect con Lambda@Edge. Usá el endpoint regular del bucket como origen; si necesitás el comportamiento de website, ese origen queda fuera de la protección por OAC.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-aws-sse-kms-needs-key-policy</id>
    <title>[Nuevo] [AWS] Con SSE-KMS la distribución también necesita permiso sobre la clave</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#aws-sse-kms-needs-key-policy"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">OAC admite SSE-KMS (OAI no). Si los objetos del bucket están cifrados con SSE-KMS, hay que asegurarse de que la distribución tenga permiso para usar la clave de KMS: se agrega un statement a la key policy. El ejemplo oficial da kms:Decrypt, kms:Encrypt y kms:GenerateDataKey* al principal cloudfront.amazonaws.com, con la misma condición AWS:SourceArn del ARN de la distribución. La key policy vive con la clave, no con el bucket: si la gestiona otro equipo, pedile el statement con el ARN de la distribución.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-gcp-cdn-service-account-appears-with-first-key</id>
    <title>[Nuevo] [GCP] Cloud CDN lee el bucket con su cuenta de servicio, que aparece al agregar la primera clave</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#gcp-cdn-service-account-appears-with-first-key"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Si el bucket restringe quién lee los objetos, Cloud CDN necesita permiso de lectura, y se le da a su cuenta de servicio service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com con roles/storage.objectViewer. Esa cuenta se crea automáticamente la primera vez que se agrega una clave a un backend bucket del proyecto; antes de eso el comando de permisos falla. Tampoco aparece en la lista de cuentas de servicio del proyecto, porque es de Cloud CDN. Si el proyecto tiene la política de organización de uso compartido restringido por dominio, la documentación sugiere deshabilitarla un momento o permitir la organización dueña del proyecto cloud-cdn-fill. En el IaC, hacé que el permiso dependa de la clave.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-gcp-public-bucket-defeats-signed-urls</id>
    <title>[Nuevo] [GCP] Si el bucket sigue siendo público, las URLs firmadas no protegen el contenido</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#gcp-public-bucket-defeats-signed-urls"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">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. Revisá que el bucket no tenga allUsers ni allAuthenticatedUsers antes de dar la entrada por cerrada, y firmá solo URLs HTTPS.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#4b9b896-protected-origin-cdn-gcp-signed-url-responses-ignore-cache-control</id>
    <title>[Nuevo] [GCP] Cloud CDN cachea las respuestas a pedidos firmados sin mirar el Cache-Control del origen</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/protected-origin-cdn/all/#gcp-signed-url-responses-ignore-cache-control"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Cloud CDN cachea las respuestas a pedidos firmados sin importar el header Cache-Control del backend. El tiempo máximo que esas respuestas pueden cachearse sin revalidar lo fija el flag signed-url-cache-max-age, que por defecto es de una hora. El Cache-Control del objeto no lo acorta. Fijá el máximo según cuánto toleres que una respuesta se siga sirviendo desde el caché, y no cuentes con el Cache-Control del objeto para controlarlo en pedidos firmados.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/es/changes/#651a32f-ci-oidc-federation-gcp-project-number-and-propagation</id>
    <title>[Corregido] [GCP] Los principals usan el número de proyecto, y los permisos tardan minutos en propagarse</title>
    <link href="https://cloud-rosetta-stone.vercel.app/es/patterns/ci-oidc-federation/all/#gcp-project-number-and-propagation"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">&lt;del&gt;El principalSet&lt;/del&gt;&lt;ins&gt;Al&lt;/ins&gt; &lt;del&gt;y&lt;/del&gt;&lt;ins&gt;otorgar&lt;/ins&gt; &lt;del&gt;el&lt;/del&gt;&lt;ins&gt;roles&lt;/ins&gt; &lt;del&gt;workload_identity_provider&lt;/del&gt;&lt;ins&gt;a&lt;/ins&gt; &lt;del&gt;que&lt;/del&gt;&lt;ins&gt;identidades&lt;/ins&gt; &lt;del&gt;le&lt;/del&gt;&lt;ins&gt;externas&lt;/ins&gt; &lt;del&gt;pasás&lt;/del&gt;&lt;ins&gt;se&lt;/ins&gt; &lt;del&gt;a&lt;/del&gt;&lt;ins&gt;usa&lt;/ins&gt; &lt;del&gt;la&lt;/del&gt;&lt;ins&gt;el&lt;/ins&gt; &lt;del&gt;action&lt;/del&gt;&lt;ins&gt;número&lt;/ins&gt; &lt;del&gt;son&lt;/del&gt;&lt;ins&gt;de&lt;/ins&gt; &lt;del&gt;projects/NÚMERO/locations/global/...,&lt;/del&gt;&lt;ins&gt;proyecto,&lt;/ins&gt; no el &lt;del&gt;ID&lt;/del&gt;&lt;ins&gt;ID:&lt;/ins&gt; &lt;del&gt;del&lt;/del&gt;&lt;ins&gt;el&lt;/ins&gt; &lt;del&gt;proyecto.&lt;/del&gt;&lt;ins&gt;principalSet&lt;/ins&gt; &lt;ins&gt;es principalSet://iam.googleapis.com/projects/NÚMERO_DE_PROYECTO/locations/global/workloadIdentityPools/.... &lt;/ins&gt;Además, un cambio de IAM suele aplicarse en 2 minutos pero puede tardar 7 o &lt;del&gt;más, así que un pipeline que se acaba de configurar puede fallar en la primera corrida sin que nada esté mal.&lt;/del&gt;&lt;ins&gt;más.&lt;/ins&gt;</content>
  </entry>
</feed>
