Linux权限拓展
文件归属更改
==可以改变属主和属组==
chown
命令(修改属主和/或属组)
chown [选项] 新属主:新属组 文件或目录
或(仅修改属组)
chown [选项] :新属组 文件或目录
常用选项
-R
:递归处理目录及其子内容。 -v
:显示操作详情
案例:同时修改属主和属组
将文件 file.txt 的属主设为 alice,属组设为 developers
chown alice:developers file.txt
案例:仅修改属主
将目录 /data 的属主设为 bob(不修改属组)
chown bob /data
案例:仅修改属组
将文件.log的属组设为 admins(等价于 chgrp)
chown :admins file.log
案例:递归修改目录及其子内容
将 /var/www 目录下所有内容的属主设为 www-data,属组设为 web
chown -R www-data:web /var/www
设置位S(SUID/SGID,针对二进制文件)
设置位S的作用
SUID(Set User ID):当普通用户执行具有SUID权限的二进制文件时,临时继承文件属主的权限(通常是root)。 SGID(Set Group ID):类似SUID,但继承的是文件属组的权限。
==主要针对二进制文件(命令),为了让一般使用者临时具有该文件所属主/组的执行权限。==
/usr/bin/passwd 在执行它的时候需要去修改 /etc/passwd 和 /etc/shadow 等文件。
这些文件除了root外,其他用户都没有写权限,但是又为了能让普通用户修改自己的密码,该怎么办呢?
whereis 命令,主要功能就是查询某个命令所在的路径,基本语法 => whereis passwd
普通账号 => 执行 /usr/bin/passwd => 修改/etc/shadow 文件(存放用户的密码)
/etc/shadow 文件比较特殊,其权限为(000),除root外,其他人都没有权限
/usr/bin/passwd
的SUID机制
ls -l /usr/bin/passwd
输出示例:-rwsr-xr-x 1 root root 59976 Nov 24 2022 /usr/bin/passwd
s
表示SUID已启用(属主执行位为 s
而非 x
)。
==普通用户执行 passwd
时,临时获得root权限,从而修改 /etc/shadow
(默认权限:-rw-r-----
,仅root可写)。==
添加SUID:
chmod u+s /path/to/file 符号法
chmod 4755 /path/to/file 数字法(4表示SUID,755为基本权限)
移除SUID:
chmod u-s /path/to/file 符号法
chmod 0755 /path/to/file 数字法(0表示清除特殊权限)
验证权限:
ls -l /usr/bin/passwd 检查属主执行位是否为 `-rws`
沾滞位T(针对文件夹)
SBIT
核心功能:在具有写权限的目录中,仅文件所有者、目录所有者或root可删除文件。
典型场景:多用户共享目录(如 /tmp
),防止用户误删他人文件。
/tmp
目录的粘滞位
默认权限分析:
ls -ld /tmp
输出示例:drwxrwxrwt 10 root root 4096 Aug 30 10:00 /tmp
t
表示粘滞位已启用(其他用户执行位为 t
而非 x
)。
功能验证:
用户A在 /tmp
创建文件 fileA.txt
。
用户B无法删除 fileA.txt
,除非用户B是root或文件所有者。
添加粘滞位:
chmod o+t /path/to/dir 符号法
chmod 1777 /path/to/dir 数字法(1表示粘滞位,777为基本权限)
移除粘滞位:
chmod o-t /path/to/dir 符号法
chmod 0777 /path/to/dir 数字法(0表示清除特殊权限)
验证权限:
ls -ld /tmp 检查其他用户执行位是否为 `rwt`
注意事项
-
仅对目录有效:对文件设置粘滞位无意义。
-
权限配合:粘滞位需与目录的写权限(
w
)配合使用,例如1777
表示所有用户可读写,但受删除限制。
权限类型 | 符号表示 | 数字表示 | 适用对象 | 核心作用 | | :案例--: | :案例: | :案例: | :案例--: | :案例案例案例案例--: | | SUID | u+s
| 4xxx
| 二进制文件 | 用户临时继承文件属主权限 | | SGID | g+s
| 2xxx
| 目录/文件 | 继承属组权限或强制子文件属组 | | 粘滞位 | o+t
| 1xxx
| 目录 | 限制文件删除权限 |
ACL访问控制
为什么需要ACL
ACL,是 Access Control List(访问控制列表)的缩写,在Linux系统中,ACL可实现对单一用户设定访问文件的权限。
扩展:ACL权限可以针对某个用户,也可以针对某个组。ACL优势就是让权限控制更加的精准。
传统权限的局限性:
-
无法为多个用户/组单独授权:例如,共享目录需要允许用户A、B、C分别读写,但又不属于同一个组。
-
权限继承不灵活:目录下新建文件无法自动继承复杂权限规则。
ACL 的优势:
支持为任意用户或组单独设置权限。
支持为目录设置默认权限规则(新建文件自动继承)。
ACL 权限优先级
当多个规则冲突时,优先级顺序为:
用户条目 > 组条目 > 传统属主权限 > 传统属组权限 > 其他用户权限
获取某个文件的ACL权限
基本语法:
getfacl 文件或目录名称
给某个文件设置ACL权限
setfacl【选项】文件或目录名称 选项说明: -m:添加/修改 ACL 规则。 -x:删除 ACL 规则。 -b:删除所有 ACL 规则。 -R:递归操作目录。 -d:设置默认 ACL 规则(仅目录)。
案例:针对readme.txt文件给linuxuser设置一个权限=>可读
setfacl1 -m u:linuxuser:r readme.txt => 针对某个用户开通ACL权限
案例:针对shop文件夹给zking组设置一个权限=>可读可写权限rw
setfacl -R -m g:zking:rw shop => 针对某个用户组开通ACL权限
案例:把linuxuser用户权限从readme.txt中移除掉
setfacl -x u:linuxuser readme.txt
案例:把zking用户组权限从shop中移除掉
setfacl -x g:zking shop
案例:把readme.txt文件中的所有ACL权限全部移除
setfacl -b readme.txt
使用 ACL 管理运维部门共享目录权限
某公司运维部门需管理服务器日志目录 /data/logs
,要求:
-
运维组(
ops-team
)拥有完全控制权。 -
开发组(
dev-team
)可查看日志,但不可修改。 -
临时审计员(用户
audit-user
)需临时拥有 7 天读写权限。 -
其他部门禁止访问。
-
未来新增日志文件自动继承权限。
创建目录
mkdir -p /data/logs 创建用户和组 groupadd ops-team groupadd dev-team useradd -G ops-team ops-admin useradd -G dev-team dev-user useradd audit-user 设置目录属组 chown :ops-team /data/logs
设置基础权限
属组可读写,其他用户无权限
chmod 770 /data/logs
使用 ACL 添加精细权限
允许 dev-team 组读和执行(查看文件列表和内容) setfacl -m g:dev-team:rx /data/logs 允许 audit-user 用户读写(临时权限) setfacl -m u:audit-user:rwx /data/logs 设置默认 ACL(未来新增文件自动继承) setfacl -d -m g:ops-team:rwx /data/logs setfacl -d -m g:dev-team:r-x /data/logs setfacl -d -m u:audit-user:rw /data/logs
验证权限
查看目录 ACL 规则 getfacl /data/logs 输出示例: file: data/logs owner: root group: ops-team user::rwx group::rwx group:dev-team:r-x user:audit-user:rw- mask::rwx other::--- default:user::rwx default:group::rwx default:group:dev-team:r-x default:user:audit-user:rw- default:mask::rwx default:other::---
测试权限效果
用户 ops-admin
(运维组):
-u ops-admin touch /data/logs/server.log 成功创建文件
-u ops-admin rm /data/logs/server.log 成功删除文件
用户 dev-user
(开发组):
-u dev-user cat /data/logs/server.log 可读
-u dev-user rm /data/logs/server.log 失败(无写权限)
用户 audit-user
(临时审计员):
-u audit-user echo "test" >> /data/logs/server.log 可写
其他用户:
-u other-user ls /data/logs 失败(禁止访问)
权限回收(7天后)
移除 audit-user 的 ACL 权限
setfacl -x u:audit-user /data/logs可选:清除所有 ACL 规则
setfacl -b /data/logs