Ubuntu 服务器初始化安全加固与免密 Sudo 配置教程
本教程包含 Ubuntu 服务器的完整安全加固流程:创建新用户、配置 SSH 密钥登录、禁用 Root 直接登录、修改 SSH 默认端口,并最终实现:通过 SSH 密钥登录的用户免密 sudo,而通过密码登录的用户必须输入密码。
🛠️ 整体配置原理
- 基础加固:弃用默认的
root账户与22端口,改用高权限普通用户与自定义端口,阻断 99% 的自动化暴力破解。 - 免密分流:利用 Linux 的 PAM (Pluggable Authentication Modules) 机制与 SSH 的
ExposeAuthInfo特性。密钥登录成功后会在内存中生成认证标记文件,sudo检测到标记则自动放行;密码登录无标记,则强制要求输入密码。
📂 第一部分:用户创建与密钥配置
💡 本部分操作假设你当前以 root 身份登录在服务器上。1. 创建新用户并赋予基础 Sudo 权限
创建一个你自己的高权限账户(将 myuser 替换为你想要的用户名):
# 创建用户并根据提示设置密码
adduser myuser
# 将用户加入 sudo 组
usermod -aG sudo myuser2. 在本地电脑生成并配置 SSH 密钥
请在你的本地电脑(客户端)终端中执行以下操作:
生成高强度的 Ed25519 密钥对(一路回车即可,无需设置 key 密码):
ssh-keygen -t ed25519 -f ~/.ssh/id_ubuntu_server将公钥上传至服务器的新用户下(将
myuser和server_ip替换为实际值):ssh-copy-id -i ~/.ssh/id_ubuntu_server.pub myuser@server_ip测试能否用密钥成功登录(此时仍需默认 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 yes2. 重启 SSH 服务
sudo systemctl restart ssh注意:此时不要断开当前的连接窗口!
📂 第三部分:配置免密 Sudo 分流
1. 修改 PAM 模块识别密钥
打开
sudo的 PAM 配置文件:sudo nano /etc/pam.d/sudo在文件的最顶端(第一行非注释行之前),添加以下核心配置:
auth [success=done default=ignore] pam_exec.so quiet /usr/bin/test -e /run/user/\$PAM_USER/ssh-auth-info说明:此规则会检查是否存在密钥认证标记。若存在则直接放行
sudo;若不存在则交由后续的密码认证模块处理。- 保存并退出(
Ctrl + O回车,Ctrl + X)。
2. 检查 sudoers 权限规则
必须确保用户在 sudoers 中使用标准权限(有密),绝对不能配置 NOPASSWD。
打开安全编辑器:
sudo visudo- 检查文件末尾。如果你之前针对该用户写过带有
NOPASSWD的规则,请将其删除。只需保持默认的%sudo ALL=(ALL:ALL) ALL即可。 - 保存并退出。
🧪 第四部分:完整验证与测试
⚠️ 在测试完成前,千万不要关闭当前已经连上的 SSH 窗口! 请开新的本地终端窗口分别进行以下测试。
验证 1:测试新端口与密钥登录(预期:免密 Sudo)
在本地电脑通过新端口和密钥登录:
ssh -p 2222 -i ~/.ssh/id_ubuntu_server myuser@server_ip登录后执行切换 root 命令:
sudo su- 正确现象:直接进入
root状态,不提示输入密码。
- 正确现象:直接进入
验证 2:测试密码登录(预期:有密 Sudo)
在本地电脑强制使用密码和新端口登录:
ssh -p 2222 -o PubkeyAuthentication=no myuser@server_ip登录后执行切换 root 命令:
sudo su- 正确现象:终端提示
[sudo] password for myuser:,必须正确输入密码才能切换。
- 正确现象:终端提示
验证 3:测试 Root 阻断(预期:拒绝登录)
尝试直接以 root 身份登录:
ssh -p 2222 root@server_ip- 正确现象:终端直接返回
Permission denied,证明 root 已被成功保护。
- 正确现象:终端直接返回
⚠️ 常见问题排查 (Troubleshooting)
修改端口后连不上了?
- 90% 的原因是因为云厂商控制台的“安全组/防火墙”没有开放你修改的新端口(如
2222)。请前往云面板添加放行规则。
- 90% 的原因是因为云厂商控制台的“安全组/防火墙”没有开放你修改的新端口(如
密钥登录的用户依然提示输入密码?
- 请确认
/etc/pam.d/sudo中的新增行是否写在了文件的绝对第一行。如果写在后面,会被前面的密码模块提前拦截。
- 请确认
评论 (0)