我希望将特定日志从我的 syslog-ng 集群发送到 Azure 事件中心,以便它可以利用 ADX 而不是 Log Analytics 工作区。
根据 syslog-ng 网站上的文档(这里),配置看起来非常简单,但我似乎无法让它工作。下面是我现在配置的净化版本。
destination d_AzureEventHub {
http(
url("https://XXXXX.servicebus.windows.net/YYYYY")
#tls( ca-dir("/etc/syslog-ng/ca.d") )
tls( ca-file("/etc/ssl/certs/ca-bundle.crt") )
method("POST")
headers(
"Authorization: SharedAccessSignature sr=XXXXX.servicebus.windows.net%YYYYY%2f&sig=ZZZZZZZZZZZZZZZZZ=RootManageSharedAccessKey",
"Content-Type: application/atom+xml;type=entry;charset=utf-8"
)
);
通过此设置,我收到以下 syslog-ng 错误。
syslog-ng[7253]: 服务器返回 4XX(客户端错误)状态代码,这意味着我们未获得授权或未找到 URL。;
在日志中进一步显示它为 401 错误。
我尝试删除“SharedAccessSignature”部分,但仍然出现同样的错误。此外,如果我使用我列出的 ca-dir,我也会收到此错误。请注意,该目录中有我下载的 DigiCert 根的 .crt 和 .pem 文件。
error='Peer certificate cannot be authenticated with given CA certificates'
我对授权部分感到困惑。我尝试使用基本共享访问策略密钥以及从密钥创建 SAS 令牌。这两种方法似乎都无法让我成功连接。
我也不确定授权应该采用什么格式。如能得到任何帮助我将不胜感激。
答案1
最终发现是 TLS 文件 + SAS 令牌的格式 + URL 不正确的组合问题。
对于独立系统来说,使用基本的 /etc/ssl/certs/ca-bundle.crt 文件就足够了。从 SAS 令牌格式来看,这页面非常有用。它还提供了 curl 命令,说明如何在 syslog-ng 之外进行测试,以确保这是 token 与 syslog-ng 的问题。
不过,最重要的还是 URL。与 syslog-ng 文档相比,我必须使用它才能让一切正常运转。
https://XXXXX.servicebus.windows.net/YYYYY/messages?timeout=60\&api-version=2014-01