使用USB磁盘无密码登录加密分区的LINUX

背景

最近一直在看关于LINUX磁盘加密的东西,也尝试了文件加密、扇区加密、全盘加密等方面。 然而每次都需要输入密码这种事情对一个追求速度的人来说似乎有点浪费时间,而且每次重新 都需要输入密码也无法适用于自动化运维的场合。因而我根据网上提到的方法制作了一个 从USB磁盘读取密钥以解密加密全盘的方法。下面是对应的实现过程。

Debian系统安装

从镜像网站下载Debian 8(jessie)的DVD安装源,在Virtualbox中创建一台虚拟机,插入 ISO后,光盘启动系统进入到以下界面:

/images/2017_01_22_18_52_55_444x325.jpg

选择Install后,继续安装,因为篇幅的关系,这里省略掉关于用户名/密码/主机名/语言/区域设置等配置, 直接进入到磁盘分区的步骤:

选择手动对磁盘进行分区:

/images/2017_01_22_18_54_29_556x251.jpg 选择我们添加的磁盘:

/images/2017_01_22_18_55_13_547x201.jpg

选择接受上面的提示,创建一个新的空白分区表:

/images/2017_01_22_18_56_33_538x154.jpg

可以看到当前没有任何磁盘分区,选择到红色光标所在的行,按回车:

/images/2017_01_22_18_57_25_543x255.jpg

创建一个新的分区:

/images/2017_01_22_18_57_55_388x178.jpg

/boot分区大小我们设置为400MB:

/images/2017_01_22_18_58_16_541x168.jpg

选择为主分区:

/images/2017_01_22_18_58_33_301x156.jpg

Location选择,从Beginning开始:

/images/2017_01_22_18_59_04_397x114.jpg

配置为我们以下截图里所示的内容:

/images/2017_01_22_18_59_37_452x219.jpg

接着创建一个大小为1GB的交换分区:

/images/2017_01_22_19_00_12_456x214.jpg

/images/2017_01_22_19_00_22_530x167.jpg

/images/2017_01_22_19_00_51_545x199.jpg

接着创建主分区,步骤不再重复,充分利用剩下的磁盘空间:

/images/2017_01_22_19_01_31_411x192.jpg

在上面的高亮区内按回车,改变磁盘类型为physical volume for encryption:

/images/2017_01_22_19_01_59_326x335.jpg

注意我们配置的参数,这里配置了默认的加密方式为device-mapper(dm-crypt), 加密算法为256键字节大小的AES加密:

/images/2017_01_22_19_03_07_517x251.jpg

成功创建后的磁盘分区情况如下图:

/images/2017_01_22_19_03_50_428x209.jpg

接下来对加密卷作高阶配置,选择如下图中的条目:

/images/2017_01_22_19_06_47_321x159.jpg

出现警告信息,告知我们当前的分区方案将被写入到磁盘,我们是否开始配置加密卷?

/images/2017_01_22_19_08_03_435x207.jpg

选择yes后,选择Create encrypted volumes:

/images/2017_01_22_19_08_41_456x182.jpg

我们选择sda2和sda3,对交换分区和主分区进行加密。如果只选择主分区加密,安装程序会 报出错误,所以一开始我们就选中这两块分区,进入到下一步:

/images/2017_01_22_19_09_34_447x245.jpg

分区完毕,选择Done Setting up the partition, 结束手动分区步骤:

/images/2017_01_22_19_10_13_399x212.jpg

确定写入磁盘:

/images/2017_01_22_19_10_29_542x135.jpg

写入过程:

/images/2017_01_22_19_10_50_553x320.jpg

此时需要定义密码:

/images/2017_01_22_19_11_12_534x209.jpg

成功配置完加密卷的磁盘分区表如下所示:

/images/2017_01_22_19_11_55_510x295.jpg

选择4G大小的主分区,改变其Mount point为/:

/images/2017_01_22_19_12_29_545x266.jpg

/images/2017_01_22_19_12_41_551x245.jpg

同样改变swap分区:

/images/2017_01_22_19_12_55_499x159.jpg

确定写入磁盘:

/images/2017_01_22_19_13_06_540x222.jpg

接下来继续安装,并在安装的最后一步将BootLoad写入MBR。

