服务器上的程序,以前可以用 user=nobody 的方式跑起来,现在需要读取证书文件,证书文件是 acme.sh 在 root 权限下生成的,如何设置可以让程序以 nobody 权限读取到证书文件跑起来?

2021-09-16 12:20:40 +08:00
 cathedrel

acme.sh 生成的证书默认放在 /root/.acme/xxx/xxx 里面

用 supervisor 管理程序的自启动,原配置里写的 user=nobody,安全用了几年了

现在程序升级,也想要更高的安全。如果把证书文件(没有移动位置)的权限改为“任何人可读”,不行,程序启动失败(就算启动成功了,acme 自动更新后也要失败的吧,到时候又要操作一番,也麻烦)

supervisor 的配置改为 user=root 就可以成功读取证书运行程序,只要不爆出漏洞好像也没什么问题,但是从安全角度来讲逼格不够

所以,大佬们,该怎么操作可以显得有逼格呢?

10621 次点击
所在节点    Linux
32 条回复
oott123
2021-09-16 12:59:44 +08:00
再专门建个用户,或者你把证书文件移动到别的地方去,再上个 SELinux 啥的
zengxs
2021-09-16 13:02:03 +08:00
这个是最基础的文件权限问题
只有 root 用户可以读取 /root/ 目录下的文件

还有不建议让 nobody 用户拥有读取证书文件的权限,你感觉「安全用了几年」不代表这个行为就真的安全了
zengxs
2021-09-16 13:06:50 +08:00
参考下这个: https://serverfault.com/questions/62496/ssl-certificate-location-on-unix-linux

建议将证书文件放在 /etc/ssl 目录,这个目录只允许 root 读取
cz5424
2021-09-16 13:09:25 +08:00
新建 nginx 用户,证书授权 nginx 用户可读
pupboss
2021-09-16 13:29:21 +08:00
root 账户直接搞 acme 从根儿上就不是很有逼格了,一般都会有一个日常普通用户的

想要解决这个问题,最好的办法是用 acme 的 deploy 功能,可以部署到 nginx 甚至用 ssh 部署到其他服务器,在你部署的时候,目标文件夹改好权限 644,覆写的文件权限不会变( root 反正肯定能写进去),这样你的 nobody 可以从 deploy 文件夹读到证书。最好别在 acme 根目录做操作,这和使用 root 账户日常办公一样没逼格
wffnone
2021-09-16 13:49:22 +08:00
你不能脱离场景谈用法。你也不能脱离自己谈习惯。

Linux 有一些基本的使用规则和基本的操作,用户熟悉了之后,用起来就想喝水用杯子一样自然。只是因为方便,不是因为用杯子就比用手高级。

如果你要开始实行这些规则,你就要试着去实行这一系列的整体,让它们变成你的习惯,至少是你工作里的保持着一致性的守则(千万别兴趣一来就高级一点,没兴趣就低级一点)。你的目的是为了完成工作,不是显得“高级”(更不必谈这根本不高级)。你的所有的规则应当构成一个整体,你应当自如于其中。这应当是一个有乐趣的自己进步的过程。

接着往下说,这种乐趣学习的过程,一般来说是阅读文档,阅读他人的项目对这些原则和工具的应用。你需要让自己保持开放心态去学习。而针对(这种如此基础的程度的)具体问题的具体解决方案是有害的,因为如此容易获得的答案反而阻止了你进一步学习,你得到了答案,却错过了一个进步的机会(因为问题给你的动力,能冲到比答案更远的地方)。
msg7086
2021-09-16 13:53:23 +08:00

3. copy/安装 证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.

注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.

正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被 copy 到相应的位置


RTFM

安装命令里可以 chown 把复制后的文件的所属用户改成 nobody,然后再重启服务就可以了。
ipwx
2021-09-16 13:59:02 +08:00
读完以后 fork 然后 setuid
hushao
2021-09-16 14:19:16 +08:00
你用 acme 的姿势是不是不对?我记得 acme 可以安装在用户目录下的,并且不建议直接使用~/.acme.sh/xxx 下的证书,取得证书后要把证书复制到自定义目录。

查查这个命令 `acme.sh --installcert`
cathedrel
2021-09-16 14:43:14 +08:00
@zengxs 为什么不让 nobody 用户读取证书? nobody 读取证书后也不能做没让它去做的事情啊
cathedrel
2021-09-16 14:43:51 +08:00
@zengxs 我倒是想知道哪个目录可以让 nobody 读取?
cathedrel
2021-09-16 14:44:22 +08:00
@cz5424 系统里都没有安装 nginx
cathedrel
2021-09-16 14:46:07 +08:00
@pupboss Linux 默认的那些文件夹里面哪个可以直接让 nobody 读取?
cathedrel
2021-09-16 14:54:02 +08:00
@msg7086 之前是用这样的命令申请到证书的:

acme.sh --server api.buypass.com/acme/directory --issue -d xxx.com --days 176 --standalone

申请成功之后应该是自动生成了一个 cron 任务检查证书到期时间并在差不多的时候自动续期对吧?续期的证书也是放在原来的位置。如果现在要改动的话,新命令要怎么写?加上--install-cert /xxx 这一段?那个 chown 的部分应该怎么写呢?不好意思,弱手,您再指点一下
cathedrel
2021-09-16 14:57:05 +08:00
@ipwx 什么叫读完以后 fork ?完全不懂,setuid 也不懂,您展开说一下好嘛?
cathedrel
2021-09-16 14:58:59 +08:00
@oott123 服务器上专门建用户的话怎么能做到权限最小同时该有的都有?不太熟悉这块,我是觉得有个 nobody 用户就好好利用
princelai
2021-09-16 15:19:05 +08:00
@cathedrel #14 应该是写在--reload-cmd "chmod a+r xxxx",我这里通常是写 systemctl restart,没在这里写过 chmod
msg7086
2021-09-16 18:37:59 +08:00
@princelai 对,虽然我没自己试过,但是应该可以 chown xxx && restart xxx 。

Install cert 只要执行一次就会写入配置文件的吧,以后自动签发时也会自动安装。
princelai
2021-09-16 18:40:59 +08:00
@msg7086 #18 是的,就写在~/.acme.sh/name.server/name.server.conf 里,写错了自己手动编辑就能改
lolizeppelin
2021-09-16 19:10:29 +08:00
楼上说的 fork 以后 setuid 就是最标准的做法

自己翻文档

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/802263

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX