允许使用SSH在Linux上以root身份自动执行命令

马丁·普里克里(Martin Prikryl)

有什么好的设置可以root使用SSH在具有特权的远程服务器上自动执行命令或脚本

我知道以下选项(只是有些选项含糊其词):

  • 允许通过rootPermitRootLogin直接登录(并可能强制进行密钥身份验证)。
  • 配置为sudo不要求密码(NOPASSWD标志为sudoers)和TTY(requiretty标志)。
  • 配置sudo为在使用特定私钥进行身份验证时允许执行特定命令/脚本。
  • 将脚本所有者root设置为,并设置setuid权限

但是首先,我不确定这些安全后果是什么。例如,我知道不允许root登录。但是我不确定这是否不是过时的观点。据我了解,似乎密码验证是危险。使用公钥身份验证,可以直接root登录。对于某些选项,尤其是sudo,我甚至不确定所需的配置。尽管我能够在Google上搜索所有内容,但可能会错过一些安全方面的考虑,这就是为什么我要征求专家的意见。

注意,我要的是服务器端设置。执行将由程序而不是诸如之类的工具触发ssh,因此我不会在寻找自动客户端身份验证之类的东西


背景:ssh在Stack Overflow上的标记中处于活动状态,这是经常出现的问题之一,涉及人们尝试在远程Unix / Linux上通过SSH执行命令/脚本(甚至是SFTP服务器)时尝试的各种黑客行为。使用root使用各种编程语言(C#,Java,VB.NET,Python等)和SSH库(SSH.NET,JSch,Paramiko等)帐户的服务器服务器

人们尝试的实现通常尝试使用susudo然后,这些提示输入密码。因此,实现然后尝试将密码提供给命令输入。由于susudo经常需要终端仿真输入密码的提示,执行有权要求PTY。由于与终端仿真的会话通常使用交互功能,例如ANSI转义码,分页等,因此反过来又引起了更多的麻烦。所有这些导致大量不可靠的骇客,这些骇客试图删除甚至解释ANSI转义码或模拟大型足够的终端以避免分页。

很少有以下例子:

虽然我通常可以为实现这些技巧提供帮助,但我通常还会建议,有比自动化sudo/更好的方法su但是我对提供那些所谓的“更好的方式”的细节实际上并不自信一个相关的问题:sudo几乎没用?

因此,我正在从超级用户的角度寻找规范的答案,然后可以将其引用并进行修改以用于堆栈溢出目的。

他叹了口气

一般注意事项

  • 每当使用SSH时,都应避免密码验证,即/ etc / ssh / sshd_config文件应包含以下行:

    PermitRootLogin no
    PasswordAuthentication no
    
  • 但是,如果出于某种原因必须使用密码身份验证,则应该使用已建立的,众所周知的且经过测试的工具,例如sshpass不要自己开始使用密码。

  • 如果使用pubkey身份验证,则如果密码短语又存储在配置文件或类似文件中,则用密码短语保护私钥是没有意义的。如果攻击者能够获得文件系统读取权限以窃取私钥文件,那么他也将能够窃取配置文件。

  • 可以以用户特权运行的所有命令,都应该以用户而不是root特权运行。

  • 在此答案中将不考虑使用的编程语言,因为就安全性而言,Python subprocess.call,Javajava.lang.Runtime.exec或Shell脚本中的subshel​​l环境之间没有区别

  • 通过配置防火墙,将IDS / IPS系统放置在适当的位置等进一步加强远程主机不受外部攻击者的攻击,因为它不在范围之内。

也就是说,让我们考虑不同的情况:

有限子集需要root特权的运行命令

一个人应该使用一个单独的用户(adduser --shell /bin/rbash --disabled-password remcmdexec将创建一个具有受限外壳程序的用户,不能进行本地登录,而只能进行远程登录,请参阅man adduserman rbash与一个sudoers文件结合使用,该文件允许该用户仅运行以下必需的有限命令集:远程主机上的root(请参阅参考资料man sudoers):

# /etc/sudoers

remcmdexec ALL = (root:root) NOPASSWD: /usr/bin/systemctl reload some.service

要求密码来运行这些命令sudo是没有意义的,因为禁用了本地登录(--disabled-password参数),并且能够窃取密钥文件的攻击者也将能够窃取所需的密码(请参阅答案的第一部分)。

authorized_keys的文件应包含进一步的限制,以防止如端口转发,看看man sshd

restrict ssh-rsa <BASE64-PUBKEY-REPRESENTATION> remcmdexec

它应该进一步由root拥有,并且可由remcmdexec用户读取但不可写,以防止删除SSH限制:

$ ls -l /home/remcmdexec/.ssh/authorized_keys
-rw-r--r-- 1 root root 739 Sep  18 22:47 /home/remcmdexec/.ssh/authorized_keys

调用例如ssh remcmdexec@remhost sudo /usr/bin/systemctl reload some.service需要root特权的命令对于所有其他命令,请跳过sudo

需要无限特权但适当子集的运行命令

可以使用与答案上一部分相同的设置,但需要修改sudoers文件:

remcmdexec ALL = (ALL:ALL) NOPASSWD: ALL

这是因为remcmdexec最终需要获得root特权。可以理解,无论以何种方式设计实现root特权的复杂性,能够以remcmdexec身份登录的攻击者现在都可以删除对远程主机施加的所有限制因此,所有这些限制在安全性方面都是徒劳的(自愿的攻击者)。但是,它们在安全性(系统故障)方面不是徒劳的

运行一全部都需要root特权的命令

使用不再有意义sudo而是以具有root特权的用户身份登录以运行命令:ssh root@remhost /usr/bin/somecmd

因此,/ etc / ssh / sshd_config文件中必须存在以下行

PermitRootLogin prohibit-password

但是,请将限制保留authorized_keys文件中以保留一些基本安全性

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 sudo 执行命令与以 root 用户身份执行命令有什么区别?

来自分类Dev

使用ssh执行命令

来自分类Dev

root是否可以以非root用户身份执行命令?

来自分类Dev

自动执行命令

来自分类Dev

我无法以root用户身份执行命令

来自分类Dev

如何以root身份从Haskell执行命令?

来自分类Dev

使用ssh远程执行命令

来自分类Dev

无法在Cisco WLC上使用SSH.NET执行命令

来自分类Dev

使用bash脚本ssh登录后在ec2上执行命令

来自分类Dev

通过SSH在远程服务器上执行命令

来自分类Dev

ssh:在远程主机而不是登录shell上执行命令

来自分类Dev

SSH.NET未在设备上执行命令

来自分类Dev

允许用户以root身份通过ssh运行单个命令

来自分类Dev

通过Dropbox在Linux上远程执行命令?

来自分类Dev

用户在Linux上登录之前如何执行命令

来自分类Dev

通过SSH执行命令时无法使用别名

来自分类Dev

通过SSH执行命令时无法使用别名

来自分类Dev

使用子进程来ssh和执行命令

来自分类Dev

通过 ssh 远程执行命令来使用别名

来自分类Dev

如何在Hudson作业中以root用户身份执行命令行?

来自分类Dev

如何在git post-receive hook中以root身份执行命令

来自分类Dev

如何以非root用户身份从自定义webmin模块执行命令

来自分类Dev

以root用户身份执行命令,然后在shell脚本中切换回用户

来自分类Dev

如何在詹金斯中以 root 身份执行命令

来自分类Dev

在Justfile中通过SSH通过sudo以其他用户身份执行命令

来自分类Dev

在Justfile中通过SSH通过sudo以其他用户身份执行命令

来自分类Dev

使用Ansible执行命令

来自分类Dev

使用JSch执行命令

来自分类Dev

打开终端时自动执行命令

Related 相关文章

热门标签

归档