Customer setup guide

Connect one Google Cloud root.

Connect keyless with Workload Identity Federation: your Google Cloud trusts an identity that Sythe Labs reserves for your organization, you grant it four predefined read-only roles, and no key is created or stored. A service-account JSON key remains available as an alternative.

Overview

Two ways to authenticate, one bounded set of reads.

A keyless connection presents Google Cloud with a short-lived token that Sythe Labs signs for your organization. Google Security Token Service exchanges it under the workload identity provider you create, and the federated access token calls Google Cloud directly. A key connection authenticates an uploaded service-account JSON key instead, which Sythe Labs stores encrypted.

Either way, the connector uses the Google APIs Node.js Client to call Cloud Asset Inventory v1 assets.list, Artifact Registry Docker image list, and Container Analysis occurrence list. It requests only fixed CAI asset types plus VULNERABILITY and DISCOVERY occurrences, then follows pagination until Google returns an empty next-page token. Under keyless access, Google may refuse the two registry reads, as explained under registry scanning below.

Google SDK authentication

Client library
googleapis
Authorization scope
https://www.googleapis.com/auth/cloud-platform
Keyless token
https://sts.googleapis.com/v1/token
Service-account key token
service-account-token-exchange
CAI read pathRead only
01
RESOURCE snapshot

Cloud Asset Inventory v1 assets.list for the fixed supported asset types.

cloudasset.googleapis.comcloudasset.assets.listResource
02
IAM_POLICY snapshot

Cloud Asset Inventory v1 assets.list for the fixed supported asset types.

cloudasset.googleapis.comcloudasset.assets.listIamPolicy
Registry vulnerability read pathRead only
01
Vulnerability and discovery occurrence snapshot

projects.locations.repositories.list for in-scope Registry projects.

artifactregistry.googleapis.comartifactregistry.repositories.list
02
Docker image snapshot

projects.locations.repositories.dockerImages.list for in-scope Registry projects.

artifactregistry.googleapis.comartifactregistry.dockerimages.list
03
Vulnerability and discovery occurrence snapshot

projects.occurrences.list for in-scope Registry projects.

containeranalysis.googleapis.comcontaineranalysis.occurrences.list
Keyless or key

Keyless is recommended. A service-account key remains available.

Both modes use the same four predefined roles. Cloud Asset Viewer, Artifact Registry Reader, and Container Analysis Occurrences Viewer go at the selected root in either mode. Service Usage Consumer goes in the workload identity pool project for keyless access, or in the service-account project for a key. Both collect the same data, except that registry vulnerability scanning may not work under keyless access, as explained below. Choose one when you connect. A key connection can move to keyless later without changing its root.

Keyless with Workload Identity Federation

Recommended
  • No key is created or stored for this connection, so there is no key file to leak and nothing for you to rotate. To stop access, disable or delete the workload identity pool provider.

  • Your Google Cloud trusts one issuer and subject that Sythe Labs reserves for your organization.

  • You grant the four roles directly to the principal Google derives from that subject. There is no service account to create and nothing is impersonated.

  • Works where organization policy blocks service-account key creation.

Service-account JSON key

  • A dedicated service account and one user-managed JSON key, which Sythe Labs stores encrypted.

  • You replace the key from the signed-in status page and delete or disable old keys in Google Cloud.

  • Registry vulnerability scanning is available without the keyless caveat below.

  • Blocked where the constraints/iam.disableServiceAccountKeyCreation organization policy is enforced.

Validation checks different things in each mode. Keyless validation exchanges a token and reads one page of Cloud Asset Inventory at the root, which proves the provider and root access but not every role. Key validation reads the complete Cloud Asset Inventory resource and IAM policy snapshots at the root before the key is stored. Neither reads a registry, so registry roles and APIs are first checked by the first sync.

Registry scanning under keyless access

Google lists Cloud Asset Inventory and Artifact Registry among the products that support identity federation, but not Artifact Analysis, which serves vulnerability occurrences. If Google refuses the keyless token for Artifact Registry or Artifact Analysis, the signed-in status page reports that registry scanning needs a service-account key. Cloud Asset Inventory sync continues, and registry vulnerability findings then need a connection made with a service-account key.

