首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >临近年底,病毒肆虐,为防暴力破解,把服务器改为证书登录

临近年底,病毒肆虐,为防暴力破解,把服务器改为证书登录

作者头像
IT狂人日志
发布2026-02-27 12:55:50
发布2026-02-27 12:55:50
1160
举报

SSH证书登录配置完整指南

本文档详细说明了如何配置Linux云服务器仅允许SSH证书登录,禁止密码登录,以提高服务器安全性。

前置条件

客户端(Windows)

  • • 已安装OpenSSH客户端(Windows 10/11默认已安装)
  • • 有PowerShell访问权限
  • • 有服务器root权限或sudo权限

服务端(Linux)

  • • 已安装OpenSSH服务器
  • • 有root权限或sudo权限
  • • 当前可以通过密码登录

第一步:生成SSH密钥对

方法一:使用ssh-keygen生成新密钥(推荐)

在Windows PowerShell中执行:

代码语言:javascript
复制
# 生成4096位RSA密钥对
ssh-keygen -t rsa -b 4096 -f "$env:USERPROFILE\.ssh\id_rsa_server" -C "admin@server"

参数说明:

  • -t rsa:使用RSA算法
  • -b 4096:密钥长度为4096位(更安全)
  • -f:指定密钥文件路径
  • -C:添加注释(通常是邮箱)

执行后会提示:

代码语言:javascript
复制
Enter passphrase (empty for no passphrase): 

建议:

  • • 可以设置密码短语(passphrase)以提高安全性
  • • 如果不需要,直接按Enter跳过

方法二:使用现有密钥

如果您已经有SSH密钥,可以跳过此步骤,直接使用现有密钥。

生成的文件

生成后会创建两个文件:

  • 私钥C:\Users\YourUsername\.ssh\id_rsa_server
  • 公钥C:\Users\YourUsername\.ssh\id_rsa_server.pub

⚠️ 重要提示:

  • • 私钥文件必须妥善保管,不要泄露
  • • 公钥文件可以公开,需要添加到服务器

第二步:将公钥添加到云服务器

方法一:使用ssh-copy-id(推荐,Linux客户端)

代码语言:javascript
复制
ssh-copy-id -i ~/.ssh/id_rsa_server.pub root@服务器IP

方法二:手动添加(Windows客户端)

2.1 查看公钥内容
代码语言:javascript
复制
Get-Content "$env:USERPROFILE\.ssh\id_rsa_server.pub"
2.2 登录到服务器
代码语言:javascript
复制
$env:Path += ";$env:SystemRoot\System32\OpenSSH"
ssh root@服务器IP
2.3 创建.ssh目录(如果不存在)
代码语言:javascript
复制
mkdir -p ~/.ssh
chmod 700 ~/.ssh
2.4 添加公钥到authorized_keys
代码语言:javascript
复制
echo "您的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
2.5 验证公钥已添加
代码语言:javascript
复制
cat ~/.ssh/authorized_keys

方法三:使用PowerShell命令(推荐)

代码语言:javascript
复制
# 一次性完成公钥添加
$env:Path += ";$env:SystemRoot\System32\OpenSSH"
$publicKey = Get-Content "$env:USERPROFILE\.ssh\id_rsa_server.pub"
ssh root@服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '$publicKey' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

测试证书登录

代码语言:javascript
复制
ssh -i "$env:USERPROFILE\.ssh\id_rsa_server" root@服务器IP

如果可以成功登录,说明公钥配置正确!


第三步:修改SSH配置禁用密码登录

3.1 备份SSH配置文件

代码语言:javascript
复制
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

3.2 修改SSH配置文件

方法一:使用sed命令(推荐)
代码语言:javascript
复制
# 禁用密码登录
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config

# 启用公钥认证
echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config
方法二:使用vim编辑器
代码语言:javascript
复制
vim /etc/ssh/sshd_config

找到并修改以下配置项:

代码语言:javascript
复制
# 禁用密码登录
PasswordAuthentication no

# 启用公钥认证
PubkeyAuthentication yes

# 确保以下配置(可选,提高安全性)
PermitRootLogin prohibit-password

保存并退出:

  • • 按 Esc
  • • 输入 :wq
  • • 按 Enter

3.3 验证配置

代码语言:javascript
复制
grep -E '(PasswordAuthentication|PubkeyAuthentication)' /etc/ssh/sshd_config

预期输出:

代码语言:javascript
复制
PasswordAuthentication no
PubkeyAuthentication yes

第四步:重启SSH服务并测试

4.1 重启SSH服务

代码语言:javascript
复制
systemctl restart sshd

4.2 检查SSH服务状态

代码语言:javascript
复制
systemctl status sshd

预期输出:

代码语言:javascript
复制
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since ...

4.3 测试证书登录

保持当前SSH连接不要断开!(防止配置错误导致无法登录)

打开新的终端窗口,测试证书登录:

代码语言:javascript
复制
ssh -i "$env:USERPROFILE\.ssh\id_rsa_server" root@服务器IP

如果可以成功登录,说明配置正确!

