如何使用 journalctl 获取登录尝试列表?

joz*_*yqk 7 fedora logs systemd-journald

根据systemd文档,journalctl推荐用于浏览日志,而不是/var/log/*文件树。

虽然man 1 journalctl描述了如何使用它,但我仍然不知道它需要什么参数才能给我我想要的东西列表。例如,我想查看用户登录列表。我知道sshd处理 ssh logins,但是本地登录名和一般用户身份验证呢?

这是我尝试过的:

#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.
Run Code Online (Sandbox Code Playgroud)

这似乎给出了一些迹象,但绝对不是最可靠的方法。正确的方法是什么?

小智 6

journalctl -q SYSLOG_FACILITY=10 SYSLOG_FACILITY=4
Run Code Online (Sandbox Code Playgroud)

这告诉日志过滤掉来自两个不同设施的消息。10 号为authpriv,4 号为auth。ssh 以及许多其他登录敏感应用程序使用这两个工具来登录。


mat*_*tdm 5

跑:

journalctl -q _AUDIT_TYPE=1112 _TRANSPORT=audit
Run Code Online (Sandbox Code Playgroud)

解释:

假设您运行了审计子系统(并且除非您禁用它,否则您会这样做),这是获取此类信息的最佳方式,因为除其他外,如果您使用_TRANSPORT=audit,则不能像通过传统系统日志套接字那样欺骗消息. 要查看通过此传输发送的所有消息,请使用journalctl -q _TRANSPORT=audit. ( -q 阻止烦人的-- Reboot --行。)

要以详细形式查看这些内容,请执行journalctl -q _TRANSPORT=audit -o verbose. 实际上,我建议您在跟随时立即停止并执行此操作,因为我们要做的下一件事是过滤我们在那里看到的一些字段。这是我系统中的记录:

_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'
Run Code Online (Sandbox Code Playgroud)

MESSAGE底部是非结构化的日志记录,这基本上是你在非详细的系统日志风格输出看到。我们可以grep for 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 */
Run Code Online (Sandbox Code Playgroud)

所以,journalctl -q _AUDIT_TYPE=1112 _TRANSPORT=audit这就是你所需要的。它获取 ssh、终端和 GUI 登录信息,并记录成功和失败。请注意,它不会捕获诸如sudo或之类的内容su——这些内容有不同的审计记录。

即使输出的“简短”版本也有点冗长,因此您可能希望使用-o json并创建一个简短的脚本来将输出解析为漂亮的格式。


dco*_*ing 1

您想要登录或尝试登录吗?

这显示登录但不显示尝试(例如今天)并且适用于 Fedora 22:

$ journalctl -u 'systemd-logind'  --since "today" --until "tomorrow"
Run Code Online (Sandbox Code Playgroud)

这是示例输出: -- 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.

它混杂着其他信息,例如盖子和电源按钮,因此您可以 grep 以session获得更精确的信息: $ 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.