Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

5.4 权限与安全

文件系统的权限与安全机制是操作系统安全的第一道防线,它控制着不同用户对文件的访问权限,防止未授权的访问和数据泄露。理解文件权限机制,对于保证系统和数据的安全至关重要。

Linux文件权限模型

Linux系统继承了Unix的文件权限模型,简单高效,是服务器系统权限控制的基础。

三类用户

Linux将文件的访问者分为三类:

  1. 所有者(User):文件的创建者,默认对文件有完全控制权
  2. 所属组(Group):文件所属的用户组,组内的所有用户对文件有相同的权限
  3. 其他用户(Others):既不是所有者也不在所属组里的其他用户

三种基本权限

每个用户类别有三种基本权限:

权限表示字符对文件的作用对目录的作用
读权限r可以读取文件内容可以列出目录下的文件列表
写权限w可以修改、删除文件内容可以在目录下创建、删除、重命名文件
执行权限x可以执行文件(程序、脚本等)可以进入目录(cd),访问目录下的文件

权限表示方法

  1. 字符表示法:用10个字符表示,例如-rwxr-xr--

    • 第1位:文件类型,-表示普通文件,d表示目录,l表示软链接,b表示块设备,c表示字符设备
    • 第2-4位:所有者的权限(rwx)
    • 第5-7位:所属组的权限(r-x)
    • 第8-10位:其他用户的权限(r–)
  2. 数字表示法:用三位八进制数表示,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 file
  • chgrp:修改文件所属组,chgrp group file

Windows ACL权限模型

Windows使用ACL(访问控制列表)的权限模型,比Linux的权限模型更灵活,支持更细粒度的权限控制。

ACL的组成

每个文件或目录都有一个ACL,包含多个访问控制项(ACE),每个ACE定义了一个用户或组对该对象的访问权限。

常见的权限

  • 完全控制:对文件有所有权限,包括修改权限、删除文件等
  • 修改:可以读取、修改、删除文件
  • 读取和执行:可以读取文件内容和执行文件
  • 列出文件夹内容:可以查看目录下的文件列表
  • 读取:只能读取文件内容
  • 写入:可以修改文件内容,或者在目录下创建文件
  • 特殊权限:更细粒度的权限控制,比如删除子文件夹和文件、读取权限、更改权限等

权限继承

默认情况下,子目录和文件会继承父目录的权限,也可以关闭继承,单独设置权限。

有效权限

用户的最终权限是所有分配给用户的权限、用户所在组的权限的合集,拒绝权限优先于允许权限。

文件系统级加密

除了权限控制外,文件系统还支持加密,即使磁盘被物理偷走,没有密钥也无法获取数据。

常见的加密方式

  1. 全磁盘加密(FDE):加密整个磁盘,系统启动时需要输入密码才能解密,所有数据写入磁盘时自动加密,读取时自动解密。

    • Windows:BitLocker
    • Linux:LUKS(Linux Unified Key Setup)
    • macOS:FileVault
    • 优点:保护整个磁盘的数据,即使磁盘丢失数据也不会泄露
    • 缺点:系统启动需要密码,性能有轻微损失
  2. 文件级加密:只加密特定的文件或目录,需要访问时单独解密。

    • Windows:EFS(Encrypting File System)
    • Linux:eCryptfs、fscrypt
    • 优点:更灵活,可以只加密敏感数据
    • 缺点:需要用户手动管理加密文件,容易遗漏
  3. 应用层加密:由应用程序自己实现加密,比如压缩包加密、文档密码保护等,不依赖文件系统。

加密注意事项

  • 一定要备份密钥和恢复密码,如果密钥丢失,数据就永远无法恢复了
  • 加密会带来一定的性能开销,对于IO密集型应用要评估性能影响
  • 全磁盘加密不会影响系统正常使用,对用户是透明的,建议笔记本电脑都开启全磁盘加密,防止电脑丢失导致数据泄露

常见文件安全问题与防范

1. 权限配置错误

  • 问题:文件权限设置过大,比如配置文件设置为所有用户可写,或者日志文件设置为所有用户可读,导致敏感信息泄露
  • 防范
    • 遵循最小权限原则,只给需要的用户分配最小必要的权限
    • 配置文件、密钥文件等敏感文件权限设置为600,只有所有者能读写
    • 可执行文件不要随便设置SUID/SGID权限
    • 定期检查系统文件的权限,发现异常及时修复

2. 符号链接攻击

  • 问题:攻击者创建软链接指向敏感文件,利用程序的文件操作漏洞,读写敏感文件
  • 防范
    • 处理文件时检查文件类型,不要跟随符号链接
    • 操作文件前验证文件的所有者和权限
    • 使用安全的文件操作函数,避免路径穿越问题

3. 路径穿越攻击

  • 问题:攻击者在路径中使用../等字符,访问到程序限制目录之外的文件,比如读取../../etc/passwd文件
  • 防范
    • 对用户传入的文件路径进行严格校验,过滤特殊字符
    • 限制程序的文件访问根目录(chroot)
    • 对路径进行规范化处理,解析出真实路径后再判断是否在允许的目录内

4. 临时文件安全问题

  • 问题:临时文件权限设置不当,或者使用可预测的临时文件名,被攻击者利用修改或读取数据
  • 防范
    • 使用系统提供的安全的临时文件创建函数,自动生成随机文件名,设置合适的权限
    • 临时文件使用完后及时删除
    • 临时目录设置Sticky Bit,防止别人删除你的临时文件

5. 数据残留问题

  • 问题:删除文件只是删除了目录项,数据还在磁盘上,可能被数据恢复软件恢复
  • 防范
    • 要彻底删除敏感文件,使用shred等工具覆盖文件内容后再删除
    • SSD的磨损均衡机制会导致覆盖不一定能完全删除数据,对于SSD建议使用加密,直接丢弃密钥比删除数据更安全
    • 淘汰旧磁盘时,要进行物理销毁或者全盘擦除

开发中的安全最佳实践

  1. 处理文件路径时一定要做校验,防止路径穿越
  2. 不要使用硬编码的文件路径,使用相对路径或者可配置的路径
  3. 创建文件时设置合理的权限,不要默认给所有用户读写权限
  4. 敏感数据不要明文存在文件中,要加密存储
  5. 操作文件时处理好异常,避免因为异常导致文件权限设置错误或者数据损坏
  6. 不要相信文件的扩展名,要验证文件的实际内容,防止上传恶意文件

思考问题

  1. Linux系统中,一个文件的权限是755,具体表示什么含义?适合什么类型的文件?
  2. SUID权限有什么作用?为什么说SUID权限很危险?
  3. Sticky Bit权限的作用是什么?适合用在什么场景?
  4. 要防止删除的文件被恢复,有哪些方法?