1. Linux文件权限基础概念
在Linux系统中,每个文件和目录都有三组权限设置,分别对应三种用户身份:文件所有者(Owner)、所属组(Group)和其他用户(Others)。这种权限机制是Linux系统安全性的基石,理解它对于系统管理和日常操作至关重要。
权限由10个字符表示,第一位表示文件类型(-表示普通文件,d表示目录),后面9位分为三组,每组三位,分别对应读(r)、写(w)和执行(x)权限。例如"-rwxr-xr--"表示:
- 这是一个普通文件(第一位-)
- 所有者有读、写、执行权限(rwx)
- 所属组有读和执行权限(r-x)
- 其他用户只有读权限(r--)
注意:目录的执行权限(x)与普通文件不同,它表示能否进入该目录并访问其中的内容,即使有读权限但没有执行权限,也无法查看目录内容。
2. 权限表示方法与数字转换
Linux权限有两种表示方法:符号表示法和数字表示法。符号表示法就是我们看到的rwx形式,而数字表示法是将每组权限转换为一个数字。
权限数字的计算方法是:
- 读权限(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。这种数字表示法在chmod命令中经常使用。
3. 权限管理命令详解
3.1 chmod命令使用
chmod命令用于修改文件或目录的权限,有两种使用方式:
- 符号模式:
bash复制chmod [ugoa][+-=][rwx] 文件名
其中:
- u=用户,g=组,o=其他,a=所有
- +添加权限,-移除权限,=设置权限
例如:
bash复制chmod u+x file.txt # 给所有者添加执行权限
chmod go-w file.txt # 移除组和其他用户的写权限
- 数字模式:
bash复制chmod 755 file.txt
这将设置权限为rwxr-xr-x。
3.2 chown和chgrp命令
chown用于改变文件所有者:
bash复制chown 新所有者 文件名
chown 新所有者:新组 文件名
chgrp专门用于改变文件所属组:
bash复制chgrp 新组 文件名
提示:普通用户只能改变自己拥有的文件的所有者和组,且只能改为自己所在的组。只有root用户可以任意改变文件所有者和组。
4. 特殊权限与高级设置
4.1 SUID、SGID和粘滞位
除了基本的rwx权限外,Linux还有三种特殊权限:
-
SUID(Set User ID):当设置在可执行文件上时,无论谁执行该文件,都会以文件所有者的身份运行。用数字表示为4000,符号表示为s(在用户执行位)。
-
SGID(Set Group ID):对于文件,类似于SUID但以文件所属组身份运行;对于目录,在该目录下创建的文件会继承目录的组。数字表示为2000,符号表示为s(在组执行位)。
-
粘滞位(Sticky Bit):主要用在目录上,只有文件所有者才能删除或重命名该目录下的文件,即使其他用户有写权限。数字表示为1000,符号表示为t(在其他用户执行位)。
设置方法:
bash复制chmod u+s file # 设置SUID
chmod g+s dir # 设置SGID
chmod +t dir # 设置粘滞位
4.2 默认权限与umask
umask决定了新建文件和目录的默认权限。它是一个掩码,表示要从完全权限中去除的权限。
查看当前umask:
bash复制umask
设置umask:
bash复制umask 0022
umask的计算:
- 对于文件,默认权限是666减去umask
- 对于目录,默认权限是777减去umask
例如umask为0022时:
- 新建文件权限:666-022=644(rw-r--r--)
- 新建目录权限:777-022=755(rwxr-xr-x)
5. 权限管理实践与常见问题
5.1 权限配置最佳实践
-
对于可执行程序:通常设置为755(rwxr-xr-x),允许所有人执行但只有所有者可以修改。
-
对于配置文件:通常设置为644(rw-r--r--),所有者可读写,其他人只读。
-
对于数据文件:根据共享需求设置,如果需要在组内共享,可以设置为664(rw-rw-r--)。
-
对于目录:通常设置为755(rwxr-xr-x),允许其他人查看但只有所有者可以修改内容。
5.2 常见权限问题排查
-
"Permission denied"错误:
- 检查当前用户是否有相应权限
- 检查文件权限设置(ls -l)
- 如果是脚本,检查是否有执行权限
-
无法删除文件:
- 检查目录的写权限
- 检查文件是否设置了不可变属性(chattr +i)
- 检查目录是否设置了粘滞位
-
脚本执行失败:
- 确保脚本有执行权限
- 确保脚本第一行指定了正确的解释器(如#!/bin/bash)
- 检查脚本中调用的命令是否有执行权限
5.3 ACL(访问控制列表)高级权限
当基本权限不能满足需求时,可以使用ACL进行更精细的权限控制:
查看ACL:
bash复制getfacl 文件名
设置ACL:
bash复制setfacl -m u:用户名:权限 文件名
setfacl -m g:组名:权限 文件名
例如,给用户test赋予file.txt的读写权限:
bash复制setfacl -m u:test:rw file.txt
删除ACL条目:
bash复制setfacl -x u:用户名 文件名
6. 权限与系统安全
合理的权限设置是系统安全的重要保障。以下是一些安全建议:
-
遵循最小权限原则:只授予必要的权限,不多不少。
-
敏感文件保护:
- /etc/passwd、/etc/shadow等系统文件应设置为644或更严格
- 用户home目录通常设置为700(drwx------)
-
定期检查:
- 查找全局可写文件:
find / -perm -2 -type f - 查找SUID/SGID文件:
find / -perm -4000 -o -perm -2000
- 查找全局可写文件:
-
特殊目录权限:
- /tmp目录通常设置为1777(drwxrwxrwt)
- /var/tmp类似,但可能有更长的保留时间
-
用户隔离:
- 不同用户的文件应保持私有(700权限)
- 需要共享时使用组权限或ACL
在实际工作中,我发现很多权限问题都源于对目录执行权限的误解。记住:即使有目录的读权限,没有执行权限也无法访问其中的文件;反之,有执行权限但没读权限,可以访问已知文件但不能列出目录内容。这种细微差别经常成为权限配置中的陷阱。