本文最后更新于11 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
零、实验环境准备
目标: 准备一个Linux环境(推荐Ubuntu/Debian系列,因为命令是 apt
),并创建所需用户和用户组。
操作(以root或有sudo权限的用户执行):
- 更新系统并安装必要工具: Bash
sudo apt update sudo apt upgrade -y sudo apt install -y ecryptfs-utils acl
ecryptfs-utils
: 用于eCryptfs加密。acl
: 用于支持和管理ACL(通常默认已安装,确保一下)。
- 创建用户: Bash
sudo adduser data_admin sudo adduser hr_user sudo adduser finance_user sudo adduser guest_user
(为每个用户设置密码,并根据提示输入用户信息,或直接回车跳过) 【截图:用户创建过程】 - 创建用户组: Bash
sudo addgroup hr_group sudo addgroup finance_group
【截图:用户组创建过程】 - 将用户添加到相应的组: Bash
sudo usermod -aG hr_group hr_user sudo usermod -aG finance_group finance_user # data_admin 通常不需要加入业务组,他是管理员 # guest_user 不加入特定业务组
验证用户组分配(可选): Bashgroups hr_user groups finance_user
【截图:用户加入组及验证命令】
一、实验方案概览(已由您提供,核心不变)
- 模拟企业场景,有敏感数据。
- 使用eCryptfs加密专门存放敏感数据的目录(静态加密)。
- 使用ACL对解密后的数据进行精细化的访问控制(动态访问控制)。
- 测试不同用户、不同权限的场景。
二、实验目的(已由您提供,核心不变)
- 掌握eCryptfs工具进行目录加密、挂载、卸载的基本操作。
- 理解eCryptfs提供的静态数据加密如何保护数据。
- 掌握使用
setfacl
和getfacl
命令配置和查看ACL。 - 实践数据目录级静态加密与操作系统层面文件访问控制相结合的安全策略。
三、详细实验步骤
4.2 eCryptfs加密目录设置
(宋体,四号)
- 安装eCryptfs工具 (已在步骤零完成)
- 命令: Bash
# (正文,宋体,小四) sudo apt update sudo apt install ecryptfs-utils # For Debian/Ubuntu # sudo yum install ecryptfs-utils # For CentOS/RHEL (可能需要EPEL源)
- 命令: Bash
- 创建底层加密目录和挂载点 (以data_admin用户操作,或root用户创建后授权给data_admin)
- 首先,切换到
data_admin
用户。如果当前是root,可以直接创建并修改权限。为简单起见,我们先用root创建,然后更改所有者为data_admin
。
# 以 root 用户操作 sudo mkdir /home/data_admin/.sensitive_storage_encrypted sudo mkdir /home/data_admin/sensitive_data_decrypted sudo chown data_admin:data_admin /home/data_admin/.sensitive_storage_encrypted sudo chown data_admin:data_admin /home/data_admin/sensitive_data_decrypted
- 然后,切换到
data_admin
用户进行后续操作:
su - data_admin
- 验证目录已创建并属于
data_admin
:
ls -ld /home/data_admin/.sensitive_storage_encrypted ls -ld /home/data_admin/sensitive_data_decrypted
【截图:目录创建及chown命令,ls -ld验证结果】 - 首先,切换到
- 首次挂载并设置eCryptfs (以data_admin用户身份执行)
- 作为
data_admin
用户执行 (需要sudo
权限来执行mount
,或者root
用户执行此命令):
# 确保当前是 data_admin 用户,或者由 root 代为执行并确保后续操作目录权限正确 # 如果 data_admin 没有直接 sudo mount 的权限,可以让 root 执行, # 或者将 data_admin 加入 sudoers (不推荐用于普通用户) # 这里我们假设由有 sudo 权限的用户(可以是 data_admin 如果配置了,或者 root)执行 sudo mount -t ecryptfs /home/data_admin/.sensitive_storage_encrypted /home/data_admin/sensitive_data_decrypted
- 系统将引导您完成一系列设置:
Passphrase:
输入一个强密码 (例如:MySecureP@$$wOrd123) – 务必记住这个密码!Select cipher:
推荐[1]
foraes
(按回车选择默认)。Select key bytes:
推荐[2]
for32
(AES-256) (按回车选择默认,如果32是默认选项之一的话;否则输入2或对应数字)。Enable plaintext passthrough (y/n) [n]:
输入n
(不启用)。Enable filename encryption (y/n) [y]:
输入y
(启用文件名加密)。
- 挂载成功后,系统可能会提示:
Attempting to mount with the following options:
并列出选项,然后提示Mounted eCryptfs
。它可能还会提示你将签名写入~/.ecryptfs/sig-cache.txt
或类似文件,并建议将挂载命令加入脚本。按提示操作(通常是yes)。
- 作为
4.3 在解密目录中操作数据,并通过卸载实现“加密”
(宋体,四号)
- 在已挂载的解密目录中创建/移动敏感文件 (以data_admin用户操作):
- 确保您仍是
data_admin
用户,并且目录已成功挂载。
# 确保当前是 data_admin 用户 # id # 确认当前用户 cd /home/data_admin/sensitive_data_decrypted pwd # 应该显示 /home/data_admin/sensitive_data_decrypted echo "This is confidential employee data for Alice." > employee_records.txt echo "Q1 Financial Statement: Profit reported." > financial_statements.docx echo "Project Phoenix details - Top Secret." > shared_project_plan.pdf ls -l
【截图:cd进入挂载点,pwd确认,创建文件命令,ls -l 显示正常文件名和大小】 - 确保您仍是
- 查看底层加密目录的内容 (此时应为加密后的乱码文件名和内容): Bash
# 仍然作为 data_admin 用户 ls -l /home/data_admin/.sensitive_storage_encrypted/
- 您会看到类似
ECRYPTFS_FNEK_ENCRYPTED. وباGa4uM...
这样的加密文件名。 - 尝试查看其中一个文件的内容:
# 从上面的ls输出中复制一个加密文件名替换下面的示例名 cat /home/data_admin/.sensitive_storage_encrypted/ECRYPTFS_FNEK_ENCRYPTED.RandomCharactersAndSoOn
- 内容应该是不可读的乱码。
- 您会看到类似
- 卸载eCryptfs目录 (实现数据的静态加密保护):
- 确保当前不在挂载点目录内。
# 仍然作为 data_admin 用户,或有卸载权限的用户 (root) cd ~ # 返回到 data_admin 的主目录,确保不在挂载点内 sudo umount /home/data_admin/sensitive_data_decrypted
【截图:cd ~ 命令,umount命令执行成功】 - 验证卸载后数据是否受保护: Bash
# 仍然作为 data_admin 用户 ls -l /home/data_admin/sensitive_data_decrypted/ # 此时目录应为空,或者显示底层目录内容(通常是空的,因为挂载点本身只是一个“窗口”) ls -l /home/data_admin/.sensitive_storage_encrypted/ # 依然是加密文件名和内容 # 尝试直接访问底层加密文件,应无法直接使用 cat /home/data_admin/.sensitive_storage_encrypted/ECRYPTFS_FNEK_ENCRYPTED.TheSameRandomNameYouUsedBefore # 依然是乱码
【截图:卸载后挂载点 ls -l (应为空),底层加密目录 ls -l (仍是加密文件名),cat 底层文件 (仍是乱码)】
4.4 ACL权限配置 (基本不变)
(宋体,四号)
ACL的配置对象是解密后挂载点内的文件。操作时机:必须在eCryptfs目录被挂载(解密)之后。
- 首先确保目录已挂载 (data_admin 或 root):
- 作为
data_admin
(或root
) 重新挂载加密目录:
# 如果当前不是 data_admin,先 su - data_admin # 或者由 root 执行 sudo mount -t ecryptfs /home/data_admin/.sensitive_storage_encrypted /home/data_admin/sensitive_data_decrypted
- 系统会再次要求输入之前设置的参数:
Passphrase:
输入之前记录的密码Select cipher:
选择之前记录的 (通常是 aes)Select key bytes:
选择之前记录的 (通常是 32)Enable plaintext passthrough (y/n) [n]:
输入n
Enable filename encryption (y/n) [y]:
输入y
- 如果提示签名问题,通常选择
yes
将其添加到缓存。
- 作为
- data_admin (或root) 进入挂载点设置ACL:
- 确保当前用户是
data_admin
(或root
)。为了方便,以下命令均使用sudo
,这样data_admin
若在sudoers
组也可以执行,否则root
执行。
cd /home/data_admin/sensitive_data_decrypted/ # employee_records.txt: hr_user (rw), hr_group (r), others (---) sudo setfacl -m u:hr_user:rw- employee_records.txt sudo setfacl -m g:hr_group:r-- employee_records.txt sudo setfacl -m o::--- employee_records.txt # financial_statements.docx: finance_user (rw), finance_group (r), others (---) sudo setfacl -m u:finance_user:rw- financial_statements.docx sudo setfacl -m g:finance_group:r-- financial_statements.docx sudo setfacl -m o::--- financial_statements.docx # shared_project_plan.pdf: hr_user (r), finance_user (r), others (---) # 注意:这里需要两次 -m u:: 来为不同用户设置权限 sudo setfacl -m u:hr_user:r-- shared_project_plan.pdf sudo setfacl -m u:finance_user:r-- shared_project_plan.pdf sudo setfacl -m o::--- shared_project_plan.pdf
- 确保当前用户是
- 验证ACL设置: Bash
getfacl employee_records.txt getfacl financial_statements.docx getfacl shared_project_plan.pdf
【截图:所有 setfacl 命令成功执行,以及每个 getfacl 命令的输出结果,清晰显示权限分配】
4.5 访问测试 (核心逻辑不变,但操作对象是挂载点内文件)
(宋体,四号)
前提: data_admin
(或系统管理员 root
) 必须先将eCryptfs目录挂载到 /home/data_admin/sensitive_data_decrypted/
。 如果目录未挂载,执行以下命令确保其挂载 (使用 data_admin
或 root
):
Bash
# 如果未挂载,先执行 (作为 data_admin 或 root):
# sudo mount -t ecryptfs /home/data_admin/.sensitive_storage_encrypted /home/data_admin/sensitive_data_decrypted
# (输入之前设置的密码和选项)
# 验证挂载成功:
# mount | grep ecryptfs
# ls /home/data_admin/sensitive_data_decrypted/
场景1: hr_user 访问 /home/data_admin/sensitive_data_decrypted/employee_records.txt (授权访问)
- 切换到
hr_user
: Bashsu - hr_user
- 尝试访问: Bash
cd /home/data_admin/sensitive_data_decrypted/ ls -l employee_records.txt # 检查是否能看到,并注意权限位旁的 `+` 号表示有ACL cat employee_records.txt # 尝试读取 (应该可以,看到的是明文内容 "This is confidential employee data for Alice.") echo "New line added by hr_user." >> employee_records.txt # 尝试写入 (应该可以,因为ACL允许rw) cat employee_records.txt # 验证写入成功
- 尝试访问不被授权的文件 (例如
financial_statements.docx
,hr_user
对其没有直接ACL权限,只有others
的---
权限): Bashcat financial_statements.docx # 应该提示 Permission denied
- 返回到之前的用户 (例如
data_admin
或root
):exit
【截图:su - hr_user
,ls
成功,cat
成功显示明文内容,echo
写入操作成功,再次 cat
验证。cat financial_statements.docx
提示 Permission denied】
场景2: guest_user 尝试访问 (ACL阻止)
- (确保eCryptfs目录已挂载 by data_admin/root)
- 切换到
guest_user
: Bashsu - guest_user
- 尝试访问: Bash
cd /home/data_admin/sensitive_data_decrypted/ ls -l employee_records.txt # 可能看不到文件(如果目录本身对others没有x权限),或者看到但权限不足 cat employee_records.txt # 应该提示 Permission denied
- 返回到之前的用户:
exit
【截图:su - guest_user
,ls
可能看不到文件或看到权限不足 (显示 ----------+
),cat
提示 Permission denied】
场景3: 数据在未挂载状态下的安全性
- 首先,作为
data_admin
或root
卸载目录: Bash# 切换回 data_admin 或 root # exit (如果当前是 guest_user, 再 exit 如果之前是 hr_user) # id (确认用户) sudo umount /home/data_admin/sensitive_data_decrypted
- 现在,任何用户 (包括
hr_user
,finance_user
,guest_user
, 甚至data_admin
自己) 尝试访问底层加密目录中的文件。 - 例如,切换到
hr_user
: Bashsu - hr_user
- 尝试访问: Bash
ls -l /home/data_admin/.sensitive_storage_encrypted/ # 应该能看到加密的文件名 # 从上面的ls输出中复制一个加密文件名 cat /home/data_admin/.sensitive_storage_encrypted/ECRYPTFS_FNEK_ENCRYPTED.SomeRandomNameUsedBefore # 内容应该是乱码
- 尝试访问已卸载的挂载点: Bash
ls -l /home/data_admin/sensitive_data_decrypted/ # 应该是空的 cat /home/data_admin/sensitive_data_decrypted/employee_records.txt # 应该提示 No such file or directory
- 返回到之前的用户:
exit
【截图:umount
命令成功。切换到 hr_user
,ls
底层目录显示加密文件名,cat
底层加密文件显示乱码。ls
挂载点目录为空,cat
文件提示 No such file or directory。】
四、实验结果与分析 (调整侧重点)
- 总结每个测试场景的结果,是否符合预期。
- eCryptfs 设置与操作:
- 首次挂载是否成功引导完成密码和加密选项设置?(预期:是)
- 在挂载点创建文件后,底层目录
/.sensitive_storage_encrypted/
是否显示加密文件名和内容?(预期:是,如果文件名加密选择y) - 卸载
sensitive_data_decrypted
目录后,该目录是否变空?(预期:是) - 卸载后,
/.sensitive_storage_encrypted/
中的文件是否依旧保持加密状态?(预期:是) - 重新挂载时,使用正确的密码和选项是否能成功解密并访问之前创建的文件?(预期:是)
- ACL 权限测试 (目录挂载后):
hr_user
是否能读写employee_records.txt
?(预期:是)hr_user
是否能读取shared_project_plan.pdf
?(预期:是)hr_user
是否能访问financial_statements.docx
?(预期:否,Permission denied)finance_user
是否能读写financial_statements.docx
?(预期:是,需自行测试此部分,步骤类似hr_user)finance_user
是否能读取shared_project_plan.pdf
?(预期:是,需自行测试)guest_user
是否能访问employee_records.txt
或任何其他敏感文件?(预期:否,Permission denied)
- 未挂载状态下的安全性测试:
- 当 eCryptfs 目录未挂载时,任何用户(包括
data_admin
,hr_user
)尝试直接访问/.sensitive_storage_encrypted/
目录下的文件,是否只能看到加密的文件名和加密内容?(预期:是)
- 当 eCryptfs 目录未挂载时,任何用户(包括
- eCryptfs 设置与操作:
- 分析eCryptfs目录加密和ACL权限在此实验中各自扮演的角色和提供的安全保障。
- eCryptfs:
- 角色: 提供数据的静态加密(Data at Rest Encryption)。
- 安全保障: 当目录未挂载时,数据以加密形式存储在物理磁盘上。即使磁盘被盗、服务器被非法访问(离线攻击),或者其他用户绕过正常文件系统直接查看底层存储,也无法获取明文数据。如果文件名加密被启用,连文件名也是不可识别的。它保护数据免受未经授权的物理访问或系统级绕过。
- ACL:
- 角色: 提供数据解密后(目录挂载后)在操作系统层面的细粒度访问控制(Data in Use Protection / Access Control)。
- 安全保障: 当加密目录被合法用户(如
data_admin
)挂载并解密后,数据在挂载点以明文形式存在。此时,ACL负责根据预设的规则,控制已登录系统的不同用户和用户组对这些明文文件的读、写、执行权限。它确保了即使数据已解密,也只有授权用户可以按其权限访问。
- eCryptfs:
- 讨论这种组合策略的优势和潜在的不足。
- 优势:
- 纵深防御: 结合了两种不同层面的安全机制。eCryptfs 防止数据泄露于物理层面或系统离线状态;ACL 防止合法用户在系统运行时越权访问已解密数据。
- 职责分离(潜在):
data_admin
(或系统管理员) 负责加密和挂载/卸载敏感数据区域,而文件所有者或管理员可以定义具体ACL策略。 - 灵活性: eCryptfs保护整个目录,而ACL可以对目录内的单个文件或子目录进行非常精细的权限控制。
- 透明性(对授权用户): 一旦目录被挂载,授权用户访问文件就像访问普通文件一样,加密/解密过程对他们是透明的。
- 潜在的不足:
- 挂载密码的安全性: eCryptfs的安全性高度依赖于挂载密码的强度和保密性。如果密码泄露或过于简单,整个加密机制就会被攻破。密码管理成为关键点。
- 性能开销: 加密和解密操作会带来一定的性能开销,尤其是在I/O密集型应用中。对于非常大的文件或大量小文件,这种开销可能更为明显。
- ACL管理的复杂性: 虽然灵活,但复杂的ACL规则可能难以管理和审计,尤其是在用户和文件数量众多时。
- Root用户权限: Root用户通常可以绕过ACL限制,并且可以执行
mount
/umount
操作。如果root账户被攻破,则数据面临风险(尽管eCryptfs的密码如果root不知道,仍是一道屏障,但root可以嗅探密码输入或修改eCryptfs配置)。 - 数据在内存中的风险: 当目录被挂载且文件被应用程序打开时,文件的明文内容会存在于系统内存中。此时,高级攻击者可能通过内存转储等方式获取数据。
- 密钥管理: eCryptfs的密码实际上是用于派生加密密钥的。在更复杂的企业环境中,可能需要更强大的密钥管理系统。
- 优势:
五、实验清理 (可选,但推荐)
完成实验后,可以清理创建的用户、组和数据。
Bash
# 以 root 用户执行
# 1. 确保eCryptfs目录已卸载
sudo umount /home/data_admin/sensitive_data_decrypted # 如果失败,可能已卸载,可忽略错误
# 2. 删除用户 (同时删除其主目录和邮件池)
sudo userdel -r guest_user
sudo userdel -r finance_user
sudo userdel -r hr_user
sudo userdel -r data_admin # 这会删除 /home/data_admin 下所有内容,包括加密目录
# 3. 删除组 (如果组内没有其他用户了)
sudo groupdel finance_group
sudo groupdel hr_group
# 4. 如果 data_admin 的主目录因某些原因未被完全删除 (例如,因为挂载点),手动删除
# sudo rm -rf /home/data_admin
# 5. 卸载工具 (如果不再需要)
# sudo apt purge --auto-remove ecryptfs-utils acl
# sudo apt autoremove