如何在 macOS 中获取 SSH 日志并将其发送到远程系统日志服务器?

wei*_*yin 6 ssh syslog macos macos-mojave

在 Linux 上,我可以获得 sshd 日志,例如:

sshd Accepted publickey for user from xxx.xxx.xxx.xxx port xxx ssh2: RSA SHA256:.....
Run Code Online (Sandbox Code Playgroud)

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

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

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

log stream --process sshd --info --predicate "messageType = 'info'"
Run Code Online (Sandbox Code Playgroud)

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

wei*_*yin 3

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

为了将日志消息写入文件,我创建了一个包含以下内容的/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>
Run Code Online (Sandbox Code Playgroud)

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

我对此的研究结果如下。

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

后来,苹果推出了苹果系统日志(ASL)。ASL 允许更微调的行为,例如通过元数据(例如进程 ID)分隔日志消息,以及通过谓词的复杂规则。ASL 还集成了 logrotate 功能。

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

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

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

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

附加信息链接: