仅在 systemd 上运行时出现 SSL 错误

仅在 systemd 上运行时出现 SSL 错误

我发过一个更广泛的问题在 StackOverflow 上,但我认为其中一些问题可能非常特定于 ubuntu。

我正在尝试使用 systemd 在运行 ubuntu 16.04 的 aws ec2 实例上运行 logstash。正常运行管道(通过 bin/logstash.bat)工作正常,事件被提取。

但是当我尝试在 systemd 上运行该服务时出现错误,其中第一个是 SSL 错误:

Error: no cipher match (OpenSSL::SSL::SSLError)

[2017-02-15T13:08:44,037][ERROR][logstash.pipeline        ] A plugin
had an unrecoverable error. Will restart this plugin.   
Plugin:
<LogStash::Inputs::Heroku app=>"xxxxxx",
codec=><LogStash::Codecs::Multiline pattern=>"^%{TIMESTAMP_ISO8601}
%{WORD}\\[\\w+(\\.\\d+)?\\]:(\\s{3,}| \\})", what=>"previous",
id=>"032c3b317ae49982945ec7e8fbf11224be98f237-3", enable_metric=>true,
negate=>false, charset=>"UTF-8", multiline_tag=>"multiline",
max_lines=>500, max_bytes=>10485760>,
id=>"032c3b317ae49982945ec7e8fbf11224be98f237-4", enable_metric=>true>

我尝试以 root 身份运行该服务,但结果是一样的。澄清一下,这个有效:

/usr/share/logstash/bin/logstash --path.settings /etc/logstash/

虽然这不:

sudo systemctl start logstash

这是 logstash 5.2.1 的全新安装,遵循弹性程序. Systemd 也按照他们的程序,这样它就执行和我手动执行的相同的命令。cat logstash.service输出:

[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/etc/default/logstash
EnvironmentFile=-/etc/sysconfig/logstash
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384

[Install]
WantedBy=multi-user.target

(当我注释掉上面的用户和组时结果是一样的)


编辑:所以 SSL 似乎是由我遇到的其他错误引起的。我sudo journalctl -f -u logstash &在后台跟踪了服务使用的日志和服务本身的日志,并得到了以下输出:

ubuntu@ip-10-0-1-216:~$ sudo systemctl start logstash

ubuntu@ip-10-0-1-216:~$ 2 月 15 日 15:38:19 ip-10-0-1-216 systemd1:已启动logstash。

2 月 15 日 15:38:33 ip-10-0-1-216 logstash[5119]: 将 Logstash 的日志发送到 /var/log/logstash,现已通过 log4j2.properties 配置

2 月 15 日 15:38:36 ip-10-0-1-216 logstash[5119]: 输入您的 Heroku 凭证。

2 月 15 日 15:38:36 ip-10-0-1-216 logstash[5119]: 电子邮件: 密码 (输入内容将被隐藏):

2 月 15 日 15:38:36 ip-10-0-1-216 logstash[5119]: 输入您的 Heroku 凭证。

2 月 15 日 15:38:36 ip-10-0-1-216 logstash[5119]: 电子邮件: 密码 (输入内容将被隐藏):

2 月 15 日 15:38:36 ip-10-0-1-216 logstash[5119]: 输入您的 Heroku 凭证。

2 月 15 日 15:38:36 ip-10-0-1-216 logstash[5119]: 电子邮件: 密码 (输入内容将被隐藏):

2 月 15 日 15:38:36 ip-10-0-1-216 logstash[5119]: 输入您的 Heroku 凭证。

2 月 15 日 15:38:36 ip-10-0-1-216 logstash[5119]: 电子邮件: 密码 (输入内容将被隐藏):

[2017-02-15T15:38:37,403][错误][logstash.pipeline] 插件发生不可恢复的错误。将重新启动此插件。插件:“ros-prd”,codec=>“^%{TIMESTAMP_ISO8601} %{WORD}\[\w+(\.\d+)?\]:(\s{3,}| \})”,what=>“previous”,id=>“9fd55a86d7f6e98e9c1698eb67a66a24364ea902-3”,enable_metric=>true,negate=>false,charset=>“UTF-8”,multiline_tag=>“multiline”,max_lines=>500,max_bytes=>10485760>,id=>“9fd55a86d7f6e98e9c1698eb67a66a24364ea902-4”,enable_metric=>true>

因此看起来 SSL 错误仅在提示输入 heroku 密码后才开始。

我的问题是:

  1. 看起来 heroku 凭证存储在 ~/home/user/.netrc 中。我如何向 systemd 服务提供对此文件的访问权限,以便它不会提示输入 heroku 密码?
  2. 或者,如果上述方法不可行,我该如何将密码传递给服务?有没有办法利用systemd-tty-询问密码代理也许?

答案1

如果systemd提示您输入密码但通常不会提示您输入密码,请比较您的system环境和 shell 环境之间的以下两种情况:

  1. 运行的用户是否systemd与在 shell 中成功运行命令时使用的用户相同?
  2. 通过运行时systemd,HOME 环境变量是否与 shell 中使用的值匹配?Environment="Home=/home/youruser"如果需要,请在 systemd Unit 文件中设置。

正如链接票中提到的,最好的解决方案是永远不要盲目地尝试将所有环境变量从 CLI 环境转储到环境中systemd

其目的systemd是提供一个独立的特定环境,以便随着时间的推移为您提供可靠、可重复的结果。要设置它,您必须知道哪些环境变量会影响您的应用程序。这种理解很可能会在以后帮助您使用和排除应用程序故障。

您的 CLI 环境会随着时间的推移而发生变化,其中包含许多与您尝试运行的任务无关的值。将所有这些值转储到环境中systemd可能感觉像是快速修复,但却会带来不必要的复杂性和困惑,让人搞不清楚哪些变量真正影响了应用程序。

相关内容