[ 
https://issues.apache.org/jira/browse/CAMEL-25675?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andrea Cosentino reassigned CAMEL-25675:
----------------------------------------

    Assignee: Andrea Cosentino

> camel-hashicorp-vault: support AppRole, Kubernetes, JWT and cloud logins
> ------------------------------------------------------------------------
>
>                 Key: CAMEL-25675
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25675
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-hashicorp-vault
>            Reporter: Claus Ibsen
>            Assignee: Andrea Cosentino
>            Priority: Major
>             Fix For: 4.24.0
>
>
> Camel's HashiCorp Vault support logs in only with a fixed token, and never 
> renews it. A fixed token is the weakest login for an application: it is the 
> one secret that unlocks all the others, so it ends up in an env var or a 
> properties file, and it expires (Vault and OpenBao default to a maximum of 
> 768h). Users who run Vault in Kubernetes or in a cloud, for example on Azure, 
> expect the application to log in with the identity the platform already gives 
> it.
> h3. Today
> * The properties function ({{HashicorpVaultPropertiesFunction}}), the secret 
> refresh task ({{HashicorpVaultReloadTriggerTask}}) and the endpoint's default 
> client ({{HashicorpVaultEndpoint}}) each create {{new VaultTemplate(endpoint, 
> new TokenAuthentication(token))}}.
> * That constructor gives the VaultTemplate Spring Vault's 
> {{SimpleSessionManager}}, which never renews the token. A periodic token 
> stops working after its first period.
> * The vault configuration ({{HashicorpVaultConfiguration}} in camel-api, the 
> camel.vault.hashicorp options in camel-main, and env vars such as 
> {{CAMEL_HASHICORP_VAULT_TOKEN}}) has a token and no other login.
> * Workarounds: the endpoint takes a {{vaultTemplate}} option, so a user can 
> build a client with another login. The properties function has a constructor 
> that takes a VaultTemplate, but {{doStart}} replaces it, or fails when no 
> token is set.
> h3. Proposal
> One option chooses the login, with its own settings, for the properties 
> function, the refresh task and the endpoint alike. Spring Vault 4.1.0, 
> already a dependency, has a class for each:
> * token, as today
> * AppRole: role ID and secret ID ({{AppRoleAuthentication}})
> * Kubernetes: the pod's service-account token ({{KubernetesAuthentication}})
> * JWT: a workload identity token, for example from a CI job 
> ({{JwtAuthentication}})
> * TLS client certificate ({{ClientCertificateAuthentication}})
> * cloud identities: AWS IAM ({{AwsIamAuthentication}}), Azure managed 
> identity ({{AzureMsiAuthentication}}), GCP ({{GcpComputeAuthentication}}, 
> {{GcpIamCredentialsAuthentication}})
> Use Spring Vault's {{LifecycleAwareSessionManager}}, so tokens are renewed 
> and the application logs in again when a token can no longer be renewed.
> Notes:
> * Dependencies: the AWS IAM login needs the AWS SDK v2 
> (software.amazon.awssdk), and the GCP IAM credentials login needs the Google 
> auth and IAM credentials libraries. Spring Vault declares them optional. Keep 
> them optional in camel-hashicorp-vault and document which one each login 
> needs. Azure managed identity, AppRole, Kubernetes and JWT need nothing extra.
> * Azure: {{AzureMsiAuthentication}} reads the Azure instance metadata service 
> (169.254.169.254), which Azure VMs and scale sets have. Check the Azure 
> hosting without it (App Service, Container Apps, AKS workload identity), 
> where a JWT login with the platform's identity token may be the way.
> * Let the properties function keep a VaultTemplate it is given, instead of 
> replacing it in {{doStart}}.
> h3. HashiCorp Vault and OpenBao
> OpenBao, the Linux Foundation fork of Vault 1.14, keeps Vault's API, so the 
> same client code works with both servers. OpenBao has the AppRole, 
> Kubernetes, JWT/OIDC and TLS certificate logins built in. Its AWS, Azure and 
> GCP logins are first-party plugins 
> (https://github.com/openbao/openbao-plugins) that the server admin installs; 
> nothing differs on the Camel side.
> h3. Tests and docs
> * camel-test-infra-hashicorp-vault runs 
> {{mirror.gcr.io/hashicorp/vault:2.1.2}}. The image is the 
> {{hashicorp.vault.container}} property, so the integration tests can also run 
> against an OpenBao image. The container sets its dev root token with 
> {{VAULT_DEV_ROOT_TOKEN_ID}}; OpenBao may need {{BAO_DEV_ROOT_TOKEN_ID}} (not 
> checked).
> * AppRole, JWT and TLS certificate logins can be tested against the 
> container. Kubernetes and the cloud logins need a cluster or a cloud 
> identity: test their configuration, not the login itself.
> * Document each login in the camel-hashicorp-vault docs and in the vault 
> configuration docs, and say it works with OpenBao once the tests run against 
> it.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to