公司有台 64C/256G 的测试服务器,运维、开发、数据三个团队共用。某天开发小王 rm -rf /data/* 把数据组的 ETL 结果全清了——因为大家都在用 root,/data 谁都能写。
这不是段子,这是真实的生产事故。多团队共用一台服务器,权限不分=定时炸弹。
今天把 Linux 用户与权限管理体系讲清楚:用户/组怎么建、目录权限怎么分、sudo 怎么收口、ACL 怎么补位,一套组合拳下来,各团队互不干扰,出问题可追溯。
Linux 权限模型就三句话:
# 查看文件权限ls -ld /data/backend# drwxrwx--- 2 deploy backend 4096 Jun 17 10:00 /data/backend# ││││││││││# │┴─┬─┘│┴─┬─┘│┴─┬─┘# type owner group others# rwx rwx --- → owner可读写执行,group可读写执行,others无权限多团队共用服务器的核心思路:一个团队一个组,目录归属对应组,权限用 group 控制。
场景:运维组(ops)、后端组(backend)、数据组(data)共用一台服务器。
# 1. 创建三个团队组groupadd opsgroupadd backendgroupadd data# 2. 创建用户并加入对应组useradd -m -g ops zhangsan # 运维张三useradd -m -g backend xiaowang # 后端小王useradd -m -g data lisi # 数据李四# 3. 验证id zhangsan# uid=1001(zhangsan) gid=1001(ops) groups=1001(ops)id xiaowang# uid=1002(xiaowang) gid=1002(backend) groups=1002(backend)# 1. 创建团队数据目录mkdir -p /data/ops /data/backend /data/data# 2. 设置目录归属(组 ownership)chown root:ops /data/opschown root:backend /data/backendchown root:data /data/data# 3. 设置权限:owner=rwx, group=rwx, others=---chmod 770 /data/opschmod 770 /data/backendchmod 770 /data/data# 4. 验证ls -ld /data/*# drwxrwx--- 2 root ops 4096 ... /data/ops# drwxrwx--- 2 root backend 4096 ... /data/backend# drwxrwx--- 2 root data 4096 ... /data/data这样各团队只能进自己的目录,互不干扰。
上面有个问题:用户在 /data/backend 下新建的文件,默认组是用户的主组(backend),这没问题。但如果某个用户通过附加组访问其他目录,新建文件的组可能不对。SGID 解决这个问题:
# 给目录设置 SGIDchmod g+s /data/backend# 效果:在该目录下新建的文件/子目录,自动继承目录的组su - xiaowangtouch /data/backend/test.txtls -l /data/backend/test.txt# -rw-r--r-- 1 xiaowang backend ... test.txt ← 组是 backend,不是 xiaowang 的主组# 递归设置 SGID(含已有子目录)find /data -type d -exec chmod g+s {} \;770 权限下,同组用户可以互相删除对方的文件(因为组有 write 权限)。加 Sticky Bit 后,只有文件 owner 才能删自己的文件:
# 设置 Sticky Bit(同 /tmp 的机制)chmod +t /data/backend# 验证ls -ld /data/backend# drwxrwx--T 2 root backend ... /data/backend# ↑ T = Sticky Bit 生效# 效果:小王能写 /data/backend,但删不了同组小李的文件最佳实践组合:
# 目录权限 = 770 + SGID + Sticky Bit = 3770chmod 3770 /data/backend# 3 = SGID(2) + Sticky(1)# 验证ls -ld /data/backend# drwxrws--T 2 root backend ... /data/backend运维小张偶尔需要查看后端日志,但不需要写权限:
# 方案一:把小张加入 backend 附加组(给读写权限)usermod -aG backend zhangsanid zhangsan# uid=1001(zhangsan) gid=1001(ops) groups=1001(ops),1002(backend)# 方案二(推荐):用 ACL 精细控制,只给读权限setfacl -m u:zhangsan:rx /data/backendgetfacl /data/backend# user::rwx# user:zhangsan:r-x ← 小张只读# group::rwx# mask::rwx# other::---附加组 vs ACL 怎么选?
多人共用服务器,用 root 操作=无法追溯谁干了什么。必须做两件事:
# /etc/ssh/sshd_configPermitRootLogin nosystemctl restart sshd# /etc/sudoers.d/ops(运维组:全部权限)%ops ALL=(ALL) ALL# /etc/sudoers.d/backend(后端组:只能重启自己的服务)%backend ALL=(root) /usr/bin/systemctl restart backend-app, /usr/bin/systemctl status backend-app# /etc/sudoers.d/data(数据组:只能操作自己的目录和脚本)%data ALL=(root) /usr/bin/systemctl restart etl-*, /usr/local/bin/run_etl.sh验证 sudo 配置:
# 查看用户能执行哪些 sudo 命令sudo -lU xiaowang# User xiaowang may run the following commands:# (root) /usr/bin/systemctl restart backend-app, /usr/bin/systemctl status backend-app审计:谁用了 sudo 做了什么
# 查看 sudo 日志grep sudo /var/log/secure # CentOSgrep sudo /var/log/auth.log # Ubuntu# 或者 journalctljournalctl -t sudo --since "today"传统权限只能设 owner/group/others 三级,ACL 可以给任意用户设权限:
# 给用户设权限setfacl -m u:zhangsan:rx /data/backend # 小张只读setfacl -m u:lisi:rwx /data/backend # 李四读写执行# 给组设权限setfacl -m g:ops:rx /data/backend # 运维组只读# 删除某条 ACLsetfacl -x u:zhangsan /data/backend# 清空所有 ACLsetfacl -b /data/backend# 递归设置(目录+已有文件)setfacl -R -m u:zhangsan:rx /data/backend/# 默认 ACL(新建文件自动继承)setfacl -d -m u:zhangsan:rx /data/backend/# mask 限制了 ACL 能给的最大权限setfacl -m u:zhangsan:rwx /data/backendsetfacl -m m::rx /data/backend # 把 mask 设为 rxgetfacl /data/backend# user:zhangsan:rwx #effective:r-x ← 实际只有 rx# mask::r-x# 改 mask 会影响所有 ACL 用户的实际权限,要小心场景:新人入职需要临时查看数据组目录
# 授权setfacl -R -m u:newguy:rx /data/data/setfacl -d -m u:newguy:rx /data/data/ # 新文件也继承# 离职或权限到期,一键回收setfacl -R -x u:newguy /data/data/groupadd <组名> | |
useradd -m -g <组> <用户> | |
usermod -aG <组> <用户> | |
chown root:<组> <目录> | |
chmod 770 <目录> | |
chmod g+s <目录> | |
chmod +t <目录> | |
chmod 3770 <目录> | |
setfacl -m u:<用户>:<权限> <目录> | |
setfacl -d -m u:<用户>:<权限> <目录> | |
getfacl <目录> | |
setfacl -x u:<用户> <目录> | |
sudo -lU <用户> | |
journalctl -t sudo --since "today" |
一句话总结: 多团队共用服务器,核心是"一组一目录、770+SGID+Sticky、sudo 按组收口、ACL 补位精细控制"。
落地清单:
groupadd),用户主组对应团队chmod 3770(770 + SGID + Sticky Bit)PermitRootLogin no/etc/sudoers.d/ 按团队拆文件)setfacl),不用附加组给读写setfacl -x 回收getfacl 检查目录权限、sudo -lU 检查 sudo 权限