我已经在全新安装的 CentOS7(最小)上从 EPEL 安装了 tor。
配置隐藏服务后,我通过浏览hostname
tor 浏览器文件中生成的 URL 来检查并验证该服务是否启动并正在运行。
此时,服务配置为使用以下方式自动启动systemctl enable tor
一切正常,直到我重新启动服务sudo systemctl restart tor
。 之后,tor 服务不再启动,并记录以下错误:
Directory /var/lib/tor/hidden_service_01/ cannot be read: Permission denied
hidden_service_01
该文件夹是 tor 服务首次运行时自动创建的。
如果我删除hidden_service_01
文件夹并重新启动服务。它会启动(生成一个新的 .onion url)。但是一旦停止并重新启动,权限错误就会再次出现。
为什么我会收到权限错误以及如何解决?
PS 我创建了一个用于我的配置的指南片段: https://gist.github.com/Dzoge/f059d30da77a21df1a0f29a0b5c528a2
更新 1: 我检查了文件夹权限,它们是:
- 文件夹权限是
rwx------. 2 toranon toranon
- 文件夹中的两个文件是
rw-------. 1 toranon toranon
我设置chmod
为770
现在文件夹和文件都有rwxrwx---. 1 toranon toranon
我尝试启动 tor 服务systemctl start tor
但仍然收到相同的权限警告。
更新2: 我尝试在 Ubuntu 服务器上执行相同操作,效果很好。我还更新了要点并添加了 ubuntu 指南。
CentOS 7 上问题仍然存在。
更新 3(解决方法): 看来一个临时的解决方法是将 SELinux 设置为宽容模式。然后它就可以按预期工作了。
答案1
如果您查看该tor.service
单元,您将看到它有一个命令,用于在启动服务之前尝试验证 Tor 配置。
ExecStartPre=/usr/bin/tor --runasdaemon 0 --defaults-torrc /usr/share/tor/defaults-torrc -f /etc/tor/torrc --verify-config
问题就出在这里。运行时,由于前面提到的权限问题,配置验证失败。
Jan 06 16:18:42 dalaran systemd[1]: Starting Anonymizing overlay network for TCP...
Jan 06 16:18:42 dalaran tor[28731]: Jan 06 16:18:42.650 [notice] Tor 0.2.9.14 (git-3f9bd01bf5736ff6) running on Linux with Libevent 2.0.21-stable, OpenSSL 1.0.2k-fips and Zlib 1.2.7.
Jan 06 16:18:42 dalaran tor[28731]: Jan 06 16:18:42.650 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning
Jan 06 16:18:42 dalaran tor[28731]: Jan 06 16:18:42.650 [notice] Read configuration file "/usr/share/tor/defaults-torrc".
Jan 06 16:18:42 dalaran tor[28731]: Jan 06 16:18:42.650 [notice] Read configuration file "/etc/tor/torrc".
Jan 06 16:18:42 dalaran tor[28731]: Jan 06 16:18:42.653 [warn] Directory /var/lib/tor/hidden_service_01/ cannot be read: Permission denied
Jan 06 16:18:42 dalaran tor[28731]: Jan 06 16:18:42.653 [warn] Checking service directory /var/lib/tor/hidden_service_01/ failed.
Jan 06 16:18:42 dalaran tor[28731]: Jan 06 16:18:42.653 [warn] Failed to parse/validate config: Failed to configure rendezvous options. See logs for details.
Jan 06 16:18:42 dalaran tor[28731]: Jan 06 16:18:42.653 [err] Reading config failed--see warnings above.
Jan 06 16:18:42 dalaran systemd[1]: tor.service: control process exited, code=exited status=1
Jan 06 16:18:42 dalaran systemd[1]: Failed to start Anonymizing overlay network for TCP.
Jan 06 16:18:42 dalaran systemd[1]: Unit tor.service entered failed state.
Jan 06 16:18:42 dalaran systemd[1]: tor.service failed.
最终,我将其归结为 systemd 在此处进行的一些强化。如果您进一步阅读单元文件,您会发现 systemd 实际上在容器中运行 Tor,并且非常严格地锁定权限。它还删除了一些功能,因此即使是 root 用户也无法执行 root 用户通常可以执行的一些操作,例如读取其他用户的文件(这称为 CAP_DAC_OVERRIDE)。
当我们尝试审核失败的启动时,我们发现:
type=PATH msg=audit(1515277122.651:3600): item=0 name="/var/lib/tor/hidden_service_01/" inode=1054341 dev=fd:01 mode=040700 ouid=988 ogid=983 rdev=00:00 obj=system_u:object_r:tor_var_lib_t:s0 objtype=NORMAL
type=CWD msg=audit(1515277122.651:3600): cwd="/"
type=SYSCALL msg=audit(1515277122.651:3600): arch=c000003e syscall=2 success=no exit=-13 a0=561b6881af10 a1=20000 a2=0 a3=1 items=1 ppid=1 pid=28731 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="tor" exe="/usr/bin/tor" subj=system_u:system_r:tor_t:s0 key=(null)
type=AVC msg=audit(1515277122.651:3600): avc: denied { dac_read_search } for pid=28731 comm="tor" capability=2 scontext=system_u:system_r:tor_t:s0 tcontext=system_u:system_r:tor_t:s0 tclass=capability
type=AVC msg=audit(1515277122.651:3600): avc: denied { dac_override } for pid=28731 comm="tor" capability=1 scontext=system_u:system_r:tor_t:s0 tcontext=system_u:system_r:tor_t:s0 tclass=capability
我在这里发现,验证配置的命令在读取配置之前实际上并没有从 root 用户更改为 toranon 用户,因此目录的访问被拒绝,因为 systemd 没有为进程提供 CAP_DAC_OVERRIDE。您可以看到用户 ID 被记录为uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0
。
因此,为了在我的系统上解决这个问题,我决定让 systemd 以 toranon 的身份启动 Tor,而不是以 root 身份启动,并且 Tor 会更改其自己的 uid/gid。
- 我
User toranon
从 中删除了该设置/usr/share/tor/torrc-defaults
。 我创建了一个覆盖文件,
/etc/systemd/system/tor.service.d/override.conf
其中包含:[Service] User=toranon Group=toranon PermissionsStartOnly=no
必须使用PermissionsStartOnly=no
确保该ExecStartPre=
命令在 toranon 用户下运行。从文档:
PermissionsStartOnly=
接受布尔参数。如果为 true,则权限相关的执行选项,如使用User=
和类似选项配置的一样(请参阅systemd.exec(5)(有关详细信息),仅适用于以 启动的进程ExecStart=
,而不适用于其他各种ExecStartPre=
、ExecStartPost=
、ExecReload=
、ExecStop=
和ExecStopPost=
命令。如果为 false,则该设置将以相同的方式应用于所有配置的命令。默认为 false。
经过一段时间后,systemctl daemon-reload
我才能够systemctl start tor
成功。
Jan 06 16:22:02 dalaran systemd[1]: Starting Anonymizing overlay network for TCP...
Jan 06 16:22:02 dalaran tor[32030]: Jan 06 16:22:02.541 [notice] Tor 0.2.9.14 (git-3f9bd01bf5736ff6) running on Linux with Libevent 2.0.21-stable, OpenSSL 1.0.2k-fips and Zlib 1.2.7.
Jan 06 16:22:02 dalaran tor[32030]: Jan 06 16:22:02.541 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning
Jan 06 16:22:02 dalaran tor[32030]: Jan 06 16:22:02.541 [notice] Read configuration file "/usr/share/tor/defaults-torrc".
Jan 06 16:22:02 dalaran tor[32030]: Jan 06 16:22:02.541 [notice] Read configuration file "/etc/tor/torrc".
Jan 06 16:22:02 dalaran tor[32030]: Configuration was valid
Jan 06 16:22:02 dalaran systemd[1]: Started Anonymizing overlay network for TCP.
Jan 06 16:22:02 dalaran tor[32035]: Jan 06 16:22:02.665 [notice] Tor 0.2.9.14 (git-3f9bd01bf5736ff6) running on Linux with Libevent 2.0.21-stable, OpenSSL 1.0.2k-fips and Zlib 1.2.7.
Jan 06 16:22:02 dalaran tor[32035]: Jan 06 16:22:02.665 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning
Jan 06 16:22:02 dalaran tor[32035]: Jan 06 16:22:02.665 [notice] Read configuration file "/usr/share/tor/defaults-torrc".
Jan 06 16:22:02 dalaran tor[32035]: Jan 06 16:22:02.665 [notice] Read configuration file "/etc/tor/torrc".
Jan 06 16:22:02 dalaran tor[32035]: Jan 06 16:22:02.668 [notice] Opening Socks listener on 127.0.0.1:9050
Jan 06 16:22:02 dalaran tor[32035]: Jan 06 16:22:02.668 [notice] Opening Control listener on /run/tor/control
Jan 06 16:22:02 dalaran Tor[32035]: OpenSSL version from headers does not match the version we're running with. If you get weird crashes, that might be why. (Compiled with 100020bf: OpenSSL 1.0.2k 26 Jan 2017; running wit
Jan 06 16:22:02 dalaran Tor[32035]: Tor 0.2.9.14 (git-3f9bd01bf5736ff6) running on Linux with Libevent 2.0.21-stable, OpenSSL 1.0.2k-fips and Zlib 1.2.7.
Jan 06 16:22:02 dalaran Tor[32035]: Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning
Jan 06 16:22:02 dalaran Tor[32035]: Read configuration file "/usr/share/tor/defaults-torrc".
Jan 06 16:22:02 dalaran Tor[32035]: Read configuration file "/etc/tor/torrc".
Jan 06 16:22:02 dalaran Tor[32035]: Opening Socks listener on 127.0.0.1:9050
Jan 06 16:22:02 dalaran Tor[32035]: Opening Control listener on /run/tor/control
Jan 06 16:22:02 dalaran Tor[32035]: Parsing GEOIP IPv4 file /usr/share/tor/geoip.
Jan 06 16:22:02 dalaran Tor[32035]: Parsing GEOIP IPv6 file /usr/share/tor/geoip6.
Jan 06 16:22:02 dalaran Tor[32035]: Bootstrapped 0%: Starting
Jan 06 16:22:02 dalaran Tor[32035]: Bootstrapped 80%: Connecting to the Tor network
Jan 06 16:22:03 dalaran Tor[32035]: Bootstrapped 85%: Finishing handshake with first hop
Jan 06 16:22:04 dalaran Tor[32035]: Bootstrapped 90%: Establishing a Tor circuit
Jan 06 16:22:05 dalaran Tor[32035]: Tor has successfully opened a circuit. Looks like client functionality is working.
Jan 06 16:22:05 dalaran Tor[32035]: Bootstrapped 100%: Done
最终,这个(或类似的东西)需要合并到 Fedora/EPEL 提供的 Tor 默认配置和 systemd 单元中,这将为每个人解决问题。