#
# PAM认证与加密文件系统
# http://www.linuxsir.org/bbs/showthread.php?t=211899
# http://www.ubuntufans.com.cn/html/02/n-102.html
# http://forums.gentoo.org/viewtopic-t-27 ... eb524406d5
*. PAM 介绍: 查看以上链接
*. 在 ubuntu 8.04 里安装
代码: 全选
apt-get install libpam-mount openssl dmsetup cryptsetup
代码: 全选
KEY=`tr -cd [:graph:] < /dev/urandom | head -c 79`
代码: 全选
echo $KEY | openssl aes-256-ecb > /home/user1_dc.key
3. 格式化分区 /dev/sdb5 (!注意查看自己的分区名)
代码: 全选
openssl aes-256-ecb -d -in /home/user1_dc.key | cryptsetup -v -c aes -s 256 luksFormat /dev/sdb5
## 也可以用文件代替
# dd if=/dev/zero of=/home/user1_dc.img bs=1M count=100
# losetup /dev/loop0 /home/user1_dc.img
# openssl aes-256-ecb -d -in /home/user1_dc.key | cryptsetup -v -c aes -s 256 luksFormat /dev/loop0
代码: 全选
openssl aes-256-ecb -d -in /home/user1_dc.key | cryptsetup luksOpen /dev/sdb5 user1_dc
# openssl aes-256-ecb -d -in /home/user1_dc.key | cryptsetup luksOpen /dev/loop0 user1_dc
5. 创建FS (注意:设备是 /dev/mapper/ 里的,不是 /dev/sdb5 或 /dev/loop0)
代码: 全选
mkfs.reiserfs /dev/mapper/user1_dc
代码: 全选
mkdir /media/test
mount /dev/mapper/user1_dc /media/test
chown user1: /media/test -R
echo "TEST" > /media/test/testfile1
umount /dev/mapper/user1_dc
代码: 全选
cryptsetup luksClose user1_dc
# losetup -d /dev/loop0
8. 设置
libpam-mount 包带一个 /etc/pam.d/common-pammount 配置文件,
在 /etc/pam.d/ 里的 login gdm 等与用户登录有关的程序里加上一行 @include common-pammount
代码: 全选
echo "@include common-pammount" >> /etc/pam.d/login
echo "@include common-pammount" >> /etc/pam.d/gdm
更不要加到 common-auth 和 common-session 里,以 common- 开头的认证配置几乎每个服务的配置都会包含它们
另外,在安装 pam-mount 时会提示是否转换 /etc/security/pam_mount.conf 文件格式之类的
*) 如果有 /etc/security/pam_mount.conf.xml ,则在文件尾部(</pam_mount>)之前加入
在 /etc/security/pam_mount.conf.xml 文件里有很多示例
代码: 全选
<volume
user="user1"
invert="0"
fstype="crypt"
path="/dev/sdb5"
mountpoint="/home/CRYPTO_d1"
options="user,exec"
fskeycipher="aes-256-ecb"
fskeypath="/home/user1_dc.key" />
<!--
<volume
user="user1"
invert="0"
fstype="crypt"
path="/home/user1_dc.img"
mountpoint="/home/CRYPTO_d1"
options="loop,user,exec"
fskeycipher="aes-256-ecb"
fskeypath="/home/user1_dc.key" />
-->
<!-- invert为0时,只有user选项中列出的用户登录时挂载这个卷,为1时表示除了user里列出的用户外登陆时都执行挂载 -->
代码: 全选
# volume <user> <type> <server> <volume> <mount point>
# <mount options> <fs key cipher> <fs key path>
volume user1 crypt - /dev/sdb5 /home/CRYPTO_d1 user,exec aes-256-ecb /home/user1_dc.key
#volume user1 crypt - /home/user1_dc.img /home/CRYPTO_d1 loop,user,exec aes-256-ecb /home/user1_dc.key
**. pam_mount 工作流程:
用户执行如登录程序登录系统时,pam-mount模块根据设置判断当前用户是否要执行 mount 某个卷,
如果是就根据设置用用户登陆口令解密 /home/user1_dc.key 文件,得到 aes 密码,使用 aes 密码打开分区和挂载
gdm 登录时可能会提示输入两次密码,一次是登录密码,一次是解密 /home/user1_dc.key 的密码
**. 问题:可能还有设置选项没有设置
*) 如果在 /etc/pam.d/common-auth 里添加了 auth optional pam_mount.so use_first_pass
在 /etc/pam.d/common-session 里添加 session optional pam_mount.so
或者在 /etc/pam.d/su 和 /etc/pam.d/sshd 里添加了 @include common-pammount
在 ssh 登录以及用 su 切换用户都会挂载分区,但退出时不会自动卸载
相关信息: 设置 /etc/security/pam_mount.conf.xml 里 debug=1 后,用户登录退出后查看 /var/log/auth.log
查看 pmvarrun 程序及 /var/run/pam_mount/ 下以用户名为名字的文件
ssh 登陆及 su 切换用户的用户在 logout/exit 时,pam_mount 的日志显示没有权限 umount ?? 分区
https://bugs.launchpad.net/ubuntu/+sour ... bug/117736
https://lists.sourceforge.net/lists/lis ... mount-user
opensuse 10.3 的能 su ,exit 能自动卸载,ssh 登录不自动挂载,没有仔细对比
*) 如果配置里设置了user选项并且invert值为1,在user中未列出的不同用户如果密码相同,即密码能用来解密 /home/user1_dc.key 文件,则都会挂载分区!!
*) 在开启 selinux 后,cryptsetup 格式化设备,登录挂载设备都非常慢
*)
**. 其它:
*) 在一个单独分区加密用户数据,设置 mountpoint="~" 挂载点为用户家目录,把密码文件存优盘随身携带,理论上别人得了你的硬盘也看不到里面的艳照了(如果有的话) zz

*) 登陆时如果挂载失败,需要手工挂载,执行 4, 6, 7 步骤
*) 用户更改了登录密码,也应该更改 aes 密码文件的解密密码。
代码: 全选
mv /home/user1_dc.key /home/user1_dc_old.key
KEY=`openssl aes-256-ecb -d -in /home/user1_dc_old.key`
echo $KEY | openssl aes-256-ecb > /home/user1_dc.key
密码文件应该多做几个备份,丢失了密码文件和忘记了解密 /home/user1_dc.key 的口令,那应该是一件很悲惨的事。。。 ^&^
## 如果你的电脑真的很重要,或者以为自己是一个人物,系统的根分区、交换分区都能加密,参考:
# 加密文件系统
# http://www.hacker.com.cn/article/view_13676_4.html
# http://wiki.ubuntu.org.cn/UbuntuHelp:En ... stemHowto3
# http://wiki.ubuntu.org.cn/UbuntuHelp:En ... mHowtoEdgy
# http://www.debian.org/releases/stable/s ... html.zh_CN
# ==============================================================================