今天跟大家唠唠我最近折腾的,关于打开加密设备时验证用户口令的那些事儿。一开始我也是一头雾水,各种资料满天飞,但真正落到实处,还是得自己一步一个脚印地摸索。
我的需求很简单,就是给我的移动硬盘加个密,每次插电脑上的时候,都得输入密码才能访问。防止哪天不小心丢,里面的重要文件被人一览无余。
一开始我尝试几个第三方的加密软件,用起来是方便,但总感觉不太放心,万一软件本身有啥问题,或者哪天不更新,我的数据不就凉凉?我决定还是用系统自带的工具来搞。
我用的是Linux系统,所以自然就想到`LUKS` (Linux Unified Key Setup)。这玩意儿听起来挺高大上,用起来也还行。
我先是找个空闲的硬盘分区,然后开始折腾。
1. 安装`cryptsetup`: 这是使用LUKS的必备工具,直接`apt-get install cryptsetup`(或者`yum install cryptsetup`,看你用的啥发行版)就搞定。
2. 格式化分区为LUKS: 这一步很关键,我用的是`cryptsetup luksFormat /dev/sdb1`,注意`/dev/sdb1`是我的硬盘分区,你得根据自己的情况改。执行这个命令的时候,会提示你输入密码,这个密码就是以后打开加密设备要用的,一定要记住!
3. 打开LUKS分区: 格式化完之后,就可以打开分区,命令是`cryptsetup luksOpen /dev/sdb1 my_encrypted_volume`。这里的`my_encrypted_volume`是你给这个加密卷起的名字,随便起一个就行。
4. 格式化加密卷: 打开之后,实际上只是创建一个虚拟设备,还需要在这个虚拟设备上创建文件系统。我用的是`*4 /dev/mapper/my_encrypted_volume`。
5. 挂载加密卷: 文件系统创建好之后,就可以挂载这个加密卷。先创建一个挂载点,比如`mkdir /mnt/encrypted`,然后执行`mount /dev/mapper/my_encrypted_volume /mnt/encrypted`。
到这里,一个简单的加密分区就搞定。你可以往`/mnt/encrypted`里面放文件,放完之后,卸载分区,命令是`umount /mnt/encrypted`,然后关闭加密卷,命令是`cryptsetup luksClose my_encrypted_volume`。
下次想用的时候,就先`cryptsetup luksOpen /dev/sdb1 my_encrypted_volume`,输入密码,然后`mount /dev/mapper/my_encrypted_volume /mnt/encrypted`,就能访问里面的文件。
但是,这个过程还是有点繁琐,每次都要手动输入命令。于是我就想能不能搞个自动化的脚本,插上硬盘就自动打开,拔掉就自动关闭。
我写一个简单的`udev`规则,当检测到我的硬盘插入时,就自动执行一个脚本。这个脚本会先检查硬盘是否已经加密,如果已经加密,就提示用户输入密码,然后自动打开并挂载加密卷。拔出硬盘时,就自动卸载并关闭加密卷。
具体步骤如下:
1. 创建`udev`规则文件: 在`/etc/udev/rules.d/`目录下创建一个规则文件,比如`*`。
2. 编写规则内容: 在规则文件中添加以下内容(需要根据你的实际情况修改):
KERNEL==”sd[b-z]1″, SUBSYSTEM==”block”, ATTRS{idVendor}==”xxxx”, ATTRS{idProduct}==”yyyy”, ACTION==”add”, RUN+=”/path/to/mount_*”
KERNEL==”dm-[0-9]”, SUBSYSTEM==”block”, ACTION==”remove”, ENV{DM_NAME}==”my_encrypted_volume”, RUN+=”/path/to/umount_*”
这里的`xxxx`和`yyyy`分别是你的硬盘的Vendor ID和Product ID,可以用`lsusb`命令查看。`mount_*`和`umount_*`是你要执行的脚本的路径。
3. 编写`mount_*`脚本:
bash
#!/bin/bash
# 检查是否已经挂载
if mountpoint /mnt/encrypted; then
exit 0
fi
# 提示用户输入密码
read -s -p “请输入加密设备密码: ” password
echo
# 打开加密卷
cryptsetup luksOpen /dev/%k my_encrypted_volume <<< "$password"
# 挂载加密卷
mount /dev/mapper/my_encrypted_volume /mnt/encrypted
# 清空密码变量,防止泄露
unset password
4. 编写`umount_*`脚本:
bash
#!/bin/bash
# 卸载加密卷
umount /mnt/encrypted
# 关闭加密卷
cryptsetup luksClose my_encrypted_volume
5. 设置脚本权限: 给这两个脚本添加执行权限,`chmod +x /path/to/mount_*`和`chmod +x /path/to/umount_*`。
6. 重新加载`udev`规则: 执行`udevadm control –reload-rules`和`udevadm trigger`。
这样,每次插上硬盘,就会自动弹出密码输入框,输入密码后,加密卷就会自动挂载到`/mnt/encrypted`,拔出硬盘时,就会自动卸载并关闭。
这只是一个简单的示例,还有很多可以优化的地方。比如,可以添加错误处理,防止密码错误或者挂载失败;可以使用图形界面提示用户输入密码,等等。
通过这回实践,我对LUKS的原理和使用有更深入的解,也学会如何使用`udev`规则来实现一些自动化的操作。虽然过程有点曲折,但最终还是实现我的需求。希望我的经验能对你有所帮助。