ssh免密登陆以及安全配置

Author : zbzhen,        Modified : Fri Jan 24 22:24:41 2025

要想安全, 主要不能让太多人让你的服务器被别人知道, 此外让知道你服务器的人, 同一个ip只有2次试错的机会. 最后才是密钥长度问题. 试想一下为什么6位数的密码也被认为是安全的.
第一条是禁止被ping通, 可以有效防止DDoS攻击, 也可以防止一些恶意扫描
第二条是禁用密码登录, 改用密钥对登录
第三条是配置fail2ban, 防止恶意登录尝试
其实还可以别的设置, 例如改默认22号端口, 改为其他不常用的端口号, 不过自己用起来也麻烦
此外如果有必要, 设置登录延时, 每次登录时, 自动延时5秒响应, 这样可以防止暴力破解, 但是用户体验不好, 所以不推荐
实践证明, 有了前面三条已经足够安全了. 所以这里只介绍这三条设置。

1. 常用命令

# 查看已经登陆和登陆失败的最近30个用户
last -30

lastb -30

查看多少人在暴力登陆root

sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

sudo lastb |awk '{print $3}'|sort |uniq -c

# 失败大于2次的
sudo lastb |awk '{print $3}'|sort |uniq -c|awk '{if ($1 > 2) print $2}'

有时候lastb统计并不一定准备, 不如直接这样查看

grep -oP '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b' /var/log/auth.log | sort | uniq

2. 查看 ECDSA key fingerprint

下面来源于ai回答

2.1. 提问

怎么获取本机器上的 ECDSA key fingerprint is SHA256

2.2. 回答

您可以使用以下命令获取本机器上的 ECDSA key fingerprint is SHA256:

ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub

该命令将输出 ECDSA key 的 SHA256 指纹。如果您想获取其他类型的 SSH key 的指纹,可以将命令中的“ecdsa”替换为“rsa”或“ed25519”。

3. 免密登陆

3.1. 直连

推荐本地用linux系统, 可以很方便处理

win上推荐在git中输入命令行,git下载地址为 https://registry.npmmirror.com/binary.html?path=git-for-windows/

  • 本地终端输入ssh-keygen, 一路回车即可
    创建记录里, 会出现id_rsa.pub文件的全路径

  • ssh-copy-id -i ~/.ssh/id_rsa.pub zbz@10.10.15.226
    或者用这个

    ssh zbz@10.10.15.226 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
    
    
  • 下次直接输入ssh zbz@10.10.15.226可以不用密码

如果是本地是win系统, 则先用某台linux系统整一次免密登陆, 然后执行下面操作

  • 本地终端输入ssh-keygen, 一路回车即可
    创建记录里, 会出现id_rsa.pub文件的全路径

  • 把本地的id_rsa.pub中的所有内容, 写入到服务器里的~/.ssh/authorized_keys文件中, 就可以实现免密登陆


  • 相对来说安全
  • 但是可能有被一锅端的风险

3.2. 常用技巧1

远程服务器A已经禁用了密码登录,怎么在新的本地机器上登录远程服务器A?

假设新的本地机器的~/.ssh/id_rsa.pubssh-rsa AAAAB3Nxxx, 则只需, 先想办法登录远程机器A, 然后执行命令

sudo echo 'ssh-rsa AAAAB3Nxxx' >> ~/.ssh/authorized_keys

需要注意的是~/.ssh/id_rsa.pub文件一般都很长, 最后可用cat ~/.ssh/authorized_keys查看是否添加成功, 如果添加成功

则可在新的本地机器上直接免密登录到远程服务器A

3.3. 常用技巧2-新买服务器设置免密登录

下面的方法适合win系统

本地操作:

Shift 点右键打开power shell,

  • 输入ssh-keygen, 一路回车
  • 再输入cat ~/.ssh/id_rsa.pub, 可以看到一串信息ssh-rsa AAAAB3N....

网页操作:

一般情况下买了服务器可以再网页上直接登录,然后执行下面操作:

  • 输入ssh-keygen, 一路回车

  • ssh-copy-id -i ~/.ssh/id_rsa.pub zbz@10.10.15.226, 选择yes

  • 接下来只需要把本地的公钥信息ssh-rsa AAAAB3N....写入到服务器文件~/.ssh/authorized_keys中, 具体方法为(下面的命令都是在网页上操作)

    • vim ~/.ssh/authorized_keys

    • i插入, 光标移动到最后, 空格, 粘贴ssh-rsa AAAAB3N...., Esc退出写入模式, Shift z z可保存退出

本地体验:
在power shell输入 ssh zbz@10.10.15.226然后回车, 即可登录到服务器

推荐使用vscode的传文件的插件: Natizyskunk.sftp

配置文件可以如下:

{
    "name": "10.10.15.226",
    "host": "10.10.15.226",
    "protocol": "sftp",
    "port": 22,
    "username": "zbz",
    "remotePath": "/root/",
    "privateKeyPath": "~/.ssh/id_rsa",
    "uploadOnSave": false,
    "ignore": [
            "**/.vscode/**",
            "**/.git/**",
            "**/.DS_Store",
            "**/__pycache__",
            "**/.env",
            ".*md"
        ],
        "watcher": {
            "files": "**/*",
            "autoUpload": false,
            "autoDelete": false
        }
}

4. 安全配置

密码登陆安全性低, 但是非常方便, 为此, 可以设置安全保护

密码带有大小写+数字+字符, 至少二十位

密码试错, 超过3次直接锁定4天

需要安装和配置fail2ban

4.1. 禁止被ping通

实践证明这个非常有效

下面的代码可以禁止被ping通

sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

取消禁止

sudo iptables -D INPUT -p icmp --icmp-type echo-request -j DROP

检查规则是否已删除:

sudo iptables -L -n

自己测试延时

sudo apt install nmap
nping --tcp -p 22 ip(根据具体情况填写)

4.2. 禁用密码登陆与端口修改

vim /etc/ssh/sshd_config

然后把

PasswordAuthentication yes
ChallengeResponseAuthentication yes

修改成

PasswordAuthentication no
ChallengeResponseAuthentication no

# 修改端口为其他端口, 例如2222, 
# 后续登录需要使用新端口, ssh -p 2222 zbz@10.10.15.226
Port 2222  

# 认证之前等待10s
LoginGraceTime 10s

修改后, 重启服务

sudo systemctl reload sshd
sudo systemctl restart sshd

4.3. 安装和配置fail2ban

# 安装
sudo apt install fail2ban

# 配置
sudo vim /etc/fail2ban/jail.conf

# 快捷键i进入编辑模式, Esc退出编辑模式 Shift + z + z保存退出 
# 在[DEFAULT]区设置
# 2次错误则封360000秒 = 100时 
bantime = 360000
findtime = 360000
maxretry = 2

# 重启
sudo service fail2ban restart

4.4. 检测与解封锁

设置成功之后用命令查看是否成功

# 输入
sudo fail2ban-client ping

# 输出的是下面命令则表示成功
Server replied: pong

检验监狱状态

sudo fail2ban-client status

查看监狱ip

fail2ban-client status sshd

或者更加全面的和清爽的格式

awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n

解锁特定封禁ip地址

sudo fail2ban-client set sshd unbanip 192.168.1.1

5. 也可以自己写脚本禁用

感觉更加靠谱

脚本名字为/root/ssh_deny.sh

vim /root/ssh_deny.sh

# i 插入, 按Esc键退出插入模式,shift + Z Z 保存并退出

写上内容如下

#!/bin/bash
#set -x

# 获取登录失败次数超过2次的IP地址列表
list=$(lastb | awk '{print $3}' | sort | uniq -c | awk '{if ($1 > 2) print $2}')

# 避免重复写入 /etc/hosts.deny
for ip in ${list}; do
    grep -qxF "${ip}" /etc/hosts.deny || echo "ALL: ${ip}" >> /etc/hosts.deny
done

然后赋予执行权限, 并测试

chmod +x /root/ssh_deny.sh

/root/ssh_deny.sh
cat /etc/hosts.deny 

然后自动执行

crontab -e
#内容为每1小时执行一次脚本
* */1 * * *  bash /root/ssh_deny.sh

#内容为每分钟执行一次脚本
*/1 * * * * bash /root/ssh_deny.sh

# 重启crontab服务
sudo service cron restart

6. 参考