• [cipher][archlinux][disk encryption][btrfs] 磁盘分区加密 + btrfs


    科普链接:https://wiki.archlinux.org/index.php/Disk_encryption

    前面的链接关于硬盘加密,讲了几种,基本上就是选dm-crypt with LUKS

    在grub中,解密根分区以及/boot分区。

    dm-crypt文档:https://wiki.archlinux.org/index.php/Dm-crypt

    使用 dm-crypt加密一个非根分区。https://wiki.archlinux.org/index.php/Dm-crypt/Encrypting_a_non-root_file_system

    dm-crypt 的两种加密方式: PLAIN, LUKS(Linux Unified Key Setup)。

    具体什么区别我也不太知道,简单来说就是LUKS在文件系统(硬盘分区?)里存储了与加密信息加密方式相关的元数据。而PLAIN中没有。LUKS是dm-crypt的默认方式。

    一堆破文档,都不及man手册讲的清楚。

    DESCRIPTION
           cryptsetup  is  used  to  conveniently setup dm-crypt managed device-mapper mappings. These include plain dm-crypt volumes and
           LUKS volumes. The difference is that LUKS uses a metadata header and can hence offer more features than plain dm-crypt. On the
           other hand, the header is visible and vulnerable to damage.

    这个man,写的这么好,在我看过的man里边可以排前三。

    /home/tong/bin [tong@T7] [19:24]
    > man cryptsetup

    一: 弄了台虚拟机做实验先:

    [root@t206 arch-crypt]# qemu-system-x86_64 -vnc 0.0.0.0:1 --enable-kvm -smp 1 -m 1G -drive file=disk.qcow2,if=virtio -net bridge -net nic,model=virtio -cdrom ../iso/archlinux-2017.05.01-x86_64.iso 

    二: 加密非根分区

    1.  格式化LUKS分区

    root@archiso ~ # cryptsetup luksFormat /dev/vda
    
    WARNING!
    ========
    This will overwrite data on /dev/vda irrevocably.
    
    Are you sure? (Type uppercase yes): YES
    Enter passphrase: 
    Verify passphrase: 
    cryptsetup luksFormat /dev/vda  5.00s user 0.01s system 41% cpu 12.157 total
    root@archiso ~ # 

    后边还能加一个参数 keyfile。意思是将keyfile里边的内容作为密码。

    2.  挂载加密分区(解密)

    root@archiso ~ # cryptsetup open /dev/vda vd_root
    Enter passphrase for /dev/vda: 
    root@archiso ~ # ll /dev/mapper/vd_root
    lrwxrwxrwx 1 root root 7 Jun  1 11:58 /dev/mapper/vd_root -> ../dm-0

    3.  初始化文件系统

     root@archiso ~ # mkfs.xfs /dev/mapper/vd_root           

    4.  挂载使用

    root@archiso ~ # mount /dev/mapper/vd_root mnt 
    root@archiso ~ # ll
    total 9
    -rw-r--r-- 1 root root 8864 May  1 07:04 install.txt
    drwxr-xr-x 2 root root    6 Jun  2 01:56 mnt
    root@archiso ~ # cd mnt 
    root@archiso ~/mnt # ll
    total 0
    root@archiso ~/mnt # touch 123
    root@archiso ~/mnt # touch txt
    root@archiso ~/mnt # vim txt 
    root@archiso ~/mnt # cat txt 
    123456
    root@archiso ~/mnt # ls
    123  txt
    root@archiso ~/mnt # ll
    total 4
    -rw-r--r-- 1 root root 0 Jun  2 01:57 123
    -rw-r--r-- 1 root root 7 Jun  2 01:57 txt
    root@archiso ~/mnt # cd ..

    5. 卸载关闭

    root@archiso ~ # umount mnt 
    root@archiso ~ # cryptsetup close vd_root
    root@archiso ~ # ll /dev/mapper 
    total 0
    crw------- 1 root root 10, 236 Jun  1 11:58 control
    root@archiso ~ # 

    三, 加密全系统

    https://wiki.archlinux.org/index.php/Dm-crypt/Encrypting_an_entire_system

    有多种方式,以及包括boot分区加密等。内容很多

    boot分区,MBR加密:https://wiki.archlinux.org/index.php/Dm-crypt/Specialties#Securing_the_unencrypted_boot_partition

    chkboot(检查分区是否被串改?)

    首先,我选用简单的方法,在LUKS上创建btrfs。查看上述文档的btrfs章节。

    btrfs的详细内容,branch到这里:http://www.cnblogs.com/hugetong/p/6934247.html 

    全系统加密的关键在于,initrd,grub,boot partition,以及kernel。

    分区什么的,与非根分区没什么区别,不再叙述。

    还是有区别的,这块盘,我需要分出boot partition,swap partition,如果是uEFI的话,还有ESP分区。

    有关 parted的unit问题 https://www.gnu.org/software/parted/manual/parted.html#unit

    1.  分区表使用 GPT 

    root@archiso ~ # parted /dev/vda 
    GNU Parted 3.2
    Using /dev/vda
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) mktable gpt

    2.  创建BIOS grub分区

      bios_grub分区只需要31KiB,但是为了对齐以及扩展,我们用1MiB

    https://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html

    (parted) mkpart fat32 1MiB 2MiB  
    (parted) set 1 bios_grub on
    (parted) print                                                            
    Model: Virtio Block Device (virtblk)
    Disk /dev/vda: 20971520kiB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start    End      Size     File system  Name  Flags
     1      1024kiB  2048kiB  1024kiB                     bios_grub
    
    (parted)                               

    3. 创建boot分区。挂载根分区前的所有内容,都在这个分区里,我们选择1G的大小。

      A suggested size for /boot is 200 MiB unless using UEFI, in which case greater than 512 MiB is needed.

    (parted) mkpart ext4 2MiB 1026MiB                                       
    (parted) print                                                            
    Model: Virtio Block Device (virtblk)
    Disk /dev/vda: 20971520kiB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start    End         Size        File system  Name  Flags
     1      1024kiB  2048kiB     1024kiB                        bios_grub
     2      2048kiB  1050624kiB  1048576kiB
    
    (parted)                                           

    4. swap分区。 时至今日,swap分区的大小已经没有要求了。要求只来自suspend and hibernate。

      文件 /sys/power/image_size配置了系统对于hibernate image大小的限制。默认为RAM大小的2/5

      https://wiki.archlinux.org/index.php/Partitioning#Swap

      https://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate#Hibernation

    (parted) mkpart primary linux-swap 1026MiB 3074MiB
    (parted) print                                                            
    Model: Virtio Block Device (virtblk)
    Disk /dev/vda: 20480MiB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start    End      Size     File system     Name  Flags
     1      1.00MiB  2.00MiB  1.00MiB                        bios_grub
     2      2.00MiB  1026MiB  1024MiB
     3      1026MiB  3074MiB  2048MiB  linux-swap(v1)
    
    (parted)                                           

    5.  剩下的空间做成 crypt-LUKS + btrfs

    (parted) mkpart primary 3074MiB 100%                   
    (parted) print                                                            
    Model: Virtio Block Device (virtblk)
    Disk /dev/vda: 20480MiB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start    End       Size      File system     Name  Flags
     1      1.00MiB  2.00MiB   1.00MiB                         bios_grub
     2      2.00MiB  1026MiB   1024MiB
     3      1026MiB  3074MiB   2048MiB   linux-swap(v1)
     4      3074MiB  20479MiB  17405MiB
    
    (parted)                        

    初始化各分区文件系统,与前文操作一至

    root@archiso ~ # mkfs.fat /dev/sda1
    mkfs.fat 4.1 (2017-01-24)
    mkfs.fat: unable to open /dev/sda1: No such file or directory
    1 root@archiso ~ # mkfs.fat /dev/vda1                                                                                                 :(
    mkfs.fat 4.1 (2017-01-24)
    root@archiso ~ # mkfs.fat /dev/vda2
    mkfs.fat 4.1 (2017-01-24)
    root@archiso ~ # mkswap /dev/vda3 
    Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
    no label, UUID=3b11937b-85fb-4c8a-8f8f-97e75097b4e1
    root@archiso ~ # cryptsetup luksFormat /dev/vda4 
    
    WARNING!
    ========
    This will overwrite data on /dev/vda4 irrevocably.
    
    Are you sure? (Type uppercase yes): YES
    Enter passphrase: 
    Verify passphrase: 
    cryptsetup luksFormat /dev/vda4  5.00s user 0.03s system 24% cpu 20.180 total
    root@archiso ~ # cryptsetup luksFormat /dev/vda4
    
    WARNING!
    ========
    This will overwrite data on /dev/vda4 irrevocably.
    
    Are you sure? (Type uppercase yes): YES
    Enter passphrase: 
    Verify passphrase: 
    Passphrases do not match.
    2 root@archiso ~ # cryptsetup luksFormat /dev/vda4                                                                                    :(
    
    WARNING!
    ========
    This will overwrite data on /dev/vda4 irrevocably.
    
    Are you sure? (Type uppercase yes): YES
    Enter passphrase: 
    Verify passphrase: 
    root@archiso ~ # cryptsetup luksFormat /dev/vda4
    
    WARNING!
    ========
    This will overwrite data on /dev/vda4 irrevocably.
    
    Are you sure? (Type uppercase yes): YES
    Enter passphrase: 
    Verify passphrase: 
    root@archiso ~ # 
    root@archiso ~ # 
    root@archiso ~ # 
    root@archiso ~ # parted -l /dev/vda
    Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0
    has been opened read-only.
    Model: QEMU QEMU DVD-ROM (scsi)                                           
    Disk /dev/sr0: 504MB
    Sector size (logical/physical): 2048B/2048B
    Partition Table: msdos
    Disk Flags: 
    
    Number  Start  End    Size   Type     File system  Flags
     2      336kB  269MB  268MB  primary               esp
    
    
    Model: Virtio Block Device (virtblk)
    Disk /dev/vda: 21.5GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start   End     Size    File system     Name       Flags
     1      1049kB  2097kB  1049kB                  bios_grub  bios_grub
     2      2097kB  1076MB  1074MB  fat32           boot
     3      1076MB  3223MB  2147MB  linux-swap(v1)  swap
     4      3223MB  21.5GB  18.3GB                  root
    
    
    root@archiso ~ # 
    View Code

    挂载crypt分区后,创建btrfs文件系统。

    root@archiso ~ # cryptsetup open --type luks /dev/vda4 crypt_root
    Enter passphrase for /dev/vda4: 
    root@archiso ~ # mkdir mnt
    root@archiso ~ # mkfs.btrfs -L root /dev/mapper/crypt_root                                                                          :(
    btrfs-progs v4.10.2
    See http://btrfs.wiki.kernel.org for more information.
    
    Label:              root
    UUID:               cd3b27fb-f257-4afc-b402-fec0550d014e
    Node size:          16384
    Sector size:        4096
    Filesystem size:    17.00GiB
    Block group profiles:
      Data:             single            8.00MiB
      Metadata:         DUP               1.00GiB
      System:           DUP               8.00MiB
    SSD detected:       no
    Incompat features:  extref, skinny-metadata
    Number of devices:  1
    Devices:
       ID        SIZE  PATH
        1    17.00GiB  /dev/mapper/crypt_root
    
    root@archiso ~ # mount /dev/mapper/crypt_root mnt 
    root@archiso ~ # btrfs subvolume create mnt/top                                                                                     :(
    Create subvolume 'mnt/top'
    root@archiso ~/mnt # cd top 
    root@archiso ~/mnt/top # mkdir snapshot
    root@archiso ~/mnt/top # btrfs subvolume create root
    Create subvolume './root'
    root@archiso ~/mnt/top # btrfs subvolume create home
    Create subvolume './home'
    root@archiso ~/mnt/top # ll
    total 0
    drwxr-xr-x 1 root root 0 Jun  3 07:13 home
    drwxr-xr-x 1 root root 0 Jun  3 07:13 root
    drwxr-xr-x 1 root root 0 Jun  3 06:42 snapshot
    root@archiso ~/mnt/top # cd ..
    root@archiso ~/mnt # ls
    top
    root@archiso ~/mnt # cd ..
    root@archiso ~ # ls
    install.txt  mnt
    root@archiso ~ # btrfs subvolume list mnt 
    ID 257 gen 12 top level 5 path top
    ID 258 gen 11 top level 257 path top/root
    ID 259 gen 12 top level 257 path top/home
    root@archiso ~ # 
    root@archiso ~ # 
    root@archiso ~ # umount mnt
    root@archiso ~ # cryptsetup close /dev/mapper/crypt_root 
    root@archiso ~ # 
    View Code

    6. 安装系统

    6.1 安装目录树结构挂起来

    root@archiso ~ # parted -l /dev/sda
    Number  Start   End     Size    File system     Name       Flags
     1      1049kB  2097kB  1049kB                  bios_grub  bios_grub
     2      2097kB  1076MB  1074MB  fat32           boot
     3      1076MB  3223MB  2147MB  linux-swap(v1)  swap
     4      3223MB  21.5GB  18.3GB                  root
    root@archiso ~ # btrfs subvolume list mnt                                             
    ID 257 gen 12 top level 5 path top
    ID 258 gen 11 top level 257 path top/root
    ID 259 gen 12 top level 257 path top/home
    root@archiso ~ # mount -o compress=lzo,subvol=top/root /dev/mapper/crypt_root mnt
    root@archiso ~ # mkdir mnt/boot
    root@archiso ~ # mkdir mnt/home
    root@archiso ~ # mount -o compress=lzo,subvol=top/home /dev/mapper/crypt_root mnt/home 
    root@archiso ~ # mount /dev/vda2 mnt/boot 
    root@archiso ~ # swapon /dev/vda3 

    6.2  设置键盘

    6.3  查看boot mode

    6.4  设置时间

    root@archiso ~ # ll /etc/localtime 
    lrwxrwxrwx 1 root root 23 May  1 07:04 /etc/localtime -> /usr/share/zoneinfo/UTC
    root@archiso ~ # rm /etc/localtime 
    root@archiso ~ # ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    root@archiso ~ # timedatectl set-ntp true                              
    root@archiso ~ # timedatectl status                                    
          Local time: Sat 2017-06-03 17:11:43 CST
      Universal time: Sat 2017-06-03 09:11:43 UTC
            RTC time: Sat 2017-06-03 09:11:42
           Time zone: Asia/Shanghai (CST, +0800)
     Network time on: yes
    NTP synchronized: no
     RTC in local TZ: no
    root@archiso ~ # date
    Sat Jun  3 17:11:46 CST 2017
    root@archiso ~ # 

    6.5  修改 /etc/pacman.d/mirrorlist

    6.6  strap 根分区

    root@archiso ~ # pacstrap mnt base

    6.7  生成分区挂载信息

    root@archiso ~ # genfstab -U mnt >> mnt/etc/fstab 

    6.8  change root

    root@archiso ~ # arch-chroot mnt 
    [root@archiso /]# ll

    6.9  改时区

    [root@archiso /]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
    [root@archiso /]# hwclock --systohc

    6.10  本地化 localizations

    [root@archiso /]# vi /etc/locale.gen 
    [root@archiso /]# locale-gen 
    Generating locales...
      en_US.UTF-8... done
      zh_CN.GBK... done
      zh_CN.UTF-8... done
      zh_CN.GB2312... done
    Generation complete.
    [root@archiso /]# echo "LANG=en_US.UTF-8" >> /etc/locale.conf

    6.11  config network with netctl

    [root@archiso netctl]# cp examples/ethernet-static lan0
    [root@archiso netctl]# vi lan0
    [root@archiso netctl]# netctl list
    * lan0

    6.12 初始化 initramfs

    根分区是加密的,ramfs 复杂解密,所以关于加密的所有特异性配置,都在这里了。

    [root@archiso ~]# vim /etc/mkinitcpio.conf 
    [root@archiso etc]# diff mkinitcpio.conf mkinitcpio.conf.bak  
    52c52
    < HOOKS="base udev autodetect modconf keyboard keymap block encrypt filesystems fsck"
    ---
    > HOOKS="base udev autodetect modconf block filesystems keyboard fsck"
    [root@archiso etc]#

    mkinitcpio 时有一个错误

    ==> ERROR: file not found: `fsck.btrfs'

    安装 btrfs-progs, 它默认不再base里。

    [root@archiso etc]# pacman -S btrfs-progs

    制作 initramfs

    [root@archiso etc]# mkinitcpio -p linux
    ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
      -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img
    ==> Starting build: 4.11.3-1-ARCH
      -> Running build hook: [base]
      -> Running build hook: [udev]
      -> Running build hook: [autodetect]
      -> Running build hook: [modconf]
      -> Running build hook: [keyboard]
      -> Running build hook: [keymap]
      -> Running build hook: [block]
      -> Running build hook: [encrypt]
      -> Running build hook: [filesystems]
      -> Running build hook: [keyboard]
      -> Running build hook: [fsck]
    ==> Generating module dependencies
    ==> Creating gzip-compressed initcpio image: /boot/initramfs-linux.img
    ==> Image generation successful
    ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
      -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-fallback.img -S autodetect
    ==> Starting build: 4.11.3-1-ARCH
      -> Running build hook: [base]
      -> Running build hook: [udev]
      -> Running build hook: [modconf]
      -> Running build hook: [keyboard]
      -> Running build hook: [keymap]
      -> Running build hook: [block]
    ==> WARNING: Possibly missing firmware for module: wd719x
    ==> WARNING: Possibly missing firmware for module: aic94xx
      -> Running build hook: [encrypt]
      -> Running build hook: [filesystems]
      -> Running build hook: [keyboard]
      -> Running build hook: [fsck]
    ==> Generating module dependencies
    ==> Creating gzip-compressed initcpio image: /boot/initramfs-linux-fallback.img
    ==> Image generation successful
    [root@archiso etc]# 
    View Code

    根据:https://wiki.archlinux.org/index.php/Btrfs#Corruption_recovery 可以选择性添加如下配置:

    14c14
    < BINARIES="/usr/bin/btrfs"
    ---
    > BINARIES=""

    6.13 设置 password

    [root@archiso etc]# passwd 
    New password: 
    Retype new password: 
    passwd: password updated successfully
    [root@archiso etc]# 

    6.14 安装 boot loader

    https://wiki.archlinux.org/index.php/GRUB

    [root@archiso etc]# pacman -S grub
    [root@archiso etc]# grub-install --target=i386-pc /dev/vda
    Installing for i386-pc platform.
    Installation finished. No error reported.
    [root@archiso etc]# 

    https://wiki.archlinux.org/index.php/GRUB#Generate_the_main_configuration_file

    [root@archiso ~]# vim /etc/default/grub

    https://wiki.archlinux.org/index.php/Dm-crypt/System_configuration#Boot_loader

    [root@archiso ~]# diff /etc/default/grub /etc/default/grub.bak 
    4c4
    < GRUB_CMDLINE_LINUX_DEFAULT="cryptdevice=UUID=38312920-93be-4ff6-ba88-e53505fcfb93:vd_root resume=UUID=3b11937b-85fb-4c8a-8f8f-97e75097b4e1 quiet"
    ---
    > GRUB_CMDLINE_LINUX_DEFAULT="quiet"
    [root@archiso ~]# 
    [root@archiso ~]# vim /boot/grub/grub.cfg

    7  重启

    reboot
  • 相关阅读:
    DevExpress_Winform_使用汇总
    SVN的可视化日志统计工具StatSVN
    jenkins搭建.Net项目自动构建
    关闭tab时,定位到导航栏对应的激活tab
    DevExpress.XtraNavBar.NavBarControl 模拟单击导航的选项事件
    选中Tab控件单击事件,点击tab头,定位到导航栏的选项,为选中状态 ,DevExpress.XtraNavBar.NavBarControl 导航控件定位或选中状态 另导航的选项为选中状态.
    WCF服务部署到IIS问题汇总
    iOS多线程编程
    最新版SDWebImage的使用
    前端入门系列之CSS
  • 原文地址:https://www.cnblogs.com/hugetong/p/6914248.html
Copyright © 2020-2023  润新知