Skip to content

Privacy and preparation

Cross-account bucket delivery (S3, GCS, Azure): a security checklist

By SourceX Editorial · Updated

Short answer

To share an S3 bucket with another account securely, deliver from a dedicated bucket, grant one scoped read-only principal, encrypt with a key whose policy you control, log every read, and set an expiry date with a planned revocation. The same controls map to Google Cloud Storage and Azure Blob Storage under different names.

Key takeaways

  • Never grant a buyer access to a production bucket; copy the delivery into a dedicated bucket or account.
  • Grant read-only access to one named principal in the buyer's account, scoped to the delivery prefix.
  • A customer-managed key lets you cut off decryption by changing the key policy, even before the bucket is deleted.
  • Turn on object-level access logging before granting access, not after a question arises.
  • Presigned or signed URLs suit small one-off pulls; role-based grants suit large or repeated deliveries.

Start with a dedicated delivery bucket#

A dedicated delivery bucket is the foundation of cross-account sharing, because every other control is simpler when the bucket holds only the licensed package. Copy the prepared data into a new bucket, ideally in a separate account, project or subscription used only for deliveries, and never grant a buyer access to a production or backup bucket.

Block public access on the bucket and the account before anything is uploaded. Name the bucket for the delivery rather than the buyer, since bucket names surface in logs, URLs and shared documents. Include a manifest of file names and checksums so the buyer can confirm the package is complete.

Before granting access, run a final scan of the delivery prefix. Google's Sensitive Data Protection can inspect Cloud Storage repositories, and secret scanners such as TruffleHog, which scans object stores among other sources, can catch keys left in configuration exports. TruffleHog's verification feature logs in with the secrets it finds, so use it with care on data that may contain third-party credentials.

The cross-account delivery checklist#

The cross-account delivery checklist covers nine controls, from a dedicated bucket to planned revocation, and works as a sign-off document. The person who configures the bucket and a second reviewer both confirm each line before the buyer receives access details.

  • Dedicated bucket in a delivery-only account, project or subscription.
  • Public access blocked at both bucket and account level.
  • One principal in the buyer's account, named in the license or delivery plan.
  • Read-only actions only, scoped to the delivery prefix.
  • Encryption with a customer-managed key whose policy grants decrypt to that principal only.
  • Object-level access logging switched on and retained.
  • Versioning or object lock if the package must be provably unchanged.
  • An expiry date agreed in writing, with a named owner for revocation.
  • Revocation steps: remove the grant, remove key permissions, then delete or archive the bucket.
  1. 01Your work records
  2. 02Personal details removed
  3. 03You approve the release
  4. 04Licensed to AI developers
How it works with SourceX: Your work records → Personal details removed → You approve the release → Licensed to AI developers.Illustrative

How the controls map across S3, GCS and Azure#

The controls map closely across the three major clouds, though the names differ. Feature details and limits change, so confirm current behavior in each provider's documentation before relying on any of them.

How the controls map across S3, GCS and Azure
ControlAWS S3Google Cloud StorageAzure Blob Storage
Grant to another organizationBucket policy plus an IAM role or principal in the buyer's accountIAM binding to the buyer's service account or groupRole assignment to a guest identity invited from the buyer's Entra ID tenant, or a shared access signature
Temporary linkPresigned URLSigned URLShared access signature with an expiry
Customer-managed keyAWS KMS key policyCloud KMS key with IAM on the keyKey Vault key used for customer-managed encryption
Access loggingCloudTrail data events or server access logsCloud Audit Logs data access logsDiagnostic settings sending storage logs to Azure Monitor
Block public accessS3 Block Public AccessPublic access preventionAnonymous blob access disabled on the account

When presigned and signed URLs are enough#

Presigned and signed URLs are enough for small, one-off pulls where the buyer has no matching cloud identity. A presigned or signed URL typically grants access to one object for a limited time (an Azure shared access signature can also cover a whole container, so scope it carefully), and anyone holding the URL can use it, which is both the convenience and the risk.

Keep expiries short, generate URLs per file batch rather than for the whole package at once, and send the list through a channel separate from the delivery notice. The maximum lifetime of a URL depends on the provider and on the credentials that signed it, so check the documentation rather than assuming a link will outlive the session that created it.

