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

文章目录

在本地生成密钥

在自己的电脑执行:

复制代码
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

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

相关推荐
重生之高冷汉堡包31 分钟前
ChatGPT 如何打造自动化账号:从零搭建到高效运营
运维·chatgpt·自动化
aaa最北边33 分钟前
Linux 上的交叉编译
linux·运维·服务器
珠海西格电力44 分钟前
物联网(IoT)在零碳园区中的关键作用:万物互联与数据采集
大数据·人工智能·物联网·安全·系统架构·能源
蒲公英内测分发44 分钟前
智能门锁量产时,工厂测试 App 一直在更新,产线怎么避免装错 APK?
服务器·人工智能·github·智能硬件·智能手表
垆边人似月.1 小时前
Python中如何使用get函数实现频次查询
服务器·前端·python
小张成长计划..1 小时前
【Linux】27:日志
linux·运维·服务器
时间售卖铺1 小时前
Nginx 反向代理
运维·nginx·云原生
life码农1 小时前
Nginx location 优先级详解:匹配规则、修饰符与完整代码示例
运维·nginx
安教安全员通关宝1 小时前
【证书管理】安全员 C 证延续:条件、时间窗口与各省口径对照
安全
我命由我123452 小时前
Python 开发 - Python 虚拟环境
运维·开发语言·后端·python·http·https·java-ee