ドキュメントによるとsystemd
、ファイル ツリーjournalctl
ではなくログを参照する場合に推奨されます/var/log/*
。
その間man 1 journalctl
使い方は説明されていますが、必要なリストを取得するためにどのような引数が必要なのかまだわかりません。たとえば、ユーザーログインのリストを表示したいのですが、sshd
SSHログインを処理するしかし、ローカル ログインや一般的なユーザー認証はどうでしょうか?
私が試したことは次のとおりです:
#shows all logs. huge
journalctl
#limit history and search for "login"
journalctl --since "yesterday" | grep login
#a week ago rather than just a day
journalctl --since `date +"%Y-%m-%d" --date "last week"` | grep login
... systemd-logind[678]: New session 81 of user jozxyqk.
これはいくつかのヒントを与えているようですが、決して最も堅牢な方法ではありません。正しい方法は何ですか?
答え1
走る:
journalctl -q _AUDIT_TYPE=1112 _TRANSPORT=audit
説明:
監査サブシステムが動作していると仮定すると(無効にしていない限り)、これはこの種の情報を取得する最良の方法です。なぜなら、 を使用すると_TRANSPORT=audit
、従来の syslog ソケット経由のメッセージのように偽装することができないからです。全てこのトランスポートを介して送信されるメッセージについては、 を使用しますjournalctl -q _TRANSPORT=audit
。(-q は煩わしい-- Reboot --
行を排除します。)
これらを詳細な形式で表示するには、 を実行しますjournalctl -q _TRANSPORT=audit -o verbose
。実際には、ここで停止して、この操作を実行することをお勧めします。次に実行したいのは、表示されているフィールドの 1 つをフィルター処理することです。以下は、私のシステムからのレコードです。
_BOOT_ID=[redacted]
_MACHINE_ID=[redacted]
_HOSTNAME=[redacted]
_UID=0
_TRANSPORT=audit
SYSLOG_FACILITY=4
SYSLOG_IDENTIFIER=audit
AUDIT_FIELD_HOSTNAME=?
AUDIT_FIELD_ADDR=?
AUDIT_FIELD_RES=success
_AUDIT_LOGINUID=18281
_AUDIT_TYPE=1112
AUDIT_FIELD_OP=login
AUDIT_FIELD_ID=18281
_PID=5398
_SELINUX_CONTEXT=system_u:system_r:local_login_t:s0-s0:c0.c1023
AUDIT_FIELD_EXE=/usr/bin/login
AUDIT_FIELD_TERMINAL=tty6
_AUDIT_SESSION=541
_SOURCE_REALTIME_TIMESTAMP=1480529473269000
_AUDIT_ID=7444
MESSAGE=USER_LOGIN pid=5398 uid=0 auid=18281 ses=541 subj=system_u:system_r:local_login_t:s0-s0:c0.c1023 msg='op=login id=18281 exe="/usr/bin/login" hostname=? addr=? terminal=tty6 res=success'
一番MESSAGE
下は非構造化ログレコードで、基本的には非冗長なsyslog形式の出力で表示されるものです。できたgrep で検索しますMESSAGE=USER_LOGIN
(これで完了です)。ただし、ジャーナルを使用すると、さらに便利なことができるので、引き続き使用してください。
各監査メッセージ タイプには、関連付けられた があります_AUDIT_TYPE
(想像してみてください!)。何らかの理由で、これは構造化出力でテキストに変換されず、1112
に対応しますUSER_LOGIN
。 をチェックしてこれを確認しました。これにはlibaudit.h
(いくつかのコンテキスト行とともに) 次の内容が含まれています。
#define AUDIT_USER_CHAUTHTOK 1108 /* User acct password or pin changed */
#define AUDIT_USER_ERR 1109 /* User acct state error */
#define AUDIT_CRED_REFR 1110 /* User credential refreshed */
#define AUDIT_USYS_CONFIG 1111 /* User space system config change */
#define AUDIT_USER_LOGIN 1112 /* User has logged in */
#define AUDIT_USER_LOGOUT 1113 /* User has logged out */
#define AUDIT_ADD_USER 1114 /* User account added */
#define AUDIT_DEL_USER 1115 /* User account deleted */
これjournalctl -q _AUDIT_TYPE=1112 _TRANSPORT=audit
が必要なことです。SSH、ターミナル、GUIログインを取得し、成功と失敗を記録します。しないsudo
またはのようなものをキャッチしますsu
。これらには異なる監査レコードがあります。
出力の「短い」バージョンでも冗長なので、-o json
出力をきれいな形式に解析するための短いスクリプトを作成して使用することをお勧めします。
答え2
journalctl -q SYSLOG_FACILITY=10 SYSLOG_FACILITY=4
これは、ジャーナルに 2 つの異なる機能から来るメッセージをフィルタリングするように指示します。10 番は .ssh 用authpriv
、4 番はauth
.ssh 用で、その他多くのログインに敏感なアプリケーションは、これら 2 つの機能をログに記録するために使用します。
答え3
ログインまたはログイン試行を希望しますか?
これはログイン情報を表示しますが試みではない(今日など) Fedora 22 でも動作します:
$ journalctl -u 'systemd-logind' --since "today" --until "tomorrow"
出力例は次のとおりです。
-- Logs begin at Mon 2014-09-01 03:10:03 BST, end at Fri 2015-11-20 09:55:02 GMT. -- Nov 20 08:47:15 meow systemd[1]: Starting Login Service... Nov 20 08:47:15 meow systemd-logind[699]: New seat seat0. Nov 20 08:47:15 meow systemd-logind[699]: Watching system buttons on /dev/input/event2 (Power Button) Nov 20 08:47:15 meow systemd-logind[699]: Watching system buttons on /dev/input/event0 (Power Button) Nov 20 08:47:15 meow systemd-logind[699]: Watching system buttons on /dev/input/event1 (Lid Switch) Nov 20 08:47:15 meow systemd[1]: Started Login Service. Nov 20 08:47:37 meow systemd-logind[699]: New session c1 of user gdm. Nov 20 08:47:46 meow systemd-logind[699]: New session c2 of user gdm. Nov 20 08:47:46 meow systemd-logind[699]: Removed session c1. Nov 20 08:47:46 meow systemd-logind[699]: Removed session c2. Nov 20 08:47:46 meow systemd-logind[699]: New session c3 of user gdm. Nov 20 08:51:22 meow systemd-logind[699]: New session 1 of user david1.
蓋や電源ボタンなどの他の情報が雑然としているので、session
より正確に検索するには grep を使用します。
$ journalctl -u 'systemd-logind' --since "today" --until "tomorrow" | grep session Nov 20 08:47:37 meow systemd-logind[699]: New session c1 of user gdm. Nov 20 08:47:46 meow systemd-logind[699]: New session c2 of user gdm. Nov 20 08:47:46 meow systemd-logind[699]: Removed session c1. Nov 20 08:47:46 meow systemd-logind[699]: Removed session c2. Nov 20 08:47:46 meow systemd-logind[699]: New session c3 of user gdm. Nov 20 08:51:22 meow systemd-logind[699]: New session 1 of user david1.