V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
raysonlu
V2EX  ›  NGINX

nginx 读取 ssl 证书的权限问题请教

  •  
  •   raysonlu · 14 天前 · 1038 次点击
    nginx 是用 nobody 运行,另外有一个用户 petter 主要是维护一大堆证书(公钥和私钥),我以为,根据 linux 的文件权限读取规则,建立一个 ssl 用户组,让 nobody 和 petter 都加入进去,再把整个证书存放目录设置为 petter:ssl ,就可以让 nginx 读取。

    但实测并不能,nginx 处理访问触发读取 ssl 证书的时候,会报错无权限读取 ssl 证书,摸索了一番后,发现只有把证书拥有者改为 nobody ,nginx 才能读取并正常处理访问。

    “进程的拥有者只能读取自己拥有的证书”?这与理解的 linux 文件权限读取逻辑有点不一样,这是 linux 内核对这种操作的特殊处理,还是 nginx 自己定的规则?
    第 1 条附言  ·  13 天前
    贴一下自己新的摸索结果:
    1 、nginx1.15.9+openssl 1.0.2 就开始支持证书路径使用变量配置,一旦使用了变量,ssl 证书的读取就交给 worker 进程(也就是这里的 nobody 用户),否则会由主进程读取(一般是 root 用户);

    2 、如果是 worker 进程读取,将会每次请求都去读,吞吐性能大概下降 4 成;

    3 、root 是权限大王 ,所以它读取的时候可以无视文件配置,但如果是非 root 用户(假设就是这里的 nobody 用户)读取,就要遵循 linux 文件权限规则;

    4 、上面失败的主要原因,是只关注了整个路径的“目录”和“文件”的 r 权限,实际需要对每一个“目录”增加 x 权限,才能给到相应的用户(或用户组所在用户)“找得到”,我理解为可当作对目录执行 ls 命令所以需要 x 权限;

    5 、回到开始自己的需求,是希望在 nginx 配置中,可以对 ssl 证书的存放“目录前缀”进行统一设置,以便我更改 ssl 证书存放目录时,不需要对每个配置文件都一一修改,但奈何 nginx 的 ssl 路径的变量处理有点“激进”,目前能想到的只有依赖系统的 symbolic link 来实现。
    11 条回复    2024-12-05 10:05:43 +08:00
    saka1zd
        1
    saka1zd  
       14 天前
    证书的权限设置了啥
    adoal
        2
    adoal  
       14 天前   ❤️ 1
    想多了,证书文件只是普通文件,对 Linux 内核来说跟其它文件没有什么不同。
    不如先找一个能登录的其它用户,加入 ssl 组,看看能不能打开证书文件。
    dzdh
        3
    dzdh  
       14 天前
    acl
    goodryb
        4
    goodryb  
       14 天前
    同一个用户组也要看你给文件的权限 600 同一个用户组也访问不了,起码 640
    liaohongxing
        5
    liaohongxing  
       14 天前
    要用 chmod 给文件夹加组读权限, 也 644 ,ls 表现为: -rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
    liaohongxing
        6
    liaohongxing  
       14 天前
    或者楼上 640
    hguandl
        7
    hguandl  
       14 天前
    我感觉更常见的方案是用 nginx.conf 来设置用户。master process 启动时一般是 root 权限,读取配置后再 fork 出 worker process 并 setuid 。
    ysc3839
        8
    ysc3839  
       14 天前 via Android
    我个人是让证书更新程序和 nginx 都使用 www 用户。隔离不需要太细,能起到隔离作用就行了。
    @hguandl 这么干问题更多,master process 还是 root 身份运行,还是有安全风险。且更新证书后要 reload 的话,只能以 root 权限发信号。
    NevadaLi
        9
    NevadaLi  
       13 天前   ❤️ 1
    setfacl -Rm u:nginx-user:r /path/of/certs
    setfacl -Rm u:petter:rw /path/of/certs
    setfacl -dm u:nginx-user:r /path/of/certs
    setfacl -dm u:petter:rw /path/of/certs


    setfacl -Rm u:nginx-user:x /path
    setfacl -Rm u:petter:rx /path

    setfacl -Rm u:nginx-user:x /path/of
    setfacl -Rm u:petter:rx /path/of


    # 解释说明: 第一组的四条分别设置 nginx-user 允许读取权限,petter 允许 rw ,新的文件默认也遵循前两条;第二和第三组允许俩用户进入证书所在的父目录。

    注意:nginx-user 只是一个名字,可以直接设置 nginx 运行的 uid ,权限也设置成相同 uid 就好,比如 setfacl -Rm u:81:r /path/of/certs
    raysonlu
        10
    raysonlu  
    OP
       13 天前
    @NevadaLi 谢谢学到新的命令工具,但原生的已经足够灵活使用,无需额外安装适用性广
    NevadaLi
        11
    NevadaLi  
       13 天前
    @raysonlu #10 acl 也是各发行版原生自带的(除非极致精简的系统),这东西就是设计被用来弥补 rwxrwxrwx 中 other 权限过于宽泛的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3513 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:40 · PVG 12:40 · LAX 20:40 · JFK 23:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.