|
|
@@ -66,14 +66,21 @@ const (
|
|
|
|
|
|
errGetKubeSecret = "cannot get Kubernetes secret %q: %w"
|
|
|
errSecretKeyFmt = "cannot find secret data for key: %q"
|
|
|
+ errConfigMapFmt = "cannot find config map data for key: %q"
|
|
|
|
|
|
errClientTLSAuth = "error from Client TLS Auth: %q"
|
|
|
+
|
|
|
+ errVaultRevokeToken = "error while revoking token: %w"
|
|
|
+
|
|
|
+ errUnknownCAProvider = "unknown caProvider type given"
|
|
|
)
|
|
|
|
|
|
type Client interface {
|
|
|
NewRequest(method, requestPath string) *vault.Request
|
|
|
RawRequestWithContext(ctx context.Context, r *vault.Request) (*vault.Response, error)
|
|
|
SetToken(v string)
|
|
|
+ Token() string
|
|
|
+ ClearToken()
|
|
|
SetNamespace(namespace string)
|
|
|
}
|
|
|
|
|
|
@@ -156,6 +163,15 @@ func (v *client) GetSecretMap(ctx context.Context, ref esv1alpha1.ExternalSecret
|
|
|
}
|
|
|
|
|
|
func (v *client) Close(ctx context.Context) error {
|
|
|
+ // Revoke the token if we have one set and it wasn't sourced from a TokenSecretRef
|
|
|
+ if v.client.Token() != "" && v.store.Auth.TokenSecretRef == nil {
|
|
|
+ req := v.client.NewRequest(http.MethodPost, "/v1/auth/token/revoke-self")
|
|
|
+ _, err := v.client.RawRequestWithContext(ctx, req)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf(errVaultRevokeToken, err)
|
|
|
+ }
|
|
|
+ v.client.ClearToken()
|
|
|
+ }
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
@@ -220,14 +236,40 @@ func (v *client) newConfig() (*vault.Config, error) {
|
|
|
cfg := vault.DefaultConfig()
|
|
|
cfg.Address = v.store.Server
|
|
|
|
|
|
- if len(v.store.CABundle) == 0 {
|
|
|
+ if len(v.store.CABundle) == 0 && v.store.CAProvider == nil {
|
|
|
return cfg, nil
|
|
|
}
|
|
|
|
|
|
caCertPool := x509.NewCertPool()
|
|
|
- ok := caCertPool.AppendCertsFromPEM(v.store.CABundle)
|
|
|
- if !ok {
|
|
|
- return nil, errors.New(errVaultCert)
|
|
|
+
|
|
|
+ if len(v.store.CABundle) > 0 {
|
|
|
+ ok := caCertPool.AppendCertsFromPEM(v.store.CABundle)
|
|
|
+ if !ok {
|
|
|
+ return nil, errors.New(errVaultCert)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if v.store.CAProvider != nil {
|
|
|
+ var cert []byte
|
|
|
+ var err error
|
|
|
+
|
|
|
+ switch v.store.CAProvider.Type {
|
|
|
+ case esv1alpha1.CAProviderTypeSecret:
|
|
|
+ cert, err = getCertFromSecret(v)
|
|
|
+ case esv1alpha1.CAProviderTypeConfigMap:
|
|
|
+ cert, err = getCertFromConfigMap(v)
|
|
|
+ default:
|
|
|
+ return nil, errors.New(errUnknownCAProvider)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ ok := caCertPool.AppendCertsFromPEM(cert)
|
|
|
+ if !ok {
|
|
|
+ return nil, errors.New(errVaultCert)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if transport, ok := cfg.HttpClient.Transport.(*http.Transport); ok {
|
|
|
@@ -237,6 +279,42 @@ func (v *client) newConfig() (*vault.Config, error) {
|
|
|
return cfg, nil
|
|
|
}
|
|
|
|
|
|
+func getCertFromSecret(v *client) ([]byte, error) {
|
|
|
+ secretRef := esmeta.SecretKeySelector{
|
|
|
+ Name: v.store.CAProvider.Name,
|
|
|
+ Namespace: &v.store.CAProvider.Namespace,
|
|
|
+ Key: v.store.CAProvider.Key,
|
|
|
+ }
|
|
|
+ ctx := context.Background()
|
|
|
+ res, err := v.secretKeyRef(ctx, &secretRef)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf(errVaultCert, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ return []byte(res), nil
|
|
|
+}
|
|
|
+
|
|
|
+func getCertFromConfigMap(v *client) ([]byte, error) {
|
|
|
+ objKey := types.NamespacedName{
|
|
|
+ Namespace: v.store.CAProvider.Namespace,
|
|
|
+ Name: v.store.CAProvider.Name,
|
|
|
+ }
|
|
|
+
|
|
|
+ configMapRef := &corev1.ConfigMap{}
|
|
|
+ ctx := context.Background()
|
|
|
+ err := v.kube.Get(ctx, objKey, configMapRef)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf(errVaultCert, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ val, ok := configMapRef.Data[v.store.CAProvider.Key]
|
|
|
+ if !ok {
|
|
|
+ return nil, fmt.Errorf(errConfigMapFmt, v.store.CAProvider.Key)
|
|
|
+ }
|
|
|
+
|
|
|
+ return []byte(val), nil
|
|
|
+}
|
|
|
+
|
|
|
func (v *client) setAuth(ctx context.Context, client Client, cfg *vault.Config) error {
|
|
|
tokenExists, err := setSecretKeyToken(ctx, v, client)
|
|
|
if tokenExists {
|