我们有几台服务器由一大群管理员管理。他们通常以服务用户身份登录(例如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.log
mtime 。/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