监视和历史记录 Linux 中用户的登录和注销事件

Hap*_*ppy 4 linux login

我想在 Linux 中维护用户的登录和注销历史记录。

也就是说,让我知道相关系统调用是否用于登录和注销事件,以便我可以通过系统调用挂钩来完成。

另外,如果我的专有代码(进程或线程)可以通过另一种方式接收登录和注销事件。

另外,如果Linux中已经有登录/退出历史维护机制,请告诉我在哪里可以获得详细信息。

谢谢你。

快乐的

use*_*686 6

如果启用了内核的审计子系统,您可以启用pam_loginuid.soPAM 模块,它将为每次登录创建一个新的“审计会话”(通过写入 /proc/self/loginuid)。这将由 auditd 或 systemd-journald 记录。

但除此之外,没有任何“登录”系统调用。除了最终的凭证切换(但也经常由内部守护程序完成)之外,几乎所有事情都在用户空间中完成(并且有点分散)。没有单一的“用户已登录”事件,至少没有一个在所有 Linux 发行版中都一致。

但是,所有涉及的组件已经记录了大量信息。例如,你可以找到在会话日志/var/log/wtmp(与命令读取who <file>last),你可以找到关于每个登录多个消息/var/log/secure/var/log/auth.log或systemd日志:

sshd[3037]: Authorized to grawity, krb5 principal grawity@NULLROUTE.EU.ORG (krb5_kuserok)
sshd[3037]: Accepted gssapi-with-mic for grawity from 2a00:1a28:1157:143::2 port 55350 ssh2
kernel: audit: type=1006 audit(1441862594.054:16701): pid=3037 uid=0 old-auid=4294967295 auid=1000 old-ses=4294967295 ses=14576 res=1
sshd[3037]: pam_unix(sshd:session): session opened for user grawity by (uid=0)
systemd-logind[1531]: New session 14576 of user grawity.
Run Code Online (Sandbox Code Playgroud)

为了在您自己的程序中监控这一点,有几种选择:

  • 如果目标机器运行 systemd,您可以监控 systemd-logind (SessionNewSessionRemoved)发送的 D-Bus 信号。ConsoleKit 有一个类似的界面。

  • 您可以实现自己的 PAM 模块,通过 IPC 发送通知。它类似于pam_unix(当前只是将上述消息打印到系统日志)的“会话”阶段。

  • 您可以 inotify-watch “utmp”或“wtmp”文件(前者在(/var)/run/utmpLinux 上,后者在/var/log/wtmp)。大多数登录会话都记录在那里,以便使用who或进行查看w。(utmp 保存当前状态,而 wtmp 是实际日志。)

  • 您可以使用auditd,它将记录pam_loginuid来自守护进程的内核消息以及来自守护进程的各种用户空间消息。

不要忘记区分“交互式”登录(gdm、sshd、登录)、“服务”登录(imap、ftp)和“批处理”会话(cron、systemd-user)。