1. Linux文件权限基础概念
在Linux系统中,文件权限是系统安全的第一道防线。作为一个从2009年就开始使用Linux的老用户,我见过太多因为权限设置不当导致的安全事故。理解文件权限机制,是每个Linux使用者必须掌握的核心技能。
文件权限本质上定义了"谁可以对文件做什么"。Linux通过三组权限来控制文件访问:
- 所有者(Owner):文件创建者,拥有最高控制权
- 所属组(Group):文件所属的用户组
- 其他人(Others):系统上的其他所有用户
每组权限又包含三种基本操作权限:
- 读(r):查看文件内容
- 写(w):修改文件内容
- 执行(x):运行文件(对程序/脚本而言)
提示:目录也是一种特殊文件,其执行权限(x)表示"可进入目录",读权限(r)表示"可列出目录内容",写权限(w)表示"可在目录中创建/删除文件"
2. 权限的数字表示法解析
2.1 权限数值计算原理
权限的数字表示法(如777、755等)实际上是一种二进制掩码的十进制表示。每个权限位对应一个二进制位:
code复制rwx => 111 => 4+2+1=7
r-x => 101 => 4+0+1=5
r-- => 100 => 4+0+0=4
这种设计使得权限组合具有唯一性,每个数字对应一种确定的权限组合。我在实际工作中发现,掌握这种转换能力可以极大提高权限管理效率。
2.2 常见权限组合详解
2.2.1 777权限(rwxrwxrwx)
这是最开放的权限设置:
- 所有者:读+写+执行(7)
- 所属组:读+写+执行(7)
- 其他人:读+写+执行(7)
警告:777权限意味着任何用户都可以修改和执行该文件,在生产环境中应绝对避免使用,这是重大安全隐患。
2.2.2 755权限(rwxr-xr-x)
这是可执行文件的推荐设置:
- 所有者:完全控制(7)
- 所属组:读+执行(5)
- 其他人:读+执行(5)
典型应用场景:
- 系统命令(/usr/bin下的程序)
- Web服务器上的CGI脚本
- 需要被多用户执行的工具程序
2.2.3 644权限(rw-r--r--)
这是普通数据文件的推荐设置:
- 所有者:读+写(6)
- 所属组:仅读(4)
- 其他人:仅读(4)
典型应用场景:
- 配置文件(/etc目录下的大多数文件)
- 日志文件
- 普通文档
2.2.4 600权限(rw-------)
这是敏感文件的推荐设置:
- 所有者:读+写(6)
- 所属组:无权限(0)
- 其他人:无权限(0)
典型应用场景:
- 包含密码或密钥的文件
- 个人私有文件
- SSH私钥(~/.ssh/id_rsa)
3. 权限管理实战技巧
3.1 chmod命令深度解析
chmod命令的基本语法:
bash复制chmod [选项] 模式 文件...
3.1.1 数字模式用法
这是最直接的方式,如:
bash复制chmod 755 script.sh # 设置script.sh权限为rwxr-xr-x
chmod 600 secret.txt # 设置secret.txt权限为rw-------
3.1.2 符号模式用法
符号模式更灵活,适合精细调整:
bash复制chmod u+x script.sh # 给所有者添加执行权限
chmod g-w data.txt # 移除所属组的写权限
chmod o= secret.txt # 清除其他人的所有权限
符号表示法:
- u:所有者(user)
- g:所属组(group)
- o:其他人(other)
- a:所有用户(all)
- +:添加权限
- -:移除权限
- =:精确设置权限
3.2 特殊权限位
除了基本的rwx权限外,Linux还有三个特殊权限位:
3.2.1 SUID(Set User ID)
表现形式:在所有者执行位显示为s
设置方法:chmod u+s 或 chmod 4xxx
作用:程序运行时以文件所有者身份运行,而非执行者
典型应用:/usr/bin/passwd
3.2.2 SGID(Set Group ID)
表现形式:在所属组执行位显示为s
设置方法:chmod g+s 或 chmod 2xxx
作用:
- 对文件:运行时以文件所属组身份运行
- 对目录:新建文件继承目录的所属组
典型应用:共享目录管理
3.2.3 Sticky Bit
表现形式:在其他人执行位显示为t
设置方法:chmod +t 或 chmod 1xxx
作用:只有文件所有者才能删除/重命名该文件
典型应用:/tmp目录
3.3 权限继承与umask
umask决定了新建文件的默认权限。计算方法:
code复制默认权限(文件) = 666 - umask
默认权限(目录) = 777 - umask
查看当前umask:
bash复制umask
设置umask(临时):
bash复制umask 0022
永久设置umask需要修改shell配置文件(~/.bashrc等)。
4. 权限管理最佳实践
4.1 安全原则
- 最小权限原则:只授予必要的最小权限
- 定期审计:使用find命令检查异常权限
bash复制find / -perm -4000 -type f # 查找所有SUID文件 find / -perm -2000 -type f # 查找所有SGID文件 find / -perm -0002 -type f # 查找全局可写文件 - 敏感文件保护:关键配置文件应设为600或640
4.2 常见场景配置建议
-
Web服务器文件:
- 静态文件:644
- 可执行脚本:755
- 上传目录:775(如果程序需要写权限)
-
数据库文件:
- MySQL数据文件:通常660
- PostgreSQL数据文件:通常700
-
用户家目录:
- 家目录本身:700
- 私有文件:600
- 共享文件:644
4.3 排错技巧
-
"Permission denied"错误排查步骤:
- 确认当前用户(使用
whoami) - 检查文件权限(
ls -l) - 检查用户所属组(
groups) - 检查父目录权限(执行权限决定能否访问目录内容)
- 确认当前用户(使用
-
权限继承问题:
- 新建文件权限异常:检查umask设置
- 目录下文件权限不一致:检查是否有SGID位
-
ACL高级权限:
当基本权限不够灵活时,可以使用ACL(访问控制列表):bash复制setfacl -m u:username:rwx file # 为用户添加权限 getfacl file # 查看ACL权限
5. 实际案例解析
5.1 案例一:Web服务器部署
假设我们部署一个PHP网站,目录结构如下:
code复制/var/www/example.com/
├── public_html/ # 网站根目录
├── logs/ # 日志目录
└── uploads/ # 用户上传目录
推荐权限设置:
bash复制# 网站所有者设置为web服务器用户(如www-data)
chown -R www-data:www-data /var/www/example.com
# 设置目录权限
find /var/www/example.com -type d -exec chmod 755 {} \;
# 设置文件权限
find /var/www/example.com -type f -exec chmod 644 {} \;
# 特殊处理上传目录
chmod 775 /var/www/example.com/uploads
5.2 案例二:多用户协作项目
团队项目目录/shared/project1需要满足:
- 项目组成员可读写
- 其他用户只读
- 新建文件自动继承组权限
解决方案:
bash复制# 创建项目组
groupadd project1_team
# 添加团队成员
usermod -aG project1_team user1
usermod -aG project1_team user2
# 设置目录权限
chown -R root:project1_team /shared/project1
chmod -R 775 /shared/project1
chmod g+s /shared/project1 # 设置SGID位
5.3 案例三:敏感配置文件保护
保护SSH配置文件:
bash复制chmod 600 /etc/ssh/sshd_config
chown root:root /etc/ssh/sshd_config
这样设置后,只有root用户可以修改SSH配置,防止未授权更改。