Skip to content

Commit 9444571

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 01272cf commit 9444571

File tree

1 file changed

+95
-27
lines changed

1 file changed

+95
-27
lines changed

controllers/keystoneapi_controller.go

Lines changed: 95 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,42 +1382,110 @@ func (r *KeystoneAPIReconciler) ensureFernetKeys(
13821382

13831383
if err != nil && !k8s_errors.IsNotFound(err) {
13841384
return err
1385+
} else if k8s_errors.IsNotFound(err) {
1386+
fernetKeys := map[string]string{
1387+
"CredentialKeys0": keystone.GenerateFernetKey(),
1388+
"CredentialKeys1": keystone.GenerateFernetKey(),
1389+
}
1390+
var numberKeys int
1391+
fmt.Sscan(instance.Spec.FernetMaxActiveKeys, &numberKeys)
1392+
for i := 0; i < numberKeys; i++ {
1393+
fernetKeys[fmt.Sprintf("FernetKeys%d", i)] = keystone.GenerateFernetKey()
1394+
}
1395+
1396+
tmpl := []util.Template{
1397+
{
1398+
Name: secretName,
1399+
Namespace: instance.Namespace,
1400+
Type: util.TemplateTypeNone,
1401+
CustomData: fernetKeys,
1402+
Labels: labels,
1403+
},
1404+
}
1405+
err := oko_secret.EnsureSecrets(ctx, helper, instance, tmpl, envVars)
1406+
if err != nil {
1407+
return err
1408+
}
13851409
} else {
13861410
// add hash to envVars
13871411
(*envVars)[secret.Name] = env.SetValue(hash)
1388-
}
13891412

1390-
fernetKeys := map[string]string{
1391-
"CredentialKeys0": keystone.GenerateFernetKey(),
1392-
"CredentialKeys1": keystone.GenerateFernetKey(),
1393-
}
1413+
var numberKeys int
1414+
fmt.Sscan(instance.Spec.FernetMaxActiveKeys, &numberKeys)
13941415

1395-
var numberKeys int
1396-
fmt.Sscan(instance.Spec.FernetMaxActiveKeys, &numberKeys)
1416+
changed_keys := false
13971417

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()
1418+
//
1419+
// Remove extra keys when FernetMaxActiveKeys changes
1420+
//
1421+
extra_key := fmt.Sprintf("FernetKeys%d", numberKeys)
1422+
for {
1423+
_, exists := secret.Data[extra_key]
1424+
if !exists {
1425+
break
1426+
}
1427+
changed_keys = true
1428+
i := 1
1429+
for {
1430+
key := fmt.Sprintf("FernetKeys%d", i)
1431+
i += 1
1432+
next_key := fmt.Sprintf("FernetKeys%d", i)
1433+
_, exists = secret.Data[next_key]
1434+
if !exists {
1435+
break
1436+
}
1437+
secret.Data[key] = secret.Data[next_key]
1438+
delete(secret.Data, next_key)
1439+
}
14051440
}
1406-
}
14071441

1408-
tmpl := []util.Template{
1409-
{
1410-
Name: secretName,
1411-
Namespace: instance.Namespace,
1412-
Type: util.TemplateTypeNone,
1413-
CustomData: fernetKeys,
1414-
Labels: labels,
1415-
},
1416-
}
1442+
//
1443+
// Add extra keys when FernetMaxActiveKeys changes
1444+
//
1445+
last_key := fmt.Sprintf("FernetKeys%d", numberKeys-1)
1446+
for {
1447+
_, exists := secret.Data[last_key]
1448+
if exists {
1449+
break
1450+
}
1451+
changed_keys = true
1452+
i := 1
1453+
next_key_value := []byte(keystone.GenerateFernetKey())
1454+
for {
1455+
key := fmt.Sprintf("FernetKeys%d", i)
1456+
i += 1
1457+
key_value, exists := secret.Data[key]
1458+
secret.Data[key] = next_key_value
1459+
next_key_value = key_value
1460+
if !exists {
1461+
break
1462+
}
1463+
}
1464+
}
14171465

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

14231491
return nil

0 commit comments

Comments
 (0)