在云服务器上设置无密码的sudo可以吗?


58

我喜欢通过按键访问服务器的想法,所以我没有在我的密码,我每次都输入ssh到一个盒子里,我甚至锁住我的用户(不root)密码(passwd -l username),所以它不可能登录无需钥匙。

但是,如果要求我输入sudo命令密码,则所有这些操作都会中断。因此,我很想设置无密码sudo以使事情与无密码登录保持一致。

但是,我一直感到自己可能会以某种意想不到的方式适得其反,这似乎有点不安全。这样的设置有什么警告吗?您是否建议/不建议对服务器上的用户帐户执行此操作?

澄清说明

  1. 我在这里谈论的是sudo在交互式用户会话中的使用,而不是用于服务或管理脚本
  2. 我正在谈论使用云服务器(因此我对计算机没有物理本地访问权限,只能远程登录)
  3. 我知道sudo有一个超时,在此期间我不必重新输入密码。但是我的演唱会并不是真的在浪费额外的时间来实际输入密码。但我的想法是根本不必处理密码,因为我认为:
    • 如果我必须记住它,它很可能太短而无法安全或重复使用
    • 如果我为远程帐户生成了一个长而唯一的密码,则必须将其存储在某个地方(本地密码管理器程序或云服务),并在每次使用时都获取它sudo。我希望我能避免这种情况。

因此,对于这个问题,我想更好地了解一种可能的配置相对于其他可能的配置所面临的风险,警告和折衷。

跟进1

所有答案都表明,无密码sudo是不安全的,因为如果我的个人用户帐户遭到破坏,它可以“轻松”地升级特权。我明白那个。但是另一方面,如果我使用密码,则密码会带来所有经典风险(太短或通用的字符串,在不同的服务之间重复等等)。但是我猜想,如果我禁用密码身份验证,/etc/ssh/sshd_config以便仍然需要登录密钥,那么我可以使用更简单的密码sudo吗?那是有效的策略吗?

跟进2

如果我也有一个root通过ssh 登录的密钥,如果有人可以访问我的计算机并窃取我的密钥(尽管它们仍然受到操作系统的密钥环密码的保护!),他们也可能会直接访问该root帐户。 ,绕过sudo路径。那么访问该root帐户应该有什么政策?


2
根本不建议这样做,因为通常有很多方法可以将shell用作用户(因为所有服务都受到安全漏洞的破坏,但是它们通常以用户身份运行以避免完全访问系统),但是具有用于登录的密码root阻止未经授权的人员获得root访问权限。如果不存在,则认为以任何方式访问您的用户帐户的任何人都可以完全访问服务器。设置密码可能不多,但有帮助。
Piernov 2014年

请查看我的后续问题
Dmitry Pashkevich 2014年

1
sudo绝不能没有密码。应当通过SSH禁用root的远程登录,不应该将ssh端口设置为默认端口(以放弃笨拙的机器人),并且任何需要sudo的帐户都应仅具有最低的最低sudo能力,以满足他们的需要(重启服务)等等),并且密码也非常安全。
SnakeDoc 2014年

@SnakeDoc谢谢,这是我所期待的答复。愿意写详细的答案吗?我很高兴学习!
Dmitry Pashkevich 2014年

2
@EEAA在Linux中实际上很容易。唯一应该被允许在sudo中使用无密码的帐户是系统帐户,该帐户无法登录,因此无法提升为该帐户并对您使用这些权限。在其中设置帐户的假外壳,/etc/passwd例如nologin,不设置密码,然后在visudo中设置无密码。如果执行此操作,则还应确保仅针对该系统帐户绝对需要的权限使用visudo设置,即将其锁定为仅应运行的唯一命令。
SnakeDoc 2014年

Answers:


48

我喜欢通过密钥访问服务器的想法,这样就不必在每次将ssh放入框时都必须输入密码,甚至可以锁定用户(不是root)的密码(passwd -l用户名),因此不可能没有密钥登录...是否建议/不建议对服务器上的用户帐户执行此操作?

您将以错误的方式禁用基于密码的登录。PasswordAuthentication no在您的中进行设置,而不是锁定用户帐户/etc/ssh/sshd_config

设置该选项后,将禁用ssh的密码身份验证,但是您仍然可以将密码用于sudo。

只有我建议设置时间NOPASSWD在须藤是服务帐户,其中流程需要能够通过sudo程序运行命令。在这种情况下,请确保仅将帐户需要运行的特定命令明确列入白名单。对于交互式帐户,应始终保持启用密码的状态。

对您的后续问题的回答:

