Нотатка для себе.
Необхідно створити систему котра використовує шифрування дисків, zfs кореневу файлову систему, і для шифрування використовуються ключі що зберігаються на віддаленому сервері.
Моя система має 3 диски, один диск (Flash/SSD) завантажувальний з файловою системою ZFS (ZROOT). Та 2 диски для шифрованого zfs пулу котрі повинні замінити собою перший диск для запису
На перший диск встановлено було операційну систему FreeBSD 11.1 майстром встановлення з вибором ZFS Boot.
Надалі в робочій системі вже виконувалися сценарії по:
Створення zfs pool на основі шифрованих дисків за допомогою geli (ключ без паролю).
zfs pool mirror з двох дисків /dev/ada0.eli та /dev/ada1.eli.
Потім копіюється інформація з першого диску на створений пул.
#!/bin/sh
kldload -n geom_eli
mkdir ./keys
dd if=/dev/random of=./keys/ada0.key bs=4096 count=1
dd if=/dev/random of=./keys/ada1.key bs=4096 count=1
zfspool=tank
zpool destroy ${zfspool}
rm -r /${zfspool}
geli detach /dev/ada0.eli
geli detach /dev/ada1.eli
gpart destroy -F /dev/ada0
gpart destroy -F /dev/ada1
geli init -P -l 256 -s 4096 -K ./keys/ada0.key /dev/ada0
geli init -P -l 256 -s 4096 -K ./keys/ada1.key /dev/ada1
geli attach -p -k ./keys/ada0.key /dev/ada0
geli attach -p -k ./keys/ada1.key /dev/ada1
ls /dev/ada*
zpool status
snapshot_string=DO_NOT_DELETE_
timestamp=$(/bin/date '+%Y%m%d%H%M%S')
source_pool=zroot
destination_pool=${zfspool}
new_snap="$source_pool"@"$snapshot_string""$timestamp"
mountpt=${zfspool}
zpool create -R /${zfspool} ${zfspool} mirror /dev/ada0.eli /dev/ada1.eli
zfs set compress=lz4 ${zfspool}
zfs set mountpoint=none ${zfspool}
zpool status
zfs list
# Create first recursive snapshot of the whole pool.
echo "zfs snapshot -r "${new_snap}" "
zfs snapshot -r "${new_snap}"
zfs list -t snapshot
echo coping data from zroot
echo "--------"
zfs list -t snapshot
# Initial send:
echo "zfs send -vR ${new_snap} | zfs recv -vFu ${zfspool}/fromz"
zfs send -vR ${new_snap} | zfs recv -vFu ${zfspool}/fromz
echo "zfs destroy ${new_snap}"
zfs destroy -r ${new_snap}
zfs set mountpoint=/ROOTO ${zfspool}/fromz/ROOT/default
zfs set canmount=on ${zfspool}/fromz/ROOT/default
zfs set canmount=on ${zfspool}/fromz/usr
zfs set canmount=on ${zfspool}/fromz/var
zfs create -o mountpoint=/root ${zfspool}/fromz/root
zfs mount -a
#set mountpoint=none
MLIST="/tmp /usr /usr/home /usr/ports /usr/src /var /var/audit /var/crash /var/log /var/mail /var/tmp"
MDLIST="${MLIST} /root "
for i in ${MDLIST}
do
cmdd="zfs set mountpoint=none ${zfspool}/fromz${i}"
echo ${cmdd}
`${cmdd}`
done
cmdd="zfs mountpoint=none ${zfspool}/fromz"
echo ${cmdd}
`${cmdd}`
zfspool=tank
MPLIST="usr var root"
DESTDIR=/${zfspool}/
SRCDIR=/${zfspool}/ROOTO/
for i in ${MPLIST}
do
echo "--------${SRCDIR}${i}----${DESTDIR}${i}"
command="rsync -ra ${SRCDIR}${i} ${DESTDIR}"
echo ${command}
`${command}`
done
zfs umount ${zfspool}/fromz/ROOT/default
zfs destroy -r ${zfspool}/fromz/ROOT
rmdir /${zfspool}/ROOTO
zpool export ${zfspool}
echo "finish"
zfs get -s local all
На далі монтування при завантаженні системи.
/etc/mntscript/get_keys_and_mount.sh:
#!/bin/sh
REMOTESTORE="remoteuser@remotehost:~/remote_key_path/*"
REMOTESTORE_IDFILE="/root/.ssh/id_rsa"
KDIR="/root/keys"
ABORT=0
MAXCOUNTS=5
NEXIT=0
rootpool=zroot
zfspool=tank
zfspool_mountpoint=/
MPLIST="/tmp /usr/home /usr/ports /usr/src /var/audit /var/crash /var/log /var/mail /var/tmp"
U_MPLIST="${MPLIST} /usr /var"
M_MPLIST="/usr /var ${MPLIST}"
# *** create and mount TMP RAM DISK
/sbin/mdmfs -s 1m md1 ${KDIR}
# *** load remote keys via scp
while [ ${ABORT} -eq 0 ]; do
echo "LOADING KEYS..."
umask 027; /usr/bin/scp -q -o ConnectTimeout=30 -i ${REMOTESTORE_IDFILE} ${REMOTESTORE} ${KDIR}
if [ -s ${KDIR}/ada0.key ] && [ -s ${KDIR}/ada1.key ]; then
echo "KEYS LOADED"
ABORT=1
else
echo "Keys not loaded. Delays 5 sec for next retry #${MAXCOUNTS}"
sleep 5
MAXCOUNTS=`expr ${MAXCOUNTS} - 1`
if [ ${MAXCOUNTS} -lt 0 ]; then
echo "LIMIT OF CONECTIONS IS OUT"
ABORT=1
NEXIT=1
fi
fi
done
#check if need exit in case missing keys
if [ ${NEXIT} -eq 0 ]; then
#use loaded keys
#check mounted ZFS POOLS
/sbin/zpool status -x ${zfspool}
if [ $? -eq 0 ]; then
echo Already imported pool ${zfspool}, try export pool
/sbin/zpool export ${zfspool}
fi
#load ENCRIPTING MODULE
kldload -n geom_eli
for i in 0 1
do
ELIDISK="ada${i}"
/sbin/geli status ${ELIDISK}.eli
if [ $? -eq 0 ]; then
/sbin/geli detach ${ELIDISK}.eli
fi
/sbin/geli attach -p -k ${KDIR}/${ELIDISK}.key /dev/${ELIDISK}
done
# release keys
rm ${KDIR}/*.key
# release RAM disk
umount -f ${KDIR}
/sbin/mdconfig -du md1
# mount ZFS POOLS
/sbin/zpool status -x ${zfspool}
if [ $? -eq 0 ]; then
echo Already imported pool ${zfspool}, try export pool
/sbin/zpool export ${zfspool}
fi
/sbin/zpool import -R ${zfspool_mountpoint} ${zfspool}
#check operation that zpool imported was ok?
if [ $? -eq 0 ]; then
#check that need ummount root system pool
if [ "${zfspool_mountpoint}" = "/" ];then
#try unmount root mount points
for i in ${U_MPLIST}
do
cmdd="/sbin/zfs umount -f ${rootpool}${i}"
# echo s ${cmdd}
`${cmdd}`
done
fi
#try mount pool in legacy mode, with set mountpoint propery to none
#add to mounting list more folders
MDLIST="${M_MPLIST} /root"
for i in ${MDLIST}
do
cmdd="/sbin/mount -t zfs ${zfspool}/fromz${i} ${zfspool_mountpoint}${i}"
# echo s ${cmdd}
`${cmdd}`
done
fi
echo "Finish mount lgeli"
#if check need exit
else
#exit w/o keys
# release RAM disk
/sbin/umount -f ${KDIR}
/sbin/mdconfig -du md1
echo "Finish w/o mount lgeli"
fi
/etc/rc.conf/lgeli
#!/bin/sh # PROVIDE: lgeli # REQUIRE: NETWORKING
# BEFORE: syslogd
# KEYWORD: nojail
. /etc/rc.subr
name="lgeli"
start_cmd="lgeli_start"
stop_cmd="lgeli_stop"
rcvar="lgeli_enable"
lgeli_start()
{
/etc/mntscript/get_keys_and_mount.sh
}
lgeli_stop()
{
zfspool=tank
/sbin/zpool export ${zfspool}
geli detach /dev/ada0.eli
geli detach /dev/ada1.eli
}
load_rc_config $name
run_rc_command "$1"
Не претендую на манул для дії кого не будь, це результат експерименту занотований щоб не загубити і можливо отримати можливі рекомендації від інших користувачів.
Немає коментарів:
Дописати коментар