有什么好的设置可以root
使用SSH在具有特权的远程服务器上自动执行命令或脚本?
我知道以下选项(只是有些选项含糊其词):
root
(PermitRootLogin
)直接登录(并可能强制进行密钥身份验证)。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等)的帐户的服务器服务器。
人们尝试的实现通常尝试使用su
或sudo
。然后,这些提示输入密码。因此,实现然后尝试将密码提供给命令输入。由于su
和sudo
经常需要终端仿真输入密码的提示,执行有权要求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脚本中的subshell环境之间没有区别。
通过配置防火墙,将IDS / IPS系统放置在适当的位置等进一步加强远程主机不受外部攻击者的攻击,因为它不在范围之内。
也就是说,让我们考虑不同的情况:
一个人应该使用一个单独的用户(adduser --shell /bin/rbash --disabled-password remcmdexec
将创建一个具有受限外壳程序的用户,不能进行本地登录,而只能进行远程登录,请参阅man adduser
和man 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身份登录的攻击者现在都可以删除对远程主机施加的所有限制。因此,所有这些限制在安全性方面都是徒劳的(自愿的攻击者)。但是,它们在安全性(系统故障)方面不是徒劳的。
使用不再有意义sudo
。而是以具有root特权的用户身份登录以运行命令:ssh root@remhost /usr/bin/somecmd
因此,/ etc / ssh / sshd_config文件中必须存在以下行:
PermitRootLogin prohibit-password
但是,请将限制保留在authorized_keys文件中以保留一些基本安全性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句