in pkg/plugin/keyvault.go [78:147]
func NewKeyVaultClient(
config *config.AzureConfig,
vaultName, keyName, keyVersion string,
proxyMode bool,
proxyAddress string,
proxyPort int,
managedHSM bool,
) (Client, error) {
// Sanitize vaultName, keyName, keyVersion. (https://github.com/Azure/kubernetes-kms/issues/85)
vaultName = utils.SanitizeString(vaultName)
keyName = utils.SanitizeString(keyName)
keyVersion = utils.SanitizeString(keyVersion)
// this should be the case for bring your own key, clusters bootstrapped with
// aks-engine or aks and standalone kms plugin deployments
if len(vaultName) == 0 || len(keyName) == 0 || len(keyVersion) == 0 {
return nil, fmt.Errorf("key vault name, key name and key version are required")
}
kvClient := kv.New()
err := kvClient.AddToUserAgent(version.GetUserAgent())
if err != nil {
return nil, fmt.Errorf("failed to add user agent to keyvault client, error: %+v", err)
}
env, err := auth.ParseAzureEnvironment(config.Cloud)
if err != nil {
return nil, fmt.Errorf("failed to parse cloud environment: %s, error: %+v", config.Cloud, err)
}
if proxyMode {
env.ActiveDirectoryEndpoint = fmt.Sprintf("http://%s:%d/", proxyAddress, proxyPort)
}
vaultResourceURL := getVaultResourceIdentifier(managedHSM, env)
if vaultResourceURL == azure.NotAvailable {
return nil, fmt.Errorf("keyvault resource identifier not available for cloud: %s", env.Name)
}
token, err := auth.GetKeyvaultToken(config, env, vaultResourceURL, proxyMode)
if err != nil {
return nil, fmt.Errorf("failed to get key vault token, error: %+v", err)
}
kvClient.Authorizer = token
vaultURL, err := getVaultURL(vaultName, managedHSM, env)
if err != nil {
return nil, fmt.Errorf("failed to get vault url, error: %+v", err)
}
keyIDHash, err := getKeyIDHash(*vaultURL, keyName, keyVersion)
if err != nil {
return nil, fmt.Errorf("failed to get key id hash, error: %w", err)
}
if proxyMode {
kvClient.RequestInspector = autorest.WithHeader(consts.RequestHeaderTargetType, consts.TargetTypeKeyVault)
vaultURL = getProxiedVaultURL(vaultURL, proxyAddress, proxyPort)
}
mlog.Always("using kms key for encrypt/decrypt", "vaultURL", *vaultURL, "keyName", keyName, "keyVersion", keyVersion)
client := &KeyVaultClient{
baseClient: kvClient,
config: config,
vaultName: vaultName,
keyName: keyName,
keyVersion: keyVersion,
vaultURL: *vaultURL,
azureEnvironment: env,
keyIDHash: keyIDHash,
}
return client, nil
}