安全部署

最小权限

以专用 clmbot 账号运行、sudoers 精确授权与证书目录 ACL;Nginx、Apache、Tomcat、IIS 分场景最小权限配置。

最后检查: 2026-08-09语言: 简体中文

clmbot 在执行证书自动更新时需要对目标证书文件进行读写,并在更新后重载或重启中间件。本文说明各类中间件场景下推荐的最小权限配置。

使用前提:本页命令是最小权限配置示例,不是可直接复制到所有服务器的固定方案。执行前必须核对实际账号、目录、服务名称和命令路径,并先在测试环境验证。

最小权限原则

推荐使用专用系统账号(如 clmbot)运行 clmbot,遵循以下原则:

  • 只授予读取 clmbot 配置、日志目录和目标证书安装点所需权限;
  • 只对 clmbot 管理的证书文件、私钥文件及其所在目录授予写入权限;
  • 只允许执行确认过的中间件 reload/restart 命令;
  • 不授予 NOPASSWD: ALL 或完整 root 权限;
  • before_scriptafter_script 必须经过人工审计。

禁止做法

  • 让 clmbot 长期以 root 或 Administrator 身份运行;
  • 将中间件配置目录、证书目录或系统服务控制权限整体开放给 clmbot;
  • bashpowershell.exesystemctl 授予无限制执行权限。

各中间件权限要求

Nginx

需要权限:

  1. 证书目录读写:对 .crt.key、CA 链文件所在目录具有读写权限,以便写入新证书并创建 .bak 备份;

  2. 执行 reload 命令

    nginx -t && nginx -s reload

最小授权建议:

  • 只开放目标证书目录,不授予整个 /etc/nginx 读写权限;
  • 通过 sudoers 精确授权 nginx -tnginx -s reload 命令。

Apache HTTP Server

需要权限:

  1. 证书目录读写:对 SSLCertificateFileSSLCertificateChainFileSSLCertificateKeyFile 所在目录具有读写权限;

  2. 执行服务重启命令(取决于发行版):

    systemctl restart httpd.service

    systemctl restart apache2.service

最小授权建议:

  • 只开放目标证书目录,不授予整个 Apache 配置目录;
  • 通过 sudoers 只对当前系统实际使用的 Apache 服务名授予 restart 权限。

Tomcat

需要权限:

  1. 证书目录读写:对 PEM 证书/私钥文件或 JKS keystore 文件所在目录具有读写权限;

  2. 执行停止和启动脚本

    export JAVA_HOME="<java_home>" && "<catalina_base>/bin/shutdown.sh" && "<catalina_base>/bin/startup.sh"

最小授权建议:

  • 优先让 clmbot 与 Tomcat 使用同一业务组,只授予目标 keystore 或证书目录读写权限;
  • 只允许执行对应 Tomcat 实例的 shutdown.shstartup.sh 脚本;
  • 不授予整个 /opt 目录权限;
  • 多实例 Tomcat 环境应按实例拆分授权:每个实例单独授权自己的 keystore 目录和启停脚本,不要用一条宽泛规则覆盖所有实例。

IIS

IIS 场景依赖 Windows PowerShell 脚本导入 PFX 并更新 HTTPS 绑定,需要管理员权限。

需要权限:

  1. 管理员账号运行:执行 powershell.exe -NoProfile -ExecutionPolicy Bypass 导入临时 PFX 并更新 IIS 站点绑定;
  2. 证书目录读写:临时 PFX 文件的创建和清理。

最小授权建议:

  • 使用专用 Windows 服务账号;
  • 只授予管理目标 IIS 站点绑定所需的权限;
  • PowerShell 执行策略和模块权限应按主机安全基线单独审核。

Linux sudoers 精确授权示例

sudoers 只允许精确命令,禁止 NOPASSWD: ALL

Nginx

clmbot ALL=(root) NOPASSWD: /usr/sbin/nginx -t
clmbot ALL=(root) NOPASSWD: /usr/sbin/nginx -s reload

Apache

clmbot ALL=(root) NOPASSWD: /bin/systemctl restart apache2.service

Tomcat

clmbot ALL=(tomcat) NOPASSWD: /opt/apache-tomcat/bin/shutdown.sh
clmbot ALL=(tomcat) NOPASSWD: /opt/apache-tomcat/bin/startup.sh

证书目录 ACL 配置

基础权限设置:

chown -R root:clmbot /etc/ssl/example
chmod 0750 /etc/ssl/example
chmod 0640 /etc/ssl/example/site.crt /etc/ssl/example/ca.crt
chmod 0640 /etc/ssl/example/site.key

使用 ACL 精确授权读写和备份权限:

setfacl -m u:clmbot:rwx /etc/ssl/example
setfacl -m u:clmbot:rw- /etc/ssl/example/site.crt
setfacl -m u:clmbot:rw- /etc/ssl/example/ca.crt
setfacl -m u:clmbot:rw- /etc/ssl/example/site.key

这允许 clmbot:

  • 写入新证书和私钥;
  • 创建 .bak 备份文件;
  • 完全清理备份和临时文件。

上线前权限核对表

部署 clmbot 前,逐项确认以下权限配置:

  • clmbot 是否使用专用账号运行(非 root 或管理员);
  • config.yaml 是否仅允许必要账号读取和写入;
  • 每个 servers[].format 指向的证书文件是否只开放必要读写权限;
  • 证书文件所在目录是否允许创建和清理 .bak 备份文件;
  • before_scriptafter_script 是否已经人工审计;
  • sudoers 是否只包含精确命令(不是 ALL、bash 或完整 systemctl);
  • Nginx/Apache/Tomcat 的 reload 或 restart 权限是否只覆盖目标实例;
  • 服务模式(Server Mode)监听地址和端口是否符合防火墙策略。

关键概念

config.yamlservers[].after_script 字段中定义的中间件 reload/restart 命令是权限管理的重点。所有脚本内容必须经过人工审计,权限应逐条授权。

禁止使用 NOPASSWD: ALL。这会给 clmbot 账号完整 root 权限,违反最小权限原则。

相关页面