Skip to content

feat: add support for GCP Workload Identity Federation#4654

Merged
Skarlso merged 9 commits intoexternal-secrets:mainfrom
bharath-b-rh:issue-1038
Sep 3, 2025
Merged

feat: add support for GCP Workload Identity Federation#4654
Skarlso merged 9 commits intoexternal-secrets:mainfrom
bharath-b-rh:issue-1038

Conversation

@bharath-b-rh
Copy link
Copy Markdown
Contributor

@bharath-b-rh bharath-b-rh commented Apr 14, 2025

Problem Statement

PR adds support for Workload Identity Federation in GCP SecretStore.

Related Issue

Fixes #1038

Proposed Changes

The GCP SecretStore API is updated with new auth field for configuring the Workload Identity Federation similar to existing Workload Identity. In which an user can configure the audience value to be used to obtain the STS and the configmap reference containing the external_account type credential configuration in json format.

Checklist

  • I have read the contribution guidelines
  • All commits are signed with git commit --signoff
  • My changes have reasonable test coverage
  • All tests pass with make test
  • I ensured my PR is ready for review with make reviewable

@bharath-b-rh bharath-b-rh requested a review from a team as a code owner April 14, 2025 11:34
@sonarqubecloud
Copy link
Copy Markdown

@torfjor
Copy link
Copy Markdown

torfjor commented Apr 21, 2025

I don't see why we need this. Both in terms of functionality and API surface. The identity used for the token exchange will in this case always be that of the controller Pod's ServiceAccount. Having the option to reference multiple external account credentials doesn't result in any significant improvement in terms of tenant isolation or security, as the identity used for accessing the API is identical.

If you provide a unique ESO instance to tenant namespaces, you can achieve what this PR implements by supplying adc to the controller Pod:

# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: external-secrets
helmCharts:
  - includeCRDs: true
    name: external-secrets
    releaseName: external-secrets
    repo: https://charts.external-secrets.io
    version: 0.16.1
resources:
  - store.yaml
  - externalsecret.yaml
configMapGenerator:
  - name: adc
    options:
      disableNameSuffixHash: true
    literals:
      - |-
        adc.json={
          "type": "external_account",
          "audience": "//iam.googleapis.com/projects/PROJECT_ID/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/credentials/token",
            "format": {
              "type": "text"
            }
          }
        }
patches:
  - target:
      kind: Deployment
      name: external-secrets
    patch: |-
      - op: add
        path: /spec/template/spec/containers/0/env
        value:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /var/run/secrets/credentials/adc.json
      - op: add
        path: /spec/template/spec/containers/0/volumeMounts
        value:
          - name: credentials
            mountPath: /var/run/secrets/credentials
      - op: add
        path: /spec/template/spec/volumes
        value:
          - name: credentials
            projected:
              defaultMode: 420
              sources:
              - serviceAccountToken:
                  path: token
                  audience: "https://iam.googleapis.com/projects/PROJECT_ID/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID"
                  expirationSeconds: 172800
              - configMap:
                  name: adc
                  items:
                    - key: adc.json

For the ESO-as-a-service model, we just need a way to override the identity provider and pool (audience) like mentioned here.

@dronenb
Copy link
Copy Markdown
Contributor

dronenb commented Apr 21, 2025

For ESO as a service / multitenancy, you should only need to provide the projectID, provider and pool, as well as the service account reference, and an optional audience (not all workload identity pools use the default audience, some have custom), so that ESO can create a tokenRequest for the service account in the tenant's namespace, then perform the token exchange using the tenant's service account token rather than the controller.

Tenants should not be using the controller's token, since that would mean that any namespace in the cluster would have access to any secret the controller has access to.

Should be similar to how it works for secrets store CSI driver: GoogleCloudPlatform/secrets-store-csi-driver-provider-gcp#459

@gusfcarvalho
Copy link
Copy Markdown
Member

Tenants should not be using the controller's token, since that would mean that any namespace in the cluster would have access to any secret the controller has access to.

I generally agree with this logic ☝️. TBH, I think just allowing for 'ServiceAccountRef' to provide an Audience, plus the scope for the workload Identity pools should be enough.

@bharath-b-rh
Copy link
Copy Markdown
Contributor Author

Should we add ServiceAccountRef only for the generators? So that in the providers where its just for controller makes use of own service account and in generators indicated ServiceAccount will be used for getting the tokens?

@gusfcarvalho
Copy link
Copy Markdown
Member

Should we add ServiceAccountRef only for the generators? So that in the providers where its just for controller makes use of own service account and in generators indicated ServiceAccount will be used for getting the tokens?

I'm not sure if I follow. Do you have an example?

@sonarqubecloud
Copy link
Copy Markdown

@bharath-b-rh
Copy link
Copy Markdown
Contributor Author

