Fix keystone-startup.sh - remove Fernet key age check

Currently we check the age of the primary Fernet key on Keystone
startup, and fail if it is older than the rotation interval. While this
may seem sensible, there are various reasons why the key may be older
than this:

* if the rotation interval is not a factor of the number of seconds in a
  week, the rotation schedule will be lumpy, with the last rotation
  being up to twice the nominal rotation interval
* if a keystone host is unavailable at its scheduled rotation time,
  rotation will not happen. This may happen multiple times

We could do several things to avoid this issue:

1. remove the check on the age of the key
2. multiply the rotation interval by some factor to determine the
   allowed key age

This change goes for the more simple option 1. It also cleans up some
terminology in the keystone-startup.sh script.

Closes-Bug: #1895723

Change-Id: I2c35f59ae9449cb1646e402e0a9f28ad61f918a8
This commit is contained in:
Mark Goddard 2020-10-22 09:18:32 +01:00
parent ffef1f2953
commit ba8c27f554
2 changed files with 15 additions and 18 deletions

View File

@ -4,32 +4,21 @@
set -o errexit
set -o pipefail
TOKEN_DIR="/etc/keystone/fernet-keys"
FERNET_KEY_DIR="/etc/keystone/fernet-keys"
# Ensure tokens are populated, check for 0 (staging) key
# Ensure Fernet keys are populated, check for 0 (staging) key
n=0
while [ ! -f "${TOKEN_DIR}/0" ]; do
while [ ! -f "${FERNET_KEY_DIR}/0" ]; do
if [ $n -lt 36 ]; then
n=$(( n + 1 ))
echo "ERROR: Fernet tokens have not been populated, rechecking in 5 seconds"
echo "DEBUG: ${TOKEN_DIR} contents:"
ls -l ${TOKEN_DIR}
echo "ERROR: Fernet keys have not been populated, rechecking in 5 seconds"
echo "DEBUG: ${FERNET_KEY_DIR} contents:"
ls -l ${FERNET_KEY_DIR}
sleep 5
else
echo "CRITICAL: Waited for 10 minutes - failing"
echo "CRITICAL: Waited for 3 minutes - failing"
exit 1
fi
done
# Ensure tokens are not stale
# Get primary token (file with highest number)
TOKEN_PRIMARY=$(ls -1 ${TOKEN_DIR} | sort -hr | head -n 1)
# Check it's age in seconds
TOKEN_AGE=$(($(date +%s) - $(date +%s -r "${TOKEN_DIR}/${TOKEN_PRIMARY}")))
# Compare if it's older than fernet_key_rotation_interval and fail if it's stale
if [ "${TOKEN_AGE}" -gt "{{ fernet_key_rotation_interval }}" ]; then
echo "ERROR: Primary token ${TOKEN_PRIMARY} is stale."
exit 1
fi
exec /usr/sbin/{{ keystone_cmd }} $@

View File

@ -0,0 +1,8 @@
---
fixes:
- |
Fixes an issue with Keystone startup when Fernet key rotation does not
occur within the configured interval. This may happen due to one of the
Keystone hosts being down at the scheduled time of rotation, or due to
uneven intervals between cron jobs. `LP#1895723
<https://bugs.launchpad.net/kolla-ansible/+bug/1895723>`__