-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Encryption Stability and On-Disk Format Fixes
The on-disk format for encrypted datasets protects not only the encrypted and authenticated blocks themselves, but also the order and interpretation of these blocks. In order to make this work while maintaining the ability to do raw sends, the indirect bps maintain a secure checksum of all the MACs in the block below it along with a few other fields that determine how the data is interpreted. Unfortunately, the current on-disk format erroneously includes some fields which are not portable and thus cannot support raw sends. It is not possible to easily work around this issue due to a separate and much smaller bug which causes indirect blocks for encrypted dnodes to not be compressed, which conflicts with the previous bug. In addition, the current code generates incompatible on-disk formats on big endian and little endian systems due to an issue with how block pointers are authenticated. Finally, raw send streams do not currently include dn_maxblkid when sending both the metadnode and normal dnodes which are needed in order to ensure that we are correctly maintaining the portable objset MAC. This patch zero's out the offending fields when computing the bp MAC and ensures that these MACs are always calculated in little endian order (regardless of the host system's byte order). This patch also registers an errata for the old on-disk format, which we detect by adding a "version" field to newly created DSL Crypto Keys. We allow datasets without a version (version 0) to only be mounted for read so that they can easily be migrated. We also now include dn_maxblkid in raw send streams to ensure the MAC can be maintained correctly. This patch also contains minor bug fixes and cleanups. Reviewed-by: Jorgen Lundman <lundman@lundman.net> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Signed-off-by: Tom Caputi <tcaputi@datto.com> Closes #6845 Closes #6864 Closes #7052
- Loading branch information
1 parent
4c46b99
commit ae76f45
Showing
31 changed files
with
787 additions
and
187 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#!/bin/bash | ||
|
||
# This script only gets executed on systemd systems, see mount-zfs.sh for non-systemd systems | ||
|
||
# import the libs now that we know the pool imported | ||
[ -f /lib/dracut-lib.sh ] && dracutlib=/lib/dracut-lib.sh | ||
[ -f /usr/lib/dracut/modules.d/99base/dracut-lib.sh ] && dracutlib=/usr/lib/dracut/modules.d/99base/dracut-lib.sh | ||
. "$dracutlib" | ||
|
||
# load the kernel command line vars | ||
[ -z "$root" ] && root=$(getarg root=) | ||
# If root is not ZFS= or zfs: or rootfstype is not zfs then we are not supposed to handle it. | ||
[ "${root##zfs:}" = "${root}" -a "${root##ZFS=}" = "${root}" -a "$rootfstype" != "zfs" ] && exit 0 | ||
|
||
# There is a race between the zpool import and the pre-mount hooks, so we wait for a pool to be imported | ||
while true; do | ||
zpool list -H | grep -q -v '^$' && break | ||
[[ $(systemctl is-failed zfs-import-cache.service) == 'failed' ]] && exit 1 | ||
[[ $(systemctl is-failed zfs-import-scan.service) == 'failed' ]] && exit 1 | ||
sleep 0.1s | ||
done | ||
|
||
# run this after import as zfs-import-cache/scan service is confirmed good | ||
if [[ "${root}" = "zfs:AUTO" ]] ; then | ||
root=$(zpool list -H -o bootfs | awk '$1 != "-" {print; exit}') | ||
else | ||
root="${root##zfs:}" | ||
root="${root##ZFS=}" | ||
fi | ||
|
||
# if pool encryption is active and the zfs command understands '-o encryption' | ||
if [[ $(zpool list -H -o feature@encryption $(echo "${root}" | awk -F\/ '{print $1}')) == 'active' ]]; then | ||
# check if root dataset has encryption enabled | ||
if $(zfs list -H -o encryption "${root}" | grep -q -v off); then | ||
# figure out where the root dataset has its key, the keylocation should not be none | ||
while true; do | ||
if [[ $(zfs list -H -o keylocation "${root}") == 'none' ]]; then | ||
root=$(echo -n "${root}" | awk 'BEGIN{FS=OFS="/"}{NF--; print}') | ||
[[ "${root}" == '' ]] && exit 1 | ||
else | ||
break | ||
fi | ||
done | ||
# decrypt them | ||
TRY_COUNT=5 | ||
while [ $TRY_COUNT != 0 ]; do | ||
zfs load-key "$root" <<< $(systemd-ask-password "Encrypted ZFS password for ${root}: ") | ||
[[ $? == 0 ]] && break | ||
((TRY_COUNT-=1)) | ||
done | ||
fi | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.