For large or repeated deliveries, role-based access is easier to audit and revoke. Reads by a named principal appear in logs under that identity, while a URL forwarded around the buyer's organization tells you only that someone used it.

Encryption keys and key policies#

A customer-managed key gives the supplier a second off switch. Even if a bucket policy is misconfigured, a principal without decrypt permission on the key cannot read the encrypted objects, and removing that permission stops further reads of objects encrypted with that key.

Scope the key policy to the buyer's principal and to decrypt only. Do not grant key administration, and do not reuse a key that protects production data. Remember the limit of any technical control: once the buyer copies objects into its own account, the license terms govern that copy, not your key.

Logging, expiry and revocation#

Logging, expiry and revocation close the delivery: logs prove who read what, and revocation should be a scheduled event with an owner, not something that happens when someone remembers. A grant left open after acceptance serves no purpose and widens the window for mistakes.

Logging, expiry and revocation
StageWhat to doWhat to keep
Before accessEnable object-level logging and confirm it records readsConfiguration export or screenshot
Access grantedSend role or URL details to the named contact onlyDate, principal and approver
During downloadWatch for reads from unexpected identities or locationsAccess log extract
AcceptanceBuyer confirms file names and checksums match the manifestWritten confirmation
ExpiryRemove grants and key permissions on the agreed dateChange record
Close-outDelete or archive the bucket as the agreement requiresDeletion or retention record

Illustrative: a software company delivers to a buyer on another cloud#

Illustrative: a fictional vertical software company serving property managers licenses a prepared set of support tickets linked to Jira issues and release notes. Its data lives in AWS, while the buyer's team works mainly in Google Cloud and has no AWS identity ready.

The CTO creates a delivery-only AWS account and bucket, blocks public access, encrypts with a dedicated KMS key and turns on CloudTrail data events. The buyer creates a minimal AWS role for the transfer, and the bucket and key policies grant that role read and decrypt on one prefix. Logs show the reads, the buyer confirms checksums, and the CTO removes both grants on the agreed date and archives the bucket under the license's retention terms.

How SourceX approaches bucket deliveries#

SourceX handles bucket delivery within the Delivery step of the SourceX five-step transaction. Large datasets stay in the supplier's own storage or ship on encrypted drives, and SourceX never hosts multi-terabyte datasets; the handover is recorded instead.

The delivery method, the principal granted access, the dates and the release authorization become part of the SourceX Evidence Packet, so supplier and buyer share one record of what was delivered, to whom and under which approval.

Frequently asked questions

Should the buyer be able to write to the delivery bucket?

No. Keep the delivery bucket read-only for the buyer so the package cannot be altered or used as a drop zone. If the buyer needs to return acceptance reports or flagged records, set up a separate location for that purpose with its own access rules and logging.

What if the buyer uses a different cloud provider?

The buyer can create a minimal identity in your provider for the transfer, which keeps role-based access and logging intact. Where that is impractical, short-lived signed URLs issued in batches are a workable fallback. If the buyer runs its own transfer service, it still needs a scoped read grant from you.

Can we revoke access after the buyer has copied the data?

You can revoke access to your bucket and key at any time, but that does not reach copies already made in the buyer's environment. Those copies are governed by the license agreement: permitted use, security requirements, retention, deletion on termination and audit rights. Agree those terms before access is granted.

Who pays for data transfer out of the bucket?

Transfer and egress charges depend on the provider, the regions and how the data moves, and some providers offer requester-pays options. Who bears them is a contract point, so settle it in the delivery terms rather than discovering it on the first invoice.

Is a public bucket with an unguessable name acceptable?

No. An unguessable name is not access control, and bucket names leak through logs, URLs and shared documents. Licensed data should be readable only by the principal named in the agreement, with logging that shows each read.

Sources

  • Google's DLP API v2 definition states that Sensitive Data Protection provides a sensitive data inspection, classification and de-identification platform that works on text, images and Google Cloud storage repositories. Source
  • TruffleHog is an AGPL-3.0 open-source secret scanner that can log in to confirm whether a detected secret is live, and scans sources including Git, chats, wikis, logs, object stores and filesystems. Source

Related resources

See if your company qualifies

A short company assessment. No data uploads are needed.

See if your company qualifies