Ubuntu SSH 密钥登录免密 Sudo 与密码登录有密 Sudo 配置教程
侧边栏壁纸
  • 累计撰写 57 篇文章
  • 累计收到 21 条评论

Ubuntu SSH 密钥登录免密 Sudo 与密码登录有密 Sudo 配置教程

admin
2026-07-28 / 0 评论 / 29 阅读 / 正在检测是否收录...

Ubuntu 服务器初始化安全加固与免密 Sudo 配置教程

本教程包含 Ubuntu 服务器的完整安全加固流程:创建新用户配置 SSH 密钥登录禁用 Root 直接登录修改 SSH 默认端口,并最终实现:通过 SSH 密钥登录的用户免密 sudo,而通过密码登录的用户必须输入密码


🛠️ 整体配置原理

  1. 基础加固:弃用默认的 root 账户与 22 端口,改用高权限普通用户与自定义端口,阻断 99% 的自动化暴力破解。
  2. 免密分流:利用 Linux 的 PAM (Pluggable Authentication Modules) 机制与 SSH 的 ExposeAuthInfo 特性。密钥登录成功后会在内存中生成认证标记文件,sudo 检测到标记则自动放行;密码登录无标记,则强制要求输入密码。

📂 第一部分:用户创建与密钥配置

💡 本部分操作假设你当前以 root 身份登录在服务器上。

1. 创建新用户并赋予基础 Sudo 权限

创建一个你自己的高权限账户(将 myuser 替换为你想要的用户名):

# 创建用户并根据提示设置密码
adduser myuser

# 将用户加入 sudo 组
usermod -aG sudo myuser

2. 在本地电脑生成并配置 SSH 密钥

请在你的本地电脑(客户端)终端中执行以下操作:

  1. 生成高强度的 Ed25519 密钥对(一路回车即可,无需设置 key 密码):

    ssh-keygen -t ed25519 -f ~/.ssh/id_ubuntu_server
  2. 将公钥上传至服务器的新用户下(将 myuserserver_ip 替换为实际值):

    ssh-copy-id -i ~/.ssh/id_ubuntu_server.pub myuser@server_ip
  3. 测试能否用密钥成功登录(此时仍需默认 22 端口):

    ssh -i ~/.ssh/id_ubuntu_server myuser@server_ip

    确认成功登录后,再继续后续步骤。


📂 第二部分:安全加固(修改端口与禁用 Root)

⚠️ 重要提示:如果服务器开启了防火墙(如 ufw)或云服务商的安全组,必须先放行新端口(例如 2222),否则修改后将无法连接!

sudo ufw allow 2222/tcp

1. 修改 SSH 服务配置文件

在服务器上打开 SSH 配置文件:

sudo nano /etc/ssh/sshd_config

在文件中修改或添加以下核心配置(部分配置可能已被注释,请取消 # 并修改):

# 1. 修改默认端口(建议选择 1024-65535 之间的随机端口,例如 2222)
Port 2222

# 2. 禁用 root 用户直接登录
PermitRootLogin no

# 3. 确保开启密码登录(用于测试对照组,后期若追求极致安全可改为 no)
PasswordAuthentication yes

# 4. 开启 PAM 模块与认证信息传递(免密 sudo 的核心前提)
UsePAM yes
ExposeAuthInfo yes

2. 重启 SSH 服务

sudo systemctl restart ssh

注意:此时不要断开当前的连接窗口!


📂 第三部分:配置免密 Sudo 分流

1. 修改 PAM 模块识别密钥

  1. 打开 sudo 的 PAM 配置文件:

    sudo nano /etc/pam.d/sudo
  2. 在文件的最顶端(第一行非注释行之前),添加以下核心配置:

    auth [success=done default=ignore] pam_exec.so quiet /usr/bin/test -e /run/user/\$PAM_USER/ssh-auth-info

    说明:此规则会检查是否存在密钥认证标记。若存在则直接放行 sudo;若不存在则交由后续的密码认证模块处理。

  3. 保存并退出(Ctrl + O 回车,Ctrl + X)。

2. 检查 sudoers 权限规则

必须确保用户在 sudoers 中使用标准权限(有密),绝对不能配置 NOPASSWD

  1. 打开安全编辑器:

    sudo visudo
  2. 检查文件末尾。如果你之前针对该用户写过带有 NOPASSWD 的规则,请将其删除。只需保持默认的 %sudo ALL=(ALL:ALL) ALL 即可。
  3. 保存并退出。

🧪 第四部分:完整验证与测试

⚠️ 在测试完成前,千万不要关闭当前已经连上的 SSH 窗口! 请开新的本地终端窗口分别进行以下测试。

验证 1:测试新端口与密钥登录(预期:免密 Sudo)

  1. 在本地电脑通过新端口和密钥登录:

    ssh -p 2222 -i ~/.ssh/id_ubuntu_server myuser@server_ip
  2. 登录后执行切换 root 命令:

    sudo su
    • 正确现象:直接进入 root 状态,不提示输入密码。

验证 2:测试密码登录(预期:有密 Sudo)

  1. 在本地电脑强制使用密码和新端口登录:

    ssh -p 2222 -o PubkeyAuthentication=no myuser@server_ip
  2. 登录后执行切换 root 命令:

    sudo su
    • 正确现象:终端提示 [sudo] password for myuser:必须正确输入密码才能切换。

验证 3:测试 Root 阻断(预期:拒绝登录)

  1. 尝试直接以 root 身份登录:

    ssh -p 2222 root@server_ip
    • 正确现象:终端直接返回 Permission denied,证明 root 已被成功保护。

⚠️ 常见问题排查 (Troubleshooting)

  1. 修改端口后连不上了?

    • 90% 的原因是因为云厂商控制台的“安全组/防火墙”没有开放你修改的新端口(如 2222)。请前往云面板添加放行规则。
  2. 密钥登录的用户依然提示输入密码?

    • 请确认 /etc/pam.d/sudo 中的新增行是否写在了文件的绝对第一行。如果写在后面,会被前面的密码模块提前拦截。
0

评论 (0)

取消