Secret Key Management

Datenbank?

Wenn Sie Sessions und User Consent in einer IdP-seitigen Datenbank ablegen, können Sie diesen Schritt überspringen.

In der Standardeinstellung speichert der Shibboleth IdP Informationen zu Sitzungen und User Consent clientseitig im Browser, in Cookies und ggf. HTML Local Storage (siehe Shibboleth Wiki). Diese Daten werden durch Verschlüsselung geschützt. Die Keys, die dabei zum Einsatz kommen, sollten regelmäßig getauscht werden, wenn Sie die oben genannten Informationen nicht serverseitig speichern.

secrets.properties

Die folgende Version des Skriptes geht davon aus, dass Sie sensible IdP-interne Informationen in der Datei credentials/secrets.properties liegen, wie es im IdP 4.x als Standard eingeführt wurde (Doku).

Legen Sie Beispiel-Skript herunter und legen es nach /opt/shibboleth-idp/bin/update-sealer.sh (Quelle: Shibboleth Wiki).

#!/bin/bash
 
set -e
set -u
 
# Default IDP_HOME if not already set
if [ ! -d "${IDP_HOME:=/opt/shibboleth-idp}" ]
then
    echo "ERROR: Directory does not exist: ${IDP_HOME}" >&2
    exit 1
fi
 
function get_config {
	# Key to lookup (escape . for regex lookup)
	local KEY=${1:?"No key provided to look up value"}
	# Passed default value
	local DEFAULT="${2:-}"
	# Lookup key, strip spaces, replace idp.home with IDP_HOME value
	local RESULT
	if [[ ${KEY} == "idp.sealer.storePassword" ]]; then
		RESULT=$(sed -rn '/^'"${KEY//./\\.}"'\s*=/ { s|^[^=]*=(.*)\s*$|\1|; s|%\{idp\.home\}|'"${IDP_HOME}"'|g; p}' ${IDP_HOME}/credentials/secrets.properties | sed 's/^\ //')
	else
		RESULT=$(sed -rn '/^'"${KEY//./\\.}"'\s*=/ { s|^[^=]*=(.*)\s*$|\1|; s|%\{idp\.home\}|'"${IDP_HOME}"'|g; p}' ${IDP_HOME}/conf/idp.properties | sed 's/^\ //')
	fi
	# Set if no result with default - exit if no default
	echo "${RESULT:-${DEFAULT:?"No value in config and no default defined for: '${KEY}'"}}"
}
 
# Get config values
## Official config items ##
storefile=$(get_config idp.sealer.storeResource)
versionfile=$(get_config idp.sealer.versionResource)
storepass=$(get_config idp.sealer.storePassword)
alias=$(get_config idp.sealer.aliasBase secret)
## Extended config items ##
count=$(get_config idp.sealer._count 30)
# default cannot be empty - so "self" is the default (self is skipped for syncing)
sync_hosts=$(get_config idp.sealer._sync_hosts ${HOSTNAME})
 
# Run the keygen utility
${0%/*}/runclass.sh net.shibboleth.utilities.java.support.security.BasicKeystoreKeyStrategyTool \
    --storefile "${storefile}" \
    --storepass "${storepass}" \
    --versionfile "${versionfile}" \
    --alias "${alias}" \
    --count "${count}"
 
# Display current version
echo "INFO: $(tac "${versionfile}" | tr "\n" " ")" >&2
 
for EACH in ${sync_hosts}
do
    if [ "${HOSTNAME}" == "${EACH}" ]
    then
        echo "INFO: Host '${EACH}' is myself - skipping" >&2
    elif ! ping -q -c 1 -W 3 ${EACH} >/dev/null 2>&1
    then
        echo "ERROR: Host '${EACH}' not reachable - skipping" >&2
    else
        # run scp in the background
        scp "${storefile}" "${versionfile}" "${EACH}:${IDP_HOME}/credentials/" &
    fi
done

Machen Sie das Skript ausführbar:

root@idp:~# chmod 755 /opt/shibboleth-idp/bin/update-sealer.sh

Dieses Skript liest die Sealer-relevanten Einstellungen aus ./conf/idp-properties und erzeugt damit neue Schlüsselwerte. Dazu legen Sie am besten einen täglichen Cronjob an:

/etc/cron.d/shibboleth-idp
01 01 * * * root /opt/shibboleth-idp/bin/update-sealer.sh >/dev/null

Falls Sie bei der IdP-Installation am Anfang ein zu einfaches Sealer-Passwort vergeben haben, können Sie dieses problemlos ändern: Löschen Sie die Dateien ./credentials/sealer.* und vergeben Sie in ./conf/idp.properties neue Passwörter (idp.sealer.storePassword und idp.sealer.keyPassword). Danach rufen Sie einfach obigen Cronjob manuell auf. Das Skript erstellt die fehlenden Dateien unter Verwendung der neuen Passwörter neu. Achtung: Sonderzeichen können in Javas .properties-Dateien zu Problemen führen. Daher raten wir davon ab, bei den Passwörtern Sonderzeichen zu verwenden.

  • Zuletzt geändert: vor 6 Tagen