通过ssh用户执行root命令

通过ssh用户执行root命令

我的目标是通过 ssh 从另一个 Linux 主机以 root 用户身份执行命令。

问题是:环境不允许直接访问 root 用户。

手动方式是先通过 ssh-key 连接到非特权用户,然后 su 到 sudo 特权用户,然后 sudo -i/sudo su 到 root 帐户并执行命令。

对我来说,一个看起来非常方便的解决方案是使用Python 与 Paramiko

我的问题是,不使用 Python 是否也能实现类似的功能。最后,我想执行一个脚本,该脚本读取特权用户密码,然后在远程系统上以 root 用户身份执行命令。

我想到这样的事情:

ssh -t user01@host su user02 -c 'sudo -S cat /etc/shadow'

如果我直接在机器上执行此命令,它可以工作,但是当我通过 ssh 尝试执行此命令时,它会出现错误:su: invalid option -- 'S'

在我看来,ssh -t 和 sudo -S 的组合存在问题,但我不明白。

有什么建议吗?谢谢你的帮助!

答案1

...首先通过 ssh-key 连接到非特权用户,然后 su 到 sudo 特权用户,然后 sudo -i/sudo su 到 root 帐户并执行命令。

sudo 的全部意义在于直接将登录者与他们被允许执行的 sudo 命令关联起来。中间有一个“共享”帐户彻底破坏这。

...我想执行一个脚本,该脚本读取特权用户密码,然后以 root 用户身份在远程系统上执行命令。

再次强调,[正确使用] sudo消除和所有这些乱七八糟的事情。
登录,使用你的密码,然后使用 sudo 执行操作(同样,使用你的密码,如果是这样配置的)。您不需要“特权用户”帐户的密码(因为不应该有密码),当然也不需要(或)的密码(因为没有人应该曾经得到一)。

我建议你们的系统管理员应该用打印的卷起来的男人sudo 的页面。

您应该以自己的身份登录,并直接从您的帐户使用 sudo。
(如果他们抱怨“管理开销”,请建议一个允许使用 sudo 的本地组,您的帐户将是该组的成员)。

答案2

问题是:环境不允许直接访问 root 用户。

如果您有需要,允许 root 用户通过 ssh 进入并不是世界末日。

对于 sshd_config 中的 OpenSSH,这也许会PermitRootLogin prohibit-password 带有额外的限制,例如Address仅匹配预期网络的前缀。

这里的一个主要缺点是缺乏个人责任制,无法将一个人与他们所做的事情的审计线索联系起来。只需将这样的私钥提供给自动化系统,它运行的所有命令都记录在版本控制中。没有人以交互方式使用它,一切都是他们自己的事情。

请注意,添加切换用户程序本身也存在正确实施的挑战。多年来,sudo 存在多个漏洞,而且 sudoers 策略也需要正确编写。


在同一个命令行中使用 sudo 和 su 是一种无用的反模式,它既会混淆访问日志,又会因密码而导致不太安全的身份验证。

密码是非常薄弱的​​身份验证因素。允许直接 root 登录的经过适当保护的 ssh 密钥更安全。

答案3

这非常简单:

ssh -t target.host sudo crontab -e -u root

这将要求 上已连接用户的密码target.host,并要求该用户处于sudoers(例如,处于 组wheelsudo或您系统中设置的任何组中)。需要“-t”来获取 tty,以便sudo能够以交互方式询问密码。如果您不想输入任何密码(以使此操作完全自动化),则需要为此命令和此用户设置 sudo 以使其无密码,或使用其他方法。

man sudoers

其他方法之一是root使用非对称加密身份验证直接连接。您可以进一步限制安装到 root 的密钥,authorized_keys使其仅允许运行所需的命令:

command="crontab -e -u root" ssh-rsa ... <the restricted public key follows>

并且只允许使用密钥登录 root 用户:

PermitRootLogin prohibit-password

然后就

ssh -i restricted_privkey [email protected]

man sshd_configman sshman authorized_keys


尽管如此,任务的性质和限制确实要求使用Ansible.它的设计正是为了满足这样的要求。

它将通过 ssh 连接,并且不需要目标主机上的任何内容即可运行,除了受支持的 Python 版本(>=2.6 或 >=3.5)。请阅读链接的手册以了解详细信息。该功能将告诉它使用或(无论你喜欢哪种方法become)成为 root 。有一个专用的sudosucron模块,因此您将可以享受“如果尚未安装则安装 crontab 作业,如果之前已安装则更新”的逻辑。

答案4

这难道不是一个简单的 shell 引用问题吗?

远端看到此命令:

su user02 -c sudo -S cat /etc/shadow

并且su命令不知道该-S标志是什么。

尝试这个:

ssh -t user01@host "su user02 -c 'sudo -S cat /etc/shadow'"

(此外,我通常使用ssh -n …(不要对标准输入抱有任何期望),以防命令最终在可能产生影响的情况下运行。)

相关内容