I apologize for the delay. I couldn't work on this issue at the intended pace.

I'm not sure if I follow. Do you have an example?

@gusfcarvalho Would having two config options like here in secretstore and generators be feasible? For secret store since it's only used by the operator, own service account will be used and for a generating a token using generators user provided service account will be used.

@y4ri
Copy link
Copy Markdown

y4ri commented May 28, 2025

Thank you for this patch. My use case is to produce username and password in a secret for crossplane helm provider to pull charts from Google Artifact Registry. I have Crossplane running on AWS, using GCP Workload Identity Federation for GCP providers. Thanks to your work here, that same identity setup can now be used by the Helm provider to pull charts as well. I hope this will be merged soon. Cheers!

@alexandrst88
Copy link
Copy Markdown

Hi! Will this feature be merged soon, it will help to interact with Google Artifact Registry from other clouds like AWS and others? I have the similar use case as @y4ri.

@bharath-b-rh
Copy link
Copy Markdown
Contributor Author

Apologies for the delay. I'll prioritize this work this week.

@bharath-b-rh bharath-b-rh changed the title WIP: Issue-1038: Adds support for GCP Workload Identity Federation Issue-1038: Adds support for GCP Workload Identity Federation Jul 22, 2025
@bharath-b-rh
Copy link
Copy Markdown
Contributor Author

@gusfcarvalho During a discussion about this issue in a community call, suggestion I received was to extend GCPWorkloadIdentity to include PoolID, PoolProvider and Audience params, but I think with that we will be able to support only Kubernetes WIF provider and other scenarios like @y4ri , @alexandrst88 has mentioned wouldn't be supported.
I think adding new GCPWorkloadIdentityFederation with a param to configure the credentials config would cover most WIF providers. I have updated the PR with new changes, please take a look and let me know what you think.

// credential_source.url in the provided credConfig. This field is merely to double-check the external token source
// URL is having the expected value.
// +kubebuilder:validation:Optional
ExternalTokenEndpoint string `json:"externalTokenEndpoint,omitempty"`
Copy link
Copy Markdown
Contributor Author

@bharath-b-rh bharath-b-rh Jul 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When credentials config has a URL configured in credential_source, which could be self created service to issue tokens, I thought to make use of ExternalTokenEndpoint to assert user knows about the configuration. I am not sure if it's really required though :)

@gusfcarvalho
Copy link
Copy Markdown
Member

@bharath-b-rh - can you make sure the CI tests pass? 😄 I think there are no other changes aside from making sure everything works

@bharath-b-rh
Copy link
Copy Markdown
Contributor Author

@bharath-b-rh - can you make sure the CI tests pass? 😄 I think there are no other changes aside from making sure everything works

@gusfcarvalho I have captured list of test scenarios with the outputs in a github gist here. PTAL. Thank you!

…upport

Signed-off-by: Bharath B <bhb@redhat.com>
…port

Signed-off-by: Bharath B <bhb@redhat.com>
Copy link
Copy Markdown
Contributor

@Skarlso Skarlso left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just initial thoughts and comments for now. :)

// +kubebuilder:validation:Optional
Namespace string `json:"namespace,omitempty"`

// key name holding the external account credential config. If empty, a key in the configmap will be used.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure I understand this comment about if empty a configmap key will be used. Could you add an example please?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had a condition in code, when a key is not provided, to use the first key read in map, just with the intention not fix the name for key or user must have to provide it. I will word it better.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that a good thing? Shouldn't rather the key be mandatory? Like, this is behind the scenes behaviour that might catch people off guard when suddenly, by default, the first key is used without warning. WDYT?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I agree, will update it make it mandatory.

@bharath-b-rh
Copy link
Copy Markdown
Contributor Author

@Skarlso In case of ClusterGenerator, only in GCPSM we are reusing method for obtaining the TokenSource, unlike other providers where the logic for obtaining token is defined in the generator package. And the checks for if not cluster scoped resource look for referenced resources in same ExternalSecret namespace isn't used.
In GCPSM this check will not match for ClusterGenerators and we have to create the referenced objects in the same namespace as of ExternalSecrets, and this is not expected, correct?

@gusfcarvalho
Copy link
Copy Markdown
Member

gusfcarvalho commented Aug 28, 2025

@Skarlso In case of ClusterGenerator, only in GCPSM we are reusing method for obtaining the TokenSource, unlike other providers where the logic for obtaining token is defined in the generator package.

I think both AWS and Azure registry token generators are leveraging common auth with their providers.

I would expect this to be the way to go when generators are driven from a common provider

Or did you mean something else I failed to understand? 😄

@Skarlso
Copy link
Copy Markdown
Contributor

Skarlso commented Aug 29, 2025

