Linux用户权限分级隔离配置:从零实现安全隔离
Linux用户权限分级隔离配置:从零实现安全隔离
多人共用一台Linux服务器时,如果所有用户权限相同,很容易误删他人文件或泄露敏感数据。
通过 Linux用户权限分级隔离配置,你可以将用户划分到不同组,并为每个组或每个用户设置独立的文件访问权限。
本文面向零基础用户,从创建用户开始,一步步带你完成配置,并给出常见坑和验证方法。
准备工作:检查环境并获取root权限
开始之前,你需要一台Linux服务器(如Ubuntu 20.04或CentOS 7+),并且拥有 root权限 或一个可以使用 sudo 的用户。
如果你是用普通用户登录,执行下面命令时记得加 sudo。
# 查看当前用户
whoami
# 检查能否使用sudo
sudo -v
如果能成功执行且不报错,就可以继续了。
第一步:按角色创建用户和组
假设你的服务器上有三个角色:开发者(dev)、运维(ops)和访客(guest)。
每个角色的访问需求不同,我们需要为每个角色创建一个 用户组,再把用户加入对应组。
# 创建三个组
sudo groupadd developers
sudo groupadd operators
sudo groupadd guests
# 创建用户并设置主组(也可以附加组)
sudo useradd -m -g developers dev01
sudo useradd -m -g operators ops01
sudo useradd -m -g guests guest01
# 为每个用户设置密码
sudo passwd dev01
sudo passwd ops01
sudo passwd guest01
注意:-m会自动创建用户家目录,-g指定主组。如果需要加入多个组,用-G。
第二步:分配目录权限实现隔离
核心思路是:每个用户只能读写自己的家目录和公共资源目录,不能随意查看其他用户的文件。
我们用 chown 和 chmod 来操作。
1. 设置每个用户家目录权限
# 确保家目录仅属主可读写执行,其他人无权限
sudo chmod 700 /home/dev01
sudo chmod 700 /home/ops01
sudo chmod 700 /home/guest01
这样,即使其他用户知道路径也进不去。
2. 创建共享目录并按组授权
假设开发者需要共享代码仓库,运维需要共享日志目录,访客只能下载公开文件。
# 创建共享目录
sudo mkdir /srv/code
sudo mkdir /srv/logs
sudo mkdir /srv/public
# 修改所属组
sudo chown root:developers /srv/code
sudo chown root:operators /srv/logs
sudo chown root:guests /srv/public
# 设置权限:组内可读写,其他人无法访问
sudo chmod 770 /srv/code
sudo chmod 770 /srv/logs
sudo chmod 755 /srv/public # 访客目录可以让所有人读,但只有组内可写
验证一下:dev01 用户可以进入 /srv/code 并创建文件,但 ops01 无法进入 `
/srv/code`(因为组不同)。
第三步:用umask控制新建文件的默认权限
即使目录权限正确,用户新建的文件可能默认带有过宽的权限(比如其他用户可读)。
通过设置 umask 可以控制。
# 查看当前umask值
umask
通常默认是 0022,表示新建文件权限为644(rw-r--r--),目录755(rwxr-xr-x)。
为了实现隔离,建议设置为 0077,新建的文件只有属主可读写。
修改所有用户的umask(全局生效):编辑 /etc/profile 或 /etc/bash.bashrc,在文件末尾添加:
umask 0077
然后让用户重新登录生效。
也可以单独为某个用户设置在家目录的 .bashrc 中:
echo "umask 0077" >> /home/dev01/.bashrc
注意:umask值过高可能会影响服务端脚本的文件写入权限,请根据实际需要调整。
第四步:用sudo精确限制提权操作
分级隔离不只是文件权限,还要限制用户能否执行特权命令。
通过编辑 /etc/sudoers 文件(建议用 visudo 命令),可以精确控制。
# 允许developers组的所有成员执行任何命令(即完全sudo权限,通常不推荐)
%developers ALL=(ALL) ALL
# 允许operators组的成员只执行重启服务命令
%operators ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart mysql
# 不允许guests组使用sudo
# 不添加即可
保存退出后,用 ops01 用户测试:
sudo systemctl restart nginx # 可以执行
sudo systemctl restart sshd # 报错!未授权
就这样实现了 sudo权限分级。
避坑指南
- 不要给用户组过大的权限:例如将普通用户加入sudo组,会打破隔离。
- 注意粘滞位:共享目录(如
/tmp)默认有粘滞位(chmod +t),防止用户删除不属于自己的文件。你自己的共享目录也建议加上:sudo chmod +t /srv/code。 - ACL高级权限:如果多组成员需要同时读写一个目录,使用ACL更精细。允许
developers组成员读,operators组成员写:sudo setfacl -m g:developers:rx /srv/public && sudo setfacl -m g:operators:rwx /srv/public。 - 修改文件后记得刷新:对新创建的目录或文件,组关系可能来不及生效,用
newgrp命令切换组再测试。
验证你的隔离效果
切换不同用户进行测试:
# 切换用户
dev01 用户
su - dev01
# 尝试进入其他用户家目录
ls /home/ops01 # 权限拒绝
# 尝试在无权目录写文件
touch /srv/logs/test.txt # 权限拒绝
# 检查新建文件的权限
touch ~/test.txt
ls -l ~/test.txt # 应为 -rw------- (600)
按照上述步骤,你应该能成功实现 Linux用户权限分级隔离配置。
如果你在过程中遇到“Permission denied”但权限似乎正确,请检查父目录的权限是否阻挡,比如 /home 目录通常权限为755,如果误改成700会导致其他用户无法进入。
多用户环境建议保持 /home 为755。
总结
通过用户分组、目录权限收紧、umask默认限制和sudo精细授权,你可以构建一个清晰的权限隔离体系。
这套方法适用于开发测试环境、团队项目或任何需要多用户安全共存的场景。
如果服务器需要对外提供Web服务,还可以结合 chroot 或容器进一步强化隔离,相关内容我们在其他文章中讨论。