Mar*_*ryl 8 linux ssh root sudo su
什么是允许root使用 SSH在具有特权的远程服务器上自动执行命令或脚本的好的设置?
我知道(仅对某些选项含糊其辞)以下选项:
root( PermitRootLogin)直接登录(并可能强制进行密钥验证)。sudo不需要密码(NOPASSWD标志 in sudoers)和 TTY(requiretty标志)。sudo为允许在使用特定私钥进行身份验证时执行特定命令/脚本。root设置为并设置setuid 权限。但首先,我不确定这些的安全后果是什么。例如,我知道允许root登录是不受欢迎的。但我不确定,如果这不是一个过时的观点。据我所知,密码身份验证似乎是危险的。使用公钥认证,直接root登录可能没问题。对于某些选项,尤其是sudo,我什至不确定所需的配置。虽然我可以用谷歌搜索所有这些,但我可能会遗漏一些安全方面的考虑,这就是为什么我要征求专家的意见。
请注意,我要求进行服务器端设置。执行将由程序触发,而不是像 那样的工具ssh,所以我不是在寻找自动客户端身份验证之类的东西。
背景:活跃在sshStack Overflow 上的标记,这是经常出现的问题之一,是关于人们在尝试通过 SSH 在远程 Unix/Linux 上执行命令/脚本(甚至 SFTP 服务器)时尝试的各种黑客攻击服务器服务器使用root使用各种编程语言(C#、Java、VB.NET、Python 等)和 SSH 库(SSH.NET、JSch、Paramiko 等)的帐户。
人们尝试的实现通常尝试使用suor sudo。这些然后提示输入密码。因此,实现然后尝试将密码提供给命令输入。由于su和sudo经常需要终端仿真输入密码的提示,执行有权要求PTY。这反过来又会导致进一步的麻烦,因为与终端仿真的会话通常采用交互功能,如ANSI 转义码、分页等。足够的终端来避免分页。
举几个例子:
虽然我通常可以提供实施这些黑客的帮助,但我通常也会添加一个建议,即有比自动化sudo/更好的方法su。但我实际上并没有信心提供那些所谓的“更好的方法”的细节。一个相关的问题:是sudo几乎没用?
所以我正在从超级用户的角度寻找一个规范的答案,然后可以参考并适应 Stack Overflow 的目的。
每当使用 SSH 时,都应避免密码身份验证,即/etc/ssh/sshd_config文件应包含以下行:
PermitRootLogin no
PasswordAuthentication no
Run Code Online (Sandbox Code Playgroud)但是,如果出于某种原因必须使用密码身份验证,则应该使用已建立的、众所周知且经过测试的工具,例如sshpass。不要自己开始通过管道传输密码。
如果使用pubkey 身份验证,如果密码又存储在配置文件或类似文件中,则通过密码保护私钥是没有意义的。如果攻击者能够获得文件系统读取权限来窃取私钥文件,那么他也将能够窃取配置文件。
所有可以使用用户权限运行的命令都应该使用用户权限而不是root权限运行。
subprocess.call本答案中不会考虑所使用的编程语言,因为在安全性方面,Python 、Javajava.lang.Runtime.exec或 shell 脚本内的子 shell 环境之间没有区别。
通过配置防火墙、部署 IDS/IPS 系统等进一步强化远程主机抵御外部攻击的能力也不会被考虑,因为它超出了范围。
也就是说,让我们考虑不同的场景:
人们应该使用一个单独的用户(adduser --shell /bin/rbash --disabled-password remcmdexec将创建一个具有受限 shell 的用户,无法进行本地登录,只能进行远程登录,请参阅man adduser和)与sudoersman rbash文件结合使用,该文件允许该用户仅运行所需的有限命令集,如下所示远程主机上的root(请参阅):man sudoers
# /etc/sudoers
remcmdexec ALL = (root:root) NOPASSWD: /usr/bin/systemctl reload some.service
Run Code Online (Sandbox Code Playgroud)
需要密码来运行这些命令sudo是没有意义的,因为本地登录已被禁用(--disabled-password参数),并且能够窃取密钥文件的攻击者也将能够获取所需的密码(请参阅答案的第一部分)。
authorized_keys文件应包含进一步的限制以防止端口转发等,请参阅man sshd:
restrict ssh-rsa <BASE64-PUBKEY-REPRESENTATION> remcmdexec
Run Code Online (Sandbox Code Playgroud)
它还应该由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
Run Code Online (Sandbox Code Playgroud)
调用例如需要rootssh remcmdexec@remhost sudo /usr/bin/systemctl reload some.service权限的命令。对于所有其他命令,请跳过。sudo
可以使用答案上一节中提供的相同设置,但需要调整sudoers文件:
remcmdexec ALL = (ALL:ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)
这是因为remcmdexec最终需要获得root权限。要知道,能够以remcmdexec身份登录的攻击者现在能够删除远程主机上设置的每一项限制,无论实现root权限的方式设计得多么复杂。因此,所有这些限制在安全方面都是徒劳的(自愿的攻击者)。然而,它们在安全性(系统故障)方面并非无用。
使用它不再有意义sudo。相反,以具有root权限的用户身份登录来运行命令:ssh root@remhost /usr/bin/somecmd
因此/etc/ssh/sshd_config文件中必须存在以下行:
PermitRootLogin prohibit-password
Run Code Online (Sandbox Code Playgroud)
但是,请将限制保留在authorized_keys文件中,以保留一些基本的安全性。
| 归档时间: |
|
| 查看次数: |
2030 次 |
| 最近记录: |