Jan 22, 2017
Technology背景
最近一直在看关于LINUX磁盘加密的东西,也尝试了文件加密、扇区加密、全盘加密等方面。
然而每次都需要输入密码这种事情对一个追求速度的人来说似乎有点浪费时间,而且每次重新
都需要输入密码也无法适用于自动化运维的场合。因而我根据网上提到的方法制作了一个
从USB磁盘读取密钥以解密加密全盘的方法。下面是对应的实现过程。
Debian系统安装
从镜像网站下载Debian
8(jessie)的DVD安装源,在Virtualbox中创建一台虚拟机,插入
ISO后,光盘启动系统进入到以下界面:

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

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

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

创建一个新的分区:

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

选择为主分区:

Location选择,从Beginning开始:

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

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



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

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

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

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

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

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

选择yes后,选择Create encrypted volumes:

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

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

确定写入磁盘:

写入过程:

此时需要定义密码:

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

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


同样改变swap分区:

确定写入磁盘:

接下来继续安装,并在安装的最后一步将BootLoad写入MBR。
安装完毕后,重新启动机器后,需要输入密码才能进入系统:


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

使用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配置文件也需要进行相应的修改,以添加rootdelay和cryptopts选项:
$ 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
最后的启动过程可以参考:

总结
这里使用一个USB存储设备打开了LINUX系统里的一个加密盘,一个自动化脚本
被用来在启动时为机密卷提供一个用于解密的secret key.
Bug
按照原教程里的配置,导致swap分区无法被激活,我觉得可能需要添加关于swap分区的选项。
更新,在分区指定swap分区加密的时候,选定密码类型为random password.
Jan 21, 2017
Life想起来有段时间没去火炉山-凤凰山玩了,看今天天气不错,出去走走。
6号线开通后可以直接坐地铁到龙洞,省掉了之前地铁转公交的繁琐,10点多才出发,一个小时
不到就可以到达火炉山山脚。
今天广州的画风是这样的:

火炉:

凤凰:

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

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

一颗枯死的树:

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

一位玩越野跑的女侠:

一位玩午睡的男侠:

此处风景甚妙:

筲箕窝水库:

木强水库:

秋叶红胜二月花:

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


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

草莓25一斤,可自采:

全程耗时3小时,全程步行大约18公里。冬日温度适宜,恰是登山之好时节。
Jan 20, 2017
TechnologyAim
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.
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)
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),
Jan 19, 2017
Technology目的
调研Linux虚拟机磁盘加密
环境
Ubuntu16.04 LTS/Libvirt.
全盘加密
选择磁盘全盘加密,需要在系统安装时指定encrypted LVM:

指定加密的密码:

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

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

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

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-
用户目录加密
安装时,指定以下参数:

指定磁盘分区格式为基本格式(非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
Jan 13, 2017
Technology写了几年博客,博文已有数百篇,于是我想能不能把每次需要上网搜索的过程改为在手机端本地查找呢?
看了下网上的解决方案,参考了以下这个,可以作为静态网站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;
执行
实际运行的效果如下:

想法
在Android端已经可以有简单的Web服务器,考虑把hugo生成的网站内容上传到Android手机内的Web服务器上。
因为网站是本地化的,所以可以去掉一切不需要的插件,例如disqus之类。