我喜欢通过密钥访问服务器的想法,所以我不必每次input密码时都input密码,甚至locking我的用户(而不是root
)密码( passwd -l username
),所以不可能无需密钥login。
但是,如果我需要为sudo
命令input密码,所有这一切都会中断。 所以我很想设置无密码的sudo
,使其符合无密码login。
然而,我仍然有一种直觉,认为这可能会以某种意想不到的方式对我产生反感,似乎有点不安全。 有没有这样的设置警告? 你会build议/不build议这样做的服务器上的用户帐户?
澄清
sudo
,而不是服务或pipe理脚本 sudo
有一个超时期间,我不必重新input我的密码。 但是我的演唱会并不是浪费额外的时间来input密码。 我的想法虽然是不必处理密码,因为我认为:
sudo
时候获取它。 我希望我能避免这一点。 所以在这个问题上,我想更好地理解一个可能的configuration的风险,警告和折衷。
跟进1
所有答案都说,无密码sudo
是不安全的,因为如果我的个人用户帐户被攻陷,它允许“简单”升级权限。 我明白那个。 但另一方面,如果我使用密码,我们会带着密码(太短或常见string,在不同服务中重复)等所有经典风险。 但是我猜如果我在/etc/ssh/sshd_config
禁用密码authentication,这样你仍然必须有一个密钥login,我可以使用一个简单的密码只是为了更容易inputsudo
? 这是一个有效的策略?
跟进2
如果我也有一个通过SSH以root
login的密钥,如果有人能够访问我的计算机并窃取我的密钥(他们仍然受到操作系统密钥环密码的保护!),他们也可以直接访问root
帐户,绕过sudo
path。 那么访问root
帐户的政策应该是什么呢?
我喜欢通过密钥访问服务器的想法,所以我不必每次input密码时都input密码,甚至locking我的用户(而不是root)密码(passwd -l username),所以不可能没有密钥login…你会推荐/不build议这样做的服务器上的用户帐户?
您将要以错误的方式禁用基于密码的login。 而不是locking用户的帐户,请在/etc/ssh/sshd_config
设置PasswordAuthentication no
。
使用该设置,密码authentication被禁用的SSH,但你仍然可以使用密码为sudo。
我build议在sudo中设置NOPASSWD
的唯一时间是服务帐户,其中进程需要能够以编程方式通过sudo运行命令。 在这些情况下,请确保您只明确白名单帐户需要运行的特定命令。 对于交互式帐户,您应始终保持启用密码。
回应您的后续问题:
但是我猜如果我在/ etc / ssh / sshd_config中禁用密码authentication,这样你仍然必须有一个密钥login,我可以使用一个简单的密码只是为了更容易inputsudo? 这是一个有效的策略?
是的,这是正确的。 我仍然build议使用相对较强的本地帐户密码,但不是很可笑。 〜8个字符,随机生成就足够了。
如果我也有一个通过SSH以rootlogin的密钥,如果有人能够访问我的计算机并窃取我的密钥(他们仍然受到操作系统密钥环密码的保护!),他们也可以直接访问root帐户,绕过sudopath。
根访问通过SSH应该被禁用。 期。 在sshd_config
设置PermitRootLogin no
。
那么访问root帐户的政策应该是什么呢?
你应该总是有办法获得你的服务器的控制台的带外访问。 几家VPS供应商确实提供这一点,就像专用硬件供应商一样。 如果您的提供者没有授予真正的控制台访问权限(比如说EC2),那么您通常仍然可以使用像我在这个答案中概述的过程来恢复访问。
我通常限制使用NOPASSWORD
到由自动化进程运行的命令。 最好有这些命令的服务帐户,并限制使用sudo到所需的命令。
为一般命令允许NOPASSWORD
,允许任何访问你的用户名的人运行任何命令。 这可能是因为你的证书有所妥协,但是当你离开一秒钟的时候,可能就像坐在你办公桌旁的人一样简单。
我发现我不需要经常input密码。 一旦你input你的密码,你可以运行几个命令,如果你不要在它们之间等待太久。 超时是可configuration的。
我只会在两种情况下使用它:
默认情况下,大多数sudo
configuration在同一个会话中不会再问你一段时间(如果你打开一个没有任何效果的新shell)。 您可以使用timestamp_timeout
设置在一定程度上控制此行为。
无密码的sudo
并不像密码短的ssh
密钥那么危险,因为远程攻击者首先需要你的证书才能进入,但是如果他们以某种方式破坏了你的私钥(或者如果它们是物理本地的给你,而你已经离开机器而自己login和解锁),那么密码请求是他们和特权访问之间宝贵的额外防御。
关于后续2:
如果我也有一个通过SSHlogin的密钥
这也是最好的避免,因为你描述的原因。 如果一个远程连接必须有特权才能通过一个服务帐户login,并给予足够的控制,通过sudo来完成它的工作。 当然,这样configuration更加容易,所以很多人不用担心(如果你这么做的话,这对你是有好处的,因为你的攻击者会花费更多的时间在上面)。在安全性和便利性之间进行旧的妥协(专业提示:select安全!)。
您可以拥有两全其美:login和sudo的SSH身份validation。 如果您集成了pam_ssh_agent_auth模块,则可以在sudo时使用SSH密钥进行身份validation,而无需input密码。
我已经在生产中使用了五年多了。
要configuration它,请安装PAM模块,然后将一行添加到/etc/pam.d/sudo
或您的系统的等效项:
auth sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys
如果你这样做,一定要用密码保护你的计算机上的密钥。 这样,有人就不得不闯入你的电脑,窃取钥匙进入。他们可以通过从内存中解锁他们,如果他们有权访问你的帐户,破解你的密码,或通过窃取你的密码短语键盘logging器或肩膀冲浪,而你键入(看你后面!)。
您可以使用与login时相同的SSH密钥,也可以设置一个单独的密钥,只有在sudo时才能添加到代理中。 所以,如果你想要特别小心,你可以维护一个单独的authorized_keys文件,它有一个单独的SSH密钥,当你需要sudo的时候你只能添加到你的代理中:
auth sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys_sudo
既然你问了,这里是关于如何解决sudo
问题的一般build议。
Sudo的目的不是为了提供更多的安全性(尽pipe它可以在某些方面)…而是提供一个很好的审计跟踪,谁在你的系统上做什么以及什么特权。
正确设置的Sudo将不会使用ALL=(ALL) ALL
设置,而是更多地限制用户所需的任何特定设置。 例如,如果您需要用户能够login并重新启动服务,则可能不需要安装新软件或closures服务器,更改防火墙规则等function。
人们通常会使用sudo来提升自己的根帐户,也就是说, sudo su -
。 一旦他们这样做,你就不再看到谁在做什么从根帐户(root可以同时login多次)。 所以有时候人们也想禁用sudo su -
命令。 但是,由于实际的原因,如果你确实需要一个完全root权限的pipe理帐户,至less在有人问题的时候, sudo su -
命令会logging谁升级到root以及何时升级。
我如何保护我的箱子:
将SSH端口更改为默认值以外的值。 这是为了避免寻找端口号的笨蛋,然后直到他们进入(或不)。
不允许使用sshd_config中的AllowRootLogin no
设置通过SSH进行rootlogin。 这可以防止某人暴力强制进入您的root帐户。 一般来说,不要让任何人出于审计和安全考虑直接login到根/pipe理员账户。 如果你允许直接rootlogin,你不知道谁login了,谁是谁的密码,等等。但是,如果有人login到Jimmy的帐户,然后提升他们的权限为根,你有一个更好的主意从哪里开始审计search(以及谁的帐户重置)。
仅允许用户使用需要SSH的用户使用AllowUsers
设置并明确指定哪些帐户需要SSH访问权限。 默认情况下,这将阻止来自SSH的所有其他帐户。
编辑Sudoers通过visudo,只允许用户需要的命令。 有很多深入的指导如何做到这一点,所以我不会在这里详细说明。 这里有一个启动器: http : //ubuntuforums.org/showthread.php?t=1132821
这个要点是为了防止一个受到危害的帐户危害你的机器。 即。 如果Sally的帐户被攻破,Sally只能使用sudo来重新启动Web服务器,那么攻击者可能会乐意在一个循环中重新启动Web服务器,但至less他们不能使用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个字符的东西,提供了大量的熵,但比一些随机密码更容易记忆。 当然,好的密码实践会说使用机器生成的随机密码来欺骗像John the Ripper这样的破解工具,它将通过大多数密码和密码来破解。 不,用3改E并不行,约翰也得到这些排列。
在某些情况下,有必要这样做。 例如,某些虚拟机pipe理程序API需要无密码login和无密码sudo
。 但是,你仍然可以限制,而不是打破。
为了你想要达到的目标。 我会说,习惯于input密码。 这里的安全更方便。 另外,如果你真的需要root权限,你可以使用sudo
,它会caching一些凭据,所以如果你连续运行几个sudo命令,它只会第一次提示input密码。 所以这不是你想象的那么大的不便。
另外,如果你input了很多根特权命令,并且不想把sudo放在它们的前面,你可以使用su
或者sudo -s
来获得root shell。 你会input你的密码一次,然后就是这样。
我被一次无密码的sudo咬了 这是一个shell脚本,一些安装程序,它代表我的名字 ,而不是,只是要求sudo或错误。
成像input'make'和脚本为你做'sudo make install'部分,不需要设置或显示基本path,而且脚本如此braindead首先,你不知道他们知道/ usr / local所以你开始检查/ usr修改…
我发誓永远不要再次使用NOPASSWD,并将超时设置更改为0。
虽然不是严格回答你的问题,但另一个select可能是设置一个更长的timestamp_timeout
所以你不需要经常input你的密码。 这将防止任何人获得pipe理员权限,但减less你的烦恼。
从sudoers手册页 :
timestamp_timeout
在sudo之前可以经过的分钟数将再次要求passwd。 如果微小粒度不足,超时可能包括小数分量,例如2.5。 默认值是5.设置为0总是提示input密码。 如果设置为小于0的值,则用户的时间戳将永不过期。 这可以让用户分别通过“sudo -v”和“sudo -k”创build或删除自己的时间戳。
这个博客文章展示了一些使用visudo
设置超时的例子 ,例如:
Defaults timestamp_timeout=60
也许这是一个安全和易用性之间的快乐中间地带?