如何通过记录器命令发送 TLS 系统日志消息

Sha*_*eri 5 syslog tls

我正在 ubuntu 16.04 上工作。

有没有办法通过记录器命令发送 TLS 系统日志消息?

Per*_*uck 5

不。

logger只能将明文数据发送到 UDP 套接字、TCP 套接字或本地 UNIX 域套接字(如,如果没有另外指示,/dev/log则为默认值)。logger

但。

我假设您已rsyslog在远程服务器(例如syslog-server.mydomain)上设置为侦听 TCP 端口 6514,因为这是通过 TLS 使用 Syslog时的默认端口。我进一步假设rsyslog远程服务器的配置与此类似:

# Certificate configuration for encrypted transmission:
global(
    defaultNetstreamDriver         = "gtls"
    defaultNetstreamDriverCAFile   = "/path/to/root-ca.crt"
    defaultNetstreamDriverCertFile = "/path/to/certificates/server-certificate.crt"
    defaultNetstreamDriverKeyFile  = "/path/to/keys/server-private.key"
)

# Load input module for encrypted TCP to receive messages from the clients:
module(
    load                  = "imtcp" 
    StreamDriver.Name     = "gtls" 
    StreamDriver.Mode     = "1" 
    StreamDriver.AuthMode = "anon"
)

# Ruleset to write externally received messages to a certain file:
ruleset(name="from_remote") {
    action(type="omfile" File="/var/log/messages-from-remote.log")
}

# Bind above ruleset to the TCP listener on port 6514:
input(type="imtcp" port="6514" ruleset="from_remote")
Run Code Online (Sandbox Code Playgroud)

通常(如果远程服务器未设置为通过 TLS 使用 Syslog)您可以发出

logger --tcp --server syslog-server.mydomain --port 6514 -p local1.info "Hello World, $RANDOM"
Run Code Online (Sandbox Code Playgroud)

但由于logger无法处理 TLS,这不起作用。相反,您必须手动准备系统日志消息并通过 发送gnutls-cli。将服务器的 CA 文件复制到本地计算机,然后发出:

echo "<142>$HOSTNAME Hello World, $RANDOM" | \
    gnutls-cli syslog-server.mydomain --port=6514 --x509cafile=/path/to/root-ca.crt
Run Code Online (Sandbox Code Playgroud)

<142>的编码值local1.info$HOSTNAME是源主机,文本Hello World, $RANDOM是实际的日志消息。gnutls-cli从其标准输入读取此字符串并使用给定的 CA 将其发送到给定的服务器和端口。

该消息应该出现在远程服务器上的文件中/var/log/messages-from-remote.log

该工具gnutls-cli是软件包的一部分gnutls-bin,可以通过安装sudo apt install gnutls-bin


当然,您也可以将本地 rsyslog配置为通过 TLS将某些消息转发到远程服务器,然后logger照常使用,即:将logger消息发送到本地rsyslog守护进程(无论如何都是默认的),然后让本地rsyslog转发加密的消息信息。