安装完毕后,重新启动机器后,需要输入密码才能进入系统:

/images/2017_01_22_19_14_22_453x97.jpg

/images/2017_01_22_19_14_32_463x151.jpg

配置passwordless

接下来我们创建无需输入密码的根文件系统,使用一个USB优盘来记录密码信息,位于USB优盘 上的secret key将用于解密加密磁盘。 将USB盘插入到虚拟机,可以使用dmesg来获取其卷标,这里可以看到我们的卷表为/dev/sdb:

/images/2017_01_22_19_16_35_540x296.jpg

使用dd命令,从优盘读取8192字节大小的随机字节 ,作为我们要使用的secret key:

# dd if=/dev/sdb of=/root/secret.key bs=512 skip=4 count=16

上面生成的secret.key文件将被加入到加密卷中,通过cryptsetup命令加入。默认的密码被保存 在slot 0, 而slot 1将被用作第二个secret key。

首先使用blkid命令来查看磁盘卷的详细信息:

# blkid 
/dev/mapper/sda3_crypt: UUID="6d978850-19f3-4a89-87cb-01825d7601c4" TYPE="ext4"
/dev/sda1: UUID="3288f26a-7669-44fe-b130-87d39ab57166" TYPE="ext4" PARTUUID="f7870f8a-01"
/dev/sda2: PARTUUID="f7870f8a-02"
/dev/sda3: UUID="8ca94b2f-89d3-4114-9e33-290dc57ed723" TYPE="crypto_LUKS" PARTUUID="f7870f8a-03"
/dev/sdb1: LABEL="XENSERVER-6" UUID="5CD6-02A1" TYPE="vfat" PARTUUID="0003fa4f-01"

被用于解密卷的secret key将仅仅被加入到/dev/sda3中,当然,它也可以被加入到/dev/sda2中。

# cryptsetup luksAddKey /dev/sda3 /root/secret.key --key-slot 1
Enter any passphrase!

我们将创建一个简单的udev规则,用于创建USB设备,我们将创建一个/etc/udev/rules.d/99-custom-usb.rules 文件,并将它的链接文件指向/dev/usbdevice:

# vi /etc/udev/rules.d/99-custom-usb.rules 
SUBSYSTEMS=="usb",DRIVERS=="usb",SYMLINK+="usbdevice%n"

重新加载udev规则:

# udevadm control --reload-rules

现在插入磁盘后,以验证自定义规则:

# ls -l /dev/usbdevice
lrwxrwxrwx 1 root root 3 Jan 22 04:27 /dev/usbdevice -> sdb

创建一个shell脚本,用于在系统启动时,从USB设备读取出secret key,并将其 提供给cryptsetup。 这个脚本位于/usr/local/sbin/openluksdevices.sh:

#!/bin/sh
############taken from following link#########
###http://www.oxygenimpaired.com/debian-lenny-luks-encrypted-root-hidden-usb-keyfile

TRUE=0
FALSE=1

# flag tracking key-file availability
OPENED=$FALSE

if [ -b /dev/usbdevice ]; then
# if device exists then output the keyfile from the usb key 
dd if=/dev/usbdevice bs=512 skip=4 count=16 | cat
OPENED=$TRUE
fi

if [ $OPENED -ne $TRUE ]; then
echo "FAILED to get USB key file ..." >&2
/lib/cryptsetup/askpass "Try LUKS password: "
else
echo "Success loading key file for Root . Moving on." >&2
fi

sleep 2

添加可执行权限:

# chmod a+x /usr/local/sbin/openluksdevices.sh

与fstab文件类似, crypttab文件包含有在Linux平台加密卷的相关配置信息. 这里 我们添加针对sda3_crypt加密卷的配置信息:

# vi /etc/crypttab 
sda2_crypt UUID=4270c1eb-5a06-4a1f-8a19-d5af9db4f779 none luks,swap
sda3_crypt UUID=8ca94b2f-89d3-4114-9e33-290dc57ed723 none luks,keyscript=/usr/local/sbin/openluksdevices.sh

同样,我们需要重新生成initramfs,因而在initramfs的制作工具的定义文件里 我们也需要添加针对sda3_crypt卷的解密操作:

# vi /etc/initramfs-tools/conf.d/cryptroot 
CRYPTROOT=target=sda3_crypt,source=/dev/disk/by-uuid/8ca94b2f-89d3-4114-9e33-290dc57ed723

