我在 Ubuntu 上运行ss-server
代理(从包中)。shadowsocks-libev
我相信ss-server
是由systemd
. ss-server
以用户身份运行shadows+
,如下所示:
$ ps u -C ss-server
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
shadows+ 719498 0.0 0.7 16244 7976 ? Ss Nov30 0:06 /usr/bin/ss-server -c /etc/shadowsocks-libev/config.json
$ ps un -C ss-server
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
64677 719498 0.0 0.7 16244 7976 ? Ss Nov30 0:06 /usr/bin/ss-server -c /etc/shadowsocks-libev/config.json
该用户在哪里shadows+
定义?我没有在 中看到该用户/etc/passwd
。
实际用户名可能类似于shadowsocks
,并且被截断为 8 个字符。但即便如此,该用户也不存在于/etc/passwd
.
所以问题仍然存在,这个用户在哪里定义?
更新:
针对 telcoM 的回答,我将提供额外的背景信息来解释我为什么对shadowsocks-libev
用户感到好奇。
ss-server
作为用户 64677 运行(至少目前)。
ss-server
读取其配置文件/etc/shadowsocks-libev/config.json
。
任何用户都可以读取此配置文件(默认安装在 Ubuntu 上)。
此配置文件包含(默认情况下)一个半机密密码(可能是在系统上安装软件包时生成的)。
理想情况下,只有ss-server
程序和任何ss-client
连接的程序ss-server
会知道这个密码。
因此,任何用户都可以读取配置文件这一事实在 IMO 中是一个(轻微的?)安全漏洞。
我正在考虑更改/etc/shadowsocks-libev/config.json
(或其父目录)的所有权。所以我想知道这个数字用户 ID 是否会在重新启动后保持稳定。
第二次更新:
感谢电信公司的回答和评论,我找到了以下文件:
/etc/systemd/system/multi-user.target.wants/shadowsocks-libev.service
# This file is part of shadowsocks-libev.
#
# Shadowsocks-libev is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This file is default for Debian packaging. See also
# /etc/default/shadowsocks-libev for environment variables.
[Unit]
Description=Shadowsocks-libev Default Server Service
Documentation=man:shadowsocks-libev(8)
After=network-online.target
[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
DynamicUser=true
EnvironmentFile=/etc/default/shadowsocks-libev
LimitNOFILE=32768
ExecStart=/usr/bin/ss-server -c $CONFFILE $DAEMON_ARGS
[Install]
WantedBy=multi-user.target
请注意,上述文件包含DynamicUser=true
. 该文件缺少StateDirectory=
条目。
首先,检查
passwd:
./etc/nsswitch.conf
你很可能会发现它说
passwd: compat systemd
。如果这是真的,那么您的系统正在使用systemd-userdbd.service
除了经典之外的方法/etc/passwd
来查找用户信息。这允许软件包通过将适当的 JSON 文件拖放到/usr/lib/userdb/
或/etc/userdb/
(或/run/userdb
与容器等一起使用)来轻松添加和删除特定于应用程序的用户帐户。有关更多信息,请阅读
man nss-systemd
您的系统,或点击此链接。查看内容
getent passwd 64677
,通过其 UID 号查找用户帐户,并以类似于/etc/passwd
一行的格式查看基本用户信息。这至少应该显示完整的用户名,然后您可以搜索。例如,如果您发现用户名实际上是shadowsocks1
,您可以运行:这可能会产生许多错误命中,但如果用户帐户有一个持久的本地定义,无论它是如何定义的,它都应该找到它。
systemd-userdbd.service
还可以支持在服务启动时“创建”并在服务关闭时不再存在的动态用户。这些将永远不会存储在/etc/passwd
任何文件中。此功能在 systemd 版本 232 中添加,并在版本 235 中得到显着扩展。根据 systemd 文档,用于动态用户的 UID 范围为 61184–65519。欲了解更多信息:https ://0pointer.net/blog/dynamic-users-with-systemd.html
检查正在运行的 systemd 服务的服务定义
ss-server
:如果它包含DynamicUser=yes
,则确认此功能正在使用中。要确定 UID 是否持久,请查看服务定义是否包含StateDirectory=
定义。如果定义了StateDirectory,只要目录/var/lib/private/<StateDirectory value>
不被删除,服务的名称不改变,UID号应该是稳定的。如果语法
/etc/shadowsocks-libev/config.json
允许引用其他文件以包含在配置中,您可以将配置的秘密部分放入放入 StateDirectory 并chown
适当编辑的文件中;在这种情况下,即使动态 UID 必须更改,systemd 也会自动chown
将状态目录及其内容与新的 UID 匹配。