我如何才能找出哪个用户以 root 身份登录?

我如何才能找出哪个用户以 root 身份登录?

我们有几台服务器由一大群管理员管理。他们通常以服务用户身份登录(例如hudson),然后切换到root进行一些小修复。这意味着我们通常无法将所做的更改映射到某个人。

有没有人有 Unix/Linux 脚本可以告诉我哪个用户以 root 身份登录?登录可以从本地 LAN 上的所有计算机进行。无法以 root 身份从 LAN 外部进行远程访问;管理员必须先以 LAN 用户身份登录,然后才能将自己提升为 root(他们都使用 SSH)。

我想要的是一个脚本,它可以跟踪远程登录(在本地局域网中)并在一定时间内打印用户名。您可以假设该脚本可以通过 ssh 以 root 身份登录到本地局域网上的任何计算机,而无需输入密码。

背景:我有一个脚本,它保存了所有由 root 编辑的文件的备份。问题是找出真正进行更改的人。

安全不是问题;这不是为了找到可能已经清理过的黑客wtmp,而是为了找出谁犯了错误并给予反馈。

[编辑]一些指针:该命令last有助于:

> last -t 20101029174200 root
root     pts/26       :0.0             Wed Oct 20 15:36 - 15:03  (23:27)    

wtmp begins Fri Oct  1 16:34:36 2010

因此root是通过 登录的pts/26。还有谁坐在那个伪 TTY 上?

> last -t 20101029174200 pts/26
adigulla pts/26       :0               Mon Oct 25 09:45   still logged in   
adigulla pts/26       :0               Fri Oct 22 14:00 - 17:29  (03:29)    
adigulla pts/26       :0               Thu Oct 21 15:04 - 16:05  (01:01)    
root     pts/26       :0.0             Wed Oct 20 15:36 - 15:03  (23:27)    
adigulla pts/26       :0.0             Fri Oct 15 15:57 - 15:57  (00:00)    

wtmp begins Fri Oct  1 16:34:36 2010

嗯...肯定是我。所以我可以跟踪本地机器上的用户更改。如果我登录到远程机器:

$ last -1 hudson 
hudson   pts/0        192.168.0.51     Fri Oct 29 17:52   still logged in   

last这样我就得到了 PTY 和我来自的 IP 地址。我怎样才能将for的输出hudson与 上的用户联系起来192.168.0.51

[编辑2]还请注意,我们通常使用 而ssh不是sudo或来更改用户su。这允许单点登录,并且避免必须告诉管理员任何密码。如果我们想授予/撤销对某些内容的访问权限,我们只需从服务帐户中添加/删除公钥即可。我还知道 ssh 会记录到 syslog 中,但消息不会告诉我哪个用户切换到 root:

sshd[7460]: Accepted publickey for root from ::1 port 36689 ssh2

答案1

您应该能够通过解析来确定谁将成为 root 用户/var/log/auth.log

例如,如果我在自己的机器上以 root 身份输入,则会输入如下行/var/log/auth.log

Oct 29 20:10:33 localhost su: pam_unix(su:session): session opened for user root by (uid=1000)

现在来看/etc/passwd,我们看到:

brad:x:1000:100:brad clawsie,,,:/home/brad:/bin/zsh

这让我们将 uid 1000 与一个名称关联起来。编写一个 perl 脚本来执行此操作应该非常简单,您只需要在某个时间范围内加入 uid,即您正在调查的文件的/var/log/auth.logmtime 。/etc/passwd

当然,如果有人以 root 身份并对touch您正在研究的文件执行命令,他们会设置它的 mtime,而您会错误地认为是他们编辑了该文件。

如果我要推荐一种最佳做法来避免你的问题,那就是存储全部脚本、crons、配置文件……一切作为版本控制系统中的文件,必须由真实用户编辑,然后使用某种部署工具(make,apt等)应用于实时系统。如果人们不断破坏事物,请在部署之前让更高级的开发人员签署他们的更改。

如果您未能在正确的时间进行复制,您的备份可能无法帮助您……版本控制系统可让您恢复任意数量的编辑。

任何时候,实时生产系统上的文件都被 root 编辑,这是一个大问题。我无法判断你的问题是否哈德森是您系统上的真实人员还是服务(即 hudson 服务)的合成用户。 如果是合成用户,我会问为什么这个 uid 会获得“真实”的登录 shell。

答案2

我认为向错误地以 root 身份登录的管理员提供反馈的最佳方式是禁用 root 登录,同时仍允许 su 和 sudo。或者让 root 的 .profile 显示适当的反馈消息,然后退出。

如果除管理员之外的任何人错误地以 root 身份登录,您至少需要更改 root 的密码 :-)


好的,您已经修改了问题,以明确您想要实现的目标。您需要尽量减少允许登录的服务数量,并确保所有服务都记录成功登录。SSH 通过 syslog 记录成功登录。

如果有几个人以“hudson”身份登录,则需要阻止这种情况。网站政策应该是,每个管理员都使用唯一的用户 ID 登录。

您需要确保日志文件轮换已调整,以便您可以搜索您认为必要的任何时期的旧日志。

您当然可以有一个由 cron 安排的脚本,该脚本每天从 syslog 中 greps 登录信息,并且检查关键配置文件上的时间戳。

此外,还有许多工具可用于监控配置文件的更改。许多 Unix 系统都有可启用的审计子系统,这也能有所帮助。

我个人认为,在发生错误时提供反馈的最佳方式不是寻找某人来追究责任,而是向整个团队解释问题,解释为什么改变是一个错误,并征求防止错误的想法。

答案3

将 su 重命名为 log_su 然后将实际的 su(现在是 log_su)调用放入名为 su 的包装器中

#!/usr/bin/env bash
$SU_LOG=<path to log file>
echo "User: $USER running su at $(date)" >> $SU_LOG
log_su

答案4

检查 /var/log/secure 日志以找出哪个用户登录/切换到 root 用户 - RHEL7

相关内容