并在/etc/initramfs-tools中添加usb_storage选项:

# vi /etc/initramfs-tools/modules 
usb_storage

添加udevusbkey.sh文件,以在临时文件系统initrd中添加自定义的udev规则:

/etc/initramfs-tools/hooks/udevusbkey.sh 文件:

#!/bin/sh
# udev-usbkey script
###taken from
###http://www.oxygenimpaired.com/ubuntu-with-grub2-luks-encrypted-lvm-root-hidden-usb-keyfile
PREREQ="udev"
prereqs()
{
echo "$PREREQ"
}

case $1 in
prereqs)
prereqs
exit 0
;;
esac

. /usr/share/initramfs-tools/hook-functions

# Copy across relevant rules

cp /etc/udev/rules.d/99-custom-usb.rules ${DESTDIR}/lib/udev/rules.d/

exit 0

并给予其可执行权限:

#  chmod a+x /etc/initramfs-tools/hooks/udevusbkey.sh

GRUB2配置文件也需要进行相应的修改,以添加rootdelaycryptopts选项:

$ vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="rootdelay=20 cryptopts=target=sda3_crypt,source=/dev/disk/by-uuid/8ca94b2f-89d3-4114-9e33-290dc57ed723,keyscript=/lib/cryptsetup/scripts/openluksdevices.sh"
GRUB_CMDLINE_LINUX=""

运行update-grub以更新grub配置文件,可以通过检查/boot/grub/grub.cfg来看到我们更改 后的配置已经被加入到最终配置文件。

运行update-initramfs -u来更新系统启动时所需用到的临时文件系统.

运行检查程序,查看openlunksdevices是否被正确打包入initramfs中:

# cd /tmp
# zcat /boot/initrd.img-3.16.0-4-amd64 | cpio -iv
# ls -l lib/cryptsetup/scripts/openluksdevices.sh 
-rwxr-xr-x 1 root staff 565 Jan 22 06:52 lib/cryptsetup/scripts/openluksdevices.sh

最后的启动过程可以参考:

/images/2017_01_22_19_54_12_548x301.jpg

总结

这里使用一个USB存储设备打开了LINUX系统里的一个加密盘,一个自动化脚本 被用来在启动时为机密卷提供一个用于解密的secret key.

Bug

按照原教程里的配置,导致swap分区无法被激活,我觉得可能需要添加关于swap分区的选项。

更新,在分区指定swap分区加密的时候,选定密码类型为random password.

火炉-凤凰

想起来有段时间没去火炉山-凤凰山玩了,看今天天气不错,出去走走。

6号线开通后可以直接坐地铁到龙洞,省掉了之前地铁转公交的繁琐,10点多才出发,一个小时 不到就可以到达火炉山山脚。

今天广州的画风是这样的:

/images/2017_01_21_17_58_33_988x983.jpg

火炉:

/images/2017_01_21_17_59_12_993x824.jpg

凤凰:

/images/2017_01_21_17_59_50_991x790.jpg

火炉山最近维护力度比较大,台阶基本上都是干净的:

/images/2017_01_21_18_00_44_987x738.jpg

爬到猪头石只需要20分钟:

/images/2017_01_21_18_02_05_894x866.jpg

一颗枯死的树:

/images/2017_01_21_18_03_07_738x986.jpg

凤凰山比起火炉山来,更加原生态:

/images/2017_01_21_18_05_03_823x826.jpg

一位玩越野跑的女侠:

/images/2017_01_21_18_06_10_729x794.jpg

一位玩午睡的男侠:

/images/2017_01_21_18_07_14_728x729.jpg

此处风景甚妙:

/images/2017_01_21_18_08_34_826x618.jpg

筲箕窝水库:

/images/2017_01_21_18_09_37_828x612.jpg

木强水库:

/images/2017_01_21_18_10_50_824x610.jpg

秋叶红胜二月花:

/images/2017_01_21_18_11_40_733x745.jpg

水库这块属凤凰山的精华:

/images/2017_01_21_18_12_48_826x590.jpg

/images/2017_01_21_18_13_59_823x620.jpg

出山的路上发现这家别致的餐馆,屋顶上长满蓝色的花:

