2021-03-26 15:08:55 +00:00
|
|
|
---
|
|
|
|
layout: docs
|
|
|
|
page_title: Vault CSI Provider
|
|
|
|
description: >-
|
|
|
|
The Vault CSI Provider allows pods to consume Vault secrets using CSI volumes.
|
|
|
|
---
|
|
|
|
|
2023-07-18 21:07:55 +00:00
|
|
|
# Vault CSI provider
|
2021-03-26 15:08:55 +00:00
|
|
|
|
2021-04-06 17:49:04 +00:00
|
|
|
The Vault CSI Provider allows pods to consume Vault secrets using
|
2021-03-26 15:08:55 +00:00
|
|
|
[CSI Secrets Store](https://github.com/kubernetes-sigs/secrets-store-csi-driver) volumes.
|
|
|
|
|
2021-04-06 17:49:04 +00:00
|
|
|
~> The Vault CSI Provider requires the [CSI Secret Store](https://github.com/kubernetes-sigs/secrets-store-csi-driver)
|
|
|
|
Driver to be installed.
|
2021-03-26 15:08:55 +00:00
|
|
|
|
|
|
|
## Overview
|
|
|
|
|
2021-04-06 17:49:04 +00:00
|
|
|
At a high level, the CSI Secrets Store driver allows users to create `SecretProviderClass` objects.
|
|
|
|
This object defines which secret provider to use and what secrets to retrieve. When pods requesting CSI volumes
|
|
|
|
are created, the CSI Secrets Store driver will send the request to the Vault CSI Provider if the provider
|
2021-06-14 15:41:22 +00:00
|
|
|
is `vault`. The Vault CSI Provider will then use Secret Provider Class specified and the pod's service account to retrieve
|
2023-05-24 12:07:00 +00:00
|
|
|
the secrets from Vault, and mount them into the pod's CSI volume.
|
2021-03-26 15:08:55 +00:00
|
|
|
|
2021-04-06 17:49:04 +00:00
|
|
|
The secret is retrieved from Vault and populated to the CSI secrets store volume during the `ContainerCreation` phase.
|
2021-03-26 15:08:55 +00:00
|
|
|
This means that pods will be blocked from starting until the secrets have been read from Vault and written to the volume.
|
|
|
|
|
|
|
|
### Features
|
|
|
|
|
|
|
|
The following features are supported by the Vault CSI Provider:
|
|
|
|
|
2021-04-06 17:49:04 +00:00
|
|
|
- All Vault secret engines supported.
|
2021-05-24 15:43:53 +00:00
|
|
|
- Authentication using the requesting pod's service account.
|
|
|
|
- TLS/mTLS communications with Vault.
|
2021-04-06 17:49:04 +00:00
|
|
|
- Rendering Vault secrets to files.
|
2023-05-24 12:07:00 +00:00
|
|
|
- Dynamic lease caching and renewal performed by Agent.
|
2021-04-06 17:49:04 +00:00
|
|
|
- Syncing secrets to Kubernetes secrets to be used as environment variables.
|
2023-01-26 00:12:15 +00:00
|
|
|
- Installation via [Vault Helm](/vault/docs/platform/k8s/helm)
|
2021-03-26 15:08:55 +00:00
|
|
|
|
2023-04-28 09:33:37 +00:00
|
|
|
@include 'kubernetes-supported-versions.mdx'
|
|
|
|
|
2021-03-26 15:08:55 +00:00
|
|
|
## Authenticating with Vault
|
|
|
|
|
2023-05-24 12:07:00 +00:00
|
|
|
The Vault CSI Provider will authenticate with Vault as the service account of the
|
|
|
|
pod that mounts the CSI volume. [Kubernetes](/vault/docs/auth/kubernetes) and
|
|
|
|
[JWT](/vault/docs/auth/jwt) auth methods are supported. The pod's service account
|
|
|
|
must be bound to a Vault role and a policy granting access to the secrets desired.
|
2021-03-26 15:08:55 +00:00
|
|
|
|
2023-05-24 12:07:00 +00:00
|
|
|
It is highly recommended to run pods with dedicated Kubernetes service accounts to
|
|
|
|
ensure applications cannot access more secrets than they require.
|
2021-06-14 15:41:22 +00:00
|
|
|
|
2023-07-18 21:07:55 +00:00
|
|
|
## Secret provider class example
|
2021-03-26 15:08:55 +00:00
|
|
|
|
|
|
|
The following is an example of a Secret Provider Class using the `vault` provider:
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
---
|
|
|
|
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
|
|
|
|
kind: SecretProviderClass
|
|
|
|
metadata:
|
|
|
|
name: vault-db-creds
|
|
|
|
spec:
|
|
|
|
# Vault CSI Provider
|
|
|
|
provider: vault
|
|
|
|
parameters:
|
|
|
|
# Vault role name to use during login
|
2021-04-06 17:49:04 +00:00
|
|
|
roleName: 'app'
|
2023-05-24 12:07:00 +00:00
|
|
|
# Vault address and TLS connection config is normally best configured by the
|
|
|
|
# helm chart, but can be overridden per SecretProviderClass:
|
2021-03-26 15:08:55 +00:00
|
|
|
# Vault's hostname
|
2023-05-24 12:07:00 +00:00
|
|
|
#vaultAddress: 'https://vault:8200'
|
2021-03-26 15:08:55 +00:00
|
|
|
# TLS CA certification for validation
|
2023-05-24 12:07:00 +00:00
|
|
|
#vaultCACertPath: '/vault/tls/ca.crt'
|
2021-03-26 15:08:55 +00:00
|
|
|
objects: |
|
|
|
|
- objectName: "dbUsername"
|
|
|
|
secretPath: "database/creds/db-app"
|
|
|
|
secretKey: "username"
|
|
|
|
- objectName: "dbPassword"
|
|
|
|
secretPath: "database/creds/db-app"
|
|
|
|
secretKey: "password"
|
2021-04-06 17:49:04 +00:00
|
|
|
# "objectName" is an alias used within the SecretProviderClass to reference
|
2021-03-26 15:08:55 +00:00
|
|
|
# that specific secret. This will also be the filename containing the secret.
|
|
|
|
# "secretPath" is the path in Vault where the secret should be retrieved.
|
|
|
|
# "secretKey" is the key within the Vault secret response to extract a value from.
|
|
|
|
```
|
|
|
|
|
|
|
|
~> Secret Provider Class is a namespaced object in Kubernetes.
|
|
|
|
|
2023-07-18 21:07:55 +00:00
|
|
|
## Using secret provider classes
|
2021-03-26 15:08:55 +00:00
|
|
|
|
|
|
|
An application pod uses the example Secret Provider Class above by mounting it as a CSI volume:
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
---
|
|
|
|
apiVersion: apps/v1
|
|
|
|
kind: Deployment
|
|
|
|
metadata:
|
|
|
|
name: app
|
|
|
|
labels:
|
|
|
|
app: demo
|
|
|
|
spec:
|
|
|
|
selector:
|
|
|
|
matchLabels:
|
|
|
|
app: demo
|
|
|
|
replicas: 1
|
|
|
|
template:
|
|
|
|
spec:
|
|
|
|
serviceAccountName: app
|
|
|
|
containers:
|
2021-04-06 17:49:04 +00:00
|
|
|
- name: app
|
|
|
|
image: my-app:1.0.0
|
|
|
|
volumeMounts:
|
|
|
|
- name: 'vault-db-creds'
|
|
|
|
mountPath: '/mnt/secrets-store'
|
|
|
|
readOnly: true
|
2021-03-26 15:08:55 +00:00
|
|
|
volumes:
|
2021-04-06 17:49:04 +00:00
|
|
|
- name: vault-db-creds
|
|
|
|
csi:
|
|
|
|
driver: 'secrets-store.csi.k8s.io'
|
|
|
|
readOnly: true
|
|
|
|
volumeAttributes:
|
|
|
|
secretProviderClass: 'vault-db-creds'
|
2021-03-26 15:08:55 +00:00
|
|
|
```
|
|
|
|
|
2021-04-06 17:49:04 +00:00
|
|
|
In this example `volumes.csi` is created on the application deployment and references
|
2021-03-26 15:08:55 +00:00
|
|
|
the Secret Provider Class named `vault-db-creds`.
|
|
|
|
|
2022-04-04 17:04:50 +00:00
|
|
|
## Tutorial
|
2021-03-26 15:08:55 +00:00
|
|
|
|
2023-01-26 00:12:15 +00:00
|
|
|
Refer to the [Vault CSI Provider](/vault/tutorials/kubernetes/kubernetes-secret-store-driver)
|
2023-03-29 20:33:06 +00:00
|
|
|
tutorial to learn how to set up Vault and its dependencies with a Helm chart.
|