Tor 隐藏服务设置无法允许 tor.service 在 CentOS/Fedora 上启动

Tor 隐藏服务设置无法允许 tor.service 在 CentOS/Fedora 上启动

tor我正在尝试使用来自 EPEL 存储库的包在 CentOS 7(带有 systemd)上设置 Tor 隐藏服务。

以前它运行良好,直到几天前停止工作。此时系统上没有重新启动任何程序,尽管通过 yum-cron 启用了自动更新,因此可能更新了某些内容。

但是,不管怎样,我在 Fedora Server 和 Fedora Workstation 的大部分库存安装中也看到了这个问题。

现在,当我尝试使用文件中的隐藏服务行启动 tor 服务时/etc/tor/torrc,它无法启动。

我一直在使用检查错误消息journalctl -xn,但它们并不一致 - 但主要错误似乎是:

Nov 09 22:05:18 hostname tor[7561]: Nov 09 22:05:18.245 [warn] Directory /var/lib/tor/sshservice/ cannot be read: Permission denied

有时:

Nov 09 22:12:33.119 [warn] /var/lib/tor/sshservice/ is not owned by this user (root, 0) but by toranon (997). Perhaps you are running Tor as the wrong user

我已经确保了整个路径的以下内容/var/lib/tor,但没有成功:

  • 目录归用户/组所有toranon(EPEL 包的默认 tor 用户)
  • 目录上的权限设置适当(我已尝试过 700、770、600、660)。
  • SELinux 上下文已针对目录进行了适当设置,并且我已使用 进行了验证restorecon

其他信息:

  • 如果我将目录的所有权更改为 root,我会收到与之前相同的“错误用户”消息,但用户名是相反的。
  • 我已尝试完全禁用 SELinux,并验证 tor 服务仍然无法启动。
  • 隐藏服务目录已填充私钥和主机名文件,它们是由该系统上的 tor 守护程序创建的。此配置之前完全有效。
  • 如果我从配置中完全删除HiddenServiceDirHiddenServicePort行,tor 将按预期启动。

一些可能有用的输出来自/etc/tor/torrc

# Do not run as client
SocksPort 0 #Run Tor only as a relay and do not create a local SOCKS proxy
SocksPolicy reject *

# Define hidden service for SSH
HiddenServiceDir /var/lib/tor/sshservice/
HiddenServicePort 44674 127.0.0.1:22 #Redirect local SSH port to a nonstandard public port

ls -Z/var/lib/tor

[root@sagan tor]# ls -Z
-rw-------. toranon toranon system_u:object_r:tor_var_lib_t:s0 cached-certs
-rw-------. toranon toranon system_u:object_r:tor_var_lib_t:s0 cached-microdesc-consensus
-rw-------. toranon toranon unconfined_u:object_r:tor_var_lib_t:s0 cached-microdescs
-rw-------. toranon toranon unconfined_u:object_r:tor_var_lib_t:s0 cached-microdescs.new
-rw-------. toranon toranon unconfined_u:object_r:tor_var_lib_t:s0 lock
drwx------. toranon toranon system_u:object_r:tor_var_lib_t:s0 sshservice
-rw-------. toranon toranon unconfined_u:object_r:tor_var_lib_t:s0 state

不确定是什么原因导致了这个问题,但我怀疑这与 systemd 的精确配置有关。我尝试注释和删除默认 systemd 文件中的某些行tor.service,但没有成功。

目前我正在尝试使用CentOS 附带的systemctl start tor默认 systemd文件启动 tor 。tor.service

有什么想法吗?非常感谢您的帮助。

答案1

我自己刚刚也对这个问题感到困惑,这要归咎于 systemd 严重缺乏调试能力。

事实证明,在我的情况下,systemd 干扰了。它允许用户在启动时toranon读取 /var/lib/tor/但不允许读取其子目录/var/lib/tor/hidden_service。因此,如果我使用相同的命令以 root 身份启动 tor,它会正常工作,但在 systemd 下启动会导致它莫名其妙地失败。目录上的权限是正确的,这更令人困惑。

我修复该问题的方法是更改​​文件,torrc将隐藏的服务文件写入 systemd 允许进程写入的目录。也就是说,您可以将行从:

HiddenServiceDir /var/lib/tor/sshservice/

HiddenServiceDir /var/lib/tor/

最终一切也许都会顺利。

另一个选择可能是通过更改 systemd 配置文件来告诉 systemd 允许进程读取子目录tor.service,可能在:

/usr/lib/systemd/system/tor.service

并更改ReadWriteDirectories选项以包含您正在创建的子目录,可能需要添加一行:

ReadWriteDirectories=/var/lib/tor/sshservice/

或者将该路径作为空格分隔的列表添加到该文件中的现有条目之一。(它已经有两行不同的ReadWriteDirectories内容,但我不确定第二行是否有效,因为没有写入日志。)根据 systemd 的文档,该条目应该是空格分隔的绝对路径列表,例如:

ReadWriteDirectories=/var/lib/tor /var/lib/tor/sshservice /var/log/tor

虽然我还没有尝试做这个更隐晦的改变,但心里默默希望 systemd 会在火灾中消亡,这样我们就不必维护第三组文件和权限。

