很多人在刚拿到一台Ubuntu云服务器时,习惯直接用root账号和密码通过SSH登录。这确实方便,但也是极其危险的操作。在公网上,针对22端口的暴力破解几乎从服务器上线第一分钟就开始了。攻击者会不断尝试root这个超高权限账户的密码组合,一旦猜中,整个系统就完全沦陷。所以,禁用root的SSH登录并不是一个可选项,而是服务器安全加固的第一步。同时,我们还需要建立一个管理机制,让特定用户能安全地获取临时root权限,这就是创建管理员组并配置sudo的意义。
理解风险:为什么root登录是众矢之的root账户是Linux系统中权限最高的用户,可以对系统文件进行任意修改、删除,甚至直接破坏系统引导。最关键的是,这个账户名在每一台Linux系统上都是公开且固定的。攻击者不需要猜测用户名,只需要暴力破解密码。一旦root密码泄露或被破解,攻击者就能植入后门、窃取数据、加密文件进行勒索,或者把服务器变成僵尸网络的一部分。而通过SSH密钥登录或使用普通用户搭配sudo提权,可以极大提高攻击门槛,因为攻击者需要同时猜中用户名、密码,或者获取你的私钥文件。
前期准备:确保你有一个可用的管理员账户在禁用root的SSH登录之前,你必须先创建一个新的普通用户,并赋予它sudo权限。否则,一旦断开当前root会话,你将永远无法再以高权限管理这台服务器。这个操作顺序至关重要,很多人因为跳过这一步而被迫重装系统。
首先,以root身份登录到你的Ubuntu服务器。执行以下命令创建一个新用户,将“your_username”替换为你想要的用户名:
adduser your_username
系统会提示你设置密码,并填写一些可选的用户信息。密码一定要足够复杂,建议使用大小写字母、数字和特殊符号的组合,长度至少12位。接着,我们需要把这个新用户加入到sudo组中。在Ubuntu系统中,sudo组的成员默认拥有通过sudo命令获取root权限的能力:
usermod -aG sudo your_username
这条命令的含义是,将用户“your_username”追加到“sudo”这个附加组中。参数“-aG”确保了追加操作,不会覆盖用户原有的组归属。操作完成后,你可以通过以下命令验证用户是否已正确加入sudo组:
groups your_username
在输出结果中,你应该能看到“sudo”字样。现在,新开一个终端窗口,尝试用这个新用户通过SSH登录服务器,并执行一个需要root权限的命令来测试sudo是否生效:
sudo whoami
如果系统返回“root”,说明你的管理员账户配置成功。这一步验证至关重要,千万不要跳过。
创建管理员组:实现更精细的权限控制虽然直接把用户加入sudo组已经能满足基本需求,但在多用户或多服务器的生产环境中,直接使用系统预设的sudo组会带来管理上的混乱。更专业的做法是创建一个自定义的管理员组,比如“admin”或“ops”,然后对这个组进行统一的sudo规则配置。这样做的好处是,当需要批量调整管理员权限时,你只需要修改这个组的sudo规则,或者调整组成员,而不需要逐个用户去修改。
创建管理员组的命令如下,这里以“admin”作为组名:
groupadd admin
接下来,把你的用户加入这个新建的admin组:
usermod -aG admin your_username
此时,这个admin组还没有任何特殊权限。我们需要通过visudo命令来配置sudo规则,让admin组的成员可以执行任何命令。visudo命令会打开一个编辑器来安全地修改/etc/sudoers文件,它会在保存时检查语法错误,防止因配置错误导致整个sudo系统瘫痪。
执行visudo命令:
visudo
在打开的文件中,找到类似“%sudo ALL=(ALL:ALL) ALL”这一行。在这一行下面,添加一条针对admin组的规则:
%admin ALL=(ALL:ALL) ALL
这行配置的含义是,允许admin组中的任何成员,在任何主机上,以任何目标用户的身份,执行任何命令。如果你希望管理员在执行sudo命令时不需要输入密码,可以这样写:
%admin ALL=(ALL:ALL) NOPASSWD:ALL
不过,从安全角度出发,建议保留密码验证,除非是在自动化脚本中。保存并退出编辑器后,admin组的管理员权限就生效了。你可以注销当前会话,重新登录后测试一下。
禁用root的SSH登录:修改核心配置文件现在,最关键的一步来了。我们需要修改SSH服务的配置文件,来彻底关闭root用户的远程登录能力。这个配置文件位于/etc/ssh/sshd_config。注意,是sshd_config,后面多了一个“d”,代表这是SSH守护进程的配置,不要和客户端的ssh_config搞混了。
使用你刚刚创建的管理员账户通过SSH登录,然后用sudo权限编辑这个文件:
sudo nano /etc/ssh/sshd_config
在文件中,找到这一行配置:
#PermitRootLogin prohibit-password
或者它可能是:
PermitRootLogin yes
Ubuntu较新版本默认通常是“prohibit-password”,意思是禁止root使用密码登录,但允许使用密钥登录。为了达到最高安全级别,我们应该将其设置为“no”,彻底禁止root通过SSH登录。修改或添加以下这行:
PermitRootLogin no
这一修改意味着,无论你使用密码还是SSH密钥,都无法再以root身份直接登录SSH。这是最硬核的防护方式。除了这一项,建议你同时检查并加固以下几个相关配置,以进一步提升SSH安全性:
将默认的22端口修改为一个高位端口,可以有效减少大量自动化扫描的噪音。找到“#Port 22”这一行,去掉注释并修改端口号,比如2222:
Port 2222
禁止使用空密码登录,确保“PermitEmptyPasswords”设置为“no”:
PermitEmptyPasswords no
关闭密码认证,强制使用SSH密钥登录,这是防御暴力破解的终极手段。前提是你已经为你的管理员账户配置好了公钥认证。找到“PasswordAuthentication”并设置为“no”:
PasswordAuthentication no
修改完成后,保存文件并退出编辑器。为了让配置生效,需要重启SSH服务:
sudo systemctl restart sshd
非常重要的一点:千万不要关闭当前的SSH连接窗口。重新开启一个新的终端窗口,尝试用root账户登录,应该会收到“Permission denied”的提示。同时,用你的管理员账户测试登录,并确保sudo命令依然正常工作。只有在新窗口测试完全通过后,你才可以安全地关闭旧的会话。如果测试失败,你还能通过旧会话回滚配置。
进阶安全策略:配置SSH密钥认证如果你决定将“PasswordAuthentication”设置为“no”,那么必须事先配置好SSH密钥对。密钥认证的安全性远高于密码,它基于非对称加密算法,几乎不可能被暴力破解。配置过程并不复杂。
在你的本地电脑(客户端)上生成密钥对。如果你使用的是Windows、macOS或Linux桌面版,都可以在终端中执行:
ssh-keygen -t ed25519 -C "your_email@example.com"
这里推荐使用Ed25519算法,它比传统的RSA算法更安全、密钥更短、性能更好。命令会提示你设置密钥的保存路径和口令,口令可以为空,但为了安全建议设置一个。生成后,你会得到两个文件:私钥(如id_ed25519)和公钥(如id_ed25519.pub)。私钥必须妥善保管在本地,绝对不能泄露。
接下来,把公钥复制到你的Ubuntu服务器上。最简单的方法是使用ssh-copy-id命令:
ssh-copy-id -i ~/.ssh/id_ed25519.pub your_username@your_server_ip
这条命令会自动将你的公钥内容追加到服务器上对应用户家目录下的~/.ssh/authorized_keys文件中,并设置正确的权限。手动操作的话,需要确保.ssh目录权限为700,authorized_keys文件权限为600,否则SSH服务会因安全原因拒绝读取。
配置完成后,再次尝试SSH登录,如果不需要输入用户密码而直接进入系统(或者只要求输入私钥的口令),说明密钥认证成功。此时再关闭密码认证,就是万无一失的了。
审计与监控:让安全防护形成闭环安全配置做完之后,不代表可以高枕无忧。持续的监控和审计是安全体系中不可或缺的一环。对于SSH登录活动,你可以通过查看系统日志来发现异常。
所有SSH登录尝试都会被记录在/var/log/auth.log文件中。你可以使用grep命令来过滤出与sshd相关的记录,例如查看失败的登录尝试:
sudo grep "Failed password" /var/log/auth.log
如果失败尝试异常地多,并且来自同一个IP地址,那很可能是一次暴力破解攻击。你可以使用fail2ban这样的工具来自动化防御。fail2ban会监控日志文件,当发现某个IP在短时间内多次登录失败,就会自动在防火墙规则中封禁该IP一段时间。
安装fail2ban非常简单:
sudo apt update sudo apt install fail2ban -y
安装完成后,fail2ban会默认启用并开始保护SSH服务。你可以通过以下命令查看其状态和被封禁的IP列表:
sudo fail2ban-client status sshd
此外,定期检查/etc/sudoers文件和admin组的成员列表,确保没有未经授权的用户获得管理员权限,也是一个良好的安全习惯。权限的授予应遵循最小权限原则,只在必要时才赋予,并在任务完成后及时回收。
总结与操作清单整个安全加固过程环环相扣,每一步都建立在下一步的基础之上。为了便于你执行和检查,这里整理了一份简洁的操作清单:先用adduser创建个人账户,用usermod -aG sudo赋予基础sudo权限;接着用groupadd创建自定义管理员组,用usermod -aG admin将用户加入该组,并通过visudo为%admin组配置完整的sudo规则;然后,在确保新用户一切正常后,编辑/etc/ssh/sshd_config,将PermitRootLogin设置为no,并视情况修改默认端口、关闭密码认证;重启SSH服务前,务必保留旧连接,用新窗口测试root被拒和管理员sudo正常;最后,配置SSH密钥登录,并部署fail2ban实现自动化防御。按照这个清单操作,你的Ubuntu服务器的SSH入口安全性将得到质的提升,从一台容易被攻破的裸机,变成一台具备基本防护能力的堡垒。
