如何解决这个问题

如何解决这个问题

我想为其创建一个单元文件stunnel,但我无法弄清楚它失败的原因。

我的 stunnel.conf 是这样的:

#Provide the full path to your certificate-key pair file

cert = /etc/pki/tls/certs/stunnel.pem

#lock the process into a chroot jail

chroot = /var/run/stunnel

# and create the PID file in this jail

pid = /stunnel.pid

#change the UID and GID of the process for security reasons
setuid = nobody
setgid = nobody

#enable client mode
client = yes


socket = l:TCP_NODELAY=1
#socket = r:TCP:NODELAY=1

[mysqls]
accept = 127.0.0.1:3306
connect = 10.0.0.3:3307

当我执行时stunnel /etc/stunnel/stunnel.conf它就起作用了。

这是我的 stunnel 系统单元文件:

[Unit]
;Description=SSL tunnel for network daemons
;Documentation=man:stunnel https://www.stunnel.org/docs.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
Alias=stunnel.target

[Service]
Type=forking
User=nobody
Group=nobody
RuntimeDirectory=stunnel
ExecStartPre=-/usr/bin/mkdir /var/run/stunnel
ExecStartPre=-/user/bin/chown nobody:nobody /var/run/stunnel
ExecStart=/bin/stunnel /etc/stunnel/stunnel.conf
ExecStop=/bin/killall -9 stunnel

当我尝试启动它时,systemctl start mystunnel.service它失败了

Job for mystunnel.service failed because the control process exited with error code. See "systemctl status mystunnel.service" and "journalctl -xe" for details.

执行journalctl -xe