@bharath-b-rh Technically, the Generator should not be aware that it is in fact a ClusterGenerator, because it creates a virtual Generator that is effectively a Generator. :) Basically, a ClusterGenerator type is never asserted anywhere because it should always be just a Generator if that makes sense?

@bharath-b-rh
Copy link
Copy Markdown
Contributor Author

@Skarlso Ah ok, I get it now. When I read the code and the comments, I thought it was mainly for extracting the embedded generator type, it makes sense now.

@gusfcarvalho I should have worded it better, what I meant to say was the GCPSM implementation we can't distinguish for what scenario auth is invoked, like though SecretStore, GCRAccessToken or ClusterGenerator. Basically I was looking if we could make that. Because I read this limitation on ClusterGenerator and I was thinking does it apply for reading the referenced objects too, like Secrets, ServiceAccounts etc...
And I was looking if there is a way to solve it, and my comment was coming from code changes pov :) Sorry for the confusions.

So ClusterGenerators are cluster scoped in existence terms, but the embedded generators are all namespaced variants, and hence every behavior should align with it.

Do we need an update to the limitation section in the docs? To mention referenced objects in the embedded types should also reside in the ExternalSecrets namespace.

@Skarlso Skarlso changed the title Issue-1038: Adds support for GCP Workload Identity Federation feat: add support for GCP Workload Identity Federation Aug 29, 2025
@Skarlso Skarlso moved this to In Progress in External Secrets Aug 29, 2025
@github-actions github-actions bot added kind/feature Categorizes issue or PR as related to a new feature. kind/documentation Categorizes issue or PR as related to documentation. size/l labels Aug 29, 2025
@Skarlso
Copy link
Copy Markdown
Contributor

Skarlso commented Aug 29, 2025

@bharath-b-rh we can if it's not already mentioned.

@Skarlso
Copy link
Copy Markdown
Contributor

Skarlso commented Sep 3, 2025

Please run make helm.test.update and commit the diff. :) 🙇

@Skarlso
Copy link
Copy Markdown
Contributor

Skarlso commented Sep 3, 2025

Looks okay to me now after the make targets are run this can be merged. :)

@Skarlso
Copy link
Copy Markdown
Contributor

Skarlso commented Sep 3, 2025

Oh, and also, could you show a successful run using this feature please? 🙇
Edit: #4654 (comment)

This should be good enough.

@Skarlso Skarlso moved this from In Progress to Waiting for External in External Secrets Sep 3, 2025
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud bot commented Sep 3, 2025