4.4 测试密码登录(应该失败)

代码语言:javascript
复制
ssh -o StrictHostKeyChecking=no -o PreferredAuthentications=password root@服务器IP "echo '测试'"

预期结果:

代码语言:javascript
复制
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

如果看到这个错误,说明密码登录已成功禁用!


后续使用方法

方法一:直接使用私钥文件

代码语言:javascript
复制
$env:Path += ";$env:SystemRoot\System32\OpenSSH"
ssh -i "C:\Users\YourUsername\.ssh\id_rsa_server" -o StrictHostKeyChecking=no root@服务器IP

方法二:配置SSH配置文件(推荐)

2.1 创建SSH配置文件

在Windows上创建或编辑 C:\Users\YourUsername\.ssh\config 文件:

代码语言:javascript
复制
Host server-alias
    HostName 服务器IP
    User root
    Port 22
    IdentityFile C:\Users\YourUsername\.ssh\id_rsa_server
    StrictHostKeyChecking no

参数说明:

  • Host:服务器别名(自定义)
  • HostName:服务器IP地址
  • User:登录用户名
  • Port:SSH端口(默认22)
  • IdentityFile:私钥文件路径
  • StrictHostKeyChecking no:跳过主机密钥确认(可选)
2.2 使用别名登录
代码语言:javascript
复制
ssh server-alias

方法三:在PowerShell中设置别名

编辑PowerShell配置文件 $PROFILE

代码语言:javascript
复制
notepad $PROFILE

添加以下函数:

代码语言:javascript
复制
function Connect-CloudServer {
    $env:Path += ";$env:SystemRoot\System32\OpenSSH"
    ssh -i "C:\Users\YourUsername\.ssh\id_rsa_server" -o StrictHostKeyChecking=no root@服务器IP
}

# 设置别名
Set-Alias ccs Connect-CloudServer

使用时只需输入:

代码语言:javascript
复制
ccs

常用管理命令

查看SSH服务状态

代码语言:javascript
复制
systemctl status sshd

查看SSH配置

代码语言:javascript
复制
cat /etc/ssh/sshd_config

查看已授权的公钥

代码语言:javascript
复制
cat ~/.ssh/authorized_keys

重启SSH服务

代码语言:javascript
复制
systemctl restart sshd

查看SSH登录日志

代码语言:javascript
复制
# 查看最近的SSH登录记录
journalctl -u sshd -n 50

# 实时监控SSH登录日志
journalctl -u sshd -f

查看当前登录用户

代码语言:javascript
复制
who

查看SSH连接数

代码语言:javascript
复制
netstat -antp | grep sshd | wc -l

故障排除

问题1:无法使用证书登录

可能原因:

  • • 私钥文件路径错误
  • • 私钥文件权限不正确
  • • 公钥未正确添加到服务器

解决方法:

  1. 1. 检查私钥文件路径:
代码语言:javascript
复制
Test-Path "C:\Users\YourUsername\.ssh\id_rsa_server"
  1. 2. 检查私钥文件权限(Linux):
代码语言:javascript
复制
chmod 600 ~/.ssh/id_rsa_server
  1. 3. 重新添加公钥:
代码语言:javascript
复制
cat ~/.ssh/authorized_keys

问题2:密码登录仍然可用

可能原因:

  • • SSH配置未正确修改
  • • SSH服务未重启

解决方法:

  1. 1. 检查SSH配置:
代码语言:javascript
复制
grep PasswordAuthentication /etc/ssh/sshd_config
  1. 2. 确保配置为 no
代码语言:javascript
复制
PasswordAuthentication no
  1. 3. 重启SSH服务:
代码语言:javascript
复制
systemctl restart sshd

问题3:配置后无法登录服务器

紧急恢复方法:

如果您在配置后无法登录服务器,可以通过以下方式恢复:

方法一:使用云服务商控制台
  1. 1. 登录云服务商控制台(阿里云、腾讯云等)
  2. 2. 找到服务器的"VNC连接"或"远程连接"功能
  3. 3. 通过控制台登录服务器
  4. 4. 恢复SSH配置:
代码语言:javascript
复制
cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
systemctl restart sshd
方法二:使用救援模式
  1. 1. 通过云服务商进入救援模式
  2. 2. 挂载服务器磁盘
  3. 3. 修改SSH配置文件
  4. 4. 重启服务器

问题4:SSH连接超时

可能原因:

  • • 防火墙阻止SSH连接
  • • SSH服务未运行
  • • 网络问题

解决方法:

  1. 1. 检查SSH服务状态:
代码语言:javascript
复制
systemctl status sshd
  1. 2. 检查防火墙:
代码语言:javascript
复制
# CentOS/RHEL
firewall-cmd --list-all

# Ubuntu/Debian
ufw status
  1. 3. 检查端口监听:
代码语言:javascript
复制
netstat -tlnp | grep 22

问题5:私钥文件损坏

解决方法:

  1. 1. 检查私钥文件格式:
