马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
为什么要有权限体系
Linux 服务器上的权限分层很严格。权限给高了,一次误操作就可能把业务数据干掉;给低了,正常运维又寸步难行。所以搞清楚 Linux 的权限到底分哪几层,是运维的基本功。
文件权限大致可以分成四类:基本权限(UGO + rwx)、高级权限(suid / sgid / sbit)、特殊权限(ACL)、隐蔽权限(chattr 系统属性)。下面按这个顺序讲。
一、基本权限 UGO
基本权限解决的是"某个用户或组,能以什么方式访问某个文件"。
三个权限对象
- u(user):属主(owner),文件的拥有者。
- g(group):属组,文件所属的组。
- o(others):其他人,既不是属主也不属于属组的那批用户。
三种权限类型
r 读、w 写、x 执行。看 ls -l 的输出就一目了然:
rwx rw- r-- alice hr file1.txt
最前面三个字符是属主权限(可读可写可执行),接着三位是属组权限(读写不可执行),最后三位是其他人权限(只读)。后面 alice 是属主,hr 是属组,file1.txt 是文件名。
两个改权限的核心命令
chown:改属主和属组。
chmod:改访问权限。
chown alice.hr file1.txt # 同时改属主和属组
chown tom file1.txt # 只改属主
chown :hr file1.txt # 只改属组(冒号打头)
chown -R alice.hr dir1 # 递归,针对目录
奇数位是"属主",点号或冒号后面是"属组"。递归参数 -R 对目录生效,改之前先确认路径。
改权限的两种写法
符号写法(适合微调某一位):
chmod u+x file1.txt # 属主加执行
chmod a=rwx file1.txt # 所有人设成读写执行
chmod a=- file1.txt # 所有人都没有权限
chmod ug=rw,o=r file1.txt # 属主属组读写,其他人只读
数字写法(适合批量,实际用得最多):
chmod 644 file1.txt # rw-r--r--,属主读写,其余只读
数字对应关系:读 r → 4、写 w → 2、执行 x → 1。注意数字写法是三位一起给,不存在"只给一半"——不是 chmod 6 这种写法,而是 chmod 644。
二、高级权限:SUID / SGID / SBIT
这三个位是"额外"的权限层,加在普通的 rwx 之上。
2.1 SUID(setuid,位值 4)
作用:给命令加权限,让普通用户执行这个命令时,临时以命令属主的身份(通常是 root)运行。
典型例子是 cat 或 passwd:which cat 查到位置 /usr/bin/cat,然后 chmod u+s /usr/bin/cat 之后,普通用户执行 cat 时就带着 root 权限跑。取消提权则是 chmod u-s /usr/bin/cat。
安全提醒:SUID 是所有提权手段里最危险的一个——任何能执行该文件的用户都拿到 root 级能力。系统上不该出现来历不明的 SUID 文件,建议定期排查:
find / -perm /4000 -type f 2>/dev/null
2.2 SGID(setgid,位值 2)
作用:给目录授权,让在该目录下新建的文件自动继承该目录的属组。团队协作目录必备。
操作步骤:
mkdir /opt/dir1 # 建目录
groupadd hr # 建组
chmod 775 /opt/dir1/ # 开读写
chown :hr /opt/dir1/ # 把属组设成 hr
chmod g+s /opt/dir1/ # 加 sgid
ll -d /opt/dir1/
此时用 ll -d 能看到权限位从 drwxrwxr-x 变成 drwxrwsr-x(那个 s 就是 sgid)。再在目录里 touch a.txt,用 ll 看这个文件,属组已经自动继承成 hr 了,后续成员无需反复 chown。
2.3 SBIT(Sticky Bit,位值 1)
作用:只对目录有效。用户可以在目录里随便建东西,但只有文件的创建者和 root 能删掉它。
chmod o+t dir2
经典场景是 /tmp。实测一下就明白了:
mkdir /home/dir2
chmod 757 /home/dir2/
chmod o+t /home/dir2/
useradd jack
su - alice
touch /home/dir2/alice.txt
su - jack
touch /home/dir2/jack.txt
rm -rf /home/dir2/alice.txt
rm: cannot remove '/home/dir2/alice.txt': Operation not permitted
jack 想删 alice 建的文件被系统拦下(Operation not permitted),这就是 sticky 位在起作用。公共上传目录、共享下载目录都该这么配。
2.4 sudo:更有针对性的提权
SUID 是"一视同仁"——谁跑这个程序谁就提权;sudo 则是"点对点"——精确指定哪个用户能用 root 身份跑哪几条命令。这在生产上安全得多。
用 visudo 或 vim /etc/sudoers 编辑,在 root ALL=(ALL) ALL 下面按同样格式加一行:
Jack ALL=(ALL) ALL # 需要输密码
Jack ALL=(ALL) NOPASSWD:ALL # 免密(慎用)
改完务必用 visudo -c 检查语法正确性,语法错了 sudo 会直接瘫痪,连 root 都用不了 sudo。配置生效后 Jack 就能用 sudo 命令 提权执行了。
更推荐的写法是只给几条必要命令,例如只允许重启 nginx:
Jack ALL=(ALL) /usr/bin/systemctl restart nginx
三、特殊权限:ACL
UGO 模型只能表达"三类对象",遇到"某个特定用户要有特殊权限"就抓瞎了。ACL(Access Control List)补的就是这个缺口——可以针对某一个人单独设权限。
- 查看:
getfacl a.txt
- 设置:
setfacl -m u:xiaoming:rwx /tmp/a.txt(给 xiaoming 对这个文件的读写执行)
回收与清理:
setfacl -m u:xiaoming:r-- a.txt # 重新赋权(收缩权限)
setfacl -b a.txt # 删掉全部 ACL 特殊权限
setfacl -x u:xiaoming a.txt # 只删这一条
getfacl a.txt # 复查
注意 ACL 生效时,ls -l 的权限位末尾多一个 + 号,看到加号就说明这个文件带 ACL。
四、隐蔽权限:文件系统属性
这一层比文件权限更硬——它在文件系统层面给文件加锁,连 root 的默认操作都会受影响(除非用 CAP_LINUX_IMMUTABLE)。
- 查看:
lsattr 文件名
- 设置:
chattr +a file1(只允许追加,不能改不能删)、chattr +i file2(完全锁死,啥都干不了)、chattr +A file3(不更新文件的最后访问时间)
+i 常用于锁住关键配置文件(如 /etc/passwd、/etc/shadow),能防住误删和部分篡改;但也可以用 chattr -i 解开,所以它防不了真正拿到 root 的攻击者。
另外,查文件的时间戳用 stat 文件名,能同时看到最近访问(Access)、最近更改(Modify)、最近改动(Change)三个时间——排查"到底是谁在什么时候动了这个文件"时必用。
五、时间属性怎么读
顺便把三个时间说清楚,权限排查里经常混:
- atime(Access):最后一次被读取的时间。
- mtime(Modify):最后一次被修改内容的时间。
- ctime(Change):最后一次改属性的时间(权限、属主、链接数变化都会动它)。
记住 mtime 看内容、ctime 看属性,别搞反了。
总结
Linux 权限是一个四层结构:
- 基本权限:UGO + rwx,
chown 改归属、chmod 改访问(符号法微调、数字法批量);
- 高级权限:SUID(4) 让执行者临时提权、SGID(2) 让目录内新文件继承属组、SBIT(1) 限制目录内文件的删除权;
- 特殊权限:ACL(
setfacl / getfacl)给单个用户开小灶;
- 隐蔽权限:文件系统属性(
chattr / lsattr)在更底层锁文件,stat 用来看时间戳。
实操上的原则:能用 UGO 解决就别上 ACL,能用 sudo 指定命令就别乱给 SUID。SUID 和 NOPASSWD 是权限体系里最容易沦陷的两个口子,上线前多瞄一眼,出问题少绕半天。
(本文由 qidao123.com企服评测-应用市场 编辑提示整理:操作基于 Linux 标准权限模型,适用于 Ubuntu / CentOS / openEuler 等发行版,SUID 与 NOPASSWD 相关配置请在测试环境验证后再上生产。) |