可以看一下 Linux 的权限机制
https://wiki.archlinux.org/title/Users_and_groups_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)用户基本分为三类,root 、普通用户、nobody,分别对应所有权限、有限的权限、无权限。
按照我个人的习惯来说,判断应该使用哪个用户:
root:尽量不用,基本只有我需要在服务器上调整配置和安装系统软件的时候会用到;
nobody:如果只需要让程序或脚本访问服务器上所有人( all )都能访问的资源,或者当所有资源都受权限管控的时候不想让程序或脚本访问任何本地资源,那么就用 nobody ;
普通用户:除了上面需要用 root 和可以用 nobody 的场景以外,基本全都用普通用户。
每个文件和目录本身会有:
1. 归属于的用户和归属于的用户组;
2. 权限标识,按照身份分为自己( user )、群组( group )、所有人( all ),按操作分为读、写、运行权限。
root 不受权限标识的限制,nobody 只能访问所有人都能访问的资源,普通用户可以访问归属于自己的文件和目录,初次之外具体看权限标识的设定。
回到题主的情境,签证书可能可以用普通用户和 nobody 来做,所以可以不用 root ;证书文件又属于需要保密的,不能让所有人都能访问,所以不用 nobody,那么最好用普通用户来做。
即你可以创建一个普通用户,如名叫 signer,同时创建一个存放证书的目录,比如叫 ca ;
ca 目录和
acme.sh 文件归属于 signer 所有,设定为所有人不能访问、自己可以读、写、运行;
同时
acme.sh 脚本不需要被群组访问,所以把这个文件单独设定为群组不可访问;
执行签证书的任务的时候使用 signer 用户来执行
acme.sh 脚本,在 ca 目录下生成证书文件。
然后确保 ca 下的证书文件和 ca 目录所有者、权限标识一致。
接下来就是需要用证书的程序了,它们只需要对证书的读权限,所以可以让 signer 和需要读取证书的用户在同一个用户组里,比如叫 ca_ro,并让 ca 目录及其中的证书文件属于 ca_ro 组,且权限标识设定为群组可读、不可写、不可运行。
至此,就能确保:
0. 除了 root 以外;
1. 只有 signer 用户能读写运行
acme.sh 脚本;
2. 只有 signer 用户能写 ca 目录及其子文件;
3. 除了 signer 用户以外,所有加入到 ca_ro 群组的用户都能读取 ca 目录及其子文件。