Secrets: Refactor data_key_id out of the encoded secure value payload (#111852)
* everything compiles * tests pass * remove file included by accident * add entry to gitignore * some scaffolding for the migration executor * remove file * implement and test the migration * use xkube.Namespace in our interfaces * add todo * update wire deps * add some logs * fix wire dependency ordering * create tests to validate error conditions during migrations
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
|
||||
"github.com/grafana/grafana-app-sdk/logging"
|
||||
"github.com/grafana/grafana/pkg/registry/apis/secret/contracts"
|
||||
"github.com/grafana/grafana/pkg/registry/apis/secret/xkube"
|
||||
otelcodes "go.opentelemetry.io/otel/codes"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
)
|
||||
@@ -60,21 +61,21 @@ func (s *ConsolidationService) Consolidate(ctx context.Context) (err error) {
|
||||
|
||||
for _, ev := range encryptedValues {
|
||||
// Decrypt the value using its old data key.
|
||||
decryptedValue, err := s.encryptionManager.Decrypt(ctx, ev.Namespace, ev.EncryptedData)
|
||||
decryptedValue, err := s.encryptionManager.Decrypt(ctx, xkube.Namespace(ev.Namespace), ev.EncryptedPayload)
|
||||
if err != nil {
|
||||
logging.FromContext(ctx).Error("Failed to decrypt value", "namespace", ev.Namespace, "name", ev.Name, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
// Re-encrypt the value using a new data key.
|
||||
reEncryptedValue, err := s.encryptionManager.Encrypt(ctx, ev.Namespace, decryptedValue)
|
||||
reEncryptedValue, err := s.encryptionManager.Encrypt(ctx, xkube.Namespace(ev.Namespace), decryptedValue)
|
||||
if err != nil {
|
||||
logging.FromContext(ctx).Error("Failed to re-encrypt value", "namespace", ev.Namespace, "name", ev.Name, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
// Update the encrypted value in the store.
|
||||
err = s.encryptedValueStore.Update(ctx, ev.Namespace, ev.Name, ev.Version, reEncryptedValue)
|
||||
err = s.encryptedValueStore.Update(ctx, xkube.Namespace(ev.Namespace), ev.Name, ev.Version, reEncryptedValue)
|
||||
if err != nil {
|
||||
logging.FromContext(ctx).Error("Failed to update encrypted value", "namespace", ev.Namespace, "name", ev.Name, "error", err)
|
||||
continue
|
||||
|
||||
@@ -97,7 +97,7 @@ func TestConsolidation(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
originalDecryptedValues = append(originalDecryptedValues, decryptedValue.DangerouslyExposeAndConsumeValue())
|
||||
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, tc.namespace, tc.name, 1)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, xkube.Namespace(tc.namespace), tc.name, 1)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, encryptedValue)
|
||||
originalEncryptedData = append(originalEncryptedData, encryptedValue.EncryptedData)
|
||||
@@ -115,7 +115,7 @@ func TestConsolidation(t *testing.T) {
|
||||
require.Equal(t, originalDecryptedValues[i], decryptedValue.DangerouslyExposeAndConsumeValue())
|
||||
|
||||
// Verify that the encrypted data has changed (indicating re-encryption)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, tc.namespace, tc.name, 1)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, xkube.Namespace(tc.namespace), tc.name, 1)
|
||||
require.NoError(t, err)
|
||||
require.NotEqual(t, originalEncryptedData[i], encryptedValue.EncryptedData)
|
||||
}
|
||||
@@ -174,7 +174,7 @@ func TestConsolidation(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
initialDecryptedValues = append(initialDecryptedValues, decryptedValue.DangerouslyExposeAndConsumeValue())
|
||||
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, tc.namespace, tc.name, 1)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, xkube.Namespace(tc.namespace), tc.name, 1)
|
||||
require.NoError(t, err)
|
||||
initialEncryptedData = append(initialEncryptedData, encryptedValue.EncryptedData)
|
||||
}
|
||||
@@ -223,7 +223,7 @@ func TestConsolidation(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
newSecretDecryptedValues = append(newSecretDecryptedValues, decryptedValue.DangerouslyExposeAndConsumeValue())
|
||||
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, tc.namespace, tc.name, 1)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, xkube.Namespace(tc.namespace), tc.name, 1)
|
||||
require.NoError(t, err)
|
||||
newSecretEncryptedData = append(newSecretEncryptedData, encryptedValue.EncryptedData)
|
||||
}
|
||||
@@ -252,7 +252,7 @@ func TestConsolidation(t *testing.T) {
|
||||
require.Equal(t, initialDecryptedValues[i], decryptedValue.DangerouslyExposeAndConsumeValue())
|
||||
|
||||
// Verify that the encrypted data has changed (indicating re-encryption)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, tc.namespace, tc.name, 1)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, xkube.Namespace(tc.namespace), tc.name, 1)
|
||||
require.NoError(t, err)
|
||||
require.NotEqual(t, initialEncryptedData[i], encryptedValue.EncryptedData)
|
||||
}
|
||||
@@ -275,7 +275,7 @@ func TestConsolidation(t *testing.T) {
|
||||
|
||||
// Verify that the encrypted data has changed from what it was when first created
|
||||
// (indicating it was re-encrypted during consolidation)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, tc.namespace, tc.name, 1)
|
||||
encryptedValue, err := sut.EncryptedValueStorage.Get(ctx, xkube.Namespace(tc.namespace), tc.name, 1)
|
||||
require.NoError(t, err)
|
||||
require.NotEqual(t, newSecretEncryptedData[i], encryptedValue.EncryptedData)
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ func (s *SecureValueService) Update(ctx context.Context, newSecureValue *secretv
|
||||
}
|
||||
logging.FromContext(ctx).Debug("retrieved keeper", "namespace", newSecureValue.Namespace, "keeperName", newSecureValue.Spec.Keeper, "type", keeperCfg.Type())
|
||||
|
||||
secret, err := keeper.Expose(ctx, keeperCfg, newSecureValue.Namespace, newSecureValue.Name, currentVersion.Status.Version)
|
||||
secret, err := keeper.Expose(ctx, keeperCfg, xkube.Namespace(newSecureValue.Namespace), newSecureValue.Name, currentVersion.Status.Version)
|
||||
if err != nil {
|
||||
return nil, false, fmt.Errorf("reading secret value from keeper: %w", err)
|
||||
}
|
||||
@@ -191,7 +191,7 @@ func (s *SecureValueService) createNewVersion(ctx context.Context, sv *secretv1b
|
||||
// TODO: can we stop using external id?
|
||||
// TODO: store uses only the namespace and returns and id. It could be a kv instead.
|
||||
// TODO: check that the encrypted store works with multiple versions
|
||||
externalID, err := keeper.Store(ctx, keeperCfg, createdSv.Namespace, createdSv.Name, createdSv.Status.Version, sv.Spec.Value.DangerouslyExposeAndConsumeValue())
|
||||
externalID, err := keeper.Store(ctx, keeperCfg, xkube.Namespace(createdSv.Namespace), createdSv.Name, createdSv.Status.Version, sv.Spec.Value.DangerouslyExposeAndConsumeValue())
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("storing secure value in keeper: %w", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user