Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(fips-crypto-policies): Make c-p follow FIPS mode automatically #2670

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions modules.d/01fips-crypto-policies/fips-crypto-policies.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/usr/bin/sh

type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh

if ! fipsmode=$(getarg fips) || [ "$fipsmode" = "0" ] || [ -z "$fipsmode" ]; then
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should the script proceed on anything but 1 there?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I copied and modified this from the existing 01fips module, so it's consistent with that. I don't believe we should introduce a difference between those two.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't argue with that

# Do nothing if not in FIPS mode
exit 0
fi

policyfile=/etc/crypto-policies/config
fipspolicyfile=/usr/share/crypto-policies/default-fips-config
backends=/etc/crypto-policies/back-ends
fipsbackends=/usr/share/crypto-policies/back-ends/FIPS

# When in FIPS mode, check the active crypto policy by reading the
# $root/etc/crypto-policies/config file. If it is not "FIPS", or does not start
# with "FIPS:", automatically switch to the FIPS policy by creating
# bind-mounts.

if ! [ -r "${NEWROOT}${policyfile}" ]; then
# No crypto-policies configured, possibly not a system that uses
# crypto-policies?
exit 0
fi

if ! [ -f "${NEWROOT}${fipspolicyfile}" ]; then
# crypto-policies is too old to deal with automatic bind-mounting of the
# FIPS policy over the normal policy, do not attempt to do the bind-mount.
exit 0
fi

policy=$(cat "${NEWROOT}${policyfile}")

# Remove the largest suffix pattern matching ":*" from the string (i.e., the
# complete list of active policy modules), then check for FIPS. This is part of
# POSIX sh (https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02).
if [ "${policy%%:*}" = "FIPS" ]; then
neverpanic marked this conversation as resolved.
Show resolved Hide resolved
exit 0
fi

# Current crypto policy is not FIPS or FIPS-based, but the system is in FIPS
# mode; this is an inconsistent configuration. Automatically bind-mount a FIPS
# configuration over this.
if ! mount -o bind,ro "${NEWROOT}${fipsbackends}" "${NEWROOT}${backends}"; then
warn "Failed to bind-mount FIPS policy over ${backends} (the system is in FIPS mode, but the crypto-policy is not)."
# If this bind-mount failed, don't attempt to do the other one to avoid
# a system that seems to be in FIPS crypto-policy but actually is not.
exit 0
fi

mount -o bind,ro "${NEWROOT}${fipspolicyfile}" "${NEWROOT}${policyfile}" \
|| warn "Failed to bind-mount FIPS crypto-policy state file over ${policyfile} (the system is in FIPS mode, but the crypto-policy is not)."
27 changes: 27 additions & 0 deletions modules.d/01fips-crypto-policies/module-setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/usr/bin/bash

# called by dracut
check() {
# only enable on systems that use crypto-policies
[ -d "$dracutsysrootdir/etc/crypto-policies" ] && return 0

# include when something else depends on it or it is explicitly requested
return 255
}

# called by dracut
depends() {
return 0
}

# called by dracut
installkernel() {
return 0
}

# called by dracut
install() {
inst_hook pre-pivot 01 "$moddir/fips-crypto-policies.sh"

inst_multiple mount
}