Skip to content

Commit 27c7d31

Browse files
authored
feat: add support for managed HSM (#134)
Signed-off-by: Anish Ramasekar <anish.ramasekar@gmail.com>
1 parent 0cba524 commit 27c7d31

File tree

6 files changed

+186
-102
lines changed

6 files changed

+186
-102
lines changed

cmd/server/main.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ var (
3333
keyvaultName = flag.String("keyvault-name", "", "Azure Key Vault name")
3434
keyName = flag.String("key-name", "", "Azure Key Vault KMS key name")
3535
keyVersion = flag.String("key-version", "", "Azure Key Vault KMS key version")
36+
managedHSM = flag.Bool("managed-hsm", false, "Azure Key Vault Managed HSM. Refer to https://docs.microsoft.com/en-us/azure/key-vault/managed-hsm/overview for more details.")
3637
logFormatJSON = flag.Bool("log-format-json", false, "set log formatter to json")
3738
// TODO remove this flag in future release.
3839
_ = flag.String("configFilePath", "/etc/kubernetes/azure.json", "[DEPRECATED] Path for Azure Cloud Provider config file")
@@ -52,7 +53,6 @@ var (
5253

5354
func main() {
5455
klog.InitFlags(nil)
55-
5656
flag.Parse()
5757

5858
if *logFormatJSON {
@@ -75,7 +75,18 @@ func main() {
7575
}
7676

7777
klog.InfoS("Starting KeyManagementServiceServer service", "version", version.BuildVersion, "buildDate", version.BuildDate)
78-
kmsServer, err := plugin.New(ctx, *configFilePath, *keyvaultName, *keyName, *keyVersion, *proxyMode, *proxyAddress, *proxyPort)
78+
79+
pc := &plugin.Config{
80+
KeyVaultName: *keyvaultName,
81+
KeyName: *keyName,
82+
KeyVersion: *keyVersion,
83+
ManagedHSM: *managedHSM,
84+
ProxyMode: *proxyMode,
85+
ProxyAddress: *proxyAddress,
86+
ProxyPort: *proxyPort,
87+
ConfigFilePath: *configFilePath,
88+
}
89+
kmsServer, err := plugin.New(ctx, pc)
7990
if err != nil {
8091
klog.Fatalf("failed to create server, error: %v", err)
8192
}

pkg/auth/auth.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"net/http"
1313
"os"
1414
"regexp"
15-
"strings"
1615

1716
"github.com/Azure/kubernetes-kms/pkg/config"
1817
"github.com/Azure/kubernetes-kms/pkg/consts"
@@ -25,9 +24,8 @@ import (
2524
)
2625

2726
// GetKeyvaultToken() returns token for Keyvault endpoint
28-
func GetKeyvaultToken(config *config.AzureConfig, env *azure.Environment, proxyMode bool) (authorizer autorest.Authorizer, err error) {
29-
kvEndPoint := strings.TrimSuffix(env.KeyVaultEndpoint, "/")
30-
servicePrincipalToken, err := GetServicePrincipalToken(config, env.ActiveDirectoryEndpoint, kvEndPoint, proxyMode)
27+
func GetKeyvaultToken(config *config.AzureConfig, env *azure.Environment, resource string, proxyMode bool) (authorizer autorest.Authorizer, err error) {
28+
servicePrincipalToken, err := GetServicePrincipalToken(config, env.ActiveDirectoryEndpoint, resource, proxyMode)
3129
if err != nil {
3230
return nil, err
3331
}

pkg/plugin/keyvault.go

+33-6
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,13 @@ type keyVaultClient struct {
4141
}
4242

4343
// NewKeyVaultClient returns a new key vault client to use for kms operations
44-
func newKeyVaultClient(config *config.AzureConfig, vaultName, keyName, keyVersion string, proxyMode bool, proxyAddress string, proxyPort int) (*keyVaultClient, error) {
44+
func newKeyVaultClient(
45+
config *config.AzureConfig,
46+
vaultName, keyName, keyVersion string,
47+
proxyMode bool,
48+
proxyAddress string,
49+
proxyPort int,
50+
managedHSM bool) (*keyVaultClient, error) {
4551
// Sanitize vaultName, keyName, keyVersion. (https://github.com/Azure/kubernetes-kms/issues/85)
4652
vaultName = utils.SanitizeString(vaultName)
4753
keyName = utils.SanitizeString(keyName)
@@ -65,13 +71,17 @@ func newKeyVaultClient(config *config.AzureConfig, vaultName, keyName, keyVersio
6571
env.ActiveDirectoryEndpoint = fmt.Sprintf("http://%s:%d/", proxyAddress, proxyPort)
6672
}
6773

68-
token, err := auth.GetKeyvaultToken(config, env, proxyMode)
74+
vaultResourceURL := getVaultResourceIdentifier(managedHSM, env)
75+
if vaultResourceURL == azure.NotAvailable {
76+
return nil, fmt.Errorf("keyvault resource identifier not available for cloud: %s", env.Name)
77+
}
78+
token, err := auth.GetKeyvaultToken(config, env, vaultResourceURL, proxyMode)
6979
if err != nil {
7080
return nil, fmt.Errorf("failed to get key vault token, error: %+v", err)
7181
}
7282
kvClient.Authorizer = token
7383

74-
vaultURL, err := getVaultURL(vaultName, env)
84+
vaultURL, err := getVaultURL(vaultName, managedHSM, env)
7585
if err != nil {
7686
return nil, fmt.Errorf("failed to get vault url, error: %+v", err)
7787
}
@@ -128,7 +138,7 @@ func (kvc *keyVaultClient) Decrypt(ctx context.Context, plain []byte) ([]byte, e
128138
return bytes, nil
129139
}
130140

131-
func getVaultURL(vaultName string, azureEnvironment *azure.Environment) (vaultURL *string, err error) {
141+
func getVaultURL(vaultName string, managedHSM bool, env *azure.Environment) (vaultURL *string, err error) {
132142
// Key Vault name must be a 3-24 character string
133143
if len(vaultName) < 3 || len(vaultName) > 24 {
134144
return nil, fmt.Errorf("invalid vault name: %q, must be between 3 and 24 chars", vaultName)
@@ -140,13 +150,30 @@ func getVaultURL(vaultName string, azureEnvironment *azure.Environment) (vaultUR
140150
return nil, fmt.Errorf("invalid vault name: %q, must match [-a-zA-Z0-9]{3,24}", vaultName)
141151
}
142152

143-
vaultDNSSuffixValue := azureEnvironment.KeyVaultDNSSuffix
144-
vaultURI := "https://" + vaultName + "." + vaultDNSSuffixValue + "/"
153+
vaultDNSSuffixValue := getVaultDNSSuffix(managedHSM, env)
154+
if vaultDNSSuffixValue == azure.NotAvailable {
155+
return nil, fmt.Errorf("vault dns suffix not available for cloud: %s", env.Name)
156+
}
145157

158+
vaultURI := fmt.Sprintf("https://%s.%s/", vaultName, vaultDNSSuffixValue)
146159
return &vaultURI, nil
147160
}
148161

149162
func getProxiedVaultURL(vaultURL *string, proxyAddress string, proxyPort int) *string {
150163
proxiedVaultURL := fmt.Sprintf("http://%s:%d/%s", proxyAddress, proxyPort, strings.TrimPrefix(*vaultURL, "https://"))
151164
return &proxiedVaultURL
152165
}
166+
167+
func getVaultDNSSuffix(managedHSM bool, env *azure.Environment) string {
168+
if managedHSM {
169+
return env.ManagedHSMDNSSuffix
170+
}
171+
return env.KeyVaultDNSSuffix
172+
}
173+
174+
func getVaultResourceIdentifier(managedHSM bool, env *azure.Environment) string {
175+
if managedHSM {
176+
return env.ResourceIdentifiers.ManagedHSM
177+
}
178+
return env.ResourceIdentifiers.KeyVault
179+
}

0 commit comments

Comments
 (0)