核心是用“组 + sgid + 统一 umask”三者闭环,即创建业务专用组(如proj-api)、设目录sgid位(2770)使新建文件自动属组且组可写、通过umask 002确保组写权限生效,再按需加固防误删或临时授权。

核心是用“组 + SGID + 统一 umask”三者闭环,而不是给目录加一堆权限了事。关键在于让新建文件自动归属协作组、且组内默认可写。
创建专用协作组并纳管用户
别用 wheel 或 users 这类通用组,避免权限污染。组名要有业务含义,比如 proj-api 或 data-engineers:
- 创建组:
sudo groupadd proj-api - 把用户加入该组(不覆盖原有组):
sudo usermod -aG proj-api alice bob charlie - 验证:
id alice应显示gid=... (proj-api)且groups输出中含proj-api - 注意:新组成员需重新登录,或运行
newgrp proj-api才能以该组为当前会话主组(影响新建文件属组)
设置共享目录属组与 SGID 权限位
SGID 是实现“自动认亲”的关键——它让目录成为权限母体,所有新内容继承其属组:
- 建目录并设属组:
sudo mkdir -p /srv/proj-api && sudo chown :proj-api /srv/proj-api(冒号开头表示只改组) - 设权限(2770):
sudo chmod 2770 /srv/proj-api
其中 2 是 SGID 位,770 表示属主+属组全权(rwx),其他人无任何权限 - 验证:
ls -ld /srv/proj-api应显示drwxrws---(第4位是小写 s,不是 x)
统一 umask 确保组写权限生效
SGID 能继承组名,但不能绕过 umask 对权限的过滤。若用户 umask=022,新建文件就是 644(组无写权),协作立刻中断:
- 全局配置(推荐):
echo 'if [ "$(id -gn)" = "proj-api" ]; then umask 002; fi' | sudo tee /etc/profile.d/proj-api.sh - 效果:新建文件默认
-rw-rw----(664),新建目录默认drwxrwx---(775) - 验证:在共享目录中执行
touch test.txt && ls -l test.txt,确认组权限含 w
按需加固:防误删与例外授权
基础协作跑通后,再考虑边界场景:
- 防误删他人文件:加粘滞位
sudo chmod +t /srv/proj-api→ 权限变为drwxrws--T(末位大写 T) - 临时授权非组成员(如外包测试员):
setfacl -m u:tester:r-X /srv/proj-api/docs - 让某子目录默认继承 ACL:
setfacl -d -m g:proj-api:rwx /srv/proj-api/docs