但是我猜想,如果我在/ etc / ssh / sshd_config中禁用了密码身份验证,以便仍然需要登录密钥,那么我可以为sudo使用更简单的密码吗?那是有效的策略吗?

对,那是正确的。我仍然建议使用相对较强的本地帐户密码,但强度不高。大约8个字符,随机生成就足够了。

如果我还有一个密钥可以通过ssh以root身份登录,如果有人可以访问我的计算机并窃取我的密钥(尽管它们仍然受到OS的密钥密码的保护!),他们也可能会直接访问该密钥。 root帐户,绕过sudo路径。

应当禁止通过ssh进行根访问。期。设置PermitRootLogin no您的sshd_config

那么访问根帐户应该有什么政策?

您应该始终具有获取对服务器控制台的带外访问的方法。多家VPS供应商确实提供此功能,专用硬件供应商也提供此功能。如果您的提供者未授予实际的控制台访问权限(例如,EC2),则通常仍可以使用我在此答案中概述的过程恢复访问权限。


2
+1 应该留下密码...
克里斯·S

6
sudo密码+1不是真正的安全性(据我所知),但更多是作为白痴检查使用的。不在那里可能会引起难以置信的骚动。
蜘蛛鲍里斯(Boris)

1
如果您松开密钥,就可以完成,除非您拥有后门,但攻击者也是如此。正确解决丢失密钥的唯一方法是亲自坐在实际的终端上。如果您需要ssh密钥提供的保护,您应该意识到陷阱,并且...简单地,不要松开密钥。
SnakeDoc 2014年

1
对您的最后一段发表评论,并就失去任何VPS的访问权限一般来说……如果您被锁定,某些VPS提供商实际上会为您提供帮助。我曾经将我的VM引导到单用户模式,并在我将自己锁定在外时为我做一些事情(它发生了……防火墙规则不好,哈哈)。根据您的主机,他们可能会向您收取服务费用; 。毕竟,专特别注意你另外,有些人会做备份/快照一个小的价格或有时是免费的,如果你犯下了大的,可能是破坏性的变化,这可能是值得的。
SnakeDoc

1
@DmitryPashkevich-关于PasswordAuthentication影响所有用户,您始终可以使用Matchsshd_config中的部分为某些用户或组将其重新打开。
Matt Thomason 2014年

11

我通常将的使用限制NOPASSWORD为由自动化过程运行的命令。最好拥有一个用于这些命令的服务帐户,并将sudo的使用限制为所需的命令。

允许NOPASSWORD使用常规命令,允许任何有权访问您的用户ID的人运行任何命令。这可能是由于您的凭据受损所致,但可能就像您走开一秒钟时坐在办公桌旁的人一样简单。

我发现我不必经常输入密码。输入密码后,如果您之间的等待时间不长,则可以运行多个命令。超时是可配置的。


8

我只会在两种情况下使用它:

  • 绝对需要以特定用户身份运行的自动化脚本时
  • 对于特定的管理任务(只读的管理任务,而不是采取措施更改系统的那些任务),然后仅对特定的用户

默认情况下,大多数sudo配置都不会在同一会话中再次询问您(如果您打开的新外壳无效)。您可以通过timestamp_timeout设置在某种程度上控制此行为。

无密码不如sudo无密码短语的ssh密钥危险,因为远程攻击者首先需要您的凭据才能进入,但是如果它们以某种方式破坏了您的私钥而被获取(或者如果它们在您的本地本地)并且您已经离开计算机登录并解锁了),那么密码请求是他们与特权访问之间的宝贵额外防御措施。

关于后续活动2:

如果我还有一个密钥可以通过ssh以root身份登录

正是出于您所描述的原因,最好也避免这种情况。如果远程连接必须具有特权访问权限,请通过服务帐户登录,并给予足够的控制权以通过sudo完成其工作。当然,这更容易配置,以至于让许多人不打扰(如果您愿意的话,它对您很有用,因为攻击者可以花很多时间在此之上,这比攻击者花了很多时间!),因此归结为在安全性和便利性之间进行古老的折衷(专家提示:选择安全性!)。


感谢您解决我的后续问题#2。不过,我仍然很困惑:我确实尝试避免root直接登录,但是我确实需要某些方式来访问帐户,对吗?那我该怎么办呢?用密码而不是ssh键?但是密钥难道不比密码好吗?
Dmitry Pashkevich 2014年

您始终可以以root用户身份在本地登录,但是建议完全禁用从远程主机(通过ssh或类似主机)到root的直接登录。如果您拥有一个可以通过sudo成为root用户的帐户(当然使用密码),那么您将永远不会丢失对该帐户的所有访问权限。
David Spillett 2014年