/images/2017_01_21_18_15_10_820x562.jpg

草莓25一斤,可自采:

/images/2017_01_21_18_15_48_828x488.jpg

全程耗时3小时,全程步行大约18公里。冬日温度适宜,恰是登山之好时节。

Awesome4.0 配置

Aim

For Awesome is upgrading to 4.0 version, the configuration file has changed a lot comparing to Awesome 3.5, I have to rewrite the configuration files, following records all of the steps for customize Awesome 4.0.

Configure File

Simply copy the configuration file from xdg:

$ cp /etc/xdg/awesome/rc.lua ~/.config/awesome/

Customization

default terminal

Change default terminal from xterm to gnome-terminal:

-- terminal = "xterm"
terminal = "gnome-terminal"

Run Once Programs

Add one function then call it:

--- Just Run Once Programs.
function run_once(cmd)
  findme = cmd
  firstspace = cmd:find(" ")
  if firstspace then
    findme = cmd:sub(0, firstspace-1)
  end
  awful.util.spawn_with_shell("pgrep -u $USER -x " .. findme .. " > /dev/null || (" .. cmd .. ")")
end

run_once("udiskie -2 --tray")
run_once("wicd-client --tray")
run_once("fcitx &")
run_once("variety")
run_once("whatpulse")

Change tag name

