新买 Ubuntu 服务器,别让 root 裸奔
> 最近在折腾一台 Ubuntu 轻量服务器的时候,我踩到一个很典型、但又非常容易被忽略的安全细节:
> 我们一开始只给默认的 ubuntu 用户设置了密码,却完全没管 root 用户的密码和 SSH 登录权限。
这篇文章就把这个过程梳理一遍:
- 默认情况下,
ubuntu、root分别是什么状态? - 为什么要给
root设置密码? - 设置完密码之后,为什么反而要立刻收紧 SSH 权限?
- 一整套完整可复制的命令清单。
一、买了 Ubuntu 服务器之后,系统默认长什么样?
以常见的云厂商(腾讯云、阿里云、AWS、GCP 等)的 Ubuntu 镜像为例:
- 系统会让你设置或下发一个普通用户,比如叫
ubuntu - 这个用户可以通过密码或密钥 SSH 登录服务器
- 这个用户通常在
sudo组里,可以通过sudo提升为 root 权限 root账户默认不能直接 SSH 登录(通常是被禁止密码登录,或者完全禁用)
但有一个细节很容易被忽略:
`root` 的密码本身可能是空的 —— 在 /etc/shadow 里可以看到这一点。
你可以用下面的命令看一眼 root 的密码状态:
sudo grep root /etc/shadow你可能会看到类似输出:
root::20350:0:99999:7:::注意第二个字段是空的(两个冒号 :: 紧挨着),表示:
root没有设置密码(空密码)- 但是否能登录,还要看 SSH 的配置
这时候,一般情况是:
- 通过 SSH:不能用
root登录(被sshd配置挡住) - 在机器内部:可以通过
sudo su -切到root,而不需要root的密码
二、那既然这么安全,为什么还要给 root 设置密码?
很多人会问:
> “反正我都是用 ubuntu + sudo,为什么还要给 root 单独设密码?”
给 root 设置密码,主要有几个原因:
- 操作系统完整性
有些运维脚本、工具可能需要直接切换或校验 root 密码(例如某些自动化运维、堡垒机接入等场景)。
- 本地或单用户维护场景
比如有一天 SSH 服务坏了、sudo 配置乱了,你只能通过控制台直接登录系统,root 密码这时可以救命。
- 安全可控,而不是“默认模糊状态”
空密码 + 未明确控制 SSH 登录,是一种“不清不楚”的状态。
设定一个强密码 + 明确禁止远程 root 登录,比 “空密码 + 不清楚行为” 要安全得多。
所以:
我们要做的不是“让 root 能登录”,而是
“先给 `root` 设一个合理密码,然后再明确禁止 `root` 通过 SSH 登录”。
三、真正的风险:给 root 设了密码,却忘了关掉 root SSH 登录
假设你做了这一步:
sudo passwd root给 root 设置了一个密码。
如果此时你的 SSH 配置是这样的:
PermitRootLogin yes那么风险就来了:
- 任何人都可以在公网对你的服务器执行
ssh root@你的IP - 拼命尝试各种密码(字典攻击、暴力破解)
- 一旦撞对一次,整个服务器就直接沦陷
很多云服务器被攻陷,正是因为:
`root` + SSH + 密码登录 被开放在公网。
四、安全姿势:root 有密码,但禁止通过 SSH 登录
正确的做法是:
- 给
root设置密码(为了系统完整性和某些本地运维场景) - 明确禁止
root通过 SSH 登录 - 平时只用普通用户(比如
ubuntu),需要高权限就用sudo或sudo su -
先来看下 SSH 配置文件:
sudo nano /etc/ssh/sshd_config常见几种配置方式:
1. 最严格(推荐):完全禁止 root SSH 登录
PermitRootLogin no含义:
root用户不能通过 SSH 登录(无论密码还是密钥)- 你只能用普通用户(如
ubuntu)登录后,通过sudo提权
2. 稍微宽松:禁止密码,但允许 root 用密钥登录
PermitRootLogin prohibit-password含义:
root不能用密码登录- 只能通过 SSH 公钥登录(例如你专门做了
root的密钥登录)
一般个人服务器/小项目,其实完全不需要 root 直接 SSH 登录,因此推荐直接用:
PermitRootLogin no
五、完整可复制操作步骤(从“买服务器”到“锁好 SSH”)
下面这段你可以直接当作操作手册保存。
1. 用默认用户登录服务器(比如 ubuntu)
本地终端执行:
ssh ubuntu@你的服务器IP输入密码或使用密钥登录。
2. 检查 root 当前是否有密码
sudo grep root /etc/shadowroot::...→ 没有密码root:$6$xxxx...→ 已经设了密码
3. 设置 / 修改 root 密码
sudo passwd root按照提示输入两次新密码。
4. 修改 SSH 配置,禁止 root 登陆
编辑 SSH 配置:
sudo nano /etc/ssh/sshd_config找到类似的行(如果没有就加一行):
PermitRootLogin yes改成:
PermitRootLogin no然后保存退出(nano:Ctrl + O 回车,Ctrl + X 退出)。
注意: 在 Ubuntu 云环境中,有时 /etc/ssh/sshd_config.d/ 目录下也会有额外配置文件,你可以用下面命令检查是否被覆盖:
grep -R PermitRootLogin /etc/ssh/sshd_config*如果某个 *.conf 里写了 PermitRootLogin yes,也要一并改掉。
5. 重启 SSH 服务让配置生效
sudo systemctl restart sshd检查状态:
sudo systemctl status sshd看到:
active (running)
说明已生效。
6. 本地测试 root 是否被禁止 SSH 登录
在你自己的电脑上执行:
ssh root@你的服务器IP如果配置正确,会看到类似:
root@IP: Permission denied (publickey,password).
说明 root 通过 SSH 已经被挡在门外。
此时你正常登录的方式,应该是:
ssh ubuntu@你的服务器IP
# 登录成功后再需要高权限就:
sudo 命令...
# 或
sudo su -六、再回顾一下:我们到底做了什么、为什么要这么做?
整个过程可以用三句话总结清楚:
- 默认买来的 Ubuntu 服务器:
- 只让你设置
ubuntu之类的普通用户 root虽然存在,但可能没有密码- SSH 一般默认不允许
root直接登录 - 我们主动做了两件事:
- 给
root设置密码(系统更完整、维护更可控) - 检查并修改 SSH 配置,保证
root即使有密码也不能 SSH 登录 - 最终目标:
- 日常:用普通用户(如
ubuntu)+sudo完成所有管理操作 - 安全:对外完全不暴露
root的 SSH 登录入口,降低暴力破解风险