@Skarlso Skarlso merged commit 6ec15bd into external-secrets:main Sep 3, 2025
27 checks passed
@github-project-automation github-project-automation bot moved this from Waiting for External to Done in External Secrets Sep 3, 2025
@bharath-b-rh bharath-b-rh deleted the issue-1038 branch September 4, 2025 02:26
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Sep 23, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [external-secrets](https://github.com/external-secrets/external-secrets) | minor | `0.19.2` -> `0.20.1` |

---

### Release Notes

<details>
<summary>external-secrets/external-secrets (external-secrets)</summary>

### [`v0.20.1`](https://github.com/external-secrets/external-secrets/releases/tag/v0.20.1)

[Compare Source](external-secrets/external-secrets@v0.19.2...v0.20.1)

Image: `ghcr.io/external-secrets/external-secrets:v0.20.1`
Image: `ghcr.io/external-secrets/external-secrets:v0.20.1-ubi`
Image: `ghcr.io/external-secrets/external-secrets:v0.20.1-ubi-boringssl`

<!-- Release notes generated using configuration in .github/release.yml at main -->

#### What's Changed

##### General

- chore: release 0.19.2 by [@&#8203;moolen](https://github.com/moolen) in [#&#8203;5136](external-secrets/external-secrets#5136)
- chore: update readme by [@&#8203;gusfcarvalho](https://github.com/gusfcarvalho) in [#&#8203;5137](external-secrets/external-secrets#5137)
- fix(kubernetes): make auth field optional by [@&#8203;mhrabovcin](https://github.com/mhrabovcin) in [#&#8203;5064](external-secrets/external-secrets#5064)
- chore: Fix Markdown spelling issues found by codespell by [@&#8203;mjtrangoni](https://github.com/mjtrangoni) in [#&#8203;5139](external-secrets/external-secrets#5139)
- Fix yaml codeblock for oracle-vault provider docs by [@&#8203;muckelba](https://github.com/muckelba) in [#&#8203;5146](external-secrets/external-secrets#5146)
- feat: add liveness probe to eso controller by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;4930](external-secrets/external-secrets#4930)
- fix(helm): add boolean for  processClusterGenerator by [@&#8203;DrummyFloyd](https://github.com/DrummyFloyd) in [#&#8203;5144](external-secrets/external-secrets#5144)
- chore: add Cisco to ADOPTERS.md by [@&#8203;sriaradhyula](https://github.com/sriaradhyula) in [#&#8203;5159](external-secrets/external-secrets#5159)
- docs: Fix provider stability and support table by [@&#8203;jonstacks](https://github.com/jonstacks) in [#&#8203;5161](external-secrets/external-secrets#5161)
- feat(helm): Add control of response to missing prometheus CRDs by [@&#8203;jcpunk](https://github.com/jcpunk) in [#&#8203;5087](external-secrets/external-secrets#5087)
- chore: Added release notes configuration by [@&#8203;bonddim](https://github.com/bonddim) in [#&#8203;5148](external-secrets/external-secrets#5148)
- chore: bump bitwarden helm chart version by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5044](external-secrets/external-secrets#5044)
- chore(docs): update `ADOPTERS.md` to include SAP by [@&#8203;jakobmoellerdev](https://github.com/jakobmoellerdev) in [#&#8203;5165](external-secrets/external-secrets#5165)
- feat: add externalsecret namespace for webhook provider by [@&#8203;matheusmazzoni](https://github.com/matheusmazzoni) in [#&#8203;5155](external-secrets/external-secrets#5155)
- fix: add unknown status for secret store by [@&#8203;alvin-rw](https://github.com/alvin-rw) in [#&#8203;5070](external-secrets/external-secrets#5070)
- Fix pushing to an AWS Secrets Manager Secret when there are no secret values by [@&#8203;nirajsapkota](https://github.com/nirajsapkota) in [#&#8203;4878](external-secrets/external-secrets#4878)
- add extralabels for dashboard to be scraped by multiple grafana instances by [@&#8203;L1ghtman2k](https://github.com/L1ghtman2k) in [#&#8203;5138](external-secrets/external-secrets#5138)
- fix: the api docs are not referencing sshkey generator by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5170](external-secrets/external-secrets#5170)
- Update github.md by [@&#8203;gecube](https://github.com/gecube) in [#&#8203;5171](external-secrets/external-secrets#5171)
- Update anchore-engine-credentials.md by [@&#8203;gecube](https://github.com/gecube) in [#&#8203;5172](external-secrets/external-secrets#5172)
- docs: update infisical docs to clarify missing system:auth-delegator need by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5174](external-secrets/external-secrets#5174)
- Adding support different type auth sources by [@&#8203;preved911](https://github.com/preved911) in [#&#8203;4877](external-secrets/external-secrets#4877)
- fix: stability update document did not update the stability table correctly by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5176](external-secrets/external-secrets#5176)
- Add esv1.AnnotationForceSync for CES and ES by [@&#8203;ntnn](https://github.com/ntnn) in [#&#8203;5156](external-secrets/external-secrets#5156)
- fix: helm build failing by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5178](external-secrets/external-secrets#5178)
- fix: remove release- branch automation by [@&#8203;moolen](https://github.com/moolen) in [#&#8203;5182](external-secrets/external-secrets#5182)
- chore: update dependencies by [@&#8203;eso-service-account-app](https://github.com/eso-service-account-app)\[bot] in [#&#8203;5181](external-secrets/external-secrets#5181)
- docs: update bitwarden documentation for dataFrom field usage by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5196](external-secrets/external-secrets#5196)
- feat: add contributor ladder by [@&#8203;gusfcarvalho](https://github.com/gusfcarvalho) in [#&#8203;5150](external-secrets/external-secrets#5150)
- feat: support vault provider check and set for push secrets by [@&#8203;webstradev](https://github.com/webstradev) in [#&#8203;5197](external-secrets/external-secrets#5197)
- chore(docs): update helm charts by [@&#8203;gusfcarvalho](https://github.com/gusfcarvalho) in [#&#8203;5203](external-secrets/external-secrets#5203)
- chore(ci): fix sonarqube security warnings in helm.yml by [@&#8203;webstradev](https://github.com/webstradev) in [#&#8203;5202](external-secrets/external-secrets#5202)
- chore: add pull request maintenance auto labelling and sizes by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5200](external-secrets/external-secrets#5200)
- fix: update the label verification step by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5209](external-secrets/external-secrets#5209)
- feat: add infisical k8s auth with Client JWT as Reviewer JWT Token support by [@&#8203;tuxtof](https://github.com/tuxtof) in [#&#8203;5168](external-secrets/external-secrets#5168)
- feat: improve error message for json marshalling/unmarshalling by [@&#8203;webstradev](https://github.com/webstradev) in [#&#8203;5211](external-secrets/external-secrets#5211)
- chore: enhance `helm-values-schema-json` schema plugin management logic by [@&#8203;jakobmoellerdev](https://github.com/jakobmoellerdev) in [#&#8203;5212](external-secrets/external-secrets#5212)
- fix(aws): stop incrementing the UUID for versions by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5175](external-secrets/external-secrets#5175)
- feat: enable secure serving for metrics \[issue 4614] by [@&#8203;rkferreira](https://github.com/rkferreira) in [#&#8203;5169](external-secrets/external-secrets#5169)
- fix(infisical): fix TokenAuth auth method by escaping the token revocation by [@&#8203;arthlr](https://github.com/arthlr) in [#&#8203;5217](external-secrets/external-secrets#5217)
- fix: tilt build was failing to rebuild by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5225](external-secrets/external-secrets#5225)
- feat: add selectable fields to the CRDs by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5226](external-secrets/external-secrets#5226)
- ref: removing Yandex Cloud specific common types declaration duplication by [@&#8203;preved911](https://github.com/preved911) in [#&#8203;4905](external-secrets/external-secrets#4905)
- fix: missing codeowners file from .github folder by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5228](external-secrets/external-secrets#5228)
- feat: add setting remote namespace to metadata for kubernetes provider by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5224](external-secrets/external-secrets#5224)
- feat: add support for certs only in pkcs12 by [@&#8203;devnopt](https://github.com/devnopt) in [#&#8203;4875](external-secrets/external-secrets#4875)
- docs: document redundant clusterName/clusterLocation parameters in GCP Secret Manager docs by [@&#8203;ionicsolutions](https://github.com/ionicsolutions) in [#&#8203;5208](external-secrets/external-secrets#5208)
- feat: Allow adding finalizers from template by [@&#8203;malovme](https://github.com/malovme) in [#&#8203;5140](external-secrets/external-secrets#5140)
- fix: controller-runtime update by [@&#8203;gusfcarvalho](https://github.com/gusfcarvalho) in [#&#8203;5239](external-secrets/external-secrets#5239)
- chore: update dependencies by [@&#8203;eso-service-account-app](https://github.com/eso-service-account-app)\[bot] in [#&#8203;5229](external-secrets/external-secrets#5229)
- fix: Prevent secretstore reconcile loop when provider error response is dynamic by [@&#8203;dakotaharden](https://github.com/dakotaharden) in [#&#8203;5247](external-secrets/external-secrets#5247)
- feat: add finalizers to SecretStores when referenced by PushSecrets with DeletionPolicy=Delete by [@&#8203;matheusmazzoni](https://github.com/matheusmazzoni) in [#&#8203;5163](external-secrets/external-secrets#5163)
- fix: keepersecurity support for shortcuts by [@&#8203;pepordev](https://github.com/pepordev) in [#&#8203;5245](external-secrets/external-secrets#5245)
- feat: add support for GCP Workload Identity Federation by [@&#8203;bharath-b-rh](https://github.com/bharath-b-rh) in [#&#8203;4654](external-secrets/external-secrets#4654)
- feat: support fetching secrets and certificates by name in Yandex Lockbox & Certificate Manager by [@&#8203;alliseeisgold](https://github.com/alliseeisgold) in [#&#8203;5022](external-secrets/external-secrets#5022)
- chore(charts): Adds new make target for installing unittest plugin by [@&#8203;bharath-b-rh](https://github.com/bharath-b-rh) in [#&#8203;5250](external-secrets/external-secrets#5250)
- docs(templating): added clarifying comments to Github generator example by [@&#8203;nielstenboom](https://github.com/nielstenboom) in [#&#8203;5248](external-secrets/external-secrets#5248)
- feat(release): add new workflow to label first time contributor issues by [@&#8203;mouhsen-ibrahim](https://github.com/mouhsen-ibrahim) in [#&#8203;5243](external-secrets/external-secrets#5243)
- feat(security): Adds an option to make HTTP2 configurable by [@&#8203;siddhibhor-56](https://github.com/siddhibhor-56) in [#&#8203;5231](external-secrets/external-secrets#5231)
- feat: add retry for onepassword on authorization error by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5253](external-secrets/external-secrets#5253)
- fix: handle namespace deletion race conditions with finalizers by [@&#8203;framsouza](https://github.com/framsouza) in [#&#8203;5154](external-secrets/external-secrets#5154)
- docs: update stability and support by [@&#8203;anders-swanson](https://github.com/anders-swanson) in [#&#8203;5257](external-secrets/external-secrets#5257)
- fix(akeyless): Upgrade Akeyless Provider Go SDK to v4 by [@&#8203;kgal-akl](https://github.com/kgal-akl) in [#&#8203;5263](external-secrets/external-secrets#5263)
- feat: support Pod Identity authentication for Vault Provider by [@&#8203;webstradev](https://github.com/webstradev) in [#&#8203;5201](external-secrets/external-secrets#5201)
- feat: add domain field to secretserver provider by [@&#8203;rkferreira](https://github.com/rkferreira) in [#&#8203;5258](external-secrets/external-secrets#5258)
- chore(release): Migrate to actions/create-github-app-token action by [@&#8203;mouhsen-ibrahim](https://github.com/mouhsen-ibrahim) in [#&#8203;5264](external-secrets/external-secrets#5264)
- chore: just updating the crd conformance tests by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5265](external-secrets/external-secrets#5265)
- chore(revert): "chore(release): Migrate to actions/create-github-app-token action" by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5269](external-secrets/external-secrets#5269)
- chore: azure sdk update by [@&#8203;hauswio](https://github.com/hauswio) in [#&#8203;5162](external-secrets/external-secrets#5162)
- feat: add support for fetching Secret by Path on Delinea Secret Server provider by [@&#8203;DelineaSahilWankhede](https://github.com/DelineaSahilWankhede) in [#&#8203;5270](external-secrets/external-secrets#5270)
- feat: migrate from tibdex to actions/create-github-app-token by [@&#8203;rkferreira](https://github.com/rkferreira) in [#&#8203;5286](external-secrets/external-secrets#5286)
- fix: license headers across all Go files - standardize format, add missing copyright, fix typos by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;5288](external-secrets/external-secrets#5288)
- fix: the boilerplate was missing the right license format by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5289](external-secrets/external-secrets#5289)
- chore(license): add automated license header checking using Apache SkyWalking Eyes GitHub Action by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;5290](external-secrets/external-secrets#5290)
- chore(docs): remove GitHub Discussions references and update support channels by [@&#8203;jakobmoellerdev](https://github.com/jakobmoellerdev) in [#&#8203;5292](external-secrets/external-secrets#5292)
- docs: updated the ladder with two new tracks: documentation and community by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5298](external-secrets/external-secrets#5298)
- docs(release): create upgrading section by [@&#8203;rkferreira](https://github.com/rkferreira) in [#&#8203;5310](external-secrets/external-secrets#5310)
- docs: readme update for health of the project by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5309](external-secrets/external-secrets#5309)
- fix: validate namespace in secretRef by [@&#8203;moolen](https://github.com/moolen) in [#&#8203;5311](external-secrets/external-secrets#5311)
- docs: add burnout prevention strategies and mitigation policy document by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5307](external-secrets/external-secrets#5307)
- feat: add missing go sbom by [@&#8203;moolen](https://github.com/moolen) in [#&#8203;5313](external-secrets/external-secrets#5313)
- feat: make vault e2e tests run locally by [@&#8203;moolen](https://github.com/moolen) in [#&#8203;5246](external-secrets/external-secrets#5246)
- chore: update dependencies by [@&#8203;eso-service-account-app](https://github.com/eso-service-account-app)\[bot] in [#&#8203;5324](external-secrets/external-secrets#5324)
- feat: add Cloudsmith generator for container registry authentication by [@&#8203;cloudsmith-iduffy](https://github.com/cloudsmith-iduffy) in [#&#8203;5267](external-secrets/external-secrets#5267)
- feat: Add lgtm review automation step to ci workflows. by [@&#8203;webstradev](https://github.com/webstradev) in [#&#8203;5251](external-secrets/external-secrets#5251)
- feat(provider): add Volcengine provider support by [@&#8203;kevinyancn](https://github.com/kevinyancn) in [#&#8203;5306](external-secrets/external-secrets#5306)
- test: add more information to potentially flaky test by [@&#8203;Skarlso](https://github.com/Skarlso) in [#&#8203;5330](external-secrets/external-secrets#5330)
- fix(docs): Fix typo in controller options doc by [@&#8203;tspearconquest](https://github.com/tspearconquest) in [#&#8203;5299](external-secrets/external-secrets#5299)
- chore(testing): Add licence.check make target by [@&#8203;jonstacks](https://github.com/jonstacks) in [#&#8203;5335](external-secrets/external-secrets#5335)
- docs(gitlab-variables): document environment scope fallback by [@&#8203;s1nyx](https://github.com/s1nyx) in [#&#8203;5300](external-secrets/external-secrets#5300)

##### Dependencies

- chore(deps): bump mkdocs-macros-plugin from 1.3.7 to 1.3.9 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5190](external-secrets/external-secrets#5190)
- chore(deps): bump requests from 2.32.4 to 2.32.5 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5191](external-secrets/external-secrets#5191)
- chore(deps): bump golang from 1.24.6-bookworm to 1.25.0-bookworm in /e2e by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5189](external-secrets/external-secrets#5189)
- chore(deps): bump goreleaser/goreleaser-action from 6.3.0 to 6.4.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5188](external-secrets/external-secrets#5188)
- chore(deps): bump actions/create-github-app-token from 2.1.0 to 2.1.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5187](external-secrets/external-secrets#5187)
- chore(deps): bump anchore/sbom-action from 0.20.4 to 0.20.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5186](external-secrets/external-secrets#5186)
- chore(deps): bump codecov/codecov-action from 5.4.3 to 5.5.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5184](external-secrets/external-secrets#5184)
- chore(deps): bump golang from 1.24.6 to 1.25.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5194](external-secrets/external-secrets#5194)
- chore(deps): bump github/codeql-action from 3.29.8 to 3.29.11 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5195](external-secrets/external-secrets#5195)
- chore(deps): bump ubi8/ubi from `4f0a4e4` to `7010e70` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5193](external-secrets/external-secrets#5193)
- chore(deps): bump mkdocs-material from 9.6.16 to 9.6.18 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5192](external-secrets/external-secrets#5192)
- chore(deps): bump actions/checkout from 4.2.2 to 5.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5198](external-secrets/external-secrets#5198)
- chore(deps): bump actions/dependency-review-action from 4.7.1 to 4.7.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5199](external-secrets/external-secrets#5199)
- chore(deps): bump aquasecurity/trivy-action from 0.32.0 to 0.33.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5234](external-secrets/external-secrets#5234)
- chore(deps): bump actions/dependency-review-action from 4.7.2 to 4.7.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5236](external-secrets/external-secrets#5236)
- chore(deps): bump ubi8/ubi from `7010e70` to `534c2c0` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5237](external-secrets/external-secrets#5237)
- chore(deps): bump actions/attest-build-provenance from 2.4.0 to 3.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5238](external-secrets/external-secrets#5238)
- chore(deps): bump regex from 2025.7.34 to 2025.8.29 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5242](external-secrets/external-secrets#5242)
- chore(deps): bump platformdirs from 4.3.8 to 4.4.0 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5241](external-secrets/external-secrets#5241)
- chore(deps): bump distroless/static from `2e114d2` to `f2ff10a` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5240](external-secrets/external-secrets#5240)
- chore(deps): bump golang from 1.25.0 to 1.25.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5275](external-secrets/external-secrets#5275)
- chore(deps): bump actions/github-script from 7.0.1 to 8.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5274](external-secrets/external-secrets#5274)
- chore(deps): bump actions/stale from 9.1.0 to 10.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5273](external-secrets/external-secrets#5273)
- chore(deps): bump actions/setup-go from 5.5.0 to 6.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5276](external-secrets/external-secrets#5276)
- chore(deps): bump mkdocs-material from 9.6.18 to 9.6.19 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5279](external-secrets/external-secrets#5279)
- chore(deps): bump codecov/codecov-action from 5.5.0 to 5.5.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5278](external-secrets/external-secrets#5278)
- chore(deps): bump github/codeql-action from 3.29.11 to 3.30.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5277](external-secrets/external-secrets#5277)
- chore(deps): bump markdown from 3.8.2 to 3.9 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5281](external-secrets/external-secrets#5281)
- chore(deps): bump golang from 1.25.0-bookworm to 1.25.1-bookworm in /e2e by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5280](external-secrets/external-secrets#5280)
- chore(deps): bump regex from 2025.8.29 to 2025.9.1 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5282](external-secrets/external-secrets#5282)
- chore(deps): bump golang from `b6ed3fd` to `b6ed3fd` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5318](external-secrets/external-secrets#5318)
- chore(deps): bump actions/setup-python from 5.6.0 to 6.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5317](external-secrets/external-secrets#5317)
- chore(deps): bump github/codeql-action from 3.30.1 to 3.30.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5319](external-secrets/external-secrets#5319)
- chore(deps): bump distroless/static from `f2ff10a` to `87bce11` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5320](external-secrets/external-secrets#5320)
- chore(deps): bump actions/labeler from 5.0.0 to 6.0.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5323](external-secrets/external-secrets#5323)
- chore(deps): bump softprops/action-gh-release from 2.3.2 to 2.3.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5321](external-secrets/external-secrets#5321)
- chore(deps): bump actions/create-github-app-token from 2.1.1 to 2.1.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5322](external-secrets/external-secrets#5322)
- chore(deps): bump actions/create-github-app-token from 2.1.1 to 2.1.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5339](external-secrets/external-secrets#5339)
- chore(deps): bump aquasecurity/trivy-action from 0.33.0 to 0.33.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5344](external-secrets/external-secrets#5344)
- chore(deps): bump mkdocs-material from 9.6.19 to 9.6.20 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5345](external-secrets/external-secrets#5345)
- chore(deps): bump step-security/harden-runner from 2.13.0 to 2.13.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5343](external-secrets/external-secrets#5343)
- chore(deps): bump sigstore/cosign-installer from 3.9.2 to 3.10.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5340](external-secrets/external-secrets#5340)
- chore(deps): bump anchore/sbom-action from 0.20.5 to 0.20.6 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5341](external-secrets/external-secrets#5341)
- chore(deps): bump regex from 2025.9.1 to 2025.9.18 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5346](external-secrets/external-secrets#5346)
- chore(deps): bump apache/skywalking-eyes from 0.6.0 to 0.7.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;5342](external-secrets/external-secrets#5342)

#### New Contributors

- [@&#8203;mjtrangoni](https://github.com/mjtrangoni) made their first contribution in [#&#8203;5139](external-secrets/external-secrets#5139)
- [@&#8203;muckelba](https://github.com/muckelba) made their first contribution in [#&#8203;5146](external-secrets/external-secrets#5146)
- [@&#8203;DrummyFloyd](https://github.com/DrummyFloyd) made their first contribution in [#&#8203;5144](external-secrets/external-secrets#5144)
- [@&#8203;sriaradhyula](https://github.com/sriaradhyula) made their first contribution in [#&#8203;5159](external-secrets/external-secrets#5159)
- [@&#8203;jonstacks](https://github.com/jonstacks) made their first contribution in [#&#8203;5161](external-secrets/external-secrets#5161)
- [@&#8203;matheusmazzoni](https://github.com/matheusmazzoni) made their first contribution in [#&#8203;5155](external-secrets/external-secrets#5155)
- [@&#8203;nirajsapkota](https://github.com/nirajsapkota) made their first contribution in [#&#8203;4878](external-secrets/external-secrets#4878)
- [@&#8203;L1ghtman2k](https://github.com/L1ghtman2k) made their first contribution in [#&#8203;5138](external-secrets/external-secrets#5138)
- [@&#8203;gecube](https://github.com/gecube) made their first contribution in [#&#8203;5171](external-secrets/external-secrets#5171)
- [@&#8203;preved911](https://github.com/preved911) made their first contribution in [#&#8203;4877](external-secrets/external-secrets#4877)
- [@&#8203;ntnn](https://github.com/ntnn) made their first contribution in [#&#8203;5156](external-secrets/external-secrets#5156)
- [@&#8203;webstradev](https://github.com/webstradev) made their first contribution in [#&#8203;5197](external-secrets/external-secrets#5197)
- [@&#8203;rkferreira](https://github.com/rkferreira) made their first contribution in [#&#8203;5169](external-secrets/external-secrets#5169)
- [@&#8203;arthlr](https://github.com/arthlr) made their first contribution in [#&#8203;5217](external-secrets/external-secrets#5217)
- [@&#8203;devnopt](https://github.com/devnopt) made their first contribution in [#&#8203;4875](external-secrets/external-secrets#4875)
- [@&#8203;dakotaharden](https://github.com/dakotaharden) made their first contribution in [#&#8203;5247](external-secrets/external-secrets#5247)
- [@&#8203;bharath-b-rh](https://github.com/bharath-b-rh) made their first contribution in [#&#8203;4654](external-secrets/external-secrets#4654)
- [@&#8203;alliseeisgold](https://github.com/alliseeisgold) made their first contribution in [#&#8203;5022](external-secrets/external-secrets#5022)
- [@&#8203;nielstenboom](https://github.com/nielstenboom) made their first contribution in [#&#8203;5248](external-secrets/external-secrets#5248)
- [@&#8203;siddhibhor-56](https://github.com/siddhibhor-56) made their first contribution in [#&#8203;5231](external-secrets/external-secrets#5231)
- [@&#8203;framsouza](https://github.com/framsouza) made their first contribution in [#&#8203;5154](external-secrets/external-secrets#5154)
- [@&#8203;kgal-akl](https://github.com/kgal-akl) made their first contribution in [#&#8203;5263](external-secrets/external-secrets#5263)
- [@&#8203;hauswio](https://github.com/hauswio) made their first contribution in [#&#8203;5162](external-secrets/external-secrets#5162)
- [@&#8203;Copilot](https://github.com/Copilot) made their first contribution in [#&#8203;5288](external-secrets/external-secrets#5288)
- [@&#8203;cloudsmith-iduffy](https://github.com/cloudsmith-iduffy) made their first contribution in [#&#8203;5267](external-secrets/external-secrets#5267)
- [@&#8203;kevinyancn](https://github.com/kevinyancn) made their first contribution in [#&#8203;5306](external-secrets/external-secrets#5306)
- [@&#8203;s1nyx](https://github.com/s1nyx) made their first contribution in [#&#8203;5300](external-secrets/external-secrets#5300)

**Full Changelog**: <external-secrets/external-secrets@v0.19.2...v0.20.1>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xMTYuNiIsInVwZGF0ZWRJblZlciI6IjQxLjExNi42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJjaGFydCJdfQ==-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/1555
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind/documentation Categorizes issue or PR as related to documentation. kind/feature Categorizes issue or PR as related to a new feature. size/l

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Support google workload identity federation

8 participants