Featured image of post 证书权限管理的最佳安全实践

证书权限管理的最佳安全实践

创建专有证书组和服务用户


问题:

v2ray和trojan在默认情况下,是以nobody用户身份运行,nobody用户是一个Linux系统中默认的最低权限的用户,它无法读取从 letsencrypt 申请的证书私钥。如果不更改letsencrypt目录及其私钥的权限,那么v2ray或trojan进程将会无法读取证书,也就无法启动。

解决这个问题的办法有三种:

  1. 第1种是简单粗暴法,打开v2ray守护进程的配置文件v2ray.service,将文件中的user=nobody这一行删除。没有这一行,v2ray或trojan将会以最高权限root身份运行。这种方法简单粗暴,但是有潜在安全风险,我不推荐这么做。
  2. 第2种方法是将证书及其目录的权限设置为755,让任何用户都能读取证书私钥。这种方法风险更高,强烈建议不要这样做。
  3. 前面这2种方法都是不安全也不专业的做法,专业的做法是创建一个权限受限的新用户,并且给这个新用户赋予读取证书和私钥的权限。然后指定v2ray或trojan以这个新用户的身份运行,这样就完美解决了以上的安全问题。

解决方案:

这一节只实现第3种方案,实现步骤:

  1. 创建一个没有 home 目录并且不能登录的服务用户: sec-usr
  2. 创建一个用户组 sec-crts
  3. 将 sec-usr 添加进 sec-crts 组
  4. 将 /etc/letsencrypt 的组所有权设置为 sec-crts
  5. 在服务账号需要访问文件的上级目录上设置 passthrough 穿透权限
  6. 让 sec-crts 组拥有读取证书和私钥的权限
  7. 指定应用以 sec-usr 运行

这种解决方案更专业和精确,而且安全。推荐使用这种合理设计的方案,而不是采用让所有人都能读取证书这种不安全的方案。这种方案不仅仅是适用于v2ray或trojan,也适用于其它需要读取证书的应用或者服务,是一种优秀的安全实践。

实现脚本:

为了简化操作,使用以下脚本完成:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash

# 脚本:创建服务用户和组以访问 LetsEncrypt 证书

# 1. 创建一个服务用户 "sec-usr",该用户没有主目录且禁止登录
echo "正在创建服务用户 'sec-usr'..."
sudo useradd --system --no-create-home --shell /usr/sbin/nologin sec-usr

# 2. 创建一个用户组 "sec-crts"
echo "正在创建用户组 'sec-crts'..."
sudo groupadd sec-crts

# 3. 将用户 "sec-usr" 添加到 "sec-crts" 组
echo "正在将用户 'sec-usr' 添加到 'sec-crts' 组..."
sudo usermod -a -G sec-crts sec-usr

# 4. 将 /etc/letsencrypt 目录及其内容的组所有权递归更改为 "sec-crts"
echo "正在将 /etc/letsencrypt 的组所有权更改为 'sec-crts'..."
sudo chown -R root:sec-crts /etc/letsencrypt

# 5. 为 archive 和 live 目录设置穿透(passthrough)权限
echo "正在为 /etc/letsencrypt/archive 设置权限..."
sudo chmod -R 750 /etc/letsencrypt/archive

echo "正在为 /etc/letsencrypt/live 设置权限..."
sudo chmod -R 750 /etc/letsencrypt/live

# 6. 为证书和私钥设置权限
echo "正在为证书设置权限..."
sudo find /etc/letsencrypt/archive -type f -name "*.pem" -exec chmod 644 {} \;
sudo find /etc/letsencrypt/archive -type f -name "privkey*.pem" -exec chmod 640 {} \;

echo "脚本执行完毕。"
echo "用户 'sec-usr' 和组 'sec-crts' 已创建,并且 /etc/letsencrypt 的权限已应用。"

指定应用以sec-usr运行

证书权限设置完毕,随后编辑 service 文件,指定进程的运行身份:

  • v2ray:
1
sudo vim /etc/systemd/system/v2ray.service

并将 User=nobody 更改为 User=sec-usr, v2ray将会以用户sec-usr运行。

  • trojan:
1
sudo vim /usr/lib/systemd/system/trojan.service

并将 User=nobody 更改为 User=sec-usr,trojan将会以用户sec-usr运行。

  • 再运行 sudo systemctl daemon-reload 来重新加载 service 文件。
  • 最后运行 sudo systemctl restart v2ray 重启服务。

欢迎关注我的 Youtube频道 观看视频。

END.

Designed By Jimmycai https://jimmycai.com