5.4 权限与安全
文件系统的权限与安全机制是操作系统安全的第一道防线,它控制着不同用户对文件的访问权限,防止未授权的访问和数据泄露。理解文件权限机制,对于保证系统和数据的安全至关重要。
Linux文件权限模型
Linux系统继承了Unix的文件权限模型,简单高效,是服务器系统权限控制的基础。
三类用户
Linux将文件的访问者分为三类:
- 所有者(User):文件的创建者,默认对文件有完全控制权
- 所属组(Group):文件所属的用户组,组内的所有用户对文件有相同的权限
- 其他用户(Others):既不是所有者也不在所属组里的其他用户
三种基本权限
每个用户类别有三种基本权限:
| 权限 | 表示字符 | 对文件的作用 | 对目录的作用 |
|---|---|---|---|
| 读权限 | r | 可以读取文件内容 | 可以列出目录下的文件列表 |
| 写权限 | w | 可以修改、删除文件内容 | 可以在目录下创建、删除、重命名文件 |
| 执行权限 | x | 可以执行文件(程序、脚本等) | 可以进入目录(cd),访问目录下的文件 |
权限表示方法
-
字符表示法:用10个字符表示,例如
-rwxr-xr--- 第1位:文件类型,
-表示普通文件,d表示目录,l表示软链接,b表示块设备,c表示字符设备 - 第2-4位:所有者的权限(rwx)
- 第5-7位:所属组的权限(r-x)
- 第8-10位:其他用户的权限(r–)
- 第1位:文件类型,
-
数字表示法:用三位八进制数表示,r=4,w=2,x=1,相加得到权限值
- rwx = 4+2+1 = 7
- r-x = 4+0+1 = 5
- r– = 4+0+0 = 4
- 例如
rwxr-xr--对应的数字权限是754
示例:
$ ls -l test.txt
-rw-r--r-- 1 user group 1024 Mar 12 10:00 test.txt
这个文件的权限是644:所有者有读写权限,所属组和其他用户只有读权限。
特殊权限位
除了基本权限外,还有三个特殊权限位:
1. SUID(Set User ID)
- 作用于可执行文件,用户执行该文件时,会临时获得文件所有者的权限
- 表示:所有者的执行权限位变为
s,例如-rwsr-xr-x,数字表示为4755(前面加4) - 典型例子:
passwd命令,普通用户需要修改密码,需要写入/etc/shadow文件,而普通用户没有写权限,passwd命令设置了SUID位,执行时临时获得root权限,就可以修改shadow文件了
注意:SUID权限非常危险,不要随便给文件设置SUID,特别是可执行文件,容易被利用提权。
2. SGID(Set Group ID)
- 作用于可执行文件时,用户执行文件时会临时获得文件所属组的权限
- 作用于目录时,在该目录下创建的文件会继承目录的所属组,而不是创建者的默认组
- 表示:所属组的执行权限位变为
s,例如-rwxr-sr-x,数字表示为2755(前面加2) - 适用场景:团队共享目录,确保团队成员创建的文件都属于同一个组,方便共享
3. Sticky Bit(粘滞位)
- 作用于目录,只有文件的所有者和root才能删除目录下的文件,即使其他用户有写权限也不能删除别人的文件
- 表示:其他用户的执行权限位变为
t,例如drwxrwxrwt,数字表示为1777(前面加1) - 典型例子:
/tmp目录,所有人都可以在/tmp下创建文件,但不能删除别人的文件
修改权限的命令
chmod:修改文件权限,chmod 755 file,或者chmod u+x file给所有者加执行权限chown:修改文件所有者和所属组,chown user:group filechgrp:修改文件所属组,chgrp group file
Windows ACL权限模型
Windows使用ACL(访问控制列表)的权限模型,比Linux的权限模型更灵活,支持更细粒度的权限控制。
ACL的组成
每个文件或目录都有一个ACL,包含多个访问控制项(ACE),每个ACE定义了一个用户或组对该对象的访问权限。
常见的权限
- 完全控制:对文件有所有权限,包括修改权限、删除文件等
- 修改:可以读取、修改、删除文件
- 读取和执行:可以读取文件内容和执行文件
- 列出文件夹内容:可以查看目录下的文件列表
- 读取:只能读取文件内容
- 写入:可以修改文件内容,或者在目录下创建文件
- 特殊权限:更细粒度的权限控制,比如删除子文件夹和文件、读取权限、更改权限等
权限继承
默认情况下,子目录和文件会继承父目录的权限,也可以关闭继承,单独设置权限。
有效权限
用户的最终权限是所有分配给用户的权限、用户所在组的权限的合集,拒绝权限优先于允许权限。
文件系统级加密
除了权限控制外,文件系统还支持加密,即使磁盘被物理偷走,没有密钥也无法获取数据。
常见的加密方式
-
全磁盘加密(FDE):加密整个磁盘,系统启动时需要输入密码才能解密,所有数据写入磁盘时自动加密,读取时自动解密。
- Windows:BitLocker
- Linux:LUKS(Linux Unified Key Setup)
- macOS:FileVault
- 优点:保护整个磁盘的数据,即使磁盘丢失数据也不会泄露
- 缺点:系统启动需要密码,性能有轻微损失
-
文件级加密:只加密特定的文件或目录,需要访问时单独解密。
- Windows:EFS(Encrypting File System)
- Linux:eCryptfs、fscrypt
- 优点:更灵活,可以只加密敏感数据
- 缺点:需要用户手动管理加密文件,容易遗漏
-
应用层加密:由应用程序自己实现加密,比如压缩包加密、文档密码保护等,不依赖文件系统。
加密注意事项
- 一定要备份密钥和恢复密码,如果密钥丢失,数据就永远无法恢复了
- 加密会带来一定的性能开销,对于IO密集型应用要评估性能影响
- 全磁盘加密不会影响系统正常使用,对用户是透明的,建议笔记本电脑都开启全磁盘加密,防止电脑丢失导致数据泄露
常见文件安全问题与防范
1. 权限配置错误
- 问题:文件权限设置过大,比如配置文件设置为所有用户可写,或者日志文件设置为所有用户可读,导致敏感信息泄露
- 防范:
- 遵循最小权限原则,只给需要的用户分配最小必要的权限
- 配置文件、密钥文件等敏感文件权限设置为600,只有所有者能读写
- 可执行文件不要随便设置SUID/SGID权限
- 定期检查系统文件的权限,发现异常及时修复
2. 符号链接攻击
- 问题:攻击者创建软链接指向敏感文件,利用程序的文件操作漏洞,读写敏感文件
- 防范:
- 处理文件时检查文件类型,不要跟随符号链接
- 操作文件前验证文件的所有者和权限
- 使用安全的文件操作函数,避免路径穿越问题
3. 路径穿越攻击
- 问题:攻击者在路径中使用
../等字符,访问到程序限制目录之外的文件,比如读取../../etc/passwd文件 - 防范:
- 对用户传入的文件路径进行严格校验,过滤特殊字符
- 限制程序的文件访问根目录(chroot)
- 对路径进行规范化处理,解析出真实路径后再判断是否在允许的目录内
4. 临时文件安全问题
- 问题:临时文件权限设置不当,或者使用可预测的临时文件名,被攻击者利用修改或读取数据
- 防范:
- 使用系统提供的安全的临时文件创建函数,自动生成随机文件名,设置合适的权限
- 临时文件使用完后及时删除
- 临时目录设置Sticky Bit,防止别人删除你的临时文件
5. 数据残留问题
- 问题:删除文件只是删除了目录项,数据还在磁盘上,可能被数据恢复软件恢复
- 防范:
- 要彻底删除敏感文件,使用shred等工具覆盖文件内容后再删除
- SSD的磨损均衡机制会导致覆盖不一定能完全删除数据,对于SSD建议使用加密,直接丢弃密钥比删除数据更安全
- 淘汰旧磁盘时,要进行物理销毁或者全盘擦除
开发中的安全最佳实践
- 处理文件路径时一定要做校验,防止路径穿越
- 不要使用硬编码的文件路径,使用相对路径或者可配置的路径
- 创建文件时设置合理的权限,不要默认给所有用户读写权限
- 敏感数据不要明文存在文件中,要加密存储
- 操作文件时处理好异常,避免因为异常导致文件权限设置错误或者数据损坏
- 不要相信文件的扩展名,要验证文件的实际内容,防止上传恶意文件
思考问题
- Linux系统中,一个文件的权限是755,具体表示什么含义?适合什么类型的文件?
- SUID权限有什么作用?为什么说SUID权限很危险?
- Sticky Bit权限的作用是什么?适合用在什么场景?
- 要防止删除的文件被恢复,有哪些方法?