Linux分区加密

基础知识

  • Initrd(Initial RamDisk)

    • Initrd是在Linux内核加载后,系统引导过程中挂载的一个临时根文件系统。
    • 使用Initrd的启动过程分两步:
      • 挂载Initrd
      • 挂载rootfs
    • Initrd的组成部分
      • /bin 一些必要的命令:busybox cat echo mount lsmod depmod insmod cryptsetup ...
      • /dev 一些必要的字符设备文件:console null zero tty0 ...
      • /lib 一些必要的动态链接库和内核模块:libc.so libblkid.so libuuid.so libcryptsetup.so e1000.ko xen-blkfront.ko ...
      • init 挂载Initrd后执行的shell脚本:
        • 从grub的CMDLINE获取rootfs所在分区及其他引导选项
        • 加载内核模块
        • 挂载rootfs(解密)
        • switch_root
    • Initrd 非必须,很多情况下可以只使用内核便进入系统。但对于存在某些重要分区,需要在Initrd中进行操作(例如解密)的情况,Initrd就是必须的
    • 文件格式:通常是一个经过gzip压缩的cpio归档格式(早期的Initrd是loop设备,可以挂载之后查看文件内容)
  • 对称加密

    • 特点:对源文件的加密和对加密文件的解密采用同一份密钥
    • 优势:计算量小、算法公开、速度快、效率高
    • 劣势:密钥的保存与传输成了安全性的重要考量、密钥数量巨大时难以管理
    • 常见的对称加密算法:RC2、RC4、AES等
    • RC4
      • Ron Rivest在1987年设计,但RSA并未真正发表过RC4
      • RC4后来被证明容易被破解,因此慢慢从SSL/TSL等众多舞台中退出
      • 原理:主要是利用xor实现加密、解密使用同一份密钥

device mapper

  • device mapper是一种linux内核提供的、用于建立物理块设备和虚拟块设备之间映射关系的框架

  • 基于device mapper的应用

    • 逻辑卷管理(LVM)
    • dm-crypt/cryptsetup
    • TrueCrypt
    • Docker
  • 创建或管理mappered device的两种方法(libdevmapper.so)

    • 通过设备节点/dev/mapper/control
    • 通过shell的dmsetup命令

dm-crypt/cryptsetup

  • dm-crypt基于Linux内核提供的crypto API,从2.5.45版本开始引入,是Linux内核提供的磁盘加密功能(内核态)。为了在用户态能够使用dm-crypt提供的功能,编译内核时需要打开以下三个选项:

    • CONFIG_DM_CRYPT
    • CONFIG_BLK_DEV_DM
    • CONFIG_CRYPTO_XTS
  • cryptsetup是提供用户使用的命令行工具(用户态),有些发行版可能需要单独安装

    • gentoo: emerge cryptsetup
    • debian/ubuntu: apt-get install cryptsetup
    • centos/fedora: yum install cryptsetup
    • ...
  • cryptsetup的优缺点

    • 优势:
      • 与LVM都基于device mapper机制,无缝衔接
      • 众多发行版均已内置,无需额外安装
      • 支持多种加密格式,如LUKS、TCRYPT等
    • 缺点:
      • 不能对系统中已有的数据加密,必须创建加密的分区
      • 一旦忘记密码或丢失密钥文件,数据将永远丢失
  • LUKS on cryptsetup

# First, partition
Device          Size        Id            Type
/dev/xvda1      3M          83            Linux
/dev/xvda2      300M        83            Linux
/dev/xvda3      2G          82      Linux swap / Solaris
/dev/xvda4      37.7G       83            Linux
# Second, encrypt using LUKS format
# Usage: cryptsetup [option] luksFormat <device> [key file]
# Example:
cryptsetup -q luksFormat /dev/xvda4 .key
# Third, open LUKS format disk
# Usage: cryptsetup [option] luksOpen <device> <name>
# Example:
cryptsetup -d .key luksOpen /dev/xvda4 root
# Fourth, make file system
# Now, using /dev/mapper/root instead of /dev/xvda4
mkfs.ext3 /dev/mapper/root
# Fifth, mount file system
mount /dev/mapper/root /mnt/gentoo

$df -h
Filesystem              Size        Mounted on
/dev/mapper/root        37.7G       /mnt/gentoo

$blkid
# different block device, different UUID
/dev/xvda4: UUID="..." TYPE="crypto_LUKS" PARTUUID="..."
/dev/mapper/root: UUID="..." TYPE="ext3"

# Umount LUKS partition
umount /dev/xvda4
# Close LUKS partition
# Uasge: crypt luksClose <name>
cryptsetup luksClose root
  • 加密原理

    • LUKS格式的加密盘不能直接挂载
    • 密码错误或密钥文件不正确时,luksOpen会失败
  • 密钥文件

    • 可以使用一个填充任意字符串的文件作为密钥文件
    • 使用dd随机生成的密钥文件安全性更高
      dd if=/dev/urandom of=.key bs=1 count=32

系统加密的例子

  • cryptsetup对rootfs分区进行加密

  • 定制Initrd

    • 使用linux内核提供的工具gen_init_cpio生成
    • 将rootfs的秘钥文件包含在Initrd中
    • Initrd中自定义init脚本,完成rootfs的解密和挂载操作
  • 对boot分区中的Initrd文件加密

    • 采用分区加密时,boot分区不能加密,因此使系统的Initrd文件暴露给入侵者。一旦Initrd被解包,rootfs的秘钥就被知晓了
    • 使用对称加密方法对Initrd进行加密,实现简单,又加大了破解Initrd的难度,使系统文件处于较安全的状态
$./gen_init_cpio
Usage:
        ./gen_init_cpio <cpio_list>

<cpio_list> is a file containing newline separated entries that
describe the files to be included in the initramfs archive:

# a comment
file <name> <location> <mode> <uid> <gid> [<hard links>]
dir <name> <mode> <uid> <gid>
nod <name> <mode> <uid> <gid> <dev_type> <maj> <min>
slink <name> <target> <mode> <uid> <gid>
pipe <name> <mode> <uid> <gid>
sock <name> <mode> <uid> <gid>

<name>       name of the file/dir/nod/etc in the archive
<location>   location of the file in the current filesystem
             expands shell variables quoted with ${}
<target>     link target
<mode>       mode/permissions of the file
<uid>        user id (0=root)
<gid>        group id (0=root)
<dev_type>   device type (b=block, c=character)
<maj>        major number of nod
<min>        minor number of nod
<hard links> space separated list of other links to file

example:
# A simple initramfs
dir /dev 0755 0 0
nod /dev/console 0600 0 0 c 5 1
dir /root 0700 0 0
dir /sbin 0755 0 0
file /sbin/kinit /usr/src/klibc/kinit/kinit 0755 0 0

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容