← All controls

58 WORM off-tenant log archive

Audit logs that live where the tenant's own admins can reach them — the Admin console, the BigQuery export (31 Audit-log export to SIEM/BigQuery) — are still deletable by whoever administers that surface, and that is often the same super admin the logs are evidence against. This control lands a second copy in a Cloud Storage bucket with a LOCKED Bucket Lock retention policy, in a project whose IAM is separate from the Workspace super admins being audited. Locked means write-once: the retention period cannot be shortened and objects cannot be deleted before it expires. The lock only places a lien against deleting the project, though — anyone who can remove liens (included in roles/owner) can delete the whole project, bucket and all, which is why the IAM split below is load-bearing. The source is Workspace data sharing with Google Cloud, which places the audit logs in Cloud Logging at the organization level; the BigQuery export is a separate pipe that never passes through Cloud Logging.

Caveats

Setup steps

  1. Account › Account settings › Legal and compliance

    Sharing options = Enabled (share Google Workspace data with Google Cloud services; super admin only)

    Share data with Google Cloud services ↗

  2. gcloud logging sinks create ws-audit-archive storage.googleapis.com/<archive-bucket> --organization=<ORG_ID> --log-filter='protoPayload.serviceName=("admin.googleapis.com" OR "login.googleapis.com" OR "cloudidentity.googleapis.com" OR "oauth2.googleapis.com")'

    View and manage audit logs for Google Workspace ↗ Collate and route organization- and folder-level logs to supported destinations ↗

  3. gcloud storage buckets update gs://… --retention-period=94608000s (3 years)
    gcloud storage buckets update gs://… --lock-retention-period

    Bucket Lock ↗ Use and lock retention policies ↗

  4. Separate GCP org/project IAM; no shared identity

Ongoing maintenance

How to verify

  1. Confirm the retention policy is LOCKED (not merely set) and that objects are still arriving.

    gcloud storage buckets describe gs://<archive-bucket> --format='default(retention_policy)'
    gcloud storage ls -l --recursive gs://<archive-bucket> | tail -3
  2. Attempt to delete a recent object with project-owner credentials — the locked policy must refuse it. The refusal is the control.

v0.1.3Assureedition All (expanded events: Ent Std+) policy #18 · #11 ↗