使用 ssh 自动从远程框检索信息

使用 ssh 自动从远程框检索信息

向大家问好。

我需要一个“basics-202”问题的答案;已经有一段时间了。

从 cronjob 中,我如何自动 ssh 到远程框来检索通常需要 root 等效权限才能查看的信息?

细节:

我所有的盒子都有

  1. 通过 /etc/login.block 禁用 root 登录。

  2. /etc/ssh/sshd_config 中阻止通过 ssh 进行 root 登录:PermitRootLogin no

  3. 所有 ssh 登录均通过 pub/priv 密钥对进行。手动密码已禁用。PasswordAuthentication 否

  4. 我已经设置了一个有限的 uid“automate”,它带有一个密钥对,用于自动 ssh 连接任务(例如,用于 cron 作业)。“automate”显然不是 sudoer,也不是 wheel 或组 0 用户 ID。

一切都很好(可能不完整,但那是另一篇文章)。

但...

有些事情显然需要根等效性才能完成,例如“netstat -patn”查看 -all- tcp 连接。


$ netstat -patn

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)


或者

(‘apt-mirror’ 是远程盒的主机名)


$ ssh apt-mirror netstat -patn
(No info could be read for "-p": geteuid()=1008 but you should be root.)
Active Internet connections (servers and established)


如果您处于交互式会话中,那么要查看所有 TCP 连接,请输入:

$ sudo netstat -patn

但我不认为这可以通过自动 ssh 会话来完成。


$ ssh -t apt-mirror sudo netstat -patn
[sudo] password for automate: <hangs here>

原因如下:

  1. sudo 交互地想要“自动化”密码
  2. 无论如何,“自动化”并不是 sudoer。

我可能可以用米老鼠来做这件事,但我更愿意把它做好。(ssh 是否是这种活动的正确方法?)问题是,做这样的事情的正确方法是什么?

谢谢!

答案1

在远程服务器上编辑 /etc/sudoers(使用visudo),并允许您的自动化用户专门运行这些 sudo 命令,而无需提示输入密码。

没有root权限就无法做“需要root权限的事情”。

答案2

从你给出的例子来看,你正在进行某种监控,而不是执行操作(service httpd statusvs service httpd restart

考虑到您的环境存在 root 限制,我个人会使用 Nagios NRPE 之类的工具来获取所需的信息。NRPE 旨在分发信息,而不会提供任何类型的潜在交互式会话。您可以定义允许远程主机执行的命令,并限制允许哪些远程主机执行这些命令。

在您的示例中,您可以添加类似以下内容:

command[all_net_conns]=/usr/bin/sudo /bin/netstat -patn

您需要允许 Nagios/NRPE 用户进行相应的无密码 sudo 访问,但您可以将其限制为所需的命令,并锁定帐户以便没有人可以实际访问它。

当然,缺点是没有用户名/密码/密钥对等访问身份验证或授权,主机可以或不能访问 NRPE 服务来获取信息。

相关内容