Linux文件加密,目录机密,磁盘加密

在 Linux 上让 “打开文件需要输入密码”,核心是对文件 / 目录做加密,只有输入正确密码才能解密查看。下面按 “单文件”“目录 / 批量文件”“磁盘 / 容器” 三种场景,来演示下如何加密

、单文件加密

适合单个文档、脚本、配置等,打开 / 编辑必须输密码

1、Vim 内置加密(最简单,仅文本)

用 Vim 直接给文件加密码,仅用 Vim 打开时提示密码,其他工具打开是乱码

vim -x secret.txt #新文件或者已有文件都用此方式加密,会提示输入两次密码

加密后只有通过vim 打开文件输入密码后才能查看,通过cat打开也是乱码,如图:

  • 打开时:vim secret.txt → 提示输入密码,正确才显示明文
  • 取消加密:正确打开后,:X → 密码留空,保存即可
  • 缺点:算法较弱,不适合极高安全需求;仅文本文件

2、GPG 加密(通用、安全,推荐)

几乎所有发行版自带,支持任何文件类型,加密后生成 .gpg 文件,解密需密码

  • 优点:安全、跨平台、支持大文件;任何文件都能用
  • 缺点:需手动解密,不能 “双击直接打开
# 安装(如未预装)
sudo apt install gnupg  # Debian/Ubuntu
sudo dnf install gnupg  # RHEL/CentOS/Fedora

# 加密文件(对称加密,用密码)
gpg -c myfile.pdf  # 会提示输入两次密码,生成 myfile.pdf.gpg

# 解密/打开(自动提示输密码)
gpg -d myfile.pdf.gpg > myfile.pdf  # 输出到新文件
# 或直接解密覆盖原文件(谨慎)
gpg myfile.pdf.gpg

注:GPG 代理会缓存密码一段时间(默认 10 分钟到 2 小时),因此如果刚加密再解密不会提示输入密码,可执行命令清除缓存,然后在解密就提示输入密码了,如下:

gpgconf --kill gpg-agent
gpg-connect-agent reloadagent /bye

3、OpenSSL 加密(轻量、命令行友好)

用 AES-256 等强算法加密,适合脚本自动化

# 加密
openssl enc -aes-256-cbc -salt -in secret.txt -out secret.txt.enc
# 解密
openssl enc -d -aes-256-cbc -in secret.txt.enc -out secret.txt

二、对目录下的文件内容和文件名加密

eCryptfs(Enterprise Cryptographic Filesystem)是 Linux 内核内置的企业级、堆叠式文件级加密系统(自 2.6.19 内核起支持)。其核心功能是对指定目录下的文件内容与文件名进行透明加密,无需修改应用即可保护数据,即便设备丢失或被非法访问,未授权者也无法读取密文

核心功能讲解:

1、透明加密 / 解密(最核心)

  • 内核级堆叠:叠加在 ext4、XFS 等底层文件系统之上,不占用独立分区。
  • 无感使用:授权用户读写时自动解密 / 加密,应用程序完全无感知。
  • 文件粒度每个文件独立加密,互不影响。

2. 双重加密:内容 + 文件名

  • 文件内容加密
    • 每个文件生成唯一随机 FEK(文件加密密钥)
    • 用 AES-256 等强对称算法加密文件数据。
    • FEK 再被用户密码 / 密钥加密(EFEK),存在文件头部。
  • 文件名加密
    • 支持加密目录与文件名,彻底隐藏敏感信息。
    • 加密后文件名变长(约 1/3)。

3. 灵活密钥体系

  • 密码 / 密钥派生:从用户密码生成主密钥(FEKEK)。
  • 多级密钥
    • FEK:文件数据加密(随机生成)。
    • FEKEK:加密保护 FEK(用户密码 / 公钥)。
  • 内核密钥环:密钥安全缓存,会话期免重复输密码。
  • 扩展支持:TPM、PKCS#11、公钥加密(RSA)。

