如何获取 SSH 日志并发送到 macOS 中的远程 syslog 服务器?

如何获取 SSH 日志并发送到 macOS 中的远程 syslog 服务器?

在 Linux 上,我可以获取如下 sshd 日志:

sshd Accepted publickey for user from xxx.xxx.xxx.xxx port xxx ssh2: RSA SHA256:.....

并通过在文件中添加文件将它们发送到远程系统日志服务器/etc/rsyslog.d/

如何在 MacOS 10.14(Mojave)上获取类似的数据,并让 macOS 将数据发送到远程系统日志服务器?

我可以使用此命令获取我想要的数据:

log stream --process sshd --info --predicate "messageType = 'info'"

现在需要弄清楚如何配置 ASL(Apple System Logger)。

答案1

我最终使用 log 命令将消息流式传输到文件,然后使用外部程序(远程系统日志2) 将文件内容流式传输到远程 syslog 服务器。

为了将日志消息写入文件,我创建了一个包含以下内容的/var/log/sshd.log文件:/Library/LaunchDaemons/log-streamer-sshd.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>log-streamer-sshd</string>
    <key>ProgramArguments</key>
    <array>
      <string>/bin/sh</string>
      <string>-c</string>
      <string>/usr/bin/log stream --info --style compact --predicate '(sender == "sshd")'</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceDescription</key>
    <string>Start sshd log stream</string>
    <key>ExitTimeOut</key>
    <integer>1</integer>
    <key>StandardOutPath</key>
    <string>/var/log/sshd.log</string>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

在启动时,LaunchDaemon 运行 log 命令,仅选择 sshd 发送的消息。其输出写入 /var/log/sshd.log。

我对此的研究结果如下。

Apple 已经两次重新发明了 syslog 轮子。最初,OS X 使用 syslog 的方式与大多数 Unix/Linux 系统相同。日志消息按设施和严重性分类,并且可以配置 syslog.conf 以写入日志文件和远程 syslog 服务器。

后来,Apple 推出了 Apple System Log (ASL)。ASL 允许更精细的行为,例如通过元数据(例如进程 ID)分离日志消息,以及通过谓词制定复杂规则。ASL 还集成了 logrotate 功能。

从 macOS 10.2 Sierra 开始,日志记录的最终形式变成了统一日志记录 (UL)。UL 以专有且未记录的压缩二进制格式将日志存储在磁盘上,实际上是一个数据库。许多日志消息甚至可能没有写入磁盘,而只是暂时保存在内存中。UL 功能包括对日志消息访问的权限控制,控制哪些用户或组可以查看哪些消息。它还可以控制消息的显示或保存以保护隐私。根据开发人员的覆盖,日志消息中的字符串替换、数组和对象被视为具有私有数据,而整数替换和静态字符串则被认为没有私有数据。

读取 UL 日志的唯一方法是使用控制台 GUI 应用程序和日志命令行工具。一些开发人员创建了应用程序来帮助查询 UL,但这些只是日志命令的前端。Apple 没有提供任何 API 来以编程方式获取日志消息,只提供写入日志消息。日志可以通过 sysdiagnose 导出到不同的系统,但同样只能在另一台 Mac 上使用控制台或日志命令读取。

至少在 Mojave 中,大多数系统日志要么直接发送到 UL,要么从 syslog 和 ASL 重定向到 UL。我只能在 UL 中找到我想要的 sshd 消息。

另一种可能性是sshd使用该-E标志运行。这将涉及ssh.plist在 LaunchDaemons 中编辑文件,但只能通过禁用系统完整性保护来完成。我认为这不太理想,而且会带来脆弱性(当操作系统升级时会发生什么?)。

更多信息链接:

相关内容