Ubuntu 22.04 Server / 使用 root 本地登录和 SSH 连接的方法
在 Ubuntu 22.04 Server 中,以 root 权限工作的常规方式是先用普通账户登录,再运行 sudo -i。直接以 root 登录需要分别检查密码和登录策略;SSH 还必须满足 PermitRootLogin 与认证方式的设置。
区分 root 权限操作与直接登录
root 是管理整个系统的账户。Ubuntu 默认锁定 root 密码,让获准的普通用户通过自己的认证信息使用 sudo;这不代表 root 账户不存在。默认设计可查阅 Ubuntu 用户管理文档。
如果只需要管理用 shell,可使用以下命令。通常使用当前普通账户的密码,具体是否认证取决于 sudo 策略。确认 whoami 输出 root,完成后运行 exit 返回普通账户。此过程不会启用 root 密码,也不会修改 SSH 策略。
sudo -i
whoami
exit
只有需要在控制台使用 root 密码登录,或通过 su - 切换时,才单独设置密码。第一次 sudo 提示使用普通账户密码,随后两次输入设置新 root 密码。输入密码时屏幕不会显示字符。
sudo passwd root
su -
whoami
exit
su - 使用刚设置的 root 密码。设置密码不代表所有登录方式都会开放,PAM(Pluggable Authentication Modules,可插拔认证模块)及控制台、远程访问策略仍可能限制登录。sudo -i 的含义见 Ubuntu 22.04 sudo 手册。
修改 SSH 前检查访问路径和现有策略
以下步骤适用于你有管理权限的 Ubuntu 22.04 OpenSSH 服务器。保持现有普通账户 SSH 会话开启,并准备物理或云恢复控制台。生产环境优先考虑普通账户 SSH 登录后使用 sudo。确需 root 直接访问时,同时确定公钥认证方案及允许访问的管理网络范围。
若未安装 SSH 服务,先执行 sudo apt update,再执行 sudo apt install openssh-server。通过 sudo systemctl status ssh.service 检查服务。连接需要实际服务器地址和 SSH 端口,防火墙与云安全规则也必须允许相应管理路径。
变更前备份配置并查找相关项。如果备份名已存在,请改用其他名称,避免覆盖。如下例所示,备份应放在通过 *.conf 加载的目录之外。
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.before-root-login
sudo cp -a /etc/ssh/sshd_config.d /etc/ssh/sshd_config.d.before-root-login
sudo grep -RnsE '^[[:space:]]*(Include|Match|PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|AuthenticationMethods|AllowUsers|DenyUsers|AllowGroups|DenyGroups)' /etc/ssh/sshd_config /etc/ssh/sshd_config.d
服务器配置文件是 sshd_config,不同于客户端的 ssh_config。Ubuntu 22.04 通常先读取 /etc/ssh/sshd_config.d/*.conf。多数设置采用最先获得的值,因此追加到主文件末尾可能无法覆盖前面的设置。检查 Include 顺序、Match 条件及云平台生成的配置,再验证实际生效值。
根据 Ubuntu 22.04 sshd_config 手册,PermitRootLogin yes 允许满足其他认证条件的 root 登录;prohibit-password 禁止 root 的密码和键盘交互认证,但可能允许公钥;no 禁止 root SSH 登录。不要仅凭一行被注释的默认值判断服务器的实际策略。
配置 root 密码 SSH 登录
此方式会开放 root 密码认证,仅在确有需要的管理环境中选择。先用 sudo passwd root 设置密码,再通过 sudoedit /etc/ssh/sshd_config 或编辑相关配置片段,修改实际优先生效的设置。以下是策略示例,不是让你直接追加到文件末尾。
PermitRootLogin yes
PasswordAuthentication yes
只有 PermitRootLogin yes 并不够。密码认证本身必须开放,AuthenticationMethods、用户或组限制、PAM 和账户状态也必须允许。全局 PasswordAuthentication yes 可能影响其他用户,应检查是否扩大现有策略。不要为了照做而关闭防火墙或取消多因素认证。
保存文件不等于完成应用。执行下文的验证及重新加载步骤后,再从客户端测试。将示例地址 192.0.2.20 换成实际服务器地址;如果不是默认 22 端口,使用 ssh -p PORT 指定实际端口号。
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password root@192.0.2.20
此测试选择密码而非公钥认证。如果服务器要求额外认证,仅有密码仍无法连接。通过可信的服务器管理渠道核对主机密钥指纹,不要为绕过密钥变化警告而关闭校验。
使用公钥进行 root SSH 登录
公钥认证由客户端保管私钥,服务器只登记对应公钥。启用 root 密码登录并非必要前提。可以通过现有管理员会话或控制台登记公钥,无须为了安装密钥先开放 root 密码 SSH。
客户端没有合适密钥时,用 ssh-keygen -t ed25519 生成。选择新文件名,不要覆盖现有密钥,并为私钥设置口令。把公钥文件 ~/.ssh/id_ed25519.pub 中的一整行登记到服务器。不要把不带 .pub 后缀的私钥复制到服务器。
在服务器已有的管理会话中,按下例准备目录及文件权限,再用编辑器追加客户端公钥的一行内容。保留已有密钥,相同密钥无需重复添加。如果使用了其他文件名,选择其对应公钥。
sudo install -d -m 700 -o root -g root /root/.ssh
sudo touch /root/.ssh/authorized_keys
sudo chown root:root /root/.ssh/authorized_keys
sudo chmod 600 /root/.ssh/authorized_keys
sudoedit /root/.ssh/authorized_keys
该示例使用默认公钥路径。如果 AuthorizedKeysFile 指向其他位置,应检查实际路径。选择下面禁止 root 密码认证的策略,处理前面存在的冲突配置,再进行验证。
PermitRootLogin prohibit-password
PubkeyAuthentication yes
验证并应用服务器设置后,在客户端按下例连接。如果提示私钥口令,输入客户端密钥的口令,而不是 root 账户密码。公钥认证同样必须满足 PAM、账户和访问限制。
ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes root@192.0.2.20
验证配置并测试新会话
- 先在服务器检查语法和主机密钥状态。
-t成功结束时通常没有输出;出现错误应先修正对应文件与行,不要重新加载。-T输出实际配置,配合-C可评估指定连接的 Match 条件。
sudo /usr/sbin/sshd -t
sudo /usr/sbin/sshd -T -C user=root,addr=192.0.2.10,host=admin.example | grep -E '^(permitrootlogin|passwordauthentication|pubkeyauthentication|authenticationmethods|authorizedkeysfile|allowusers|denyusers|allowgroups|denygroups) '
将 192.0.2.10 换成服务器看到的实际管理客户端地址,将 admin.example 换成待评估的客户端主机名。若使用 Match LocalAddress 或 LocalPort,还应在 -C 中提供 laddr 和 lport。输出不符合预期时,先调查优先级和条件。选项含义见 Ubuntu 22.04 sshd 手册。
- 语法检查成功且实际值符合目标策略后,重新加载服务。保留已有管理会话,在另一个客户端窗口测试前文的密码或公钥连接。
sudo systemctl reload ssh.service
sudo systemctl is-active ssh.service
- 服务处于
active不代表新认证必然成功。在新的 root 会话中,确认whoami输出root、id -u输出0。也要新建普通账户连接并测试 sudo。用户、密钥、网络和账户条件仍可能拒绝访问。
连接排错与撤销 root 直接访问
Permission denied 应检查认证、账户及访问策略;超时或连接被拒绝,应分别检查地址、端口、服务及防火墙。服务器可用 sudo journalctl -u ssh.service -n 50 --no-pager 查看近期记录,客户端用 ssh -v root@192.0.2.20 查看认证过程。共享日志前遮盖地址、用户名等敏感信息。
要重新禁止 root SSH,将实际生效的 PermitRootLogin 改为 no,检查 sshd -t 和带连接条件的 sshd -T,再执行 sudo systemctl reload ssh.service。临时修改的密码认证策略也应恢复。只还原改过的文件和项目,不要盲目覆盖整个配置片段目录。
先确认另一个普通账户能正常 SSH 登录并使用 sudo;若本次启用的 root 密码已不再需要,再用下例锁定。passwd 手册中的 -l 只锁定密码,并不会封锁公钥等全部访问方式。root SSH 禁止策略必须另用 PermitRootLogin no 验证。
sudo passwd -l root
锁定密码或修改 SSH 配置不会自动结束已有 root 会话。完成操作后,用 exit 退出自己开启的 root shell。需要恢复访问时,通过保留的普通账户会话或恢复控制台,根据备份和变更记录还原设置。



