问题:
v2ray和trojan在默认情况下,是以nobody用户身份运行,nobody用户是一个Linux系统中默认的最低权限的用户,它无法读取从 letsencrypt 申请的证书私钥。如果不更改letsencrypt目录及其私钥的权限,那么v2ray或trojan进程将会无法读取证书,也就无法启动。
解决这个问题的办法有三种:
- 第1种是简单粗暴法,打开v2ray守护进程的配置文件
v2ray.service
,将文件中的user=nobody
这一行删除。没有这一行,v2ray或trojan将会以最高权限root身份运行。这种方法简单粗暴,但是有潜在安全风险,我不推荐这么做。
- 第2种方法是将证书及其目录的权限设置为755,让任何用户都能读取证书私钥。这种方法风险更高,强烈建议不要这样做。
- 前面这2种方法都是不安全也不专业的做法,专业的做法是创建一个权限受限的新用户,并且给这个新用户赋予读取证书和私钥的权限。然后指定v2ray或trojan以这个新用户的身份运行,这样就完美解决了以上的安全问题。
解决方案:
这一节只实现第3种方案,实现步骤:
- 创建一个没有 home 目录并且不能登录的服务用户: sec-usr
- 创建一个用户组 sec-crts
- 将 sec-usr 添加进 sec-crts 组
- 将 /etc/letsencrypt 的组所有权设置为 sec-crts
- 在服务账号需要访问文件的上级目录上设置 passthrough 穿透权限
- 让 sec-crts 组拥有读取证书和私钥的权限
- 指定应用以 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 文件,指定进程的运行身份:
1
|
sudo vim /etc/systemd/system/v2ray.service
|
并将 User=nobody
更改为 User=sec-usr
, v2ray将会以用户sec-usr
运行。
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.