1. Linux权限系统概述
在Linux系统中,权限管理是系统安全的核心机制。每个文件和目录都有明确的权限设置,决定了谁可以访问以及如何访问它们。这套权限系统源自Unix的多用户设计理念,通过精细的权限控制,确保系统资源的安全使用。
Linux权限主要分为三类:用户权限(User)、组权限(Group)和其他用户权限(Others)。每种权限又包含读(r)、写(w)和执行(x)三种基本操作权限。当你执行ls -l命令时,会看到类似-rwxr-xr--的权限表示,这串字符详细说明了文件所有者、所属组和其他人的访问权限。
提示:权限字符串的第一个字符表示文件类型,"-"代表普通文件,"d"表示目录,"l"则是符号链接。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 权限基础与表示方法
2.1 权限的三种类型
Linux系统中的每个文件都有三组权限设置:
- 用户权限(User):文件所有者拥有的权限
- 组权限(Group):文件所属用户组成员拥有的权限
- 其他权限(Others):既不是所有者也不在组成员的其他用户的权限
每组权限都包含三种基本操作权限:
- 读权限(r):允许查看文件内容(对目录则是列出内容)
- 写权限(w):允许修改文件内容(对目录则是增删文件)
- 执行权限(x):允许执行文件(对目录则是进入目录)
2.2 权限的两种表示方法
Linux权限有两种表示方式:
符号表示法:
使用字母表示权限,如rwxr-xr--,分为三组,分别对应用户、组和其他用户的权限。
数字表示法:
用三位八进制数表示权限,每位数字是r(4)、w(2)、x(1)的和。例如:
- 755 → rwxr-xr-x
- 644 → rw-r--r--
- 777 → rwxrwxrwx
注意:数字表示法中,第一位数字有时用于设置特殊权限(SUID、SGID、Sticky bit),我们将在后面详细讨论。
3. 权限管理命令详解
3.1 chmod命令:修改文件权限
chmod是Linux中最常用的权限修改命令,有两种使用方式:
符号模式:
bash复制chmod [ugoa][+-=][rwx] 文件名
- u: 用户,g: 组,o: 其他,a: 所有
- +: 添加权限,-: 移除权限,=: 设置权限
示例:
bash复制chmod u+x script.sh # 给所有者添加执行权限
chmod go-w file.txt # 移除组和其他用户的写权限
chmod a=rw config.cfg # 设置所有用户为读写权限
数字模式:
bash复制chmod 755 script.sh
chmod 644 config.cfg
3.2 chown命令:改变文件所有者
chown命令用于更改文件的所有者和所属组:
bash复制chown 用户名:组名 文件名
示例:
bash复制chown root:root /etc/passwd # 将文件所有者改为root用户,组改为root组
chown alice report.txt # 只改变所有者
chown :developers project/ # 只改变所属组
注意:普通用户只能更改自己拥有的文件的所有权,只有root用户可以任意更改文件所有者。
3.3 chgrp命令:改变文件所属组
chgrp专门用于更改文件的所属组:
bash复制chgrp 组名 文件名
虽然功能与chown部分重叠,但在脚本中更明确表达意图。
4. 特殊权限详解
除了基本的rwx权限外,Linux还有三种特殊权限:
4.1 SUID(Set User ID)
当可执行文件设置了SUID位时,无论谁执行这个文件,都会以文件所有者的身份运行。这在需要临时提升权限的场景下非常有用。
设置方法:
bash复制chmod u+s 文件名 # 符号表示法
chmod 4755 文件名 # 数字表示法(4表示SUID)
典型应用:
/usr/bin/passwd:允许普通用户修改自己的密码(需要写入/etc/shadow的权限)
4.2 SGID(Set Group ID)
对于可执行文件,SGID与SUID类似,但以文件所属组的身份运行。对于目录,新创建的文件会继承目录的组,而不是创建者的主组。
设置方法:
bash复制chmod g+s 文件名/目录名 # 符号表示法
chmod 2755 文件名/目录名 # 数字表示法(2表示SGID)
典型应用:
- 共享目录:确保团队协作时所有文件都属于同一组
4.3 Sticky Bit(粘滞位)
设置在目录上时,只有文件所有者、目录所有者或root用户才能删除或重命名目录中的文件,即使其他用户有写权限。
设置方法:
bash复制chmod +t 目录名 # 符号表示法
chmod 1777 目录名 # 数字表示法(1表示Sticky bit)
典型应用:
/tmp目录:允许所有用户创建文件,但只能删除自己的文件
5. 用户权限提升:su与sudo
5.1 su命令:切换用户
su(switch user)命令允许用户切换到另一个用户身份:
bash复制su - 用户名 # 完全切换用户环境
su 用户名 # 不切换环境变量
不加用户名默认为root:
bash复制su - # 切换到root并加载环境
su # 切换到root但不加载环境
注意:使用su需要知道目标用户的密码,这在实际运维中可能带来安全隐患。
5.2 sudo命令:以超级用户权限执行命令
sudo允许授权用户以root或其他用户身份执行命令,而不需要知道目标用户的密码:
bash复制sudo 命令
sudo -u 用户名 命令 # 以特定用户身份执行
sudo的配置在/etc/sudoers文件中,建议使用visudo命令编辑,因为它会检查语法:
bash复制# 允许alice用户以root身份运行所有命令
alice ALL=(ALL:ALL) ALL
# 允许developers组无需密码运行特定命令
%developers ALL=(ALL) NOPASSWD: /usr/bin/apt-get update, /usr/bin/apt-get upgrade
常见问题解决:
bash复制# 当出现"sudo: apt: command not found"时
sudo apt-get update && sudo apt-get install apt
6. 权限管理实战技巧
6.1 安全权限设置建议
-
最小权限原则:只授予必要的权限
- 配置文件:644(rw-r--r--)
- 可执行脚本:755(rwxr-xr-x)
- 私有文件:600(rw-------)
- 共享目录:2770(rwxrws---)
-
敏感文件保护:
bash复制chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh -
递归修改权限:
bash复制chmod -R 755 /path/to/directory # 递归修改目录下所有文件权限 chown -R user:group /path/to/directory # 递归修改所有者和组
6.2 常见问题排查
-
"Permission denied"错误:
- 检查文件权限:
ls -l 文件名 - 检查父目录权限:需要有x权限才能访问
- 检查SELinux状态:
getenforce,如果是Enforcing模式可能需要调整安全上下文
- 检查文件权限:
-
无法删除文件:
- 检查文件所在目录的写权限
- 检查文件是否被锁定:
lsof 文件名 - 检查文件系统是否只读:
mount | grep "ro,"
-
sudo相关问题:
bash复制# 检查用户是否在sudoers中 sudo -l # 修复sudo环境 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
6.3 高级权限管理
-
ACL(访问控制列表):
当基本权限不够精细时,可以使用ACL:bash复制setfacl -m u:alice:rwx file.txt # 给alice添加rwx权限 getfacl file.txt # 查看ACL权限 -
umask设置:
umask决定新建文件的默认权限:bash复制umask 022 # 默认设置,新建文件权限为644,目录为755 umask 077 # 更严格,新建文件权限为600,目录为700 -
文件属性:
使用chattr设置更底层的文件属性:bash复制chattr +i important_file # 设置不可修改(连root也不能修改) lsattr # 查看文件属性
7. 权限与系统安全
合理的权限设置是Linux系统安全的基础。以下是一些安全最佳实践:
-
避免使用root:
- 日常操作使用普通用户
- 必须使用root权限时优先考虑sudo而非su
-
定期审计权限:
bash复制# 查找全局可写文件 find / -xdev -type f -perm -0002 -exec ls -l {} \; # 查找没有所有者或组的文件 find / -xdev \( -nouser -o -nogroup \) -exec ls -l {} \; -
SUID/SGID文件检查:
bash复制# 查找所有SUID文件 find / -xdev -type f -perm -4000 -exec ls -l {} \; # 查找所有SGID文件 find / -xdev -type f -perm -2000 -exec ls -l {} \; -
敏感文件保护:
bash复制chmod 700 /root # 限制root家目录访问 chmod 600 /etc/shadow # 保护密码哈希文件
在实际工作中,我发现很多权限问题源于对目录执行权限的误解。记住:对目录来说,执行权限(x)是进入目录的钥匙,没有x权限,即使有r权限也无法列出目录内容,有w权限也无法在目录中创建或删除文件。