Before a key connection moves to keyless, the move warns that registry vulnerability scanning may stop when the connection collects registry data, holds open or triaged registry findings, or has registry coverage Sythe Labs cannot read. The warning never blocks the move.

Before you start

Keep the identity, roles, and console under customer control.

Your Google Cloud administrators create and own every resource in this guide. Do not ask Sythe Labs staff to enter the Google Cloud console, and never paste a credential into a support request.

  • 01

    One authoritative organization, folder, or project root for the inventory boundary.

  • 02

    Every project under that root with an in-scope Artifact Registry Docker repository.

  • 03

    Organization owner or administrator access to the signed-in Sythe Labs platform Integrations page.

Each mode also needs its own project and permissions.

Keyless

  • A customer-owned project to hold the workload identity pool. Keyless Cloud Asset Inventory reads use this project's quota.

  • Permission to create a workload identity pool and provider in that project, enable APIs, and grant four predefined roles.

  • An organization policy that allows the Sythe Labs issuer, where it restricts workload identity providers. See the organization policy note below.

Service-account key

  • A customer-owned project to hold a dedicated service account. Key Cloud Asset Inventory reads use this project's quota.

  • Permission to create that service account and one JSON key, enable APIs, and grant four predefined roles.

  • An organization policy that permits user-managed service-account keys.

Organization policy must allow the issuer

The constraints/iam.workloadIdentityPoolProviders organization policy can restrict which issuers a workload identity provider may trust, and Google Cloud refuses a provider whose issuer the policy does not allow. Before you create the provider, check the effective policy on the pool project.

Check the effective policy

gcloud resource-manager org-policies describe constraints/iam.workloadIdentityPoolProviders --project=POOL_PROJECT_ID --effective

If the policy lists allowedValues, add the issuer URI shown on the signed-in Google Cloud integration page to that list with the command below. Use --folder or --project in place of --organization when the list is set on a folder or project. If it shows allValues: DENY, your organization policy administrator must replace it with an allow list that includes the issuer.

Add the issuer to an existing allow list

gcloud resource-manager org-policies allow constraints/iam.workloadIdentityPoolProviders ISSUER_URI --organization=ORGANIZATION_ID

Otherwise, skip this step. Do not run the command where the constraint is unset: it would create an allow list with only this issuer, which blocks every other provider.

The policy is yours to change. Google does not review or approve the Sythe Labs issuer, and no request to Google is needed.

Connect keyless

Trust one issuer, grant four roles to one principal.

The signed-in Google Cloud integration page reserves the issuer and subject for your organization and shows them for you to copy into these steps. No key is created, uploaded, or stored. You also download no credential configuration file and set no token URL: Sythe Labs runs the token exchange from its side.

  1. 01
    Reserve a setup identity

    Open the signed-in Google Cloud integration page, choose Keyless, and select Reserve setup identity. The page shows the issuer URI, subject, and attribute mapping reserved for your organization. Reserving again returns the same values, and they stay reserved after a disconnect.

  2. 02
    Allow the issuer if your organization restricts providers

    Check the effective constraints/iam.workloadIdentityPoolProviders policy on the pool project. Only if it already lists allowed values, add the issuer URI to them before you create the provider. See the organization policy note above.

  3. 03
    Create a workload identity pool

    Create a pool in the project that will hold it. Pool and provider IDs are 4 to 32 lowercase letters, digits, or hyphens, and cannot start with gcp-.

  4. 04
    Create an OIDC provider

    Create an OIDC provider in that pool with the issuer URI exactly as shown and the attribute mapping google.subject=assertion.sub. Leave allowed audiences empty: Sythe Labs presents the provider's own resource name as the audience, which Google Cloud accepts by default. Do not upload a JWKS. Google Cloud reads the current signing keys from the issuer, so Sythe Labs key rotation needs nothing from you.

  5. 05
    Enable the APIs

    Enable Cloud Asset Inventory in the pool project, and Artifact Registry and Container Scanning in every project with an in-scope Docker repository.

  6. 06
    Grant the four roles to the principal

    Grant Service Usage Consumer on the pool project, and Cloud Asset Viewer, Artifact Registry Reader, and Container Analysis Occurrences Viewer at the root. Grant them directly to the principal below. It names only the Sythe Labs subject for your organization, so no other identity in the pool gains access.

  7. 07
    Validate and connect

    On the signed-in page, enter the pool project number, pool ID, provider ID, and the root, then select Validate and connect. Sythe Labs exchanges a token with Google Security Token Service and reads one page of Cloud Asset Inventory at the root. Nothing is saved unless both succeed. That proves the provider and root access, not every role: validation reads no IAM policy and no registry, so a connection that validates can still fail its first sync, and the signed-in status page then names the reason. Google Cloud can take several minutes to apply a new provider or role, so if validation reports one you just created or granted, wait a few minutes and validate again.

