提高服务器安全-采用密钥公钥登录而非密码登录-详细操作步骤

文章目录

在本地生成密钥

在自己的电脑执行:

复制代码
ssh-keygen -t ed25519

一路回车(也可以设置密码)

会生成:

私钥:~/.ssh/id_ed25519

公钥:~/.ssh/id_ed25519.pub

手动复制公钥

查看你的公钥

在 PowerShell 输入:

复制代码
type $env:USERPROFILE\.ssh\id_ed25519.pub

或者输入:

复制代码
cat ~/.ssh/id_ed25519.pub

或者输入:

bash 复制代码
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub

这三个爱用哪个用哪个。

会输出一行类似:

复制代码
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... 乱七八糟的乱码

复制整行。

登录服务器(用密码)

复制代码
ssh user@服务器IP

在服务器上执行

复制代码
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys

把刚才复制的内容粘进去,如果发现无法复制,可以尝试点击第一个空行,然后再复制,注意,是第一个空行,而非整个空白区域。

保存:

复制代码
Ctrl + O → 回车
Ctrl + X

设置权限:

bash 复制代码
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

测试登录

退出服务器:

bash 复制代码
exit

再登录:

bash 复制代码
ssh user@服务器IP

如果不用密码直接进 = 成功,如果你设置了密钥的密码,就会提示你输入passphrase。

关闭密码登录

编辑 SSH 配置:

bash 复制代码
nano /etc/ssh/sshd_config

找到并修改这两行:

搜索,按:

bash 复制代码
Ctrl + W

输入:

bash 复制代码
PasswordAuthentication

如果你看到:

bash 复制代码
#PasswordAuthentication yes

改成(去掉 #):

bash 复制代码
PasswordAuthentication no

这个表示禁止密码登录。

再搜索 root 登录

按:

bash 复制代码
Ctrl + W

输入:

bash 复制代码
PermitRootLogin

如果看到:

bash 复制代码
#PermitRootLogin prohibit-password

改成:

bash 复制代码
PermitRootLogin prohibit-password
(如果没有这一行,就自己加一行)

这个表示root 只能用密钥登录,不能用密码。

保存并退出

按:

bash 复制代码
Ctrl + O   (保存)

回车

bash 复制代码
Ctrl + X   (退出)

重启 SSH 服务

执行:

bash 复制代码
systemctl restart ssh

如果你是CentOS/RHEL之类的,执行:

bash 复制代码
systemctl restart sshd

检查配置是否生效

执行:

bash 复制代码
sshd -T | grep passwordauthentication

如果输出:

bash 复制代码
passwordauthentication yes

说明密码登录还在开启。

如果前面怎么改都不行的话,主配置可能被覆盖了,真正生效的配置,可能在 /etc/ssh/sshd_config.d/ 目录里。

查看这个目录

执行:

bash 复制代码
ls /etc/ssh/sshd_config.d/

查看里面的内容

bash 复制代码
cat /etc/ssh/sshd_config.d/*.conf

如果看到了:

bash 复制代码
PasswordAuthentication yes

那就对胃了。

直接改这个文件:

bash 复制代码
nano /etc/ssh/sshd_config.d/50-cloud-init.conf

把里面的:

bash 复制代码
PasswordAuthentication yes

改成:

bash 复制代码
PasswordAuthentication no

重启 SSH

bash 复制代码
systemctl restart ssh

再验证

bash 复制代码
sshd -T | grep passwordauthentication

这次应该是:

bash 复制代码
passwordauthentication no

一般这种情况是Ubuntu,特别是云服务器,常见。使用 cloud-init 自动生成配置,放在/etc/ssh/sshd_config.d/优先级比主文件还高,配置被"隐藏配置文件"覆盖了

验证一下

不要马上断开当前连接,先开一个新窗口测试:

bash 复制代码
ssh root@你的服务器IP

如果能正常登上去,就可以断开链接了

相关推荐
tedcloud1234 小时前
Wand-Enhancer 怎么搭建?开源 Wand 客户端增强与远程控制工具介绍
大数据·服务器·人工智能·开源·音视频
隐擎fox4 小时前
深入理解网络传输层安全:TLS 指纹识别(JA3/JA4)原理与 Python 协议层检测实战
爬虫·python·网络协议·安全·网络安全·https
Emily156853598705 小时前
ABB CI867K01 3BSE043660R1
服务器·plc·dcs·abb·ci867k01·3bse043660r1·工控模块
考虑考虑5 小时前
docker compose环境变量替换
运维·后端·自动化运维
Java陈序员6 小时前
轻量运维面板!一款现代化的服务器控制面板工具!
运维·服务器·python·react.js·github
bosins6 小时前
WSL 迁移指南:如何将 Linux 环境完整复制到另一台电脑
linux·运维·服务器
IT利刃出鞘6 小时前
Docker Compose--安装WordPress--方法/示例
运维·docker·容器
小蒋观天下7 小时前
社区AI智能摄像头完整选型指南
大数据·人工智能·安全·计算机视觉·语音识别·ai大模型
snow@li8 小时前
服务器运维:Linux命令速查手册(全景梳理)
linux·服务器·网络
handler018 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存