Change the default 1 2 3 4 5 to you own tag name list:

    -- Each screen has its own tag table.
    -- awful.tag({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, s, awful.layout.layouts[1])
    local names = { "1WWW", "2Code", "3Term", "4Office", "5", "6", "7", "8", "9IM" }
    local l = awful.layout.suit  -- Just to save some typing: use an alias.
    local layouts = { l.floating, l.tile, l.floating, l.fair, l.max, l.floating, l.tile.left, l.floating, l.floating }
    awful.tag(names, s, layouts)

Use d-menu

When press mod4 + r, change it to calling d-menu:

    -- Prompt
    -- awful.key({ modkey },            "r",     function () awful.screen.focused().mypromptbox:run() end,
    --           {description = "run prompt", group = "launcher"}),

    awful.key({ modkey },            "r",     function ()
    awful.util.spawn("dmenu_run -i -p 'Run command:' -nb '" .. 
 		beautiful.bg_normal .. "' -nf '" .. beautiful.fg_normal .. 
		"' -sb '" .. beautiful.bg_focus .. 
		"' -sf '" .. beautiful.fg_focus .. "'") 
	end),

Linux下的磁盘加密

目的

调研Linux虚拟机磁盘加密

环境

Ubuntu16.04 LTS/Libvirt.

全盘加密

选择磁盘全盘加密,需要在系统安装时指定encrypted LVM:

/images/2017_01_19_11_16_10_884x316.jpg

指定加密的密码:

/images/2017_01_19_11_58_50_471x231.jpg

效果

每次启动时,需要在以下界面手动输入加密时密码,以继续系统启动:

/images/2017_01_19_12_06_36_721x145.jpg

如果输入失败,会提示密码错误,无法继续启动:

/images/2017_01_19_12_10_23_517x99.jpg

只有输入正确密码,才可以继续系统启动并进入到登录界面:

/images/2017_01_19_12_12_35_338x141.jpg

Packer.io制作加密系统

UBUNTU系统,对于加密LVM系统的构建,需要改动相应的preseed文件。
CentOS需要改动KickStart中对应的定义.

磁盘格局

通过命令sudo fdisk -l查看磁盘格局:

Disk /dev/ram0 ~ /dev/ram14, 64 MiB, 67108864 bytes, 131072 sectors
Disk /dev/mapper/sda5_crypt: 7.5 GiB, 8074035200 bytes, 15769600 sectors
Disk /dev/mapper/ubuntu--vg-root: 6.5 GiB, 6996099072 bytes, 13664256 sectors
Disk /dev/mapper/ubuntu--vg-swap_1: 1 GiB, 1073741824 bytes, 2097152 sectors
Disk /dev/mapper/cryptswap1: 1023.5 MiB, 1073217536 bytes, 2096128 sectors

通过df -h查看分区格式:

$ df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         478M     0  478M   0% /dev
tmpfs                        100M  3.3M   96M   4% /run
/dev/mapper/ubuntu--vg-root  6.3G  1.6G  4.4G  27% /
tmpfs                        497M  4.0K  497M   1% /dev/shm
tmpfs                        5.0M     0  5.0M   0% /run/lock
tmpfs                        497M     0  497M   0% /sys/fs/cgroup
/dev/sda1                    472M  102M  346M  23% /boot
tmpfs                        100M     0  100M   0% /run/user/1000
/home/xxx/.Private          6.3G  1.6G  4.4G  27% /home/xxx

.Private分区内容:

$ pwd
/home/xxxx/.Private
$ ls
ECRYPTFS_FNEK_ENCRYPTED.FWYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6B-0l.TGAjZjnshofl6TMQF---
ECRYPTFS_FNEK_ENCRYPTED.FWYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6Bdpm6RnbmADLIif6RGU1S5k--
ECRYPTFS_FNEK_ENCRYPTED.FWYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6BLUWJcoDqnHFsQ4A3epMc-E--
ECRYPTFS_FNEK_ENCRYPTED.FWYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6BS7V4kKNhThl7lqZKTP5ESk--
ECRYPTFS_FNEK_ENCRYPTED.FWYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6Bw8q1hT0peM0rGRaQYYWDzE--
ECRYPTFS_FNEK_ENCRYPTED.FWYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6BXMsQUOdEgj0L-co6klbTaE--
ECRYPTFS_FNEK_ENCRYPTED.FWYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6BZN3TyfKVLDHINFE1.88qzE--
ECRYPTFS_FNEK_ENCRYPTED.FWYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6BZUKbEf0KxQzl84GnQZl73E--
ECRYPTFS_FNEK_ENCRYPTED.FXYRZgbFHyb3vETJehOMeGaNdKMCGZhYJy6BV-b9978jYgqh05Dadlf8vsKlFwiW7mAteHwsvaUddlc-

用户目录加密

安装时,指定以下参数:

/images/2017_01_19_15_22_41_739x214.jpg

指定磁盘分区格式为基本格式(非LVM)。

检查磁盘分区:

$ df -h
Filesystem           Size  Used Avail Use% Mounted on
udev                 478M     0  478M   0% /dev
tmpfs                100M  3.3M   96M   4% /run
/dev/sda1            6.8G  1.1G  5.4G  17% /
tmpfs                497M  4.0K  497M   1% /dev/shm
tmpfs                5.0M     0  5.0M   0% /run/lock
tmpfs                497M     0  497M   0% /sys/fs/cgroup
tmpfs                100M     0  100M   0% /run/user/1000
/home/dash/.Private  6.8G  1.1G  5.4G  17% /home/dash
tmpfs                100M     0  100M   0% /run/user/1001

将网站转化为Android应用程序

写了几年博客,博文已有数百篇,于是我想能不能把每次需要上网搜索的过程改为在手机端本地查找呢?

看了下网上的解决方案,参考了以下这个,可以作为静态网站APP化的第一步。

参考链接:
http://www.vetbossel.in/convert-website-to-android-application/

构建开发环境

ArchLinux下安装android-studio的方法是通过yaourt:

$ yaourt -S android-studio

需要注意的是,安装过程中需要访问Google网站,因而需要代理(你懂的)。而安装完毕后,需要安装本地模拟器,下载 img也需要用到代理。确保你翻墙的速度够快。

运行模拟器会出错,可以通过以下两个步骤来纠正:

$ yaourt glxinfo
$ cd ~/Android/Sdk/tools/lib64/libstdc++/
$ mv libstdc++.so.6 libstdc++.so.6.back
$ ln -s /usr/lib/libstdc++.so.6 ~/Android/Sdk/tools/lib64/libstdc++/libstdc++.so.6

开发

开发步骤可以参考原文。

值得注意的是,在MainActivity.java文件中,第一行需要改正为正确的包名,否则会出现编译错误。

- package com.example.vetri.websitetoapplication;
+ package com.example.dash.websitetoapplication;

执行

实际运行的效果如下:

/images/2017_01_13_19_31_05_373x680.jpg

想法

在Android端已经可以有简单的Web服务器,考虑把hugo生成的网站内容上传到Android手机内的Web服务器上。

因为网站是本地化的,所以可以去掉一切不需要的插件,例如disqus之类。