禁用SSH密码认证并启用密钥认证

生成公私钥

1
ssh-keygen -t ed25519 -f ~/.ssh/<file_name>

将公钥上传到服务器

1
ssh-copy-id <username>@<server_ip>

如果没有ssh-copy-id命令,可以手动操作:

1
cat ~/.ssh/<file_name>.pub | ssh <username>@<server_ip> "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
1
2
# 登录测试 (不要退出, 防止接下来配置出错否无法登录服务器)
ssh -i <key_file> -p <port> <user>@<host_name>

修改 sshd 的配置

/etc/ssh/sshd_config (找到并修改以下参数):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 取消注释并修改为一个高端口号(如 2022, 2222等), 为了避开自动化扫描脚本
Port 2222

# 禁止 root 用户直接登录
PermitRootLogin no
# 可选但推荐:禁止使用空密码
PermitEmptyPasswords no

# 禁用密码认证,强制使用密钥
PasswordAuthentication no

# 启用公钥认证 (通常默认是启用的,但请确认)
PubkeyAuthentication yes

# 可选但推荐:配置允许登录的用户或用户组
# 将 ‘your_user’ 替换为你的实际用户名
AllowUsers your_user
# 或者允许一个用户组,例如 ‘ssh-users’
# AllowGroups ssh-users

防火墙开放端口:

1
sudo ufw allow 2222

重启SSH服务

1
sudo systemctl restart sshd   # 之前的连接不会中断

配置 ssh

1
2
3
4
5
Host <ip/host_name>
    #HostName <host_name>    # 真实 ip/host_name
    Port <port>
    User <user_name>
    IdentityFile ~/.ssh/<file_name>

测试连接

先不要关闭当前会话,新开一个终端测试连接:

1
ssh <username>@<server_ip>

确认可以正常登录后,再关闭当前会话。

恢复方法

如果无法通过密码或密钥认证, 可以通过服务器控制台(如 AWS/Aliyun 的 VNC 或 KVM)直接访问。

0%