• 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	/dev/mmcblk0p2	none	luks' > /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
    2
    w" | fdisk /dev/sdb
    partprobe
    sleep 5
    echo -e "n
    p
    2
    
    
    w" | 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访问权限的完全加密的文件系统。

  • 相关阅读:
    包和模块的导入问题
    第9.6节 Python使用read函数读取文件内容
    第9.5节 Python的readlines读取文件内容及其参数hint使用分析
    第9.4节 Python中用readline读取二进制文件方式打开文件
    第9.3节 Python的文件行读取:readline
    第9.2节 Python的文件打开函数open详解
    第9.1节 Python的文件打开函数open简介
    第九章 Python文件操作
    第8.34节 《Python类中常用的特殊变量和方法》总结
    第8.33节 Python中__getattr__以及__getattr__与__ getattribute__的关系深入剖析
  • 原文地址:https://www.cnblogs.com/GKLBB/p/13583450.html
Copyright © 2020-2023  润新知