What the provider and bindings use

Issuer URI

Shown on the signed-in Google Cloud integration page. It ends in your organization's subject, and Google Cloud reads its discovery document and signing keys from it.

Attribute mapping
google.subject=assertion.sub
Allowed audiences

Leave empty. The audience is the provider's own resource name.

Principal for every role binding
principal://iam.googleapis.com/projects/POOL_PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
Roles and APIs

Four predefined roles and the APIs they read through, in either mode.

A keyless connection grants each role to the principal above. A key connection grants it to the dedicated service account. Only the quota project differs: Service Usage Consumer and the Cloud Asset Inventory API go in the workload identity pool project for keyless access, and in the service-account project for a key.

Cloud Asset Inventory API

cloudasset.googleapis.com

Serves both Cloud Asset Inventory reads. It must be enabled in the project that Google charges their quota to.

Keyless:

the workload identity pool project

Service-account key:

the service-account project

Artifact Registry and Container Scanning APIs

artifactregistry.googleapis.comcontainerscanning.googleapis.com

Container Scanning turns on Artifact Analysis vulnerability scanning. Scanning starts with new image pushes.

Keyless:

every project with an in-scope Docker repository

Service-account key:

every project with an in-scope Docker repository

Service Usage Consumer

roles/serviceusage.serviceUsageConsumer

Permit the connection to consume the enabled Cloud Asset Inventory API.

Keyless:

the workload identity pool project

Service-account key:

the service-account project

Permissions
  • serviceusage.services.use

Cloud Asset Viewer

roles/cloudasset.viewer

List RESOURCE and IAM_POLICY assets throughout the selected root boundary.

Keyless:

the selected root

Service-account key:

the selected root

Permissions
  • cloudasset.assets.listResource
  • cloudasset.assets.listIamPolicy

Artifact Registry Reader

roles/artifactregistry.reader

List Docker images in Artifact Registry repositories throughout the selected root boundary.

Keyless:

the selected root

Service-account key:

the selected root

Permissions
  • artifactregistry.repositories.list
  • artifactregistry.dockerimages.list

Container Analysis Occurrences Viewer

roles/containeranalysis.occurrences.viewer

List Artifact Analysis vulnerability and discovery occurrences throughout the selected root boundary.

Keyless:

the selected root

Service-account key:

the selected root

Permissions
  • containeranalysis.occurrences.list
Connect with a key

The alternative: a dedicated service account and one JSON key.

Copy the prompt below into a CLI coding agent. It asks for the root, service-account project, Registry projects, and whether this is a new connection or an upgrade. For an upgrade, it reuses the existing service account and encrypted key: grant the new access, then run Sync without disconnecting or reconnecting.

  1. 01

    Choose the authoritative organization, folder, or project root and copy its canonical resource name.

  2. 02

    Choose or confirm the customer-owned project that owns the dedicated service account.

  3. 03

    Enable the Cloud Asset Inventory API in the service-account project, and Artifact Registry and Container Scanning in every project with an in-scope Docker repository.

  4. 04

    Create or reuse the dedicated service account for the Sythe Labs platform connection.

  5. 05

    Grant Service Usage Consumer to that service account in the project that owns it.

  6. 06

    Grant Cloud Asset Viewer, Artifact Registry Reader, and Container Analysis Occurrences Viewer at the selected root with inherited coverage for every intended child resource.

  7. 07

    Create and download one JSON key only for a new connection if organization policy permits user-managed keys.

  8. 08

    For a new connection, open the signed-in Integrations page, choose Service-account key, enter the canonical root, and select the JSON key file. Sythe Labs reads the complete Cloud Asset Inventory resource and IAM policy snapshots at the root before it stores the key.

  9. 09

    For an existing connection, keep the stored JSON key, wait for IAM propagation, and run Sync. Do not disconnect or reconnect.

Move a key connection

Move an existing key connection to keyless without a gap.

The move keeps the connection, its root, and its inventory. It switches authentication only after Google Cloud accepts the keyless identity.

  1. 01

    Open the connected Google Cloud status page and select Move to keyless access. The connection keeps its root.

  2. 02

    Review the preview. It warns that registry vulnerability scanning may stop under keyless access when the connection collects registry data, holds open or triaged registry findings, or has registry coverage Sythe Labs cannot read. The warning never blocks the move.

  3. 03

    Reserve the setup identity, then create the pool, provider, and role bindings for the same root as in the keyless steps above.

  4. 04

    Enter the pool project number, pool ID, and provider ID, then select Validate and move. The connection keeps syncing with its key until Google Cloud accepts the keyless identity. If validation fails, nothing changes.

  5. 05

    After the move, Sythe Labs no longer stores the key, but Google Cloud accepts it until you delete or disable it. Delete the key under IAM & Admin > Service accounts > Keys, then remove the service account, or its role bindings, if nothing else uses them.

Access and data

Fixed Cloud Asset types and Registry vulnerability occurrences.

The connector supplies these exact asset-type filters to the two Cloud Asset Inventory reads. It also lists Docker images plus VULNERABILITY and DISCOVERY occurrences in each configured Registry project. Discovery data prevents an unscanned or expired image from appearing clean. It does not request an unbounded asset catalog.

RESOURCE - 10 asset types

  • cloudresourcemanager.googleapis.com/Project
  • compute.googleapis.com/Instance
  • compute.googleapis.com/Disk
  • compute.googleapis.com/Firewall
  • run.googleapis.com/Service
  • container.googleapis.com/Cluster
  • storage.googleapis.com/Bucket
  • sqladmin.googleapis.com/Instance
  • artifactregistry.googleapis.com/Repository
  • alloydb.googleapis.com/Cluster

IAM_POLICY - 1 asset type

  • storage.googleapis.com/Bucket

8 types become inventory

Compute Engine virtual machine

compute.googleapis.com/Instance

compute-instance / iaas

Compute Engine persistent block storage

compute.googleapis.com/Disk

block-storage / iaas

Cloud Run managed application service

run.googleapis.com/Service

serverless-service / paas

Google Kubernetes Engine managed cluster

container.googleapis.com/Cluster

container-orchestration / paas

Cloud Storage object bucket

storage.googleapis.com/Bucket

object-storage / iaas

Cloud SQL managed database instance

sqladmin.googleapis.com/Instance

managed-database / paas

Artifact Registry managed repository

artifactregistry.googleapis.com/Repository

artifact-registry / paas

AlloyDB for PostgreSQL managed database cluster

alloydb.googleapis.com/Cluster

managed-database / paas

Supporting configuration checks

  • Public SSH ingress on Compute Engine firewall rules

  • Public Cloud Storage bucket IAM

  • Cloud Storage bucket versioning or retention protection

  • Automated Cloud SQL backups

Project and firewall assets support lookup and checks but do not become inventory rows. The connector does not call Compute Engine, Cloud Storage, Cloud SQL, AlloyDB, Resource Manager, export, feed, or search APIs. Container Scanning begins with new image pushes; existing images need a new push before Google creates vulnerability results. A failed or incomplete CAI or Registry collection preserves the prior complete data and never produces a false pass.

Lifecycle

The customer controls repair, replacement, and removal.

A keyless connection holds no secret: Sythe Labs stores only non-secret configuration, such as the root, the pool and provider reference, and the subject reserved for your organization. A key connection's JSON key is stored as an encrypted opaque secret and used only for the bounded SDK operations in this guide. Google Cloud remains the source of truth for what it trusts and for key status.

Repair keyless access

If the pool or provider changes, or a keyless connection stops syncing, select Repair on the signed-in status page and enter the current pool and provider. The root stays the same, and the connection changes only after Google Cloud accepts the new configuration.

Stop keyless access now

