SSH:su根或sudo?

有什么更好的select:使用su切换到root或enabeling sudo? 如果没有使用sudo,入侵者就需要知道被允许ssh的用户的密码(或者密钥),然后还需要知道root密码。 用sudo,非特权用户的密码就足够了。

我build立了一个新的web服务器(Debian 8.2),并且想知道通过SSH安全连接到它的最佳实践是什么,并且仍然很容易使用它。

到目前为止,我已经在SSH上禁用了PermitRootLogin并切换了端口。 另外iptables是在阻止我不需要的一切。 现在我必须login一个非特权用户,然后切换

su root 

但是,以root身份工作并不是我所听到的最好的事情……所以我想到了授予我无特权的用户sudo权利。

然后再入侵者只需要知道一个密码,因为sudo是要求当前用户密码而不是根密码。 因此,我计划通过在SSH中禁用PermitRootLogin来使攻击者更难以继续工作。

所以:su根或sudo?

到目前为止,我已经在SSH上禁用了PermitRootLogin并切换了端口。

我不是在非标准端口上运行服务的忠实粉丝; 你使自己和他人的互用性更难,因为没有真正的收益。 用一个体面的密码(或更好的:密钥),随机的SSH扫描没有成功的机会,有针对性的攻击不是由不同的端口分阶段。

但是,以root身份工作并不是我所听到的最好的事情……所以我想到了授予我无特权的用户sudo权利。

这是个人偏好; 有select任何一种方法的正当理由。

就个人而言,我宁愿避免sudo,主要是因为它比su复杂得多。 而且这种复杂性在sudo的configuration和sudo本身(有几个安全build议 )中都有更高的安全风险。 不过,sudo在允许非特权用户执行非特定命令而非密码方面非常有用。

这就是说,切换到root并使用sudo按照你所描述的方式是非常可交换的,除了一些事情:

  • Sudo可以logging通过它执行的每个命令。 在使用su时,您必须依赖root的shell历史logging。 (攻击者可以轻易地绕过这个,例如通过简单的做sudo su

  • 用sudo,你通常需要用户的密码,你需要root用户的密码。

  • 使用sudo,交错特权和非特权命令更容易。

    但是,我通常会发现自己要么执行需要很多根的pipe理任务,要么执行不需要root的非pipe理任务。 为了避免混淆,我使用shell提示来区分根(红色)和用户(蓝色)。

  • 默认情况下,sudo仅限于某些帐户。

    对于su,通过使用pam_wheel.so将su-to-root限制到某个组的成员,可以实现类似的function。 ( addgroup --system wheeladduser YOU wheel ,取消/etc/pam.d/su的pam_wheel行注释)

我应该通过密码禁用SSH身份validation,只使用密钥? 那么如果我不在我自己的笔记本电脑上,我将很难访问服务器。

是的,这可能是最大的安全收益之一。

您可以在多台(可信赖的)机器上为您的帐户的SSH密钥授予访问权限。

如果机器不受信任,则应考虑不要从它们login; 他们可以注入命令或有一个键盘logging嗅探您的密码。

一些额外的提示:

  • 考虑将SSH访问限制为需要SSH访问的用户帐户。

    我喜欢通过addgroup --system allowssh ,然后在/etc/ssh/sshd_config设置PubkeyAuthentication no ,并添加一个Match Group allowssh\n PubkeyAuthentication yes节。

    我敢肯定,这也可以通过PAM来完成,使用类似于auth required pam_succeed_if.so quiet_success user ingroup allowssh /etc/pam.d/sshd auth required pam_succeed_if.so quiet_success user ingroup allowssh

  • 考虑安装一个报告exception的日志检查器。 为了减less邮件的数量,你可以考虑邮寄成功的login尝试,而不是失败的login尝试。

我的想法:

  • PasswordAuthenticationPermitRootLogin设置为no
  • 也可以select密码SSH密钥(虽然没有办法强制执行此操作)
  • 使用MFA,因为Tim的回答表明进一步限制SSH访问(个人来说,我会通过PAM的Google Authenticator插件来实现 )
  • 不要启用无密码的sudo,并确保为您的用户设置强密码。
  • 更改SSH端口并不是必须的,任何专用的端口扫描程序将最终find您的开放端口。
  • 使用Fail2Ban来防范powershell的SSH攻击
  • 通过设置AllowTcpForwarding no禁用端口转发
  • 关于iptables,使用“默认拒绝”规则系统地删除任何不在您的白名单的端口。
  • 如果你是超偏执的,那么使用iptables来限制SSH访问一个已知的IP地址(注意,如果你正在家中访问或者从一个可能改变的IP地址访问,这不是一个好主意)。

我们所做的(ops公司)是禁用密码login,只允许密钥。 使用cryptostick (新名称, NitroKey )或只是一个智能卡 ,但这意味着你还需要一个读者。 这样你就有了双重身份validation,你拥有的东西(棒子或卡片)以及你知道的东西(sudo的密码)。

除非你确实需要切换到根目录,否则认为这是不好的做法,总是花时间考虑是否真的需要切换。