macOS Catalina における sshd のログの記録

2022年1月25日 新規, 2022年2月22日 更新


macOS Sierra における sshd のログ取得方法は下記サイトにて紹介されていますが、macOS Catalina でその方法を適用しても sshd のログを取得できませんでした。

そこで、別の方法を探したところ、/usr/bin/log コマンドを利用すれば、標準出力へ sshd のログを出力することが可能だと分かりました。

例えば、以下のコマンドで sshd の INFO レベルのログが標準出力に出力されます。

$ log stream --level info --process sshd --type log

これだと、まだ余分なログも出力されますが、調整した結果、次のコマンドで必要にして十分なログを取得可能だとわかりました。

$ log stream --level info --style compact --predicate '(sender == "sshd")'

続いて、上記結果を利用して、macOS 起動時に自動的に起動し、sshd のログをファイルに出力する org.sample.sshd-logging.plist-20220125 (2022/2/21ファイル名変更) を以下の通り作成しました。

<?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>org.sample.sshd-logging</string>
	<key>UserName</key>
	<string>root</string>
	<key>ProgramArguments</key>
	<array>
		<string>/bin/sh</string>
		<string>-c</string>
		<string>/usr/bin/log stream --level info --style compact --predicate '(sender == "sshd")'</string>
	</array>
	<key>StandardOutPath</key>
	<string>/var/log/sshd-log</string>
	<key>RunAtLoad</key>
	<true/>
	<key>KeepAlive</key>
	<true/>
</dict>
</plist>

肝は /bin/sh -c で、これがないと常駐せずにすぐに終了してしまいました。

この plist ファイルを /Library/LaunchDaemons/org.sample.sshd-logging.plist に作成し、次のコマンドを実行すれば、sshd のログが /var/log/sshd-log に記録されるようになります。

$ sudo launchctl load -w /Library/LaunchDaemons/org.sample.sshd-logging.plist 

なお、最初に紹介した macOS Sierra で有効な方法では、ログにタイムスタンプが付与されなかったのですが、このページで紹介している方法を用いるとタイムスタンプも付与されるようになり、これは嬉しい点です。

また、log コマンドのオプションなどに違いがあるようで、上記の方法をそのまま macOS Sierra に適用はできないようです。オプションをいじってもみましたが、うまくログを取得できる設定は見つけられていません。試したのは ssh.plist を用いた方法を適用したマシンで、サービスを停止させるわけにもいかず、これ以上は試していないのですが、もしかしたら、現在運用中の方式の方にログが流れていって log コマンドの方には流れてこないのかもしれません。

(2022/2/22 更新)

上記 plist ファイルでしばらく試験運用していた結果、5 日程度ログの記録がなかった状態の後に slogin によるログの記録が発生したとき、次のようなメッセージが何回も記録されました。直後に一度ログアウトして、再度 slogin しても同様に記録されました。ただし、ログの欠損はないように思えます。また、一度ログ取得を停止・再起動してしばらくした後も同様の現象が発生しています。

=== Messages dropped during live streaming (use `log show` to see what they were)

このメッセージに関する情報は少なく、解決方法は見つかりませんでしたが、ログ記録の条件を変更することで解決できないかと、次の方法を試してみました。

/usr/bin/log のオプションに --process sshd を追加し、sshd プロセスのログのみを出力の対象とするようにしました。修正後の plist ファイル org.sample.sshd-logging.plist は以下の通りです。

試験運用開始から 5 日程度経過した時点では、不要なメッセージは記録されていません。

<?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>org.sample.sshd-logging</string>
	<key>UserName</key>
	<string>root</string>
	<key>ProgramArguments</key>
	<array>
		<string>/bin/sh</string>
		<string>-c</string>
		<string>/usr/bin/log stream --level info --process sshd --style compact --predicate '(sender == "sshd")'</string>
	</array>
	<key>StandardOutPath</key>
	<string>/var/log/sshd-log</string>
	<key>RunAtLoad</key>
	<true/>
	<key>KeepAlive</key>
	<true/>
</dict>
</plist>

参考サイト


付記

参考情報として、最初に紹介した macOS Sierra で有効な方法を macOS Catalina に適用した場合、ログファイルの作成すらされません。ただし、下記実行結果を見ると -E オプションは残っているようです。

$ sshd -E
sshd: option requires an argument -- E
OpenSSH_8.1p1, LibreSSL 2.7.3
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
            [-E log_file] [-f config_file] [-g login_grace_time]
            [-h host_key_file] [-o option] [-p port] [-u len]

また、sshd の man を見ると、-E および -e オプションの説明は以下のようになっています。

     -E log_file
             Append debug logs to log_file instead of the system log.

     -e      Write debug logs to standard error instead of the system log.

-E-e オプションの違いは出力先だけなようなので、/System/Library/LaunchDaemons/ssh.plist-E log_file-e として、StandardErrorPath/var/log/sshd-log にしてみたのですが、やはり何も記録されませんでした。

-E-e オプションによる出力を一切しないようになったのか、出力するレベルが変わったのかわかりませんが、いずれにせよ仕様が変わってしまったようです。


Written by Jun Takahashi <junt@aihara.co.jp>