Disable or delete the workload identity pool provider in your Google Cloud. Google then refuses every new token exchange through it. Only you can do this, and access tokens Google already issued stay valid until Google expires them. Then disconnect the integration unless you plan to repair it.

Replace a key

Create a new JSON key for the same dedicated service account and select Replace key on the signed-in status page. The Sythe Labs platform validates both Cloud Asset Inventory reads before switching keys. A key connection that stopped syncing recovers the same way.

Retire a key

After a replacement succeeds, delete or disable the old key in Google Cloud. To stop access now, delete or disable the current key, then disconnect the integration. Access tokens Google already issued stay valid until Google expires them.

Enable Registry findings

For an existing connection, grant the two Registry roles, enable Artifact Registry and Container Scanning in each registry project, then run Sync. Do not disconnect, replace, or re-upload anything.

Disconnect

Disconnect from the signed-in status page to stop scheduled synchronization, delete any key Sythe Labs stores, and remove Google Cloud connector inventory from active inventory. It changes nothing in your Google Cloud.

Clean up in Google Cloud

Disconnecting or moving to keyless changes nothing in your Google Cloud. Remove what you no longer need yourself.

Keyless connection

Remove the role bindings granted to the principal, then delete the workload identity pool provider, and the pool if nothing else uses it. Until you disable or delete it, the provider still trusts the Sythe Labs issuer. Removing the issuer from your organization policy does not disable a provider that already exists.

Service-account key connection

Delete the key under IAM & Admin > Service accounts > Keys, then delete the dedicated service account or remove its four role bindings. Remove customer-held key copies under your credential-retention process.

Troubleshooting

Resolve the stable reason shown in the signed-in status page.

Match the reason code to the customer-owned action below. Keep a safe request identifier for support, but never copy a credential or raw provider response into a message.

Google Cloud did not accept the service-account key

invalid_credential

Create a new JSON key for the dedicated customer-owned service account, then connect with it, or select Replace key on a connection that already exists. Do not send the key to Sythe Labs staff or include it in a support request. A keyless connection never reports this reason: when Google Cloud refuses its token, one of the keyless reasons below names the fix.

Google Cloud refused the keyless token

workload_identity_token_exchange_failed

Google Cloud's Security Token Service rejected the Sythe Labs token for the configured workload identity provider, or Cloud Asset Inventory refused the access token it issued. Confirm the pool and provider still match the issuer, subject, and attribute mapping shown on the signed-in Google Cloud integration page, then repair the connection from the signed-in Integrations page. A pool or provider created or changed in the last few minutes may not be applied yet, so wait a few minutes before you retry.

The provider does not accept the Sythe Labs audience

workload_identity_audience_rejected

Leave the workload identity provider's allowed audiences empty. Sythe Labs presents the provider's own resource name as the audience, which Google Cloud accepts by default only while allowed audiences is empty. Then repair the connection from the signed-in Integrations page.

The provider rejected the Sythe Labs subject

workload_identity_subject_rejected

Keep the provider's attribute mapping as google.subject=assertion.sub, and make sure any attribute condition accepts the subject shown on the signed-in Google Cloud integration page. Then repair the connection from the signed-in Integrations page.

The provider does not trust the Sythe Labs issuer

workload_identity_issuer_rejected

Set the workload identity provider's issuer URL to exactly the issuer shown on the signed-in Google Cloud integration page, then repair the connection from the signed-in Integrations page.

The workload identity pool or provider is unavailable

workload_identity_provider_disabled

Google Cloud reports the configured pool or provider as disabled, deleted, or missing. Re-enable or restore it in the pool project, or create it again with the values on the signed-in Google Cloud integration page, then repair the connection from the signed-in Integrations page. A pool or provider you just created or re-enabled can take a few minutes to become usable, so wait a few minutes before retrying.

Google Cloud could not verify the Sythe Labs token

workload_identity_jwks_unverifiable

Google Cloud could not fetch or match the Sythe Labs signing keys, and the sync retries automatically. Leave the provider's JWKS unset so Google Cloud reads the current keys from the issuer; an uploaded JWKS goes stale when Sythe Labs rotates its signing key. If the reason persists, contact Sythe Labs support with the stable reason code.

Google Cloud is still applying a new configuration

workload_identity_propagation_pending

