Author : zbzhen, Modified : Fri Jan 24 22:24:41 2025
要想安全, 主要不能让太多人让你的服务器被别人知道, 此外让知道你服务器的人, 同一个ip只有2次试错的机会. 最后才是密钥长度问题. 试想一下为什么6位数的密码也被认为是安全的.
第一条是禁止被ping通, 可以有效防止DDoS攻击, 也可以防止一些恶意扫描
第二条是禁用密码登录, 改用密钥对登录
第三条是配置fail2ban, 防止恶意登录尝试
其实还可以别的设置, 例如改默认22号端口, 改为其他不常用的端口号, 不过自己用起来也麻烦
此外如果有必要, 设置登录延时, 每次登录时, 自动延时5秒响应, 这样可以防止暴力破解, 但是用户体验不好, 所以不推荐
实践证明, 有了前面三条已经足够安全了. 所以这里只介绍这三条设置。
# 查看已经登陆和登陆失败的最近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
下面来源于ai回答
怎么获取本机器上的 ECDSA key fingerprint is SHA256
您可以使用以下命令获取本机器上的 ECDSA key fingerprint is SHA256:
ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
该命令将输出 ECDSA key 的 SHA256 指纹。如果您想获取其他类型的 SSH key 的指纹,可以将命令中的“ecdsa”替换为“rsa”或“ed25519”。
推荐本地用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
文件中, 就可以实现免密登陆
远程服务器A已经禁用了密码登录,怎么在新的本地机器上登录远程服务器A?
假设新的本地机器的~/.ssh/id_rsa.pub
为 ssh-rsa AAAAB3Nxxx
, 则只需, 先想办法登录远程机器A, 然后执行命令
sudo echo 'ssh-rsa AAAAB3Nxxx' >> ~/.ssh/authorized_keys
需要注意的是~/.ssh/id_rsa.pub
文件一般都很长, 最后可用cat ~/.ssh/authorized_keys
查看是否添加成功, 如果添加成功
则可在新的本地机器上直接免密登录到远程服务器A
下面的方法适合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 } }
密码登陆安全性低, 但是非常方便, 为此, 可以设置安全保护
密码带有大小写+数字+字符, 至少二十位
密码试错, 超过3次直接锁定4天
需要安装和配置fail2ban
实践证明这个非常有效
下面的代码可以禁止被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(根据具体情况填写)
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
# 安装 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
设置成功之后用命令查看是否成功
# 输入 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
感觉更加靠谱
脚本名字为/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