KAL1 LINUX 官方文档之arm上的ka1i---树莓派全盘加密
Raspberry Pi-全盘加密
以下文档尚不可用。在以下链接中关注状态:https://gitlab.com/ka1ilinux/documentation/ka1i-docs/issues/49
译者注:以下文章有操作有问题,因此暂时不再细翻
去年,我们做了一篇博文《安全ka1i Pi 2018》,涵盖了如何加密ka1i RPi安装。从那时起,出现了一些进展。一个重要的注意是,unixabg已经创建了一个脚本来自动化这个过程。我们将在通过手动方法后触及了更多,然而我们仍然建议阅读正在做的事情。
回顾一下,我们要完成的工作是创建一个独立的“遗留”设备,一旦发现该设备,就很难弄清楚自己在做什么。因此,我们将LUKS全盘加密与LUKS Nuke功能结合使用。如果您有Raspberry Pi 3 Model B +或其他型号或类似设备,请按照以下说明设置您自己的安全系统。此更新过程基于我们以前的文档,并根据一些社区建议进行了更新。
过程概述
在深入研究将要完成的技术之前,让我们快速看一下设置Raspberry Pi 3 Model B +(以下称为“ RPi”)的目标:
- 创建普通的ka1i Linux RPi安装
- 通过远程磁盘解锁,为加密启动系统做好准备。
- 创建一个配置有Dropbear和SSH密钥的initramfs,以允许进行解锁
- 备份现有数据
- 配置加密分区
- 恢复我们的数据
这看起来可能很多,但确实非常简单。完成后,我们将剩下一个RPi,它将启动,从DHCP获取IP,并允许我们通过SSH通过Dropbear连接以提供LUKS密钥。这使我们可以无头文件运行RPi,同时仍保持数据安全。然后,在处理完之后,我们可以检索它。
准备系统
我们首先将下载最新的ka1i RPi3映像并对其进行映像。如果要继续,请确保知道要将文件映像到的位置。
wget https://images.offensive-security.com/arm-images/ka1i-linux-2019.4-rpi3-nexmon.img.xz
xzcat ka1i-linux-2019.4-rpi3-nexmon.img.xz | dd of=/dev/sdb bs=4M
接下来,我们将为chroot做好准备。让我们创建我们要安装SD卡的位置,然后再安装它。
mkdir -p /mnt/chroot/boot
mount /dev/sdb2 /mnt/chroot/
mount /dev/sdb1 /mnt/chroot/boot/
mount -t proc none /mnt/chroot/proc
mount -t sysfs none /mnt/chroot/sys
mount -o bind /dev /mnt/chroot/dev
mount -o bind /dev/pts /mnt/chroot/dev/pts
apt install -y qemu-user-static
cp /usr/bin/qemu-arm-static /mnt/chroot/usr/bin/
做法
现在我们的系统已经建立,我们可以使用chroot来建立用于加密的RPi映像。让我们首先chroot并安装一些必要的软件包。
LANG=C chroot /mnt/chroot/
sudo apt update
sudo apt install -y cryptsetup lvm2 busybox dropbear
现在,我们将列出五个内核版本,根据所使用的RPi,您需要选择某些版本。第一个版本Re4son +适用于armv6设备IE。RPi1,RPi0或RPi0w。接下来的两个,Re4son-v7 +和Re4son-v8 +,分别是armv7设备的32位和64位版本。最后两个将是合并到armv7 32位和64位版本中的版本,l
名称中的表示它们将用于RPi4。请记住,内核版本可能会更改,但是名称不会更改。
ls -l /lib/modules/ | awk -F" " '{print $9}'
4.19.81-Re4son+
4.19.81-Re4son-v7+
4.19.81-Re4son-v7l+
4.19.81-Re4son-v8+
4.19.81-Re4son-v8l+
echo initramfs initramfs.gz followkernel >> /boot/config.txt
接下来,我们将编辑/boot/cmdline.txt
和更改根路径。我们将希望将根路径更改为/dev/mapper/crypt
,然后在此cryptdevice=/dev/mmcblk0p2:crypt
之后添加。最终结果应如下所示:
root@ka1i:~# cat /boot/cmdline.txt
dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mapper/crypt cryptdevice=/dev/mmcblk0p2:crypt rootfstype=ext4 rootwait rootflags=noload net.ifnames=0
现在,我们将fstab更新为具有正确的根文件系统路径。
root@ka1i:~# cat /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mapper/crypt / ext4 defaults,noatime 0 1
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
接下来,我们将创建crypttab文件。
echo -e 'crypt\t/dev/mmcblk0p2\tnone\tluks' > /etc/crypttab
现在,我们进行一些文件系统欺骗。我们创建了一个伪造的LUKS文件系统,该系统强制包含cryptsetup。
dd if=/dev/zero of=/tmp/fakeroot.img bs=4M count=20
exit
cryptsetup luksFormat /mnt/chroot/tmp/fakeroot.img
cryptsetup luksOpen /mnt/chroot/tmp/fakeroot.img crypt
mkfs.ext4 /mnt/chroot/dev/mapper/crypt
之后,我们需要复制或生成一个ssh密钥,以将其添加到dropbear的authorized_keys文件中。
cp id_rsa.pub /mnt/chroot/
LANG=C chroot /mnt/chroot/
接下来,我们必须将以下内容添加到/ etc / dropbear-initramfs / authorized_keys中:
root@ka1i:~# nano /etc/dropbear-initramfs/authorized_keys
root@ka1i:~# cat /etc/dropbear-initramfs/authorized_keys
command="export PATH='/sbin:/bin/:/usr/sbin:/usr/bin'; /scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3` && exit"
这样做之后,我们可以附加复制过来的ssh密钥,然后将其从卡中删除。
cat id_rsa.pub >> /etc/dropbear-initramfs/authorized_keys && rm id_rsa.pub
完成后,/etc/dropbear-initramfs/authorized_keys
应如下所示(注意:您可能需要在命令后删除返回值,以便ssh键紧随其后):
root@ka1i:~# cat /etc/dropbear-initramfs/authorized_keys
command="export PATH='/sbin:/bin/:/usr/sbin:/usr/bin'; /scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3` && exit" ssh-rsa key user@sys
现在,我们需要进行编辑/usr/share/initramfs-tools/scripts/init-premount/dropbear
以添加一个睡眠计时器,这允许在 dropbear 之前启动网络。
[ "$BOOT" != nfs ] || configure_networking
sleep 5
run_dropbear &
echo $! >/run/dropbear.pid
现在让我们启用cryptsetup。
echo CRYPTSETUP=y > /etc/cryptsetup-initramfs/conf-hook
root@ka1i:~# cat /etc/cryptsetup-initramfs/conf-hook
CRYPTSETUP=y
现在我们需要创建initramfs。这是以前的内核版本开始起作用的地方。
mkinitramfs -o /boot/initramfs.gz 4.19.93-Re4son-v7+
现在,我们要确保我们牢固地创建了initramfs。如果没有结果,则出了点问题。
lsinitramfs /boot/initramfs.gz | grep cryptsetup
lsinitramfs /boot/initramfs.gz | grep authorized
在备份之前,我们必须确保禁用rpiwiggle,否则它将删除文件系统。
systemctl disable rpiwiggle
现在我们可以确保所有更改都已写入,然后可以对磁盘进行加密。
sync && sync
exit
umount /mnt/chroot/boot
umount /mnt/chroot/sys
umount /mnt/chroot/proc
umount /mnt/chroot/dev/pts
umount /mnt/chroot/dev
mkdir -p /mnt/{backup,encrypted}
rsync -avh /mnt/chroot/* /mnt/backup/
cryptsetup luksClose crypt
umount /mnt/chroot
echo -e "d\n2\nw" | fdisk /dev/sdb
partprobe
sleep 5
echo -e "n\np\n2\n\n\nw" | fdisk /dev/sdb
partprobe
sync && sync
cryptsetup -v -y --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sdb2
cryptsetup -v luksOpen /dev/sdb2 crypt
mkfs.ext4 /dev/mapper/crypt
mount /dev/mapper/crypt /mnt/encrypted/
rsync -avh /mnt/backup/* /mnt/encrypted/
sync
我们要做的最后一步是重新制作initramfs文件,这一步很重要,因为如果不这样做,它将无法正确启动。
mount /dev/sdb1 /mnt/encrypted/boot/
mount -t proc none /mnt/encrypted/proc
mount -t sysfs none /mnt/encrypted/sys
mount -o bind /dev /mnt/encrypted/dev
mount -o bind /dev/pts /mnt/encrypted/dev/pts
LANG=C chroot /mnt/encrypted
mkinitramfs -o /boot/initramfs.gz 4.19.93-Re4son-v7+
现在我们可以卸载并关闭所有内容。
exit
umount /mnt/encrypted/boot
umount /mnt/encrypted/sys
umount /mnt/encrypted/proc
umount /mnt/encrypted/dev/pts
umount /mnt/encrypted/dev
umount /mnt/encrypted
cryptsetup luksClose /dev/mapper/crypt
LUKS NUKE
如果用户还需要LUKS NUKE,那么他们所需要做的就是运行以下命令。
dpkg-reconfigure cryptsetup-nuke-password
自动化?
现在我们如何使它自动化?多亏了Richard Nelson(unixabg),任何想要比使用手动方法花费更少时间,更轻松地完成所有工作的人都可以!
首先,让我们下载unixabg的cryptmypi脚本。
git clone https://github.com/unixabg/cryptmypi.git
但是,在运行构建脚本之前,我们需要做很多事情。现在让我们一起经历这些:
cd cryptmypi
cp cryptmypi.conf config
cd config
cat ~/.ssh/id_rsa.pub >> authorized_keys
现在,我们需要编辑cryptmypi.conf来更改阶段2中的某些设置。这些设置将是个人设置,但让我们举个例子。
cat cryptmypi.conf
##################
## cryptmypi settings
##################
# export prefix for hooks
export _VER="2.2-beta"
# base and build
export _BASEDIR=$(pwd)
export _BUILDDIR=${_BASEDIR}/cryptmypi-build
##################
## Stage-1
##################
_IMAGEURL=https://images.offensive-security.com/arm-images/ka1i-linux-2019.4-rpi3-nexmon-64.img.xz
# compose package actions
export _PKGSPURGE=""
export _PKGSINSTALL=""
# iodine settings
_IODINE_PASSWORD="your iodine password goes here"
_IODINE_DOMAIN="your iodine domain goes here"
# final package actions
export _FINALPKGPURGE=""
export _FINALPKGINSTALL="telnet dsniff bettercap"
##################
## Stage-2
##################
# block device
_BLKDEV="/dev/sdb"
# luks encryption cipher
_LUKSCIPHER="aes-cbc-essiv:sha256"
# luks encryption password
_LUKSPASSWD="toor"
# root password
export _ROOTPASSWD="toor"
我们在这里更改的是块设备,luks加密密码和root密码。如果您想使用其他图像文件,则可以更改图像URL,因此请务必立即进行操作。
现在剩下要做的就是运行两个阶段的脚本并按照说明进行操作。到最后,您将拥有一个具有dropbear SSH访问权限的完全加密的文件系统。