Skip to content

Commit f8f0cae

Browse files
committed
Trigger fernet rotation inside keystone-operator
1 parent 1b15034 commit f8f0cae

5 files changed

Lines changed: 33 additions & 3 deletions

File tree

api/bases/keystone.openstack.org_keystoneapis.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ spec:
9999
description: Keystone Fernet Rotation Container Image URL (will be
100100
set to environmental default if empty)
101101
type: string
102+
fernetRotationDays:
103+
default: 1
104+
description: FernetRotationDays - Rotate fernet token keys every X
105+
days
106+
format: int32
107+
type: integer
102108
fernetRotationSchedule:
103109
default: 1 0 * * *
104110
description: FernetRotationSchedule - Schedule rotate fernet token

api/v1beta1/keystoneapi_types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ type KeystoneAPISpecCore struct {
125125
// TrustFlushSuspend - Suspend the cron job to purge trusts
126126
TrustFlushSuspend bool `json:"trustFlushSuspend"`
127127

128+
// +kubebuilder:validation:Optional
129+
// +kubebuilder:default=1
130+
// FernetRotationDays - Rotate fernet token keys every X days
131+
FernetRotationDays *int32 `json:"fernetRotationDays"`
132+
128133
// +kubebuilder:validation:Optional
129134
// +kubebuilder:default="1 0 * * *"
130135
// FernetRotationSchedule - Schedule rotate fernet token keys

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/keystone.openstack.org_keystoneapis.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ spec:
9999
description: Keystone Fernet Rotation Container Image URL (will be
100100
set to environmental default if empty)
101101
type: string
102+
fernetRotationDays:
103+
default: 1
104+
description: FernetRotationDays - Rotate fernet token keys every X
105+
days
106+
format: int32
107+
type: integer
102108
fernetRotationSchedule:
103109
default: 1 0 * * *
104110
description: FernetRotationSchedule - Schedule rotate fernet token

controllers/keystoneapi_controller.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,6 @@ func (r *KeystoneAPIReconciler) reconcileNormal(
880880
//
881881
// Create secret holding fernet keys (for token and credential)
882882
//
883-
// TODO key rotation
884883
err = r.ensureFernetKeys(ctx, instance, helper, &configMapVars)
885884
if err != nil {
886885
instance.Status.Conditions.Set(condition.FalseCondition(
@@ -1365,14 +1364,16 @@ func (r *KeystoneAPIReconciler) reconcileCloudConfig(
13651364
return oko_secret.EnsureSecrets(ctx, h, instance, secrets, nil)
13661365
}
13671366

1368-
// ensureFernetKeys - creates secret with fernet keys
1367+
// ensureFernetKeys - creates secret with fernet keys, rotates the keys
13691368
func (r *KeystoneAPIReconciler) ensureFernetKeys(
13701369
ctx context.Context,
13711370
instance *keystonev1.KeystoneAPI,
13721371
helper *helper.Helper,
13731372
envVars *map[string]env.Setter,
13741373
) error {
1374+
fernetLabel := labels.GetGroupLabel(keystone.ServiceName) + "/rotatedat"
13751375
labels := labels.GetLabels(instance, labels.GetGroupLabel(keystone.ServiceName), map[string]string{})
1376+
now := time.Now().UTC()
13761377

13771378
//
13781379
// check if secret already exist
@@ -1394,6 +1395,8 @@ func (r *KeystoneAPIReconciler) ensureFernetKeys(
13941395
fernetKeys[fmt.Sprintf("FernetKeys%d", i)] = keystone.GenerateFernetKey()
13951396
}
13961397

1398+
labels[fernetLabel] = now.Format(time.RFC3339)
1399+
13971400
tmpl := []util.Template{
13981401
{
13991402
Name: secretName,
@@ -1414,11 +1417,16 @@ func (r *KeystoneAPIReconciler) ensureFernetKeys(
14141417
changedKeys := false
14151418

14161419
extraKey := fmt.Sprintf("FernetKeys%d", numberKeys)
1420+
14171421
//
14181422
// Fernet Key rotation
14191423
//
1424+
rotatedAt, err := time.Parse(time.RFC3339, labels[fernetLabel])
1425+
duration := int(*instance.Spec.FernetRotationDays)
14201426

1421-
if false { // TODO: trigger rotation
1427+
if err != nil {
1428+
labels[fernetLabel] = now.Format(time.RFC3339)
1429+
} else if rotatedAt.AddDate(0, 0, duration).After(now) {
14221430
secret.Data[extraKey] = secret.Data["FernetKeys0"]
14231431
secret.Data["FernetKeys0"] = []byte(keystone.GenerateFernetKey())
14241432
}

0 commit comments

Comments
 (0)