瑾浩

文章

新买 Ubuntu 服务器,别让 root 裸奔

瑾浩2024-09-21· 约 6 分钟
独立页面

> 最近在折腾一台 Ubuntu 轻量服务器的时候,我踩到一个很典型、但又非常容易被忽略的安全细节:

> 我们一开始只给默认的 ubuntu 用户设置了密码,却完全没管 root 用户的密码和 SSH 登录权限。

这篇文章就把这个过程梳理一遍:

  • 默认情况下,ubunturoot 分别是什么状态?
  • 为什么要给 root 设置密码?
  • 设置完密码之后,为什么反而要立刻收紧 SSH 权限?
  • 一整套完整可复制的命令清单。

一、买了 Ubuntu 服务器之后,系统默认长什么样?

以常见的云厂商(腾讯云、阿里云、AWS、GCP 等)的 Ubuntu 镜像为例:

  • 系统会让你设置或下发一个普通用户,比如叫 ubuntu
  • 这个用户可以通过密码或密钥 SSH 登录服务器
  • 这个用户通常在 sudo 组里,可以通过 sudo 提升为 root 权限
  • root 账户默认不能直接 SSH 登录(通常是被禁止密码登录,或者完全禁用)

但有一个细节很容易被忽略:

`root` 的密码本身可能是空的 —— 在 /etc/shadow 里可以看到这一点。

你可以用下面的命令看一眼 root 的密码状态:

bash
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 登录

假设你做了这一步:

bash
sudo passwd root

root 设置了一个密码。

如果此时你的 SSH 配置是这样的:

PermitRootLogin yes

那么风险就来了:

  • 任何人都可以在公网对你的服务器执行 ssh root@你的IP
  • 拼命尝试各种密码(字典攻击、暴力破解)
  • 一旦撞对一次,整个服务器就直接沦陷

很多云服务器被攻陷,正是因为:

`root` + SSH + 密码登录 被开放在公网。


四、安全姿势:root 有密码,但禁止通过 SSH 登录

正确的做法是:

  • root 设置密码(为了系统完整性和某些本地运维场景)
  • 明确禁止 root 通过 SSH 登录
  • 平时只用普通用户(比如 ubuntu),需要高权限就用 sudosudo su -

先来看下 SSH 配置文件:

bash
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

本地终端执行:

bash
ssh ubuntu@你的服务器IP

输入密码或使用密钥登录。


2. 检查 root 当前是否有密码

bash
sudo grep root /etc/shadow
  • root::... → 没有密码
  • root:$6$xxxx... → 已经设了密码

3. 设置 / 修改 root 密码

bash
sudo passwd root

按照提示输入两次新密码。


4. 修改 SSH 配置,禁止 root 登陆

编辑 SSH 配置:

bash
sudo nano /etc/ssh/sshd_config

找到类似的行(如果没有就加一行):

PermitRootLogin yes

改成:

PermitRootLogin no

然后保存退出(nano:Ctrl + O 回车,Ctrl + X 退出)。

注意: 在 Ubuntu 云环境中,有时 /etc/ssh/sshd_config.d/ 目录下也会有额外配置文件,你可以用下面命令检查是否被覆盖:

bash
grep -R PermitRootLogin /etc/ssh/sshd_config*

如果某个 *.conf 里写了 PermitRootLogin yes,也要一并改掉。


5. 重启 SSH 服务让配置生效

bash
sudo systemctl restart sshd

检查状态:

bash
sudo systemctl status sshd

看到:

active (running)

说明已生效。


6. 本地测试 root 是否被禁止 SSH 登录

在你自己的电脑上执行:

bash
ssh root@你的服务器IP

如果配置正确,会看到类似:

root@IP: Permission denied (publickey,password).

说明 root 通过 SSH 已经被挡在门外。

此时你正常登录的方式,应该是:

bash
ssh ubuntu@你的服务器IP
# 登录成功后再需要高权限就:
sudo 命令...
# 或
sudo su -

六、再回顾一下:我们到底做了什么、为什么要这么做?

整个过程可以用三句话总结清楚:

  • 默认买来的 Ubuntu 服务器:
  • 只让你设置 ubuntu 之类的普通用户
  • root 虽然存在,但可能没有密码
  • SSH 一般默认不允许 root 直接登录
  • 我们主动做了两件事:
  • root 设置密码(系统更完整、维护更可控)
  • 检查并修改 SSH 配置,保证 root 即使有密码也不能 SSH 登录
  • 最终目标:
  • 日常:用普通用户(如 ubuntu)+ sudo 完成所有管理操作
  • 安全:对外完全不暴露 root 的 SSH 登录入口,降低暴力破解风险
新文章

相关文章

留言