Cloud Capture is still in active development. Its capabilities and configuration format may change, and onboarding is done together with Kosli’s Customer Success team.
The Cloud Capture managed service uses the public cloud APIs to extract information about your cloud environments. In order to do this, you need to provide Kosli with an identity in your cloud account that Kosli can use to call these APIs. The identity is created and managed by you. It must be protected by a trust condition that allows only Kosli to use it, and it must hold the read-only permissions Kosli needs to find and snapshot your resources.
AWS
GCP
Kosli publishes a CloudFormation template, for use in AWS, showing the permissions needed. The template is publicly accessible and can be used directly within an aws cloudformation create-stack call.The CloudFormation template we share with you includes a “phone-home” feature that notifies Kosli when a CloudFormation stack has been built from it; this allows us to pick up the AWS AccountId for the account in which you have used the CloudFormation template without you needing to do anything. This automation is especially useful when you deploy the template as a StackSet within an Organizational Unit.If you wish to build an IAM role for Cloud Capture without using our published CloudFormation template, the permissions needed are those shown below. The role must contain an Assume Role policy that allows the Kosli account to access the resources, and must include an externalId. Both of these values are supplied by Kosli and cannot be derived; you cannot construct the trust policy without them.
The IAM role defined within the Cloudformation template includes a number of IAM policy statements, granting read-only access to some AWS APIs. The statements are:
Statement: # How Capture finds what to snapshot. Discovery lists the ECS # clusters in the account and reads each cluster's tags from the # same DescribeClusters call. # # Worth knowing for a security review: these are inventory calls # and none of them returns application data. DescribeTaskDefinition # is the widest - a task definition holds the container image, the # command, and any environment variables written into the # definition itself in plain text. Values injected from Secrets # Manager or Parameter Store are named there rather than resolved, # so what comes back is the reference and not the secret. - Sid: EcsInventory Effect: Allow Action: - ecs:DescribeCapacityProviders - ecs:DescribeClusters - ecs:DescribeContainerInstances - ecs:DescribeServices - ecs:DescribeTaskDefinition - ecs:DescribeTasks - ecs:ListClusters - ecs:ListContainerInstances - ecs:ListServices - ecs:ListTagsForResource - ecs:ListTaskDefinitionFamilies - ecs:ListTaskDefinitions - ecs:ListTasks Resource: "*" - Sid: LambdaInventory Effect: Allow Action: - lambda:GetFunctionConfiguration - lambda:GetPolicy - lambda:ListAliases - lambda:ListFunctions - lambda:ListTags - lambda:ListVersionsByFunction Resource: "*" # lambda:GetFunction returns a pre-signed URL to the deployment # package. That is source-code access, so it is denied outright. - Sid: NeverDownloadFunctionCode Effect: Deny Action: - lambda:GetFunction - lambda:GetLayerVersion Resource: "*"
GCP support is coming soon
Kosli publishes a Terraform configuration, for use with
Infrastructure Manager, showing the
permissions needed to snapshot Google Kubernetes Engine (GKE) clusters. Infrastructure Manager runs
Terraform as a managed service inside your project, so there is no state file or Terraform install
for you to manage. Deploy the configuration once in each project that holds clusters you want Cloud
Capture to snapshot.Cloud Capture runs in AWS and reaches your project through
Workload Identity Federation. Cloud
Capture exchanges its own short-lived AWS credentials for a short-lived Google token, then
impersonates a service account that you create. No service account key is ever created or shared.Your workload identity pool makes two checks before it issues a token:
It accepts only credentials issued by the Kosli AWS account in which Cloud Capture runs.
Within that account, it accepts only the Kosli-side IAM role dedicated to your organization.
Every Cloud Capture job runs under the role for the organization it is working for. A job for
another Kosli tenant presents a different role name, so your pool refuses it, even if that
tenant gave Kosli your provider and service account details instead of their own.
The role name is part of the credential that AWS signs and Google verifies, so the caller cannot
forge it.For readers familiar with the AWS setup: the account check plays the part of the principal in the
assume-role trust policy, and the role check plays the part of the external ID.Kosli needs two values to connect to your project: the full resource name of the workload identity
provider, and the email of the service account. The configuration emits both as Terraform outputs.
After the deployment completes, register them with Kosli through the Kosli API’s cloud accounts
endpoint. You can read them at any time from the deployment’s latest revision, under
applyResults.outputs, with gcloud infra-manager revisions describe.If you wish to grant access for Cloud Capture without using our published configuration, the
resources needed are those shown below. The pool must accept only the Kosli AWS account and, within
it, only the Kosli-side role for your organization, and only that role may impersonate the service
account. The specific permissions needed to find and snapshot GKE clusters are in the custom role.
The Terraform configuration creates a workload identity pool, an AWS provider within it that trusts
the Kosli-side role for your organization, and a service account that only that role may
impersonate. This appears as:
variable "project_id" { type = string description = "The GCP project that holds the GKE clusters Cloud Capture will snapshot."}variable "kosli_aws_account_id" { type = string description = <<-EOT The AWS account in which Cloud Capture runs, supplied by Kosli. It differs per tenant because more than one Kosli account serves tenants. There is no default and no value you can derive yourself. EOT validation { condition = can(regex("^[0-9]{12}$", var.kosli_aws_account_id)) error_message = "Must be the 12-digit AWS account id issued to you by Kosli." }}variable "kosli_role_name" { type = string description = <<-EOT The name of the IAM role, in the Kosli AWS account, that Cloud Capture uses when working for your organization. Supplied by Kosli. Each Kosli organization has its own role, and the workload identity pool accepts only this one, so only Cloud Capture jobs run on behalf of your organization can obtain a token from your project. In the AWS setup, the external ID plays the same part. EOT validation { condition = can(regex("^[A-Za-z0-9+=,.@_-]{1,64}$", var.kosli_role_name)) error_message = "Must be the IAM role name issued to you by Kosli." }}# Cloud Capture runs in AWS. Workload Identity Federation lets it exchange its# own short-lived AWS credentials for a short-lived Google token, so no service# account key is ever created, stored or shared.resource "google_iam_workload_identity_pool" "kosli_capture" { project = var.project_id workload_identity_pool_id = "kosli-capture" display_name = "Cloud Capture" description = <<-EOT Read-only access for Cloud Capture SDLC compliance evidence collection. Managed by Infrastructure Manager; do not edit in place. EOT}resource "google_iam_workload_identity_pool_provider" "kosli_aws" { project = var.project_id workload_identity_pool_id = google_iam_workload_identity_pool.kosli_capture.workload_identity_pool_id workload_identity_pool_provider_id = "kosli-aws" display_name = "Cloud Capture (AWS)" aws { account_id = var.kosli_aws_account_id } attribute_mapping = { "google.subject" = "assertion.arn" "attribute.account" = "assertion.account" "attribute.aws_role" = "assertion.arn.extract('assumed-role/{role}/')" } # Two checks before the pool issues a token. The account check accepts only # credentials issued by the Kosli AWS account, however the token reaches # Google. The role check accepts, within that account, only the Kosli-side # role dedicated to your organization. A Cloud Capture job for another tenant # runs under a different role and is refused here. In the AWS setup, these # checks correspond to the trust policy principal and the external ID. attribute_condition = join(" && ", [ "attribute.account == \"${var.kosli_aws_account_id}\"", "attribute.aws_role == \"${var.kosli_role_name}\"", ])}resource "google_service_account" "kosli_capture" { project = var.project_id account_id = "kosli-capture" display_name = "Cloud Capture" description = "Impersonated by Cloud Capture to snapshot GKE clusters. Managed by Infrastructure Manager."}# Only the Kosli-side role for your organization may impersonate the service# account. The pool's attribute condition already refuses every other identity;# naming the role here as well keeps the binding correct even if that condition# is later loosened.resource "google_service_account_iam_member" "kosli_impersonation" { service_account_id = google_service_account.kosli_capture.name role = "roles/iam.workloadIdentityUser" member = "principalSet://iam.googleapis.com/${google_iam_workload_identity_pool.kosli_capture.name}/attribute.aws_role/${var.kosli_role_name}"}# Kosli needs these two values to connect. Infrastructure Manager records them# on the deployment's latest revision, under applyResults.outputs.output "kosli_capture_provider" { description = "Full resource name of the workload identity provider; give this to Kosli." value = google_iam_workload_identity_pool_provider.kosli_aws.name}output "kosli_capture_service_account" { description = "Email of the service account Cloud Capture impersonates; give this to Kosli." value = google_service_account.kosli_capture.email}
The Terraform configuration grants the service account a custom role containing read-only
permissions. Cloud Capture reads the pods of your GKE clusters from
Cloud Asset Inventory, in the same way as
kosli snapshot gke. It never calls a cluster’s Kubernetes
API, so no Kubernetes RBAC objects need to be created inside your clusters, and Cloud Capture needs
no network access to any cluster control plane.The configuration also enables the Cloud Asset API in your project. These appear as:
# Cloud Capture reads pods through the Cloud Asset API, so it must be enabled# in the project.resource "google_project_service" "cloudasset" { project = var.project_id service = "cloudasset.googleapis.com" disable_on_destroy = false}# How Capture finds what to snapshot. Discovery lists the GKE clusters in the# project and reads each cluster's labels from the same clusters.get call.## Worth knowing for a security review: Cloud Capture reads pods from Cloud# Asset Inventory rather than from each cluster's Kubernetes API, so it needs# no Kubernetes RBAC and no network access to any cluster control plane. None# of it returns application data. listContainerPod is the widest - a pod spec# holds the container image, the command, and any environment variables# written into the spec itself in plain text. Values taken from a Secret or# ConfigMap are named there rather than resolved, so what comes back is the# reference and not the secret. This role lists pod assets only; the broader# roles/cloudasset.viewer would also list k8s.io/Secret assets.resource "google_project_iam_custom_role" "kosli_capture" { project = var.project_id role_id = "kosliCapture" title = "Cloud Capture" description = "Read-only GKE inventory for Cloud Capture SDLC compliance evidence collection." permissions = [ # Discovery "container.clusters.get", "container.clusters.list", # Snapshot: the Cloud Asset Inventory calls that kosli snapshot gke makes. # serviceusage.services.use lets the Cloud Asset API calls use this # project as their quota project. "cloudasset.assets.listContainerPod", "serviceusage.services.use", ]}resource "google_project_iam_member" "kosli_capture" { project = var.project_id role = google_project_iam_custom_role.kosli_capture.id member = google_service_account.kosli_capture.member}
Run the following from the directory containing the configuration. Infrastructure Manager runs
Terraform as the service account you name, so that service account needs permission to enable APIs
and to create workload identity pools, service accounts, custom roles and project IAM bindings.
Copy the Kosli AWS account ID and role name from the Cloud Capture section of your organization’s
Settings page in the Kosli UI.
gcloud infra-manager deployments apply \ projects/<your-gcp-project>/locations/<your-gcp-region>/deployments/kosli-capture \ --service-account=projects/<your-gcp-project>/serviceAccounts/<deployer>@<your-gcp-project>.iam.gserviceaccount.com \ --local-source=. \ --input-values=project_id=<your-gcp-project>,kosli_aws_account_id=<value from Kosli>,kosli_role_name=<value from Kosli>
Cloud Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to
one tenant.
AWS
GCP
A Cloud Capture worker picks up a job for your organization and assumes the role in your account
using your externalId. A worker running for a different tenant is unable to read the externalId
for your cloud account.
When the job finishes, the temporary credentials for your account are discarded. A worker holding
credentials for your cloud account has no path to anyone else’s account.
The ExternalId lives in Kosli’s Parameter Store and is readable only by the Kosli-side role for your
organization. The shared task role cannot read any tenant’s ExternalId. Separation is enforced
by IAM, not by application code.
The trust policy on the role in your account limits access to the AWS account in which the Cloud
Capture is running. The ExternalId acts as a shared secret between Kosli and you, so that only
Cloud Capture is permitted to assume the role.
Each Cloud Capture job for your organization runs under the Kosli-side IAM role dedicated to your
organization. The workload identity pool in your project accepts only that role, so a job running
for a different tenant cannot obtain a token from your project or impersonate your service account.
Separation is enforced by the identity provider, not by application code.
Cloud Capture itself does not hold any tenant data. Snapshots taken by Cloud Capture are
immediately sent to Kosli through the same ingest path as your existing pipelines.
If the role, or the service account and workload identity pool, that Cloud Capture uses is removed
or edited within your cloud accounts, Cloud Capture will fail to operate correctly. The failure will be detected and the account will be
removed from the list of accounts captured.
Last modified on October 22, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Kosli Documentation","colors":{"primary":"#1C4BC6","light":"#ABBDFF","dark":"#1C4BC6"},"logo":{"light":"https://mintcdn.com/kosli/Cee1LAu-Jhawp1Om/logo/kosli-logo-light-main.svg?fit=max\u0026auto=format\u0026n=Cee1LAu-Jhawp1Om\u0026q=85\u0026s=fb05fdbb0c9c9ae7da266a500eac2be6","dark":"https://mintcdn.com/kosli/Cee1LAu-Jhawp1Om/logo/kosli-logo-dark-main.svg?fit=max\u0026auto=format\u0026n=Cee1LAu-Jhawp1Om\u0026q=85\u0026s=c230555c5e1d57d0f9f9630117a1467d"},"favicon":"https://mintcdn.com/kosli/CktiOOFhqneQZXyH/favicon-32x32.png?fit=max\u0026auto=format\u0026n=CktiOOFhqneQZXyH\u0026q=85\u0026s=1b16e66cd5c7266604a6a683f334f672","api":{"playground":{"display":"interactive"}},"background":{"decoration":"windows","color":{"light":"#F6F8FC","dark":"#111A26"}},"navbar":{"links":[{"href":"mailto:support@kosli.com","label":"Support"}],"primary":{"type":"button","label":"Kosli App","href":"https://app.kosli.com"}},"footer":{"socials":{"website":"https://kosli.com","github":"https://github.com/kosli-dev","linkedin":"https://linkedin.com/company/kosli-dev"},"links":[{"header":"Resources","items":[{"label":"Privacy Policy","href":"https://www.kosli.com/privacy-policy"},{"label":"Status","href":"https://status.app.kosli.com/"}]},{"header":"Learn","items":[{"label":"Labs","href":"/labs"},{"label":"Blog","href":"https://kosli.com/blog"}]},{"header":"Company","items":[{"label":"About Kosli","href":"https://www.kosli.com/about"},{"label":"Privacy","href":"https://www.kosli.com/privacy-policy"},{"label":"Community","href":"https://www.kosli.com/community"}]}]},"fonts":{"family":"IBM Plex Sans"},"styling":{"eyebrows":"breadcrumbs","codeblocks":{"theme":"dracula","languages":{"custom":["/languages/rego.json"]}},"latex":false},"integrations":{"posthog":{"apiKey":"phc_vKbCGJq5rzV4apArUzYDRwh6azCmgCPcLz8jTa9CgmGR","apiHost":"https://eu.posthog.com","sessionRecording":false},"cookies":{"key":"kosli_consent","value":"accepted"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"kosli","hasAudioNarration":false,"actualSubdomain":"kosli","customDomains":["docs.kosli.com"],"gitSource":{"type":"github","owner":"kosli-dev","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae9ec99156f2fde8c4c4cf1","collectionId":"fb579c4a-d6e7-498c-bdef-9ecba83020c0","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae9ec99156f2fde8c4c4cf1"},"feedback":{"thumbs":true,"edits":false,"issues":false,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"DISABLED","enabled":"DISABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"DISABLED","enabled":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae9ec99156f2fde8c4c4cf1","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Reference","count":287},{"language":"default","tag":"API Reference","count":149},{"language":"default","tag":"CLI Reference","count":103},{"language":"default","tag":"Documentation","count":70},{"language":"default","tag":"Terraform Reference","count":22},{"language":"default","tag":"Tutorials","count":22},{"language":"default","tag":"Environments","count":21},{"language":"default","tag":"Attestation","count":18},{"language":"default","tag":"Administration","count":17},{"language":"default","tag":"kosli get","count":15}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":false,"showHelpButton":false}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"[data-component-part=step-number]>div{background-color:#cfd8ff!important;color:#111a26!important}"}],"page":{"pagePath":"administration/cloud_capture/security","slug":"/administration/cloud_capture/security","pageMetadata":{"title":"Cloud Capture - Security","sidebarTitle":"Security","description":"Learn about the security of Cloud Capture","tag":"BETA","href":"/administration/cloud_capture/security"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Learn about the security of Cloud Capture\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tab,Tabs,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Warning,{children:_jsx(_components.p,{children:`Cloud Capture is still in active development. Its capabilities and configuration format may change, and onboarding is done together with Kosli’s Customer Success team.`})}),`\n`,_jsx(Heading,{level:`2`,id:`cloud-capture-permissions`,children:`Cloud Capture permissions`}),`\n`,_jsx(_components.p,{children:`The Cloud Capture managed service uses the public cloud APIs to extract information about your cloud environments. In order to do this, you need to provide Kosli with an identity in your cloud account that Kosli can use to call these APIs. The identity is created and managed by you. It must be protected by a trust condition that allows only Kosli to use it, and it must hold the read-only permissions Kosli needs to find and snapshot your resources.`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`AWS`,id:`aws`,\"data-child-heading-ids\":`[\"assume-role\",\"all-permissions-needed\"]`,children:[_jsxs(_components.p,{children:[`Kosli publishes a CloudFormation template, for use in AWS, showing the permissions needed. The template is publicly accessible and can be used directly within an `,_jsx(_components.code,{children:`aws cloudformation create-stack`}),` call.`]}),_jsx(_components.p,{children:`The CloudFormation template we share with you includes a “phone-home” feature that notifies Kosli when a CloudFormation stack has been built from it; this allows us to pick up the AWS AccountId for the account in which you have used the CloudFormation template without you needing to do anything. This automation is especially useful when you deploy the template as a StackSet within an Organizational Unit.`}),_jsx(_components.p,{children:`If you wish to build an IAM role for Cloud Capture without using our published CloudFormation template, the permissions needed are those shown below. The role must contain an Assume Role policy that allows the Kosli account to access the resources, and must include an externalId. Both of these values are supplied by Kosli and cannot be derived; you cannot construct the trust policy without them.`}),_jsx(Heading,{level:`3`,id:`assume-role`,children:`Assume role`}),_jsx(_components.p,{children:`The IAM role defined within the CloudFormation template includes an “assume role” policy granting permission from Kosli. This appears as:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`19`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes dracula dracula`,style:{backgroundColor:`#282A36`,\"--shiki-dark-bg\":`#282A36`,color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`19`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` KosliCaptureAccessRole`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Type`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` AWS::IAM::Role`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Properties`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` RoleName`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` !Ref`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` RoleName`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Description`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` >-`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Read-only access for Cloud Capture SDLC compliance evidence collection.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Managed by CloudFormation; do not edit in place.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` MaxSessionDuration`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:` 3600`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` AssumeRolePolicyDocument`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Version`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`2012-10-17`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Statement`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Sid`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` AllowKosliToAssumeWithExternalId`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Effect`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Allow`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Principal`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` AWS`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` !Ref`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` TrustedPrincipalArn`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Action`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` sts:AssumeRole`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Condition`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` StringEquals`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` sts:ExternalId`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` !Ref`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ExternalId`})]}),`\n`]})})}),_jsx(Heading,{level:`3`,id:`all-permissions-needed`,children:`All permissions needed`}),_jsx(_components.p,{children:`The IAM role defined within the Cloudformation template includes a number of IAM policy statements, granting read-only access to some AWS APIs. The statements are:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`50`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes dracula dracula`,style:{backgroundColor:`#282A36`,\"--shiki-dark-bg\":`#282A36`,color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`50`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:`Statement`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # How Capture finds what to snapshot. Discovery lists the ECS`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # clusters in the account and reads each cluster's tags from the`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # same DescribeClusters call.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` #`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # Worth knowing for a security review: these are inventory calls`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # and none of them returns application data. DescribeTaskDefinition`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # is the widest - a task definition holds the container image, the`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # command, and any environment variables written into the`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # definition itself in plain text. Values injected from Secrets`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # Manager or Parameter Store are named there rather than resolved,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # so what comes back is the reference and not the secret.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Sid`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` EcsInventory`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Effect`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Allow`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Action`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:DescribeCapacityProviders`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:DescribeClusters`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:DescribeContainerInstances`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:DescribeServices`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:DescribeTaskDefinition`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:DescribeTasks`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:ListClusters`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:ListContainerInstances`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:ListServices`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:ListTagsForResource`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:ListTaskDefinitionFamilies`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:ListTaskDefinitions`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ecs:ListTasks`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Resource`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`*`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Sid`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` LambdaInventory`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Effect`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Allow`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Action`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` lambda:GetFunctionConfiguration`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` lambda:GetPolicy`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` lambda:ListAliases`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` lambda:ListFunctions`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` lambda:ListTags`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` lambda:ListVersionsByFunction`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Resource`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`*`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # lambda:GetFunction returns a pre-signed URL to the deployment`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # package. That is source-code access, so it is denied outright.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Sid`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` NeverDownloadFunctionCode`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Effect`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Deny`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Action`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` lambda:GetFunction`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` lambda:GetLayerVersion`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` Resource`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`*`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`]})})})]}),_jsxs(Tab,{title:`GCP`,id:`gcp`,\"data-child-heading-ids\":`[\"workload-identity-federation\",\"gke-permissions\",\"deploying-with-infrastructure-manager\"]`,children:[_jsx(Warning,{children:_jsx(_components.p,{children:`GCP support is coming soon`})}),_jsxs(_components.p,{children:[`Kosli publishes a Terraform configuration, for use with\n`,_jsx(_components.a,{href:`https://cloud.google.com/infrastructure-manager/docs`,children:`Infrastructure Manager`}),`, showing the\npermissions needed to snapshot Google Kubernetes Engine (GKE) clusters. Infrastructure Manager runs\nTerraform as a managed service inside your project, so there is no state file or Terraform install\nfor you to manage. Deploy the configuration once in each project that holds clusters you want Cloud\nCapture to snapshot.`]}),_jsxs(_components.p,{children:[`Cloud Capture runs in AWS and reaches your project through\n`,_jsx(_components.a,{href:`https://cloud.google.com/iam/docs/workload-identity-federation`,children:`Workload Identity Federation`}),`. Cloud\nCapture exchanges its own short-lived AWS credentials for a short-lived Google token, then\nimpersonates a service account that you create. No service account key is ever created or shared.`]}),_jsx(_components.p,{children:`Your workload identity pool makes two checks before it issues a token:`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`It accepts only credentials issued by the Kosli AWS account in which Cloud Capture runs.`}),`\n`,_jsx(_components.li,{children:`Within that account, it accepts only the Kosli-side IAM role dedicated to your organization.\nEvery Cloud Capture job runs under the role for the organization it is working for. A job for\nanother Kosli tenant presents a different role name, so your pool refuses it, even if that\ntenant gave Kosli your provider and service account details instead of their own.`}),`\n`]}),_jsx(_components.p,{children:`The role name is part of the credential that AWS signs and Google verifies, so the caller cannot\nforge it.`}),_jsx(_components.p,{children:`For readers familiar with the AWS setup: the account check plays the part of the principal in the\nassume-role trust policy, and the role check plays the part of the external ID.`}),_jsxs(_components.p,{children:[`Kosli needs two values to connect to your project: the full resource name of the workload identity\nprovider, and the email of the service account. The configuration emits both as Terraform outputs.\nAfter the deployment completes, register them with Kosli through the Kosli API’s cloud accounts\nendpoint. You can read them at any time from the deployment’s latest revision, under\n`,_jsx(_components.code,{children:`applyResults.outputs`}),`, with `,_jsx(_components.code,{children:`gcloud infra-manager revisions describe`}),`.`]}),_jsx(_components.p,{children:`If you wish to grant access for Cloud Capture without using our published configuration, the\nresources needed are those shown below. The pool must accept only the Kosli AWS account and, within\nit, only the Kosli-side role for your organization, and only that role may impersonate the service\naccount. The specific permissions needed to find and snapshot GKE clusters are in the custom role.`}),_jsx(Heading,{level:`3`,id:`workload-identity-federation`,children:`Workload identity federation`}),_jsx(_components.p,{children:`The Terraform configuration creates a workload identity pool, an AWS provider within it that trusts\nthe Kosli-side role for your organization, and a service account that only that role may\nimpersonate. This appears as:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`105`,language:`hcl`,children:_jsx(_components.pre,{className:`shiki shiki-themes dracula dracula`,style:{backgroundColor:`#282A36`,\"--shiki-dark-bg\":`#282A36`,color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},language:`hcl`,children:_jsxs(_components.code,{language:`hcl`,numberOfLines:`105`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`variable`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"project_id\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` type `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` string`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` description `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`The GCP project that holds the GKE clusters Cloud Capture will snapshot.`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`variable`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"kosli_aws_account_id\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` type `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` string`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` description `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` \u003c\u003c-EOT`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` The AWS account in which Cloud Capture runs, supplied by Kosli. It differs`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` per tenant because more than one Kosli account serves tenants. There`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` is no default and no value you can derive yourself.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` EOT`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:` validation`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` condition `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` can`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`(`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:`regex`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`(`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`^[0-9]{12}$`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`, var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_aws_account_id))`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` error_message `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Must be the 12-digit AWS account id issued to you by Kosli.`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`variable`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"kosli_role_name\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` type `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` string`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` description `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` \u003c\u003c-EOT`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` The name of the IAM role, in the Kosli AWS account, that Cloud Capture`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` uses when working for your organization. Supplied by Kosli. Each Kosli`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` organization has its own role, and the workload identity pool accepts`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` only this one, so only Cloud Capture jobs run on behalf of your`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` organization can obtain a token from your project. In the AWS setup,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` the external ID plays the same part.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` EOT`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:` validation`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` condition `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` can`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`(`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:`regex`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`(`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`^[A-Za-z0-9+=,.@_-]{1,64}$`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`, var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_role_name))`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` error_message `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Must be the IAM role name issued to you by Kosli.`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# Cloud Capture runs in AWS. Workload Identity Federation lets it exchange its`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# own short-lived AWS credentials for a short-lived Google token, so no service`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# account key is ever created, stored or shared.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`resource`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"google_iam_workload_identity_pool\" \"kosli_capture\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` project `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`project_id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` workload_identity_pool_id `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`kosli-capture`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` display_name `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Cloud Capture`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` description `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` \u003c\u003c-EOT`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Read-only access for Cloud Capture SDLC compliance evidence collection.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Managed by Infrastructure Manager; do not edit in place.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` EOT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`resource`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"google_iam_workload_identity_pool_provider\" \"kosli_aws\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` project `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`project_id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` workload_identity_pool_id `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` google_iam_workload_identity_pool`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_capture`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`workload_identity_pool_id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` workload_identity_pool_provider_id `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`kosli-aws`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` display_name `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Cloud Capture (AWS)`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:` aws`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` account_id `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_aws_account_id`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` attribute_mapping `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`google.subject`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` =`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`assertion.arn`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`attribute.account`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` =`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`assertion.account`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`attribute.aws_role`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` =`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`assertion.arn.extract('assumed-role/{role}/')`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # Two checks before the pool issues a token. The account check accepts only`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # credentials issued by the Kosli AWS account, however the token reaches`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # Google. The role check accepts, within that account, only the Kosli-side`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # role dedicated to your organization. A Cloud Capture job for another tenant`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # runs under a different role and is refused here. In the AWS setup, these`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # checks correspond to the trust policy principal and the external ID.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` attribute_condition `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` join`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`(`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`, [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`attribute.account == `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:'\\\\\"${'}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_aws_account_id`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`}\\\\\"`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`attribute.aws_role == `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:'\\\\\"${'}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_role_name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`}\\\\\"`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` ])`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`resource`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"google_service_account\" \"kosli_capture\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` project `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`project_id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` account_id `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`kosli-capture`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` display_name `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Cloud Capture`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` description `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Impersonated by Cloud Capture to snapshot GKE clusters. Managed by Infrastructure Manager.`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# Only the Kosli-side role for your organization may impersonate the service`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# account. The pool's attribute condition already refuses every other identity;`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# naming the role here as well keeps the binding correct even if that condition`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# is later loosened.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`resource`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"google_service_account_iam_member\" \"kosli_impersonation\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` service_account_id `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` google_service_account`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_capture`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`name`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` role `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`roles/iam.workloadIdentityUser`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` member `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`principalSet://iam.googleapis.com/`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`google_iam_workload_identity_pool`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_capture`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`}`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`/attribute.aws_role/`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_role_name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`}`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# Kosli needs these two values to connect. Infrastructure Manager records them`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# on the deployment's latest revision, under applyResults.outputs.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`output`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"kosli_capture_provider\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` description `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Full resource name of the workload identity provider; give this to Kosli.`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` value `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` google_iam_workload_identity_pool_provider`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_aws`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`name`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`output`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"kosli_capture_service_account\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` description `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Email of the service account Cloud Capture impersonates; give this to Kosli.`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` value `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` google_service_account`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_capture`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`email`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`]})})}),_jsx(Heading,{level:`3`,id:`gke-permissions`,children:`GKE permissions`}),_jsxs(_components.p,{children:[`The Terraform configuration grants the service account a custom role containing read-only\npermissions. Cloud Capture reads the pods of your GKE clusters from\n`,_jsx(_components.a,{href:`https://cloud.google.com/asset-inventory/docs/overview`,children:`Cloud Asset Inventory`}),`, in the same way as\n`,_jsx(_components.a,{href:`/client_reference/kosli_snapshot_gke`,children:_jsx(_components.code,{children:`kosli snapshot gke`})}),`. It never calls a cluster’s Kubernetes\nAPI, so no Kubernetes RBAC objects need to be created inside your clusters, and Cloud Capture needs\nno network access to any cluster control plane.`]}),_jsx(_components.p,{children:`The configuration also enables the Cloud Asset API in your project. These appear as:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`44`,language:`hcl`,children:_jsx(_components.pre,{className:`shiki shiki-themes dracula dracula`,style:{backgroundColor:`#282A36`,\"--shiki-dark-bg\":`#282A36`,color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},language:`hcl`,children:_jsxs(_components.code,{language:`hcl`,numberOfLines:`44`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# Cloud Capture reads pods through the Cloud Asset API, so it must be enabled`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# in the project.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`resource`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"google_project_service\" \"cloudasset\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` project `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`project_id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` service `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`cloudasset.googleapis.com`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` disable_on_destroy `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:` false`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# How Capture finds what to snapshot. Discovery lists the GKE clusters in the`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# project and reads each cluster's labels from the same clusters.get call.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`#`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# Worth knowing for a security review: Cloud Capture reads pods from Cloud`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# Asset Inventory rather than from each cluster's Kubernetes API, so it needs`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# no Kubernetes RBAC and no network access to any cluster control plane. None`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# of it returns application data. listContainerPod is the widest - a pod spec`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# holds the container image, the command, and any environment variables`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# written into the spec itself in plain text. Values taken from a Secret or`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# ConfigMap are named there rather than resolved, so what comes back is the`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# reference and not the secret. This role lists pod assets only; the broader`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# roles/cloudasset.viewer would also list k8s.io/Secret assets.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`resource`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"google_project_iam_custom_role\" \"kosli_capture\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` project `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`project_id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` role_id `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`kosliCapture`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` title `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Cloud Capture`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` description `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`Read-only GKE inventory for Cloud Capture SDLC compliance evidence collection.`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` permissions `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # Discovery`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`container.clusters.get`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`container.clusters.list`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # Snapshot: the Cloud Asset Inventory calls that kosli snapshot gke makes.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # serviceusage.services.use lets the Cloud Asset API calls use this`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:` # project as their quota project.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`cloudasset.assets.listContainerPod`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:` \"`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`serviceusage.services.use`}),_jsx(_components.span,{style:{color:`#E9F284`,\"--shiki-dark\":`#E9F284`},children:`\"`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#8BE9FD`,\"--shiki-dark-font-style\":`italic`},children:`resource`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` \"google_project_iam_member\" \"kosli_capture\" {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` project `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` var`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`project_id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` role `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` google_project_iam_custom_role`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_capture`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` member `}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`=`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:` google_service_account`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`kosli_capture`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`.`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`member`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`}`})}),`\n`]})})}),_jsx(Heading,{level:`3`,id:`deploying-with-infrastructure-manager`,children:`Deploying with Infrastructure Manager`}),_jsx(_components.p,{children:`Run the following from the directory containing the configuration. Infrastructure Manager runs\nTerraform as the service account you name, so that service account needs permission to enable APIs\nand to create workload identity pools, service accounts, custom roles and project IAM bindings.\nCopy the Kosli AWS account ID and role name from the Cloud Capture section of your organization’s\nSettings page in the Kosli UI.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dracula dracula`,style:{backgroundColor:`#282A36`,\"--shiki-dark-bg\":`#282A36`,color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#50FA7B`,\"--shiki-dark\":`#50FA7B`},children:`gcloud`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` infra-manager`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` deployments`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` apply`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` projects/`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`your-gcp-projec`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`t`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`>`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`/locations/`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`your-gcp-regio`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`n`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`>`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`/deployments/kosli-capture`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:` --service-account=projects/`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`your-gcp-project`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`>`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`/serviceAccounts/`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`deployer`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`>`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`@`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`your-gcp-project`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`>`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`.iam.gserviceaccount.com`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:` --local-source=.`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:` --input-values=project_id=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`your-gcp-project`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`>`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`,kosli_aws_account_id=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:`value`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` from`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Kosl`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`i`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`>`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`,kosli_role_name=`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:`value`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` from`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` Kosl`}),_jsx(_components.span,{style:{color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},children:`i`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`>`})]}),`\n`]})})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`how-kosli-isolates-tenants`,children:`How Kosli isolates tenants`}),`\n`,_jsx(_components.p,{children:`Cloud Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to\none tenant.`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`AWS`,id:`aws-2`,children:[_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A Cloud Capture worker picks up a job for your organization and assumes the role in your account\nusing your externalId. A worker running for a different tenant is unable to read the externalId\nfor your cloud account.`}),`\n`,_jsx(_components.li,{children:`When the job finishes, the temporary credentials for your account are discarded. A worker holding\ncredentials for your cloud account has no path to anyone else’s account.`}),`\n`,_jsx(_components.li,{children:`The ExternalId lives in Kosli’s Parameter Store and is readable only by the Kosli-side role for your\norganization. The shared task role cannot read any tenant’s ExternalId. Separation is enforced\nby IAM, not by application code.`}),`\n`]}),_jsx(_components.p,{children:`The trust policy on the role in your account limits access to the AWS account in which the Cloud\nCapture is running. The ExternalId acts as a shared secret between Kosli and you, so that only\nCloud Capture is permitted to assume the role.`})]}),_jsx(Tab,{title:`GCP`,id:`gcp-2`,children:_jsx(_components.p,{children:`Each Cloud Capture job for your organization runs under the Kosli-side IAM role dedicated to your\norganization. The workload identity pool in your project accepts only that role, so a job running\nfor a different tenant cannot obtain a token from your project or impersonate your service account.\nSeparation is enforced by the identity provider, not by application code.`})})]}),`\n`,_jsx(_components.p,{children:`Cloud Capture itself does not hold any tenant data. Snapshots taken by Cloud Capture are\nimmediately sent to Kosli through the same ingest path as your existing pipelines.`}),`\n`,_jsx(Heading,{level:`2`,id:`changing-security-permissions`,children:`Changing security permissions`}),`\n`,_jsx(_components.p,{children:`If the role, or the service account and workload identity pool, that Cloud Capture uses is removed\nor edited within your cloud accounts, Cloud Capture will fail to operate correctly. The failure will be detected and the account will be\nremoved from the list of accounts captured.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":"dracula","languages":{"custom":["/languages/rego.json"]}},"config":{},"pageMetadata":{"title":"Cloud Capture - Security","sidebarTitle":"Security","description":"Learn about the security of Cloud Capture","tag":"BETA","href":"/administration/cloud_capture/security"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Cloud Capture permissions","slug":"cloud-capture-permissions","depth":2,"children":[{"title":"Assume role","slug":"assume-role","depth":3,"children":[],"tabId":"aws"},{"title":"All permissions needed","slug":"all-permissions-needed","depth":3,"children":[],"tabId":"aws"},{"title":"Workload identity federation","slug":"workload-identity-federation","depth":3,"children":[],"tabId":"gcp"},{"title":"GKE permissions","slug":"gke-permissions","depth":3,"children":[],"tabId":"gcp"},{"title":"Deploying with Infrastructure Manager","slug":"deploying-with-infrastructure-manager","depth":3,"children":[],"tabId":"gcp"}]},{"title":"How Kosli isolates tenants","slug":"how-kosli-isolates-tenants","depth":2,"children":[]},{"title":"Changing security permissions","slug":"changing-security-permissions","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/kosli/a8952d14c382591c/termly.js"],"subdomain":"kosli","siteName":"Kosli Documentation","title":"Cloud Capture - Security - Kosli Documentation","contextualStarterQuestions":[{"_id":"6ada077808985ce60f519c62","deploymentId":"694a567a82866c4f503bbfbf","questionText":"How do I set up AWS permissions?","status":"active","generatedBy":"contextual","path":"administration/cloud_capture/security","createdAt":"2026-10-22T12:54:16.054Z","updatedAt":"2026-10-22T12:54:16.054Z","__v":0},{"_id":"6ada077808985ce60f519c63","deploymentId":"694a567a82866c4f503bbfbf","questionText":"What is the CloudFormation template?","status":"active","generatedBy":"contextual","path":"administration/cloud_capture/security","createdAt":"2026-10-22T12:54:16.054Z","updatedAt":"2026-10-22T12:54:16.054Z","__v":0},{"_id":"6ada077808985ce60f519c64","deploymentId":"694a567a82866c4f503bbfbf","questionText":"Do I need an external ID?","status":"active","generatedBy":"contextual","path":"administration/cloud_capture/security","createdAt":"2026-10-22T12:54:16.054Z","updatedAt":"2026-10-22T12:54:16.054Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T12:54:10.488Z","gitLastModified":"2026-10-22T12:53:48.000Z","originalFileLocation":"administration/cloud_capture/security.md"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Learn about the security of Cloud Capture\">\u003cmeta data-mint-head name=\"application-name\" content=\"Kosli Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Cloud Capture - Security - Kosli Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Learn about the security of Cloud Capture\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Kosli Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.kosli.com/administration/cloud_capture/security\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://kosli.mintlify.app/_mintlify/api/og/v2?division=Cloud+Capture\u0026amp;title=Cloud+Capture+-+Security\u0026amp;description=Learn+about+the+security+of+Cloud+Capture\u0026amp;theme=381f3588bbad67d04f5be36e\u0026amp;signature=002eccd4ffb40bc33c20eaee456ddccf3ac2d914d5dd38bc8fe96aa4abd57cb2\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Cloud Capture - Security - Kosli Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Learn about the security of Cloud Capture\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://kosli.mintlify.app/_mintlify/api/og/v2?division=Cloud+Capture\u0026amp;title=Cloud+Capture+-+Security\u0026amp;description=Learn+about+the+security+of+Cloud+Capture\u0026amp;theme=381f3588bbad67d04f5be36e\u0026amp;signature=002eccd4ffb40bc33c20eaee456ddccf3ac2d914d5dd38bc8fe96aa4abd57cb2\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Kosli Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1C4BC6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.kosli.com/administration/cloud_capture/security\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/administration/cloud_capture/security.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.kosli.com/#organization\",\"name\":\"Kosli Documentation\",\"url\":\"https://docs.kosli.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/kosli/Cee1LAu-Jhawp1Om/logo/kosli-logo-light-main.svg?fit=max\u0026auto=format\u0026n=Cee1LAu-Jhawp1Om\u0026q=85\u0026s=fb05fdbb0c9c9ae7da266a500eac2be6\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.kosli.com#website\",\"name\":\"Kosli Documentation\",\"url\":\"https://docs.kosli.com\",\"publisher\":{\"@id\":\"https://docs.kosli.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.kosli.com/administration/cloud_capture/security#webpage\",\"url\":\"https://docs.kosli.com/administration/cloud_capture/security\",\"name\":\"Cloud Capture - Security\",\"description\":\"Learn about the security of Cloud Capture\",\"dateModified\":\"2026-10-22T12:53:48.000Z\",\"isPartOf\":{\"@id\":\"https://docs.kosli.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.kosli.com/administration/cloud_capture/security#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.kosli.com/administration/cloud_capture/security#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Administration\",\"item\":\"https://docs.kosli.com/administration/authentication/single_sign_on\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cloud Capture\",\"item\":\"https://docs.kosli.com/administration/cloud_capture/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cloud Capture - Security\",\"item\":\"https://docs.kosli.com/administration/cloud_capture/security\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.kosli.com/administration/cloud_capture/security#article\",\"headline\":\"Cloud Capture - Security\",\"name\":\"Cloud Capture - Security\",\"description\":\"Learn about the security of Cloud Capture\",\"url\":\"https://docs.kosli.com/administration/cloud_capture/security\",\"mainEntityOfPage\":{\"@id\":\"https://docs.kosli.com/administration/cloud_capture/security#webpage\"},\"dateModified\":\"2026-10-22T12:53:48.000Z\",\"publisher\":{\"@id\":\"https://docs.kosli.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.kosli.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Kosli Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Kosli Documentation","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Understand Kosli","icon":"book-open","pages":[{"title":"What is Kosli?","href":"/understand_kosli/what_is_kosli"},{"title":"Risks","href":"/understand_kosli/risks"},{"title":"Controls","href":"/understand_kosli/controls"},{"title":"How Kosli works","href":"/understand_kosli/how_kosli_works"},{"title":"Glossary","href":"/understand_kosli/glossary"},{"title":"AI access to these docs","href":"/understand_kosli/ai_docs_access"}]},{"group":"Getting started","icon":"rocket","pages":[{"title":"Install Kosli CLI","icon":"download","href":"/getting_started/install"},{"title":"Authenticating to Kosli","icon":"key","href":"/getting_started/authenticating_to_kosli"},{"title":"Flows","icon":"wave-sine","href":"/getting_started/flows"},{"title":"Trails","icon":"route","href":"/getting_started/trails"},{"title":"Artifacts","icon":"box","href":"/getting_started/artifacts"},{"title":"Attestations","icon":"receipt","href":"/getting_started/attestations"},{"title":"Environments","icon":"layer-group","href":"/getting_started/environments"},{"title":"Environment Policies","icon":"scroll","href":"/getting_started/policies"},{"title":"Enforce policies","icon":"shield-check","href":"/getting_started/enforce_policies"}]},{"group":"User","icon":"user","pages":[{"title":"Default organization","icon":"building","href":"/user/default_organization"},{"title":"Personal API keys","icon":"key","href":"/user/personal_api_keys"}]},{"group":"Administration","icon":"cog","pages":[{"group":"Authentication \u0026 access","pages":[{"title":"Single sign-on","icon":"id-card","href":"/administration/authentication/single_sign_on"},{"title":"Magic Link","icon":"wand-magic-sparkles","href":"/administration/authentication/magic_link"},{"title":"GitHub sign-in","icon":"github","href":"/administration/authentication/github_login"},{"title":"API authentication methods","icon":"shield-halved","href":"/administration/authentication/api_authentication_methods"},{"title":"Service accounts","icon":"user-gear","href":"/administration/authentication/service_accounts"},{"title":"API key rotation","icon":"arrows-rotate","href":"/administration/authentication/api_key_rotation"}]},{"group":"Users \u0026 roles","pages":[{"title":"Roles in Kosli","href":"/administration/managing_users/roles_in_kosli"},{"title":"Mapping users to roles","href":"/administration/managing_users/mapping_users_to_roles"},{"title":"Automated user provisioning","href":"/administration/managing_users/automated_user_provisioning"}]},{"group":"Managing Environments","pages":[{"title":"Managing Environments","href":"/administration/managing_environments/overview"}]},{"group":"Managing Custom Attestation Types","pages":[{"title":"Managing Custom Attestation Types","href":"/administration/managing_custom_attestation_types/overview"}]},{"title":"Managing Tags","href":"/administration/managing_tags"},{"group":"Dedicated instance","pages":[{"title":"Dedicated instance parameters","icon":"sliders","href":"/administration/dedicated_instance_parameters"},{"title":"Customer KMS keys","icon":"key","href":"/administration/customer_kms_keys"}]},{"group":"Cloud Capture","pages":[{"title":"Cloud Capture","sidebarTitle":"Cloud Capture","tag":"BETA","href":"/administration/cloud_capture/overview"},{"title":"Getting started with Cloud Capture","sidebarTitle":"Getting started","description":"Learn how to configure Cloud Capture for your organization","tag":"BETA","href":"/administration/cloud_capture/getting_started"},{"title":"Cloud Capture - Security","sidebarTitle":"Security","tag":"BETA","href":"/administration/cloud_capture/security"}]}]},{"group":"Tutorials","icon":"graduation-cap","pages":[{"group":"Getting started","pages":[{"title":"Try Kosli locally","description":"A quick local demo of Kosli's core features using Docker — no GitHub account or CI pipeline required. Runs entirely from your terminal in about 10 minutes.","href":"/tutorials/try_kosli_locally"},{"title":"Using Kosli CLI with an HTTP proxy","href":"/tutorials/cli_and_http_proxy"},{"title":"Organizing Flows and Environments with Spaces","href":"/tutorials/organizing_with_spaces"}]},{"group":"Attesting","pages":[{"title":"Reporting a custom attestation","href":"/tutorials/attest_custom"},{"title":"Attesting Snyk scans","href":"/tutorials/attest_snyk"},{"title":"Creating custom CTRF attestation type","href":"/tutorials/custom-attestation-ctrf"},{"title":"Attesting large documents (SBOMs, SARIF, vulnerability reports)","href":"/tutorials/attest_large_documents"}]},{"group":"Reporting environments","pages":[{"title":"Report AWS environments to Kosli","href":"/tutorials/report_aws_envs"},{"title":"Report Kubernetes environments to Kosli","href":"/tutorials/report_k8s_envs"},{"title":"Report Cloud Run environments to Kosli","href":"/tutorials/report_cloud_run_envs"},{"title":"Report GKE environments to Kosli","href":"/tutorials/report_gke_envs"}]},{"group":"Querying \u0026 tracing","pages":[{"title":"Querying Kosli","href":"/tutorials/querying_kosli"},{"title":"From commit to production","href":"/tutorials/following_a_git_commit_to_runtime_environments"},{"title":"Tracing a production incident to its git commit","href":"/tutorials/tracing_a_production_incident_back_to_git_commits"},{"title":"Adding trail summaries to CI pipeline runs","href":"/tutorials/trail_summaries_in_ci"}]},{"group":"Security","pages":[{"group":"Detecting Terraform drift","pages":[{"title":"Detecting unexpected statefile changes","href":"/tutorials/detecting_unexpected_statefile_changes"},{"title":"Detecting non-Terraform changes","href":"/tutorials/detecting_non_terraform_changes"}]},{"title":"Rotating API keys","href":"/tutorials/rotating_api_keys"}]},{"group":"Evaluation","pages":[{"title":"Evaluate trails with OPA policies","href":"/tutorials/evaluate_trails_with_opa"}]},{"group":"Multi-flow workflows","pages":[{"title":"Linking trails across branches","href":"/tutorials/linking_trails_across_branches"}]},{"group":"Controls","pages":[{"title":"Working with controls","href":"/tutorials/working_with_controls"}]},{"group":"Repositories","pages":[{"title":"Working with repositories","href":"/tutorials/repositories"}]}]},{"group":"Troubleshooting","icon":"wrench","pages":[{"title":"What do I do if Kosli is down?","href":"/troubleshooting/what_do_i_do_if_kosli_is_down"},{"title":"Docker API version error in GitHub Actions","href":"/troubleshooting/docker_api_version_error"},{"title":"Repo digest unavailable","href":"/troubleshooting/repo_digest_unavailable"},{"title":"zsh: no such user or named directory","href":"/troubleshooting/zsh_no_such_user"},{"title":"GitHub can't see KOSLI_API_TOKEN secret","href":"/troubleshooting/github_kosli_api_token"},{"title":"CLI in subshell captures stderr","href":"/troubleshooting/subshell_stderr"},{"title":"Path/Image name is a single whitespace character","href":"/troubleshooting/whitespace_path"}]},{"group":"FAQ","icon":"circle-question","pages":[{"title":"FAQ","href":"/faq/faq"}]},{"group":"Integrations","icon":"puzzle-piece","pages":[{"title":"Kosli Actions","href":"/integrations/kosli_actions"},{"title":"CI/CD","href":"/integrations/ci_cd"},{"title":"Slack","href":"/integrations/slack"},{"title":"LaunchDarkly","href":"/integrations/launchdarkly"},{"title":"Sonar","href":"/integrations/sonar"},{"title":"MCP server","tag":"BETA","href":"/integrations/mcp_server"}]}]},{"tab":"Labs","pages":[{"title":"Labs","href":"/labs"}]},{"tab":"Implementation Guide","pages":[{"title":"Implementation Guide","href":"/implementation_guide/phase_1/roles_and_responsibilities/overview"}]},{"tab":"Reference","menu":[{"item":"CLI Reference","icon":"terminal","pages":[{"title":"CLI Reference","href":"/client_reference/overview"}]},{"item":"API Reference","icon":"code","pages":[{"title":"API Reference","href":"/api-reference/actions/list-actions"}]},{"item":"GitHub Action Reference","icon":"github","pages":[{"title":"GitHub Action Reference","href":"/github-action-reference/setup_cli_action"}]},{"item":"Terraform Reference","icon":"cubes","pages":[{"title":"Terraform Reference","href":"/terraform-reference"}]},{"item":"Helm Reference","icon":"layer-group","pages":[{"title":"Helm Reference","href":"/helm/k8s_reporter/overview"}]},{"item":"Template Reference","icon":"file-code","pages":[{"title":"Template Reference","href":"/template-reference/flow_template"}]},{"item":"Policy Reference","icon":"scroll","pages":[{"title":"Policy Reference","href":"/policy-reference/environment_policy"}]}],"pages":[{"title":"Reference","href":"/client_reference/overview"}]},{"tab":"Changelog","icon":"clock","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Cloud Capture - Security - Kosli Documentation","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":[],"chunks":[]}