7

您可以两全其美:SSH身份验证用于登录和sudo。如果集成了pam_ssh_agent_auth模块,则在使用sudo时无需输入密码即可使用SSH密钥进行身份验证。

我已经在生产中使用了五年以上。

要对其进行配置,请安装PAM模块,然后在/etc/pam.d/sudo或系统的等效项中添加一行:

auth    sufficient     pam_ssh_agent_auth.so file=~/.ssh/authorized_keys

如果这样做,请确保使用密码保护计算机上的密钥。这样,某人将不得不闯入您的计算机并窃取密钥才能进入。如果他们可以访问您的帐户,则可以通过在未锁定的情况下将其从内存中拉出,破解您的密码短语或通过以下方式来窃取您的密码短语:在您键入内容时,键盘记录程序或肩膀在网上冲浪(向后看!)。

您可以使用与登录时相同的SSH密钥,也可以设置一个单独的密钥,仅在sudo时将其添加到代理中。因此,如果您要格外小心,可以维护一个单独的authorized_keys文件,该文件具有单独的SSH密钥,仅在需要进行sudo时才添加到代理中:

auth    sufficient     pam_ssh_agent_auth.so file=~/.ssh/authorized_keys_sudo

哇,听起来不错!那么,我是否生成一个单独的密钥来执行sudo命令,还是使用与SSH身份验证相同的密钥?
Dmitry Pashkevich 2014年

1
这真太了不起了。如果可以的话,我会多次投票给你。
nyuszika7h 2015年

您可以使用与用于普通SSH身份验证的密钥相同的密钥,也可以为提高安全性而临时将用于sudo-ing的密钥添加到SSH身份验证代理。这将要求您指定一个不同于的~/.ssh/authorized_keys文件,~/.ssh/authorized_keys_sudo例如,您可以管理另一个文件/etc/ssh/authorized_keys_sudo
obscurerichard '16

6

如您所问,这是我如何解决此sudo问题的一般建议。

Sudo并不是为了提供更高的安全性而设计的(尽管它可以在某种程度上提供)...而是提供了一个良好的审计线索,以了解谁在用什么特权在您的系统上做什么。

正确设置的Sudo将不会使用该ALL=(ALL) ALL设置,而是将其限制为用户特别需要的任何内容。例如,如果您需要用户能够登录并重新启动受困的服务,则他们可能不需要安装新软件或关闭服务器,更改防火墙规则等的能力。

人们有时会使用sudo将自己提升为root帐户,即。sudo su -。一旦他们这样做了,您就不再从根帐户中看到谁在做什么(root可以同时登录多次)。因此有时人们也想禁用该sudo su -命令。但是,出于实际原因,如果您确实需要一个完全具有root特权的帐户来进行管理,则至少要让某人发出该sudo su -命令,才能记录谁升迁到root的时间。

我如何固定我的盒子:

将SSH端口更改为默认端口。这是为了避免笨拙的僵尸寻找端口号,然后笨拙地敲打它们,直到它们进入(或不进入)。

禁止使用AllowRootLogin nosshd_config中的设置通过SSH进行根登录。这样可以防止有人强行强行进入您的根帐户。通常,从审计和安全角度考虑,绝对不允许任何人直接登录到root /管理员帐户,这是一种很好的做法。如果您直接允许root登录,那么您将不知道谁登录,谁从谁那里获得了密码等等。但是,如果有人登录Jimmy的帐户,然后提升他们的root权限,那么您最好从哪里开始审核搜索(以及要重置的帐户)。

仅允许用户使用需要它的SSH使用该AllowUsers设置并明确指定哪些帐户需要SSH访问。默认情况下,这将阻止所有其他来自SSH的帐户。

通过visudo编辑Sudoers,仅允许用户需要的命令。关于如何执行此操作,有很多深入的指南,因此,在此不做详细介绍。这是一个入门工具:http : //ubuntuforums.org/showthread.php?t=1132821

其主要目的是防止帐户遭到破坏而危害您的计算机。即。如果Sally的帐户被破解,并且Sally只能使用sudo来重新启动Web服务器,那么攻击者可能会很乐意循环重新启动Web服务器,但是至少他们不能rm -rf /your/webserver/directory或无法打开所有防火墙端口等。

设置好的防火墙规则,仅允许您的设备运行所必需的端口。通常,您要删除所有内容,仅明确允许您需要的内容。有很多不错的iptables和其他防火墙可以在线启动,这是我使用的(这是一个基本的启动器):