代码语言:javascript
复制
Get-Content "C:\Users\YourUsername\.ssh\id_rsa_server" | Select-Object -First 3

预期输出:

代码语言:javascript
复制
-----BEGIN OPENSSH PRIVATE KEY-----
或
-----BEGIN RSA PRIVATE KEY-----
  1. 2. 如果格式不正确,重新生成密钥对

安全建议

1. 使用强密码短语(Passphrase)

在生成密钥时设置密码短语,即使私钥泄露,攻击者也需要密码才能使用。

2. 定期更换SSH密钥

建议每6-12个月更换一次SSH密钥。

3. 限制SSH访问IP

/etc/hosts.allow/etc/hosts.deny 中配置IP白名单。

4. 使用非标准端口

修改SSH端口,避免暴力破解:

代码语言:javascript
复制
vim /etc/ssh/sshd_config
# 修改 Port 22 为其他端口,如 Port 2222
systemctl restart sshd

5. 启用fail2ban

安装fail2ban防止暴力破解:

代码语言:javascript
复制
# CentOS/RHEL
yum install fail2ban

# Ubuntu/Debian
apt install fail2ban

6. 禁用root登录(可选)

创建普通用户,使用sudo提权:

代码语言:javascript
复制
# 创建普通用户
adduser username
usermod -aG sudo username

# 修改SSH配置
vim /etc/ssh/sshd_config
# 修改 PermitRootLogin yes 为 PermitRootLogin no
systemctl restart sshd

附录

A. SSH配置文件详解

配置项

说明

推荐值

PasswordAuthentication

是否允许密码登录

no

PubkeyAuthentication

是否允许公钥认证

yes

PermitRootLogin

是否允许root登录

prohibit-password

Port

SSH监听端口

22(可修改)

PermitEmptyPasswords

是否允许空密码

no

MaxAuthTries

最大认证尝试次数

3

B. SSH密钥类型对比

类型

密钥长度

安全性

兼容性

推荐度

RSA

2048/4096

极好

⭐⭐⭐⭐⭐

ECDSA

256/384/521

极高

⭐⭐⭐⭐

Ed25519

256

极高

较好

⭐⭐⭐⭐⭐

C. 常用SSH命令

代码语言:javascript
复制
# 端口转发
ssh -L 本地端口:目标地址:目标端口 用户@服务器

# 文件传输
scp -i 私钥文件 本地文件 用户@服务器:/远程路径

# 远程命令执行
ssh 用户@服务器 "命令"

# SSH隧道
ssh -D 本地端口 用户@服务器

总结

通过本文档的配置,您的服务器已经实现了:

✅ 仅允许SSH证书登录 ✅ 禁用密码登录 ✅ 提高服务器安全性

⚠️ 重要提醒:

  • • 务必妥善保管私钥文件
  • • 定期备份SSH配置
  • • 定期检查SSH登录日志
  • • 如果需要恢复密码登录,使用备份文件

文档版本: 1.0 更新日期: 2026-01-16 适用系统: CentOS 7+, Ubuntu 18+, Debian 9+ 客户端系统: Windows 10/11, macOS, Linux

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT狂人日志58446291 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SSH证书登录配置完整指南
    • 前置条件
      • 客户端(Windows)
      • 服务端(Linux)
    • 第一步:生成SSH密钥对
      • 方法一:使用ssh-keygen生成新密钥(推荐)
      • 方法二:使用现有密钥
      • 生成的文件
    • 第二步:将公钥添加到云服务器
      • 方法一:使用ssh-copy-id(推荐,Linux客户端)
      • 方法二:手动添加(Windows客户端)
      • 方法三:使用PowerShell命令(推荐)
      • 测试证书登录
    • 第三步:修改SSH配置禁用密码登录
      • 3.1 备份SSH配置文件
      • 3.2 修改SSH配置文件
      • 3.3 验证配置
    • 第四步:重启SSH服务并测试
      • 4.1 重启SSH服务
      • 4.2 检查SSH服务状态
      • 4.3 测试证书登录
      • 4.4 测试密码登录(应该失败)
    • 后续使用方法
      • 方法一:直接使用私钥文件
      • 方法二:配置SSH配置文件(推荐)
      • 方法三:在PowerShell中设置别名
    • 常用管理命令
      • 查看SSH服务状态
      • 查看SSH配置
      • 查看已授权的公钥
      • 重启SSH服务
      • 查看SSH登录日志
      • 查看当前登录用户
      • 查看SSH连接数
    • 故障排除
      • 问题1:无法使用证书登录
      • 问题2:密码登录仍然可用
      • 问题3:配置后无法登录服务器
      • 问题4:SSH连接超时
      • 问题5:私钥文件损坏
    • 安全建议
      • 1. 使用强密码短语(Passphrase)
      • 2. 定期更换SSH密钥
      • 3. 限制SSH访问IP
      • 4. 使用非标准端口
      • 5. 启用fail2ban
      • 6. 禁用root登录(可选)
    • 附录
      • A. SSH配置文件详解
      • B. SSH密钥类型对比
      • C. 常用SSH命令
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档