4. 便捷部署与迁移

  • 目录级加密:挂载到任意目录(如~/Private)。
  • 无需预分配空间:直接在现有目录启用。
  • 可迁移备份:加密文件 + 头部元数据,可直接复制 / 备份 / 恢复。
  • 用户 Home 加密:Ubuntu 等曾用它实现加密主目录。

5. 安全与兼容特性

  • 内核 Crypto API:高效、内核态加解密,性能损耗低。
  • OpenPGP 兼容格式:安全标准高、可跨信任域迁移ecryptfs.sourceforge.net。
  • POSIX 兼容:保留权限、属主、软硬链接等属性。
  • 不影响交换分区:需配合 dm-crypt 单独加密 swap

适用场景:

  • 个人 / 企业 敏感目录加密(文档、证书、代码)
  • 多用户服务器 用户 Home 隔离加密
  • 云服务器 / VPS 数据防泄露
  • 移动设备 丢失后数据保护
  • 文件级、可迁移、透明加密 的场景(非全盘)

eCryptfs使用

1、先安装包,如下:

sudo apt update && sudo apt install ecryptfs-utils

2、建两个目录(明文挂载点 + 底层加密存储)

# 上层:你日常用的解密目录,实际的业务文件是在这个目录下
mkdir -p ~/Private_Decrypt

# 下层:真正存加密文件的目录(千万别直接往这里写!)
mkdir -p /opt/ecryptfs_my_secret
chmod 700 /opt/ecryptfs_my_secret

3、执行命令挂载(加密目录在前,明文目录在后)

