linux服务部署和权限管理

记录一下在linux上部署服务的一般setup

权限隔离

为了权限隔离,核心原则是每个服务使用独立用户运行,只给它最低权限(Least Privilege)。

通常建议为每个服务创建一个专用用户,例如:

服务 用户名建议
nginx nginx
mysql mysql
redis redis
yourapp appuser / myservice

不建议用 root 运行服务,因为 root 权限太大。

创建服务用户

创建系统用户,同时不允许登陆,-r表示系统用户,uid低于1000,nologin的用户无法使用su切换到改账户

1
sudo useradd -r -s /usr/sbin/nologin myservice

或者如果需要登陆的话,创建普通用户

1
sudo useradd -m -s /bin/bash myservice

给用户设置密码,如果需要登陆的话

1
sudo passwd myservice

权限管理

权限管理的核心是:把文件、目录、进程资源权限限制在最小范围

例如需要访问的文件是/var/www/myapp

1
2
3
sudo mkdir -p /var/www/myapp
sudo chown -R myservice:myservice /var/www/myapp
sudo chmod -R 750 /var/www/myapp

chown更改目录的所有权,chmod -R 750表示所有者:读写执行,组:读执行,其他:无权限

常见服务权限需求:

资源 权限建议
日志文件 644 或 640
日志目录 750
数据目录 700 或 750
配置文件 600 或 640
可执行文件 755

服务启动

如果你用 systemd 启动服务,你应该在 service 文件里指定:

1
2
3
4
5
6
7
8
9
[Service]
User=myservice
Group=myservice

# 更多限制
PrivateTmp=true
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=true

这样服务进程就会以该用户身份运行。或者进一步的限制:

  • PrivateTmp=true:独立 /tmp,避免泄漏
  • NoNewPrivileges=true:禁止提权
  • ProtectSystem=full:系统目录只读
  • ProtectHome=true:用户家目录只读/不可访问

不过禁止提权可能会导致无法监听特权端口,所以视情况而定。以及注意要配置log目录和文件的权限,确保用户可以访问。

可以先在终端切换用户试一下服务是否能启动

1
su -u myservice /usr/bin/myservice --config /etc/myservice/some.conf

配置模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Some Service
After=network.target

[Service]
User=someuser
Group=somegroup

# 允许绑定低端口
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
ProtectSystem=full
ProtectHome=true

ExecStart=/some/bin run --config /some/config.json
Restart=on-failure

[Install]
WantedBy=multi-user.target

linux服务部署和权限管理
http://zr4in.github.io/2026/01/22/linux服务部署和权限管理/
作者
zr4in
发布于
2026年1月22日
许可协议