答案2

针对该问题发布的一些修复方法确实有效,但成功率各不相同。

我遇到的一个始终有效的修复方法是将一些例外加载到 SELinux 中。

步骤1

创建一个tor-selinux-workaround.cil包含以下内容的文件:

(typeattributeset cil_gen_require tor_t) (allow tor_t self (capability (dac_override dac_read_search)))

第2步

使用以下命令将该文件导入 SELinux:

sudo semodule -i tor-selinux-workaround.cil

对于最新的 Fedora 和 CentOS 系统来说这应该可以完美运行。

更多信息

有关更完整的解释,请参阅我的帖子:https://alexhaydock.co.uk/tech/fix-tor-onion-services-on-centos-fedora

答案3

如果您希望能够使用 启动和停止 tor systemctl,那么最好的做法是不要修改默认的安全配置。

您的系统中应该有一个名为 system_tor 的文件位于以下位置:/etc/apparmor.d/system_tor

如果您查看此文件,您应该会看到 tor 已预先配置为可以使用的目录列表。以下是我的工作和默认版本的文件包含的内容:

# vim:syntax=apparmor
#include <tunables/global>

profile system_tor flags=(attach_disconnected) {
  #include <abstractions/tor>

  owner /var/lib/tor/** rwk,
  owner /var/lib/tor/ r,
  owner /var/log/tor/* w,

  # During startup, tor (as root) tries to open various things such as
  # directories via check_private_dir().  Let it.
  /var/lib/tor/** r,

  /{,var/}run/tor/ r,
  /{,var/}run/tor/control w,
  /{,var/}run/tor/socks w,
  /{,var/}run/tor/tor.pid w,
  /{,var/}run/tor/control.authcookie w,
  /{,var/}run/tor/control.authcookie.tmp rw,
  /{,var/}run/systemd/notify w,

  # Site-specific additions and overrides. See local/README for details.
  #include <local/system_tor>
}

如果你查看显示的第一个目录路径,你会看到 owner /var/lib/tor/** rwk, 双星号。这实际上表示 tor 服务可以读取和写入位于其中的任何文件夹和文件/var/lib/tor

您还应该看到位于 中的路径tor.service,或者根据版本,位于[email protected]文件中的路径。这是[email protected]我当前工作版本中的默认路径:

[Unit]
Description=Anonymizing overlay network for TCP
After=network.target nss-lookup.target
PartOf=tor.service
ReloadPropagatedFrom=tor.service

[Service]
Type=notify
NotifyAccess=all
PIDFile=/run/tor/tor.pid
PermissionsStartOnly=yes
ExecStartPre=/usr/bin/install -Z -m 02755 -o debian-tor -g debian-tor -d /run/tor
ExecStartPre=/usr/bin/tor --defaults-torrc /usr/share/tor/tor-service-defaults-torrc -f /etc/tor/torrc --RunAsDaemon 0 --verify-config
ExecStart=/usr/bin/tor --defaults-torrc /usr/share/tor/tor-service-defaults-torrc -f /etc/tor/torrc --RunAsDaemon 0
ExecReload=/bin/kill -HUP ${MAINPID}
KillSignal=SIGINT
TimeoutStartSec=300
TimeoutStopSec=60
Restart=on-failure
LimitNOFILE=65536

# Hardening
AppArmorProfile=-system_tor
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectHome=yes
ProtectSystem=full
ReadOnlyDirectories=/
ReadWriteDirectories=-/proc
ReadWriteDirectories=-/var/lib/tor
ReadWriteDirectories=-/var/log/tor
ReadWriteDirectories=-/run
CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH

考虑到所有这些,您希望torrc隐藏服务配置如下所示:

HiddenServiceDir /var/lib/tor/sshservice
HiddenServicePort 44674 127.0.0.1:22
HiddenServiceVersion 3

然后,您需要预先配置目录,以便 tor 可以正确使用它。这个过程看起来如下:

#!/bin/bash
sudo mkdir /var/lib/tor/sshservice
sudo chown -R toranon:toranon /var/lib/tor/sshservice # some versions use debian-tor instead of toranon
sudo chmod 700 /var/lib/tor/sshservice

在使用 systemctl 命令运行 tor 之前,您可能必须先手动运行它以生成所需的隐藏服务文件。这可能是我的特定实例的一个错误。请按如下方式执行此操作:

sudo -u toranon tor

完成后,使用ctrl+ckill命令终止 tor 进程。

现在您应该能够使用命令systemctlsystem命令来启动和停止 tor。

答案4

在 Debian Jessie 上,这对我有用(我将 tor 隐藏服务信息存储在 /opt/tor 中)

编辑 /etc/tor/torrc,添加适当的 HiddenServiceDir 和 HiddenServicePort 指令:

HiddenServiceDir /opt/tor/

隐藏服务端口 80 127.0.0.1:8080

编辑 /lib/systemd/system/[电子邮件保护],在文件末尾添加此行:

读写目录=/opt/tor

创建目录并设置所有权和权限:

mkdir /opt/tor

chown debian-tor。/opt/tor

chmod go-rwx / opt / tor

重新加载服务配置:

systemctl 守护进程重新加载

并启动服务:

systemctl 启动

相关内容