Feb 20 19:26:07 otrs1 polkitd[610]: Registered Authentication Agent for unix-process:14179:2643087 (system bus name :1.62 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, loc
Feb 20 19:26:07 otrs1 systemd[1]: Starting mystunnel.service...
-- Subject: Unit stunnel-otrs.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit mystunnel.service has begun starting up.
Feb 20 19:26:07 otrs1 mkdir[14185]: /usr/bin/mkdir: cannot create directory ‘/var/run/stunnel’: File exists
Feb 20 19:26:07 otrs1 systemd[14186]: Failed at step EXEC spawning /user/bin/chown: No such file or directory
-- Subject: Process /user/bin/chown could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /user/bin/chown could not be executed and failed.
--
-- The error number returned by this process is 2.
Feb 20 19:26:08 otrs1 stunnel[14188]: Clients allowed=500
Feb 20 19:26:08 otrs1 stunnel[14188]: stunnel 4.56 on x86_64-redhat-linux-gnu platform
Feb 20 19:26:08 otrs1 stunnel[14188]: Compiled/running with OpenSSL 1.0.1e-fips 11 Feb 2013
Feb 20 19:26:08 otrs1 stunnel[14188]: Threading:PTHREAD Sockets:POLL,IPv6 SSL:ENGINE,OCSP,FIPS Auth:LIBWRAP
Feb 20 19:26:08 otrs1 stunnel[14188]: Reading configuration from file /etc/stunnel/stunnel.conf
Feb 20 19:26:08 otrs1 stunnel[14188]: FIPS mode is enabled
Feb 20 19:26:08 otrs1 stunnel[14188]: Compression not enabled
Feb 20 19:26:08 otrs1 stunnel[14188]: PRNG seeded successfully
Feb 20 19:26:08 otrs1 stunnel[14188]: Initializing service [mysqls]
Feb 20 19:26:08 otrs1 stunnel[14188]: Certificate: /etc/pki/tls/certs/stunnel.pem
Feb 20 19:26:08 otrs1 stunnel[14188]: Error reading certificate file: /etc/pki/tls/certs/stunnel.pem
Feb 20 19:26:08 otrs1 stunnel[14188]: error queue: 140DC002: error:140DC002:SSL routines:SSL_CTX_use_certificate_chain_file:system lib
Feb 20 19:26:08 otrs1 stunnel[14188]: error queue: 20074002: error:20074002:BIO routines:FILE_CTRL:system lib
Feb 20 19:26:08 otrs1 stunnel[14188]: SSL_CTX_use_certificate_chain_file: 200100D: error:0200100D:system library:fopen:Permission denied
Feb 20 19:26:08 otrs1 stunnel[14188]: Service [mysqls]: Failed to initialize SSL context
Feb 20 19:26:08 otrs1 stunnel[14188]: str_stats: 12 block(s), 1050 data byte(s), 696 control byte(s)
Feb 20 19:26:08 otrs1 polkitd[610]: Unregistered Authentication Agent for unix-process:14179:2643087 (system bus name :1.62, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Feb 20 19:26:08 otrs1 systemd[1]: stunnel-otrs.service: control process exited, code=exited status=1
Feb 20 19:26:08 otrs1 systemd[1]: Failed to start stunnel-otrs.service.
-- Subject: Unit stunnel-otrs.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit stunnel-otrs.service has failed.
--
-- The result is failed.
Feb 20 19:26:08 otrs1 systemd[1]: Unit mystunnel.service entered failed state.
Feb 20 19:26:08 otrs1 systemd[1]: mystunnel.service failed.

我不明白为什么它会给出无法创建目录的错误(显然是因为它存在),但事实并非如此!另外,为什么无法读取证书?为什么手动运行它有效。 SELinux 已禁用。

编辑:

df -h

Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   14G  1.9G   13G  14% /
devtmpfs             234M     0  234M   0% /dev
tmpfs                245M   54M  191M  22% /dev/shm
tmpfs                245M  4.4M  240M   2% /run
tmpfs                245M     0  245M   0% /sys/fs/cgroup
/dev/sda1           1014M  138M  877M  14% /boot
tmpfs                 49M     0   49M   0% /run/user/0

编辑2:

应用 ErikF 的建议后,目录存在问题消失了,但读取证书时仍然失败:

   Feb 20 20:42:59 otrs1 polkitd[610]: Registered Authentication Agent for unix-process:16232:3104221 (system bus name :1.73 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, loc
    Feb 20 20:42:59 otrs1 systemd[1]: Starting stunnel-otrs.service...
    -- Subject: Unit stunnel-otrs.service has begun start-up
    -- Defined-By: systemd
    -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
    --
    -- Unit stunnel-otrs.service has begun starting up.
    Feb 20 20:42:59 otrs1 stunnel[16239]: Clients allowed=500
    Feb 20 20:42:59 otrs1 stunnel[16239]: stunnel 4.56 on x86_64-redhat-linux-gnu platform
    Feb 20 20:42:59 otrs1 stunnel[16239]: Compiled/running with OpenSSL 1.0.1e-fips 11 Feb 2013
    Feb 20 20:42:59 otrs1 stunnel[16239]: Threading:PTHREAD Sockets:POLL,IPv6 SSL:ENGINE,OCSP,FIPS Auth:LIBWRAP
    Feb 20 20:42:59 otrs1 stunnel[16239]: Reading configuration from file /etc/stunnel/stunnel.conf
    Feb 20 20:42:59 otrs1 stunnel[16239]: FIPS mode is enabled
    Feb 20 20:42:59 otrs1 stunnel[16239]: Compression not enabled
    Feb 20 20:42:59 otrs1 stunnel[16239]: PRNG seeded successfully
    Feb 20 20:42:59 otrs1 stunnel[16239]: Initializing service [mysqls]
    Feb 20 20:42:59 otrs1 stunnel[16239]: Certificate: /etc/pki/tls/certs/stunnel.pem
    Feb 20 20:42:59 otrs1 stunnel[16239]: Error reading certificate file: /etc/pki/tls/certs/stunnel.pem
    Feb 20 20:42:59 otrs1 stunnel[16239]: error queue: 140DC002: error:140DC002:SSL routines:SSL_CTX_use_certificate_chain_file:system lib
    Feb 20 20:42:59 otrs1 stunnel[16239]: error queue: 20074002: error:20074002:BIO routines:FILE_CTRL:system lib
    Feb 20 20:42:59 otrs1 stunnel[16239]: SSL_CTX_use_certificate_chain_file: 200100D: error:0200100D:system library:fopen:Permission denied
    Feb 20 20:42:59 otrs1 stunnel[16239]: Service [mysqls]: Failed to initialize SSL context
    Feb 20 20:42:59 otrs1 stunnel[16239]: str_stats: 12 block(s), 1050 data byte(s), 696 control byte(s)
    Feb 20 20:42:59 otrs1 polkitd[610]: Unregistered Authentication Agent for unix-process:16232:3104221 (system bus name :1.73, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
    Feb 20 20:42:59 otrs1 systemd[1]: stunnel-otrs.service: control process exited, code=exited status=1
    Feb 20 20:42:59 otrs1 systemd[1]: Failed to start stunnel-otrs.service.
    -- Subject: Unit stunnel-otrs.service has failed
    -- Defined-By: systemd
    -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
    --
    -- Unit stunnel-otrs.service has failed.
    --
    -- The result is failed.
    Feb 20 20:42:59 otrs1 systemd[1]: Unit stunnel-otrs.service entered failed state.
    Feb 20 20:42:59 otrs1 systemd[1]: stunnel-otrs.service failed.

Any ideas or hints please? 

Appreciate or help! 

答案1

如何解决这个问题

在服务管理器下运行的服务不应尝试自我守护进程,不应使用不稳定且危险的 PID 文件机制,并且不应(在绝大多数常见情况下)放弃权限本身。所有这些都将由服务管理系统正确完成。

因此,当您stunnel像这样在命令行中运行时,它应该让 shell 等待,直到您终止/停止该进程。

所有在非特权用户帐户的支持下运行、设置减少的文件系统访问以及实际上(对于那些能够继承和使用打开套接字文件描述符的程序)打开侦听套接字都是服务管理的领域。

这就是 systemd 人们天真地称之为运行守护进程的“新风格”方式。事实上,这正是 daemontools 用户在过去二十年中一直所说的运行守护进程的方式,也是 IBM 在过去四分之一个世纪中一直所说的方式。

该非特权用户帐户不应该是nobody,它可以被列为文件的所有者。相关服务不需要所有权许可任何文件或目录根本不,因此非特权用户帐户应该是专门为此目的创建的帐户,例如:

useradd --shell /usr/bin/true mysql-stunnel-d

在 systemd 中设置一个chroot()环境实际上并不简单,因为/bin/stunnel它读取的所有文件(根据其 doco,除了证书文件和配置文件之外,还包括相当多的系统内容;诸如/dev/zeroNSS 配置系统和时区数据库之类的东西需要使用 进行配置BindReadOnlyPaths。更简单的方法是Protect…机制。

配置文件

套接字由套接字单元来描述。 stunnel不懂该LISTEN_FDS协议,但它是 UCSPI-TCP 兼容的。因此套接字单元必须描述一个接受套接字:

; /etc/systemd/service/mysql-stunnel.socket
[单元]
描述=MySQL 的 SSL 包装器
文档=

[插座]
ListenStream=127.0.0.1:mysql
ListenStream=[::1]:mysql
接受=是
无延迟=是

[安装]
WantedBy=多用户.target

请注意,这是插座在这里启用/禁用/启动/停止,带有systemctl.这服务,由服务单元描述,按需自动启动通过插座。因为它是一个接受套接字,所以它是一个模板服务单元。它描述了服务管理所做的所有特权删除和设置:

; /etc/systemd/服务/[电子邮件受保护]
[单元]
描述=MySQL 的 SSL 包装器
文档=

[服务]
类型=简单
用户=mysql-stunnel-d
保护主页=是
保护系统=严格
PrivateTmp=是
标准输入=套接字
标准输出=插座
标准错误=期刊
ExecStart=/bin/stunnel /etc/stunnel/mysql-stunnel.conf

然后配置stunnel文件不处理任何服务管理的内容为它做:

# /etc/stunnel/mysql-stunnel.conf
证书 = /etc/pki/tls/certs/stunnel.pem
客户 = 是
前景 = 是
连接=10.0.0.3:3307

奖励内容

是的,这就是daemontools的方式。将这两个单元文件传递给convert-systemd-unitsfrom诺什工具集我们得到了一个run程序service(以及其他几个程序),它举例说明了如何通过 daemontools 方式完成此操作,并使用一组合适的链加载 UCSPI 和其他工具:

%系统控制转换systemd-units ./mysql-stunnel.socket
转换系统单元:警告:./[电子邮件受保护]:强制设置:[Service] StandardError = log
Convert-systemd-units:警告:./mysql-stunnel.socket:未使用的设置:[unit] 文档 =
转换系统单元:警告:./[电子邮件受保护]:未使用的设置:[service] standarderror = 日志
转换系统单元:警告:./[电子邮件受保护]:未使用的设置:[单位]文档=
%系统控制猫./mysql-stunnel
开始:#!/bin/nosh                
start:#从./mysql-stunnel.socket生成的启动文件
开始:真
停止:#!/bin/nosh
stop:#停止从./mysql-stunnel.socket生成的文件
停止:真
运行:#!/bin/nosh
run:#运行./mysql-stunnel.socket生成的文件
运行:#MySQL 的 SSL 包装器
运行:tcp-socket-listen 127.0.0.1 mysql
运行:tcp-socket-listen "::1" mysql
运行:移动到控制组../mysql-stunnel.service
运行:envuidgid --补充 -- mysql-stunnel-d
运行:userenv-fromenv
运行:取消共享--挂载
运行:set-mount-object --recursive Slave /
运行:make-private-fs --temp --homes
运行:make-read-only-fs --os --etc
运行:set-mount-object --recursive 共享/
运行:setuidgid --补充 -- mysql-stunnel-d
运行:tcp-socket-accept --无延迟
运行:./服务
服务:#!/bin/nosh
service:#由./生成的服务文件[电子邮件受保护]
服务:#MySQL 的 SSL 包装器
服务:/bin/stunnel /etc/stunnel/mysql-stunnel.conf
重新启动:#!/bin/sh
restart:#重新启动./生成的文件[电子邮件受保护]
restart:exec false # 忽略脚本参数
%                                                                                                                                                                                           

进一步阅读

答案2

你有一个拼写错误:

ExecStartPre=-/user/bin/chown nobody:nobody /var/run/stunnel

你的意思可能是/usr/bin/chown,不是/user/bin/chown

另外,如果/var/run是 的符号链接/run,您可以将目录创建命令替换为RuntimeDirectory=

RuntimeDirectory=stunnel

答案3

持续的隧道

由于 stunnel 处理 ssl 连接,这意味着使用 TCP 而不是 UDP,因此假设连接应该长期存在并不是没有道理的,对于这些情况,我发现 @JdeBP 的答案是绝对正确的;它已成为我进行此类单元的正确方法的参考点,特别是使用 Stunnel。

然而,如果相对于进程的生命周期而言,启动进程的成本很高,那么让 systemd 套接字侦听连接就没有什么意义了。作为比较 - 您不一定希望 Web 服务器为每个传入的 TCP 连接启动一个新实例,当然当轻量级线程是一种选择时。

同样,如果 stunnel 作为持久进程运行而不是为每个连接启动,则可以利用一些优化。此外,您不会为每个连接启动一个新进程,但据我了解,stunnel(取决于编译选项)可以使用实例化成本低得多的线程 - 并且您可以避免某些工作负载分布的潜在磁盘命中。

那么,我们如何将 stunnel 作为持久服务运行,同时听取 @JdeBP 的答案提供的所有优秀建议(避免 PID 文件,不滥用“nobody”,不分叉)?

以下是我使用不支持加密的客户端连接到受 ssl 保护的服务的基础。如果您的用例不同,您可能需要进行调整。

;/etc/stunneld.conf

client=yes 
;presuming that the upstream is ssl protected and the downstream is not

foreground=yes
;no forking. Use `quiet` to get less noisy logs

pid=
;no PID File, note that it must be blank to avoid PID creation

[my-upstream-service]
accept=x.x.x.x:pppp
;optional address, and mandatory port to listen on - can be a hostname instead of an address

connect=x.x.x.x:pppp 
;upstream ssl protected service

CApath=/etc/ssl/certs
;may be different in your distribution

verifyChain=yes
checkHost=example.com
;were required in my case as the ssl cert was specific to a hostname. Note that without the verification you're still vulnerable to MITM attacks.
;/etc/systemd/system/stunneld.service (location may be different in your distro)

[Unit]
Description=Stunnel Service
Documentation=

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=stunnel4
;my distro happened to provide a stunnel user as part of the package. YMMV
ProtectHome=yes
ProtectSystem=strict
PrivateTmp=yes
StandardError=journal
ExecStart=/usr/bin/stunnel /etc/stunneld.conf

这些配置允许我们将 stunnel 作为持久任务运行,这为我们提供了与执行许多小型连接而不是几个大型连接的上下文相关的优化优势。

答案4

就我而言,我没有任何配置文件。

为此,我有这个配置文件:

client = yes

[stunnel]
accept = 127.0.0.1:41194
connect = vpnserverhost:port

放置为/etc/stunnel/stunnel.conf

相关内容