我喜欢通过密钥访问服务器的想法,这样我就不必每次ssh
进入框时都输入密码,我甚至锁定了我的用户(不是root
)密码(passwd -l username
),这样不可能的无需密钥即可登录。
但如果命令要求我输入密码,那么这一切都会失效sudo
。所以我想设置无密码sudo
使一切符合无密码登录的要求。
但是,我总有一种直觉,它可能会以意想不到的方式对我产生不利影响,它似乎有点不安全。这种设置有什么注意事项吗?您是否建议/不建议对服务器上的用户帐户执行此操作?
澄清
sudo
我在这里谈论的是交互式用户会话中的使用,而不是服务或管理脚本的使用- 我说的是使用云服务器(所以我无法在本地物理访问机器,只能远程登录)
- 我知道
sudo
有超时时间,在此期间我不必重新输入密码。但我的音乐会并不是要浪费额外的时间亲自输入密码。我的想法是根本不需要处理密码,因为我认为:- 如果我必须记住它,它很可能太短,不安全或重复使用
- 如果我为我的远程帐户生成一个长而唯一的密码,我将不得不将其存储在某个地方(本地密码管理器程序或云服务),并在每次要使用时获取它
sudo
。我希望我可以避免这种情况。
因此,通过这个问题,我想更好地了解一种可能的配置相对于其他配置的风险、注意事项和权衡。
跟进1
所有答案都说无密码sudo
是不安全的,因为如果我的个人用户帐户被盗用,它允许“轻松”升级权限。我明白这一点。但另一方面,如果我使用密码,我们会面临所有经典的密码风险(太短或太常见的字符串、在不同服务中重复等)。但我想,如果我禁用密码验证,这样/etc/ssh/sshd_config
您仍然需要密钥才能登录,我可以使用更简单的密码,只是为了sudo
更容易输入?这是一个有效的策略吗?
跟进2
如果我也有一个通过 ssh 登录的密钥root
,如果有人访问了我的计算机并窃取了我的密钥(尽管它们仍然受到操作系统的密钥环密码的保护!),他们可能会root
绕过sudo
路径直接访问该帐户。那么访问帐户的策略应该是什么root
?
答案1
我喜欢通过密钥访问服务器的想法,这样我就不必在每次 ssh 进入一个框时输入我的密码,我甚至锁定了我的用户(不是 root)的密码(passwd -l 用户名)所以没有密钥就不可能登录...你会推荐/不推荐对服务器上的用户帐户执行此操作吗?
您禁用基于密码的登录的方式是错误的。不要锁定用户帐户,而是PasswordAuthentication no
在您的 中设置/etc/ssh/sshd_config
。
设置完成后,ssh 的密码验证将被禁用,但您仍然可以对 sudo 使用密码。
这仅有的我建议NOPASSWD
在 sudo 中设置的时间是针对服务帐户,其中进程需要能够以编程方式通过 sudo 运行命令。在这种情况下,请确保您明确将以下帐户列入白名单:具体的该帐户需要运行的命令。对于交互式帐户,您应该总是保持密码启用。
对您的后续问题的答复:
但是我猜如果我在 /etc/ssh/sshd_config 中禁用密码验证,这样您仍然需要密钥才能登录,我可以使用更简单的密码来输入 sudo 吗?这是一个有效的策略吗?
是的,没错。我仍然建议使用相对较强的本地帐户密码,但不要太强。~8 个字符,随机生成就足够了。
如果我也有一个通过 ssh 以 root 身份登录的密钥,那么如果有人访问我的计算机并窃取我的密钥(但它们仍然受到 OS 的密钥环密码保护!),他们也可能直接访问 root 帐户,绕过 sudo 路径。
应禁用通过 ssh 进行的 root 访问。句号。PermitRootLogin no
在您的 中设置sshd_config
。
那么访问 root 帐户的策略应该是什么?
您应该始终有一种方法来获取服务器控制台的带外访问权限。一些 VPS 供应商确实提供此功能,专用硬件供应商也是如此。如果您的提供商不授予真正的控制台访问权限(例如 EC2),您通常仍可以使用我在这个答案。
答案2
我通常会将 sudo 的使用限制NOPASSWORD
在由自动化进程运行的命令上。最好为这些命令设置一个服务帐户,并将 sudo 的使用限制在所需的命令上。
允许NOPASSWORD
执行一般命令,允许任何有权访问您的用户 ID 的人运行任何命令。这可能是由于您的凭据被盗用所致,但也可能很简单,例如当您离开一秒钟时有人坐在您的办公桌前。
我发现我不需要经常输入密码。输入密码后,如果间隔时间不长,您可以运行多个命令。超时时间是可配置的。
答案3
您可以同时拥有两种优势:登录和 sudo 均使用 SSH 身份验证。如果您集成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
答案4
既然您问了,以下是我关于如何解决该sudo
问题的一般建议。
Sudo 的设计目的并非提供更高的安全性(尽管在某些方面可以)......而是提供良好的审计跟踪,以跟踪谁在你的系统上使用什么权限做了什么。
正确设置的 Sudo 不会使用该ALL=(ALL) ALL
设置,而是使用一些更有限的功能,以满足用户的特定需求。例如,如果您需要用户能够登录并重新启动卡住的服务,他们可能不需要安装新软件或关闭服务器、更改防火墙规则等功能。
人们有时通常会使用 sudo 将自己提升到 root 帐户,即。sudo su -
一旦他们这样做,您就无法再看到谁在从 root 帐户执行什么操作(root 可以同时登录多次)。所以有时人们sudo su -
也想禁用该命令。但是,出于实际原因,如果您确实需要一个完全 root 特权的帐户进行管理,至少让某人发出该sudo su -
命令会记录谁在何时提升为 root。
我如何保护我的箱子:
将 SSH 端口更改为非默认端口。这是为了避免那些寻找端口号然后不断攻击直到进入(或无法进入)的愚蠢机器人。
AllowRootLogin no
使用sshd_config 中的设置禁止 Root 通过 SSH 登录。这可以防止有人强行进入您的 root 帐户。出于审计原因以及安全性考虑,通常最好不要允许某人直接登录 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 个字符长的内容,提供足够的熵,但也比一些随机密码更容易记住。当然,良好的密码习惯是使用机器生成的随机密码来欺骗破解工具,例如 John the Ripper,它可以直接破解大多数密码短语和密码。不,将 E 更改为 3 不起作用,John 也会得到那些排列。