为Linux开启密钥登录,增强安全性

为Linux开启密钥登录,增强安全性

零、快速脚本

下载脚本并赋予执行权限:

1
wget https://raw.githubusercontent.com/meowprivacy/LinuxSH/refs/heads/main/pubkey_setup.sh && sudo chmod +x pubkey_setup.sh

执行该脚本:

1
bash pubkey_setup.sh

菜单

1.写入pubkey到执行用户authorized_keys

​ –1 追加写入

​ –2 覆盖写入

2.开启密钥登录(执行过程中询问是否禁用密码登录)

3.新机配置(输入pubkey、新端口号、是否开启密钥登录、是否禁用密码登录)

注意

修改过SSH配置或公钥文件后,不要关闭当前连接,新开终端测试公钥登录,以免因配置修改失误导致无法登录SSH

为避免主配置被覆写,该脚本文件执行过程中会清空/etc/ssh/sshd_config.d目录下所有文件,如果为新机执行该脚本,则无需担心,如自定义过该目录下的配置,请不要使用该脚本

一、改动文件

~/.ssh/authorized_keys:储存用户ssh公钥

/etc/ssh/sshd_config:端口、公钥验证、密码登录、是否允许root用户登录

/etc/ssh/sshd_config.d/:sshd_config配置文件中include了该目录下的所有配置文件,该目录下的配置会覆写主配置文件,建议删除(如你在该目录下自行创建过配置文件,请注意保留)(请注意:该文章提供的快速脚本默认删除sshd_config.d目录下所有内容!

二、生成SSH密钥

在系统命令行终端下(如powershell、git bash)执行:

1
ssh-keygen -t ed25519 -C "ssh login key"

如果你使用的是不支持 Ed25519 算法的旧系统,请使用以下命令:

1
ssh-keygen -t rsa -b 4096 -C "ssh login key"

ssh login key为密钥备注,可自定义

执行后会要求输入密钥保存位置(默认在~/.ssh目录下)、密钥口令、重复密钥口令(密钥口令留空为不设定密钥)

执行成功后打开~/.ssh/文件夹(Windows用户为C:\Users\用户名\.ssh\)

会有刚才透过命令行生成的私钥和公钥:id_ed25519和id_ed25519.pub(或:id_rsa和id_rsa.pub)

请妥善保管私钥,私钥用于登录SSH,类似于密码登录方式中的密码

三、导入pubkey到服务器

上一步生成的id_ed25519.pub或id_rsa.pub即为公钥文件,只有该文件导入到服务器相应档案中,其对应的私钥才会生效

查看当前使用者家目录下是否有.ssh目录和authorized_keys文件:

1
ls -al ~/.ssh

若没有,则创建该目录和文件并修改为正确的权限:

1
2
3
4
mkdir -p ~/.ssh
sudo chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
sudo chmod 600 ~/.ssh/authorized_keys

复制公钥文件中的内容,并导入到authorized_keys中:(pubkey content为你的公钥文件内容)

1
echo "pubkey content" > ~/.ssh/authorized_keys

如果要追加新的公钥,请使用下面的命令:

1
echo -e "\npubkey content" >> ~/.ssh/authorized_keys

修改/etc/ssh/sshd_config配置文件:

1
2
3
sudo sed -i "s/^#\?\(Port\s*\).*/\1 新端口号/" /etc/ssh/sshd_config
sudo sed -i 's/^#\?\(PubkeyAuthentication\s*\).*/\1 yes/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?\(PermitRootLogin\s*\).*/\1 yes/' /etc/ssh/sshd_config

开启密码登录:(测试密钥登录成功后再禁用密码登录)

1
2
sudo sed -i 's/^#\?\(PermitRootLogin\s*\).*/\1 yes/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?\(PasswordAuthentication\s*\).*/\1 yes/' /etc/ssh/sshd_config

部分镜像安装后,/etc/ssh/sshd_config.d/目录中自带部分配置覆写了主配置,可能导致的问题如:

设定PasswordAuthentication值为no后,该修改不生效,原因是sshd_config主配置文件中include了sshd_config.d目录下的所有配置文件,建议检查目录内容后清空该目录:

1
sudo rm -rf /etc/ssh/sshd_config.d/*

然后,重启SSH服务:

1
sudo systemctl restart sshd

重启SSH服务后新配置生效,

修改过SSH配置或公钥文件后,不要关闭当前连接,新开终端测试公钥登录,以免因配置修改失误导致无法登录SSH

测试成功后,禁用密码登录:

1
2
3
sudo sed -i 's/^#\?\(PermitRootLogin\s*\).*/\1 prohibit-password/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?\(PasswordAuthentication\s*\).*/\1 no/' /etc/ssh/sshd_config
sudo systemctl restart sshd

四、常见问题

Q1:公钥认证失败

A1:vim ~/.ssh/authorized_keys检查格式是否正确并修正错误

Q2:关闭密码登录不生效

A2:部分镜像安装后,/etc/ssh/sshd_config.d/目录中自带部分配置覆写了主配置,建议先检查目录内容后清空该目录:sudo rm -rf /etc/ssh/sshd_config.d/*

然后,重启SSH服务:sudo systemctl restart sshd

Q3:无权限执行sudo,或者sudo需要输入密码

A3:赋权(root下执行):usermod -aG sudo $USER($USER为需要赋权的用户);设定无需密码执行sudo:sudo visudo,找到%sudo ALL=(ALL:ALL) ALL这行,修改为%sudo ALL=(ALL:ALL) NOPASSWD: ALL注意空格),然后CTRL+X保存

Q4:修改了sudo配置后,还是需要密码

A4:原因类似A2,sudo rm -rf /etc/sudoers.d/*即可

为Linux开启密钥登录,增强安全性

https://blog.ran.ac/post/ssh-pubkey-auth/

作者

Ran

发布于

2025-01-14

更新于

2025-01-14

许可协议

评论