A new pool, provider, or role binding can take several minutes to take effect across Google Cloud, and the sync retries automatically. If the reason persists, confirm the pool, provider, and role bindings match the signed-in Google Cloud integration page.

The selected root cannot be read

inaccessible_scope

Use the canonical organization, folder, or project resource name, and grant Cloud Asset Viewer at that exact root to the dedicated service account, or for keyless access to the connection's principal.

Cloud Asset Inventory is disabled

api_disabled

Enable the Cloud Asset Inventory API in the project that owns the service account, or for keyless access in the workload identity pool project, then retry the connection.

Registry vulnerability scanning is disabled

registry_api_disabled

Enable Artifact Registry and Container Scanning in every project with an in-scope Docker repository, then run Sync. The existing connection remains valid.

Registry scanning needs a service-account key

registry_workload_identity_unsupported

Google Cloud refused the keyless token for Artifact Registry or Container Analysis. Cloud Asset Inventory sync continues under keyless access, but registry vulnerability scanning currently needs a service-account key. If you need registry findings, connect with a service-account JSON key instead.

Service Usage Consumer is missing

missing_service_usage_consumer

Grant Service Usage Consumer to the dedicated service account in the project that owns it, or for keyless access to the connection's principal in the workload identity pool project, then retry the connection.

Resource inventory permission is missing

missing_resource_permission

Grant Cloud Asset Viewer at the selected root to the dedicated service account, or for keyless access to the connection's principal, so RESOURCE assets can be listed throughout that boundary.

IAM policy inventory permission is missing

missing_iam_policy_permission

Grant Cloud Asset Viewer at the selected root to the dedicated service account, or for keyless access to the connection's principal, so bucket IAM policies can be listed throughout that boundary.

Artifact Registry image permission is missing

missing_artifact_registry_permission

Grant Artifact Registry Reader at the selected root, or in each in-scope registry project, to the connection's existing service account or keyless principal, then run Sync. Do not reconnect or replace the credential.

Container Analysis vulnerability permission is missing

missing_container_analysis_permission

Grant Container Analysis Occurrences Viewer at the selected root, or in each in-scope registry project, to the connection's existing service account or keyless principal, then run Sync. Do not reconnect or replace the credential.

Some images have no completed vulnerability scan

image_scan_incomplete

Container Scanning has not finished a scan for every in-scope image. Newly pushed images finish shortly, and base images Google cannot analyze never will. Findings for the images that did scan are already published; no reconnection or role change is required.

Google Cloud could not reach every location

unreachable_region

Google Cloud reported one or more locations as unreachable for this request. Run Sync again once the location recovers. Findings collected from the reachable locations are already published and are left untouched.

Google Cloud could not complete the request

transient_failure

Wait for the retry window shown in the signed-in status page, then run the sync again. The prior complete inventory remains unchanged.

The connection configuration is invalid

configuration_error

Review the selected root, the service-account project or workload identity pool project, the registry projects, and all four predefined role assignments. For a new connection, connect again. For a connection that is still connected, run Sync once the fix is in place: the credential does not need replacing. For a connection that stopped syncing, retry its recovery once the fix is in place: select Replace key for a key connection, or repair a keyless connection, from the signed-in Integrations page. To change the root, disconnect and connect again.

Google Cloud returned an unsupported result

provider_schema_drift

Use Sythe Labs support and include only the stable reason code and safe request identifier shown in the signed-in status page. Do not include a key, a token, or a raw provider response.

The keyless token exchange failed on the Sythe Labs side

platform_token_exchange_failed

Sythe Labs could not complete the keyless token exchange with Google Cloud. The problem is on the Sythe Labs side, so no Google Cloud setting needs to change: leave the workload identity pool, provider and role bindings as they are. Sythe Labs has been notified, and syncs retry on their own. If a connect, repair or migration attempt showed this reason, try it again in a few minutes.

The sync reached a collection limit

collection_limit_reached

The connection is correct. This sync reached a Sythe Labs collection limit before it read everything, so anything it could not read was left unchanged. No role or setting needs to change, and no reconnection or new credential is required.

Need platform help?

Use the Sythe Labs support page and include only the stable reason code and safe request identifier shown in the signed-in status page.