mount -t ecryptfs /opt/ecryptfs_my_secret ~/Private_Decrypt
  • Passphrase: 输入你强密码(记住!丢了数据全没
  • Select cipher: 选 aes
  • Select key bytes: 选 32(AES-256)
  • Enable plaintext passthrough: n (选n 表示传递来的文件全部加密)
  • Enable filename encryption: y (文件名也加密)

注:挂载成功后:往 ~/Private_Decrypt 写文件,自动加密;底层 /opt/ecryptfs_my_secret 全是乱码密文。

4、验证下,想~/Private_Decrypt中创建文件写入内容,然后查看/opt/ecryptfs_my_secret中的文件,如图:

5、卸载加密目录

退出所有该目录程序,再执行:

 umount ~/Private_Decrypt

卸载后,~/Private_Decrypt 看不到真实内容(是空的,没有任何内容),必须重新输密码挂载才行

6、日常运维关键操作:

查看当前 eCryptfs 挂载:

mount | grep ecryptfs

忘记挂载参数,重新交互式挂载:

mount -t ecryptfs 底层目录 挂载点

备份加密数据,只备份底层加密目录就行,/opt/ecryptfs_my_secret 整个打包复制,换机器也能挂载解密(只要密码一致),不要直接备份解密目录!那是明文

开机自动挂载(慎用,存密码有风险)

7、常见报错 & 坑

Input/output error 打不开文件:

  • 没正确卸载就拔盘 / 重启,加密元数据损坏
  • 解决:先 umount,检查底层目录权限 700,重新挂载核对密码、文件名加密开关一致

挂载提示参数不匹配:

  • 前后:AES、32 位密钥、文件名加密 y/n 必须和第一次完全一致

Docker / 容器里用报错:

  • eCryptfs 叠加文件系统,容器直通挂载容易权限 /inode 冲突;不建议把 eCryptfs 目录直接给 Docker 做数据卷,优先 LUKS 块加密更稳

总结下ecryptfs主要能干啥:把一个加密目录挂载到一个明文目录中,然后在明文目录中写入数据,如果我卸载了加密目录,那么明文直接就看不到了,应用挂掉,如果想继续重新使用,可以重新挂载,只有知道了密码才能重新挂载,否则数据全部丢失

三、对整个磁盘加密

LUKS = Linux Unified Key Setup,主要功能是给整个磁盘/分区进行加密

核心作用:

1、加密整个分区 / 磁盘(块级加密):

  • /dev/sda3 整个系统盘,整个移动硬盘、U 盘、整个数据分区(写入的所有数据(系统、文件、日志、缓存、临时文件、swap 交换分区)全部自动加密,内核底层加解密,上层系统完全无感)

2、开机 / 挂载必须输密码 / 插密钥

  • 没密码 → 分区直接识别不了,全盘都是乱码;
  • 丢硬盘、被盗、拆盘读数据 → 完全扒不出来

3、支持多密码槽(非常实用),一个 LUKS 加密盘,可以存多个解锁密码 / 密钥

  • 日常自己用主密码
  • 留一个备用应急密码
  • 用 U 盘密钥文件解锁

4、系统级全覆盖

  • 包括临时文件、缓存、swap 虚拟内存、残留日志 ——全部加密不留明文痕迹,这是 eCryptfs 做不到的

LUKS vs eCryptfs 直白对比

对比项LUKS(dm-crypt)eCryptfs
加密层级整块磁盘 / 分区(块级)文件夹 / 文件(文件级)
要不要独立分区必须单独分区 / 整块盘随便一个目录就行
加密范围所有数据、日志、缓存、swap 全覆盖只保护你指定的那个目录
删除文件彻底密文删除,无残留删明文视图 = 删真实加密文件
迁移拷贝整个分区镜像迁移,不能单拷文件可单独拷贝单个加密文件 / 目录
适合场景装机全盘加密、服务器整盘保密、移动硬盘加密只加密个别隐私文件夹、证书、私密文档
Docker / 容器稳定兼容,生产首选容易出 IO 报错、不推荐容器用

LUKS 是块级加密,依赖:cryptsetup + dm-crypt

⚠️ 警告:所有操作会清空目标磁盘 / 分区数据!先备份分清设备,别炸系统盘!

实际操作

1、安装工具,如下:

apt update && sudo apt install cryptsetup

2、给Linux服务器新增一块盘,并将此盘进行分区,先不用执行mkfs来格式化,如图:

3、给分区初始化 LUKS 加密(写加密头),给分区写入 LUKS 头部、生成加密密钥槽,整个分区变成密文容器,如下:

cryptsetup luksFormat /dev/vdb1
  • 输入大写 YES 确认(必须全大写)
  • 设置强解锁密码(牢记,丢了数据永久报废)

4、打开 LUKS 容器,映射成系统可识别虚拟设备,如下:

cryptsetup luksOpen /dev/vdb1 mycrypt
  • mycrypt:自定义映射名,然后输入刚才设置的密码

执行后会生成虚拟块设备,执行fdisk -l 可以查看,如图:

5、在加密容器里建文件系统,格式化为xfs,如下:

mkfs.xfs /dev/mapper/mycrypt

6、挂载使用,如下:

mkdir -p /datanew
mount /dev/mapper/mycrypt /datanew

现在往/datanew中存文件 → 底层自动全盘加密,拆盘、读裸分区全是乱码

7、日常卸载 & 关闭加密(安全拔盘)

卸载:

umount /datanew

关闭 LUKS 映射,关闭后:/dev/mapper/mycrypt 消失,分区彻底锁死

cryptsetup luksClose mycrypt   #要先退出/datanew目录,否则会提示Device mycrypt is still in use

下次重新使用方法:

# 1.打开加密
sudo cryptsetup luksOpen /dev/vdb1 mycrypt
# 2.挂载
sudo mount /dev/mapper/mycrypt /mnt/luks_data

8、进阶

查看 LUKS 信息 / 密钥槽

cryptsetup luksDump /dev/vdb1

添加新的备用密码,后续用备用密码挂载也可以的:

# 1. 添加新密码
sudo cryptsetup luksAddKey /dev/sdb1

# 2. 系统提示:输入【已存在的正确密码】
Enter any existing passphrase:  【输入你原来的主密码】

# 3. 系统提示:输入【新的备用密码】
Enter new passphrase for key slot:  【你想加的备用密码】

# 4. 确认新密码
Verify passphrase:  【再输一遍】

删除不用密码槽:

cryptsetup luksRemoveKey /dev/sdb1

标签