|
|
@@ -64,30 +64,32 @@ const (
|
|
|
AnnotationTenantID = "azure.workload.identity/tenant-id"
|
|
|
managerLabel = "external-secrets"
|
|
|
|
|
|
- errUnexpectedStoreSpec = "unexpected store spec"
|
|
|
- errMissingAuthType = "cannot initialize Azure Client: no valid authType was specified"
|
|
|
- errPropNotExist = "property %s does not exist in key %s"
|
|
|
- errTagNotExist = "tag %s does not exist"
|
|
|
- errUnknownObjectType = "unknown Azure Keyvault object Type for %s"
|
|
|
- errUnmarshalJSONData = "error unmarshalling json data: %w"
|
|
|
- errDataFromCert = "cannot get use dataFrom to get certificate secret"
|
|
|
- errDataFromKey = "cannot get use dataFrom to get key secret"
|
|
|
- errMissingTenant = "missing tenantID in store config"
|
|
|
- errMissingClient = "missing clientID: either serviceAccountRef or service account annotation '%s' is missing"
|
|
|
- errMissingSecretRef = "missing secretRef in provider config"
|
|
|
- errMissingClientIDSecret = "missing accessKeyID/secretAccessKey in store config"
|
|
|
- errMultipleClientID = "multiple clientID found. Check secretRef and serviceAccountRef"
|
|
|
- errMultipleTenantID = "multiple tenantID found. Check secretRef, 'spec.provider.azurekv.tenantId', and serviceAccountRef"
|
|
|
- errFindSecret = "could not find secret %s/%s: %w"
|
|
|
- errFindDataKey = "no data for %q in secret '%s/%s'"
|
|
|
-
|
|
|
- errInvalidStore = "invalid store"
|
|
|
- errInvalidStoreSpec = "invalid store spec"
|
|
|
- errInvalidStoreProv = "invalid store provider"
|
|
|
- errInvalidAzureProv = "invalid azure keyvault provider"
|
|
|
- errInvalidSecRefClientID = "invalid AuthSecretRef.ClientID: %w"
|
|
|
- errInvalidSecRefClientSecret = "invalid AuthSecretRef.ClientSecret: %w"
|
|
|
- errInvalidSARef = "invalid ServiceAccountRef: %w"
|
|
|
+ errUnexpectedStoreSpec = "unexpected store spec"
|
|
|
+ errMissingAuthType = "cannot initialize Azure Client: no valid authType was specified"
|
|
|
+ errPropNotExist = "property %s does not exist in key %s"
|
|
|
+ errTagNotExist = "tag %s does not exist"
|
|
|
+ errUnknownObjectType = "unknown Azure Keyvault object Type for %s"
|
|
|
+ errUnmarshalJSONData = "error unmarshalling json data: %w"
|
|
|
+ errDataFromCert = "cannot get use dataFrom to get certificate secret"
|
|
|
+ errDataFromKey = "cannot get use dataFrom to get key secret"
|
|
|
+ errMissingTenant = "missing tenantID in store config"
|
|
|
+ errMissingClient = "missing clientID: either serviceAccountRef or service account annotation '%s' is missing"
|
|
|
+ errMissingSecretRef = "missing secretRef in provider config"
|
|
|
+ errMissingClientIDSecret = "missing accessKeyID/secretAccessKey in store config"
|
|
|
+ errInvalidClientCredentials = "both clientSecret and clientCredentials set"
|
|
|
+ errMultipleClientID = "multiple clientID found. Check secretRef and serviceAccountRef"
|
|
|
+ errMultipleTenantID = "multiple tenantID found. Check secretRef, 'spec.provider.azurekv.tenantId', and serviceAccountRef"
|
|
|
+ errFindSecret = "could not find secret %s/%s: %w"
|
|
|
+ errFindDataKey = "no data for %q in secret '%s/%s'"
|
|
|
+
|
|
|
+ errInvalidStore = "invalid store"
|
|
|
+ errInvalidStoreSpec = "invalid store spec"
|
|
|
+ errInvalidStoreProv = "invalid store provider"
|
|
|
+ errInvalidAzureProv = "invalid azure keyvault provider"
|
|
|
+ errInvalidSecRefClientID = "invalid AuthSecretRef.ClientID: %w"
|
|
|
+ errInvalidSecRefClientSecret = "invalid AuthSecretRef.ClientSecret: %w"
|
|
|
+ errInvalidSecRefClientCertificate = "invalid AuthSecretRef.ClientCertificate: %w"
|
|
|
+ errInvalidSARef = "invalid ServiceAccountRef: %w"
|
|
|
|
|
|
errMissingWorkloadEnvVars = "missing environment variables. AZURE_CLIENT_ID, AZURE_TENANT_ID and AZURE_FEDERATED_TOKEN_FILE must be set"
|
|
|
errReadTokenFile = "unable to read token file %s: %w"
|
|
|
@@ -877,7 +879,7 @@ func (a *Azure) authorizerForWorkloadIdentity(ctx context.Context, tokenProvider
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- // Check if spec.provider.azurekv.tenantId is set
|
|
|
+ // Check if spec.provider.azurekv.tenantID is set
|
|
|
if tenantID == "" && a.provider.TenantID != nil {
|
|
|
tenantID = *a.provider.TenantID
|
|
|
}
|
|
|
@@ -979,31 +981,81 @@ func (a *Azure) authorizerForServicePrincipal(ctx context.Context) (autorest.Aut
|
|
|
if a.provider.AuthSecretRef == nil {
|
|
|
return nil, fmt.Errorf(errMissingSecretRef)
|
|
|
}
|
|
|
- if a.provider.AuthSecretRef.ClientID == nil || a.provider.AuthSecretRef.ClientSecret == nil {
|
|
|
+ if a.provider.AuthSecretRef.ClientID == nil || (a.provider.AuthSecretRef.ClientSecret == nil && a.provider.AuthSecretRef.ClientCertificate == nil) {
|
|
|
return nil, fmt.Errorf(errMissingClientIDSecret)
|
|
|
}
|
|
|
+ if a.provider.AuthSecretRef.ClientSecret != nil && a.provider.AuthSecretRef.ClientCertificate != nil {
|
|
|
+ return nil, fmt.Errorf(errInvalidClientCredentials)
|
|
|
+ }
|
|
|
+
|
|
|
+ return a.getAuthorizerFromCredentials(ctx)
|
|
|
+}
|
|
|
+
|
|
|
+func (a *Azure) getAuthorizerFromCredentials(ctx context.Context) (autorest.Authorizer, error) {
|
|
|
clientID, err := resolvers.SecretKeyRef(
|
|
|
ctx,
|
|
|
a.crClient,
|
|
|
a.store.GetKind(),
|
|
|
- a.namespace, a.provider.AuthSecretRef.ClientID)
|
|
|
+ a.namespace, a.provider.AuthSecretRef.ClientID,
|
|
|
+ )
|
|
|
+
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- clientSecret, err := resolvers.SecretKeyRef(
|
|
|
- ctx,
|
|
|
- a.crClient,
|
|
|
- a.store.GetKind(),
|
|
|
- a.namespace, a.provider.AuthSecretRef.ClientSecret)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
+
|
|
|
+ if a.provider.AuthSecretRef.ClientSecret != nil {
|
|
|
+ clientSecret, err := resolvers.SecretKeyRef(
|
|
|
+ ctx,
|
|
|
+ a.crClient,
|
|
|
+ a.store.GetKind(),
|
|
|
+ a.namespace, a.provider.AuthSecretRef.ClientSecret,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return getAuthorizerForClientSecret(
|
|
|
+ clientID,
|
|
|
+ clientSecret,
|
|
|
+ *a.provider.TenantID,
|
|
|
+ a.provider.EnvironmentType,
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ clientCertificate, err := resolvers.SecretKeyRef(
|
|
|
+ ctx,
|
|
|
+ a.crClient,
|
|
|
+ a.store.GetKind(),
|
|
|
+ a.namespace, a.provider.AuthSecretRef.ClientCertificate,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return getAuthorizerForClientCertificate(
|
|
|
+ clientID,
|
|
|
+ []byte(clientCertificate),
|
|
|
+ *a.provider.TenantID,
|
|
|
+ a.provider.EnvironmentType,
|
|
|
+ )
|
|
|
}
|
|
|
- clientCredentialsConfig := kvauth.NewClientCredentialsConfig(clientID, clientSecret, *a.provider.TenantID)
|
|
|
- clientCredentialsConfig.Resource = kvResourceForProviderConfig(a.provider.EnvironmentType)
|
|
|
- clientCredentialsConfig.AADEndpoint = AadEndpointForType(a.provider.EnvironmentType)
|
|
|
+}
|
|
|
+
|
|
|
+func getAuthorizerForClientSecret(clientID, clientSecret, tenantID string, environmentType esv1beta1.AzureEnvironmentType) (autorest.Authorizer, error) {
|
|
|
+ clientCredentialsConfig := kvauth.NewClientCredentialsConfig(clientID, clientSecret, tenantID)
|
|
|
+ clientCredentialsConfig.Resource = kvResourceForProviderConfig(environmentType)
|
|
|
+ clientCredentialsConfig.AADEndpoint = AadEndpointForType(environmentType)
|
|
|
return clientCredentialsConfig.Authorizer()
|
|
|
}
|
|
|
|
|
|
+func getAuthorizerForClientCertificate(clientID string, certificateBytes []byte, tenantID string, environmentType esv1beta1.AzureEnvironmentType) (autorest.Authorizer, error) {
|
|
|
+ clientCertificateConfig := NewClientInMemoryCertificateConfig(clientID, certificateBytes, tenantID)
|
|
|
+ clientCertificateConfig.Resource = kvResourceForProviderConfig(environmentType)
|
|
|
+ clientCertificateConfig.AADEndpoint = AadEndpointForType(environmentType)
|
|
|
+ return clientCertificateConfig.Authorizer()
|
|
|
+}
|
|
|
+
|
|
|
func (a *Azure) Close(_ context.Context) error {
|
|
|
return nil
|
|
|
}
|