Skip to content

Commit 871490d

Browse files
committed
Generate and rotate keys
After configuration change, keys need to be added/removed and rotated in the proper order to ensure that the sessions don't expire prematurely.
1 parent a92a8f6 commit 871490d

File tree

1 file changed

+98
-27
lines changed

1 file changed

+98
-27
lines changed

controllers/keystoneapi_controller.go

Lines changed: 98 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,46 +1378,117 @@ func (r *KeystoneAPIReconciler) ensureFernetKeys(
13781378
// check if secret already exist
13791379
//
13801380
secretName := keystone.ServiceName
1381+
1382+
var numberKeys int
1383+
_, err := fmt.Sscan(instance.Spec.FernetMaxActiveKeys, &numberKeys)
1384+
if err != nil {
1385+
return err
1386+
}
1387+
13811388
secret, hash, err := oko_secret.GetSecret(ctx, helper, secretName, instance.Namespace)
13821389

13831390
if err != nil && !k8s_errors.IsNotFound(err) {
13841391
return err
1392+
} else if k8s_errors.IsNotFound(err) {
1393+
fernetKeys := map[string]string{
1394+
"CredentialKeys0": keystone.GenerateFernetKey(),
1395+
"CredentialKeys1": keystone.GenerateFernetKey(),
1396+
}
1397+
1398+
for i := 0; i < numberKeys; i++ {
1399+
fernetKeys[fmt.Sprintf("FernetKeys%d", i)] = keystone.GenerateFernetKey()
1400+
}
1401+
1402+
tmpl := []util.Template{
1403+
{
1404+
Name: secretName,
1405+
Namespace: instance.Namespace,
1406+
Type: util.TemplateTypeNone,
1407+
CustomData: fernetKeys,
1408+
Labels: labels,
1409+
},
1410+
}
1411+
err := oko_secret.EnsureSecrets(ctx, helper, instance, tmpl, envVars)
1412+
if err != nil {
1413+
return err
1414+
}
13851415
} else {
13861416
// add hash to envVars
13871417
(*envVars)[secret.Name] = env.SetValue(hash)
1388-
}
13891418

1390-
fernetKeys := map[string]string{
1391-
"CredentialKeys0": keystone.GenerateFernetKey(),
1392-
"CredentialKeys1": keystone.GenerateFernetKey(),
1393-
}
1419+
changedKeys := false
13941420

1395-
var numberKeys int
1396-
fmt.Sscan(instance.Spec.FernetMaxActiveKeys, &numberKeys)
1421+
//
1422+
// Remove extra keys when FernetMaxActiveKeys changes
1423+
//
1424+
extraKey := fmt.Sprintf("FernetKeys%d", numberKeys)
1425+
for {
1426+
_, exists := secret.Data[extraKey]
1427+
if !exists {
1428+
break
1429+
}
1430+
changedKeys = true
1431+
i := 1
1432+
for {
1433+
key := fmt.Sprintf("FernetKeys%d", i)
1434+
i++
1435+
nextKey := fmt.Sprintf("FernetKeys%d", i)
1436+
_, exists = secret.Data[nextKey]
1437+
if !exists {
1438+
break
1439+
}
1440+
secret.Data[key] = secret.Data[nextKey]
1441+
delete(secret.Data, nextKey)
1442+
}
1443+
}
13971444

1398-
for i := 0; i < numberKeys; i++ {
1399-
key := fmt.Sprintf("FernetKeys%d", i)
1400-
v, exists := secret.Data[key]
1401-
if exists {
1402-
fernetKeys[key] = string(v[:])
1403-
} else {
1404-
fernetKeys[key] = keystone.GenerateFernetKey()
1445+
//
1446+
// Add extra keys when FernetMaxActiveKeys changes
1447+
//
1448+
lastKey := fmt.Sprintf("FernetKeys%d", numberKeys-1)
1449+
for {
1450+
_, exists := secret.Data[lastKey]
1451+
if exists {
1452+
break
1453+
}
1454+
changedKeys = true
1455+
i := 1
1456+
nextKeyValue := []byte(keystone.GenerateFernetKey())
1457+
for {
1458+
key := fmt.Sprintf("FernetKeys%d", i)
1459+
i++
1460+
keyValue, exists := secret.Data[key]
1461+
secret.Data[key] = nextKeyValue
1462+
nextKeyValue = keyValue
1463+
if !exists {
1464+
break
1465+
}
1466+
}
14051467
}
1406-
}
14071468

1408-
tmpl := []util.Template{
1409-
{
1410-
Name: secretName,
1411-
Namespace: instance.Namespace,
1412-
Type: util.TemplateTypeNone,
1413-
CustomData: fernetKeys,
1414-
Labels: labels,
1415-
},
1416-
}
1469+
if !changedKeys {
1470+
return nil
1471+
}
14171472

1418-
err = oko_secret.EnsureSecrets(ctx, helper, instance, tmpl, envVars)
1419-
if err != nil {
1420-
return err
1473+
fernetKeys := make(map[string]string, len(secret.Data))
1474+
for k, v := range secret.Data {
1475+
fernetKeys[k] = string(v[:])
1476+
}
1477+
1478+
tmpl := []util.Template{
1479+
{
1480+
Name: secretName,
1481+
Namespace: instance.Namespace,
1482+
Type: util.TemplateTypeNone,
1483+
CustomData: fernetKeys,
1484+
Labels: labels,
1485+
},
1486+
}
1487+
1488+
err = oko_secret.EnsureSecrets(ctx, helper, instance, tmpl, envVars)
1489+
if err != nil {
1490+
return err
1491+
}
14211492
}
14221493

14231494
return nil

0 commit comments

Comments
 (0)