# Generated by iptables-save v1.4.7 on Mon Mar  3 17:55:02 2014
*filter
:INPUT DROP [4528:192078]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [39845:27914520]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4254 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8443 -m state --state NEW -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Mon Mar  3 17:55:02 2014

密钥也很安全。即使您使用SSH密钥进行远程访问,仍应要求密码才能使用Sudo。这是sudo可以提供更多安全性的情况。如果有人要窃取您的ssh密钥,如果他们仍然必须蛮力使用您的帐户密码来使用sudo,则仍然会阻止他们对您的盒子做任何重要的事情。密码不是一个单词,而是一个通行短语。想一个句子,并使用它。通常,这将使您的字符长度超过8个字符,提供了足够的熵,但是比一些随机密码更容易记住。当然,良好的密码习惯是说使用机器生成的随机密码来欺骗开膛手约翰之类的破解工具,该工具会撕裂大多数密码短语和密码。不,将E更改为3无效,John也获得了这些排列。


感谢您的全面回答!我绝对需要使用所有这些建议来保护我的盒子。我仍然会接受EEAA的回答,因为它相对于我所要求的更为具体。
Dmitry Pashkevich 2014年

1
@DmitryPashkevich很好,EEAA的回答很好。您要求我在上面详述我的评论,所以我做到了。不用担心:)
SnakeDoc

至于sudo su -和变化,sudoreplay可以派上用场。
nyuszika7h 2015年

3

在某些情况下,有必要这样做。例如,某些管理程序API需要无密码登录和无密码sudo。但是您仍然可以在不中断的情况下对其进行限制。

对于您要实现的目标。我会说,习惯于输入密码。安全比这里的便利更方便。此外,如果您确实需要root用户访问权限,则可以使用sudo它,并且它将缓存凭据一会儿,以便如果您连续运行多个sudo命令,则只会在第一次提示您输入密码。因此,这并不是您想的那么大的麻烦。

另外,如果您要输入许多root特权命令,并且不想一直将sudo放在命令的前面,则可以选择su或者sudo -s获取root shell。您将输入一次密码,仅此而已。


2

我曾经被无密码的sudo咬过。这是一个shell脚本,是一些安装程序,代表我调用sudo,而您只需要sudo或出错就可以了。

对键入“ make”进行成像,并为您执行“ sudo make install”部分的脚本,而无需设置或显示基本路径,并且脚本一开始就很死,以至于您不确定他们是否了解/ usr / local所以您开始检查/ usr的修改...

我发誓永远不会再使用NOPASSWD,并且还将超时设置更改为0。


1

在不严格回答您的问题的同时,另一种选择可能是设置更长的时间 timestamp_timeout这样您就不需要如此频繁地输入密码。这样可以防止任何人获得管理员特权,但可以减少您的烦恼。

sudoers手册页中

timestamp_timeout

sudo可能经过的分钟数将再次要求输入密码。如果微小粒度不足,则超时可能包括小数部分,例如2.5。默认值为5。将其设置为0总是提示输入密码。如果设置为小于0的值,则用户的时间戳将永不过期。这可用于允许用户分别通过“ sudo -v”和“ sudo -k”创建或删除自己的时间戳。

本博客文章给出了一些示例使用visudo设置在分钟,如超时:

Defaults timestamp_timeout=60

也许这是安全性和易用性之间的一个愉快的中间立场?


感谢您的输入!我最初的问题是关于根本不必使用(记住)密码,因为您可以使用密钥将密码SSH到计算机中,而不是关于我需要输入密码的频率。其他人则清楚地表明这是一个坏主意。
Dmitry Pashkevich 2014年

1

这里的其他答案很好,涉及大多数要点。我未曾提及的一件事是,您已经登录您帐户的远程攻击者可以捕获您登录时进行的任何身份验证。他们可以修改您的Shell登录文件或PATH以安装键盘记录程序,以便您键入的所有内容(包括sudo密码)都发送给他们。他们可以将hacked sudo二进制文件添加到您的PATH中以收集您的密码。他们可以将ssh代理连接劫持回您的连接计算机,以击败pam_ssh_agent_auth并在您连接后立即成为root用户。因此,就绝对安全性而言,我认为使用sudo密码与不使用sudo密码之间没有区别。当然,它确实使攻击更加复杂j,

总而言之,我相信,如果您具有sudo访问权限,则绝对防止受到感染的用户帐户成为root用户的唯一方法是从您自己中删除sudo访问权限,或者从不使用它。如果您不同意,请告诉我,我想错了!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.