服务器服务间权限隔离的核心是账户、文件、资源、运行环境四层协同:创建专用服务账户并禁用登录,用acl精细控制目录访问,通过systemd限制资源与能力,容器化则提供进程、文件系统和网络的天然隔离。

实现服务器服务间权限隔离,核心是让每个服务“各干各的、互不干扰”,既防故障扩散,也防权限越界。不是靠一个命令搞定,而是从账户、文件、资源、运行环境四个层面协同控制。
创建专用服务账户
避免所有服务都用 root 或同一普通用户运行。每个服务应有独立系统账户,UID 固定、无登录权限:
- 用 useradd -r -u 1001 -s /sbin/nologin -d /var/lib/nginx nginx 创建 Nginx 服务账户
- 同理为 MySQL、Redis、PHP-FPM 等分别分配 UID 1002、1003、1004…,避开 1–999 系统保留段
- 服务进程启动时明确指定用户,例如 systemd 服务文件中设置 User=nginx
用 ACL 精细控制数据目录访问
传统 owner/group 权限无法满足“A 服务可读写自己的目录、但完全看不到 B 服务目录”的需求,ACL 是更直接的解法:
- 为服务专属目录设置独立访问规则:setfacl -m u:nginx:rwx /srv/web-content
- 同时屏蔽其他服务访问:setfacl -m u:mysql:--- /srv/web-content
- 启用默认 ACL,确保新生成的文件自动继承权限:setfacl -d -m u:nginx:rwx /srv/web-content
限制运行时资源与能力
即使账户分离,服务仍可能耗尽 CPU、内存或滥用系统调用。需在启动层加固:
- systemd 服务中配置 MemoryLimit=512M、CPUQuota=50% 防止单一服务霸占资源
- 禁用危险能力:CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_CHOWN(只保留必需项)
- 启用私有挂载命名空间:PrivateTmp=yes、ProtectSystem=strict
容器化运行(推荐进阶方案)
当服务数量多、依赖复杂时,Docker 或 Podman 提供天然隔离边界:
- 每个服务运行在独立容器内,自带文件系统、进程空间和网络栈
- 镜像构建时用 USER nginx 指令降权,避免以 root 运行应用进程
- 通过自定义 bridge 网络控制容器间通信,不显式允许则默认不通
- 挂载卷时指定 uid/gid,确保宿主机文件权限与容器内用户对齐
不复杂但容易忽略











