Linux ssh登录防暴力密码破解

最后更新:2021.07.22

Ubuntu ssh登录防暴力密码破解

建议直接跳转 方案四

方案一:使用PAM锁定多次登陆失败的账户

PAM为Ubuntu自带的工具

修改如下文件:

/etc/pam.d/sshd    (远程ssh)
/etc/pam.d/login    (终端)

在第一行下即#%PAM-1.0的下面添加:

auth    required    pam_tally2.so    deny=3    unlock_time=600 even_deny_root root_unlock_time=1200

各参数解释:
even_deny_root    也限制root用户;
    
deny           设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
    
unlock_time        设定普通用户锁定后,多少时间后解锁,单位是秒;
    
root_unlock_time      设定root用户锁定后,多少时间后解锁,单位是秒;

查看某一用户错误登陆次数:
pam_tally –-user
例如,查看work用户的错误登陆次数:
pam_tally –-user work
清空某一用户错误登陆次数:
pam_tally –-user –-reset
例如,清空 work 用户的错误登陆次数
pam_tally –-user work –-reset
faillog -r 命令亦可。
如果前几条没生效的话,也可以使用命令:
pam_tally2 –u tom --reset将用户的计数器重置清零(SLES 11.2下用此命令才重置成功)
查看错误登录次数:
pam_tally2 –u tom 

方案二:使用脚本ban 登陆者ip地址

一、系统:Centos6.3 64位
二、方法:读取/var/log/secure,查找关键字 Failed,例如(注:文中的IP地址特意做了删减):

Sep 17 09:08:09 localhost sshd[29087]: Failed password for root from 13.7.3.6 port 44367 ssh2
Sep 17 09:08:20 localhost sshd[29087]: Failed password for root from 13.7.3.6 port 44367 ssh2
Sep 17 09:10:02 localhost sshd[29223]: Failed password for root from 13.7.3.6 port 56482 ssh2
Sep 17 09:10:14 localhost sshd[29223]: Failed password for root from 13.7.3.6 port 56482 ssh2

从这些行中提取IP地址,如果次数达到10次(脚本中判断次数字符长度是否大于1)则将该IP写到 /etc/hosts.deny中。
三、步骤:
1、先把始终允许的IP填入 /etc/hosts.allow ,这很重要!比如:

sshd:19.16.18.1:allow
sshd:19.16.18.2:allow

2、脚本 /usr/local/bin/secure_ssh.sh

#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
  if [ ${#NUM} -gt 1 ]; then
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
    fi
  fi
done

3、将secure_ssh.sh脚本放入cron计划任务,每1分钟执行一次。

$ crontab -e

*/1 * * * *  sh /usr/local/bin/secure_ssh.sh

四、测试:
1、开两个终端窗口,一个ssh连上服务器,另一个用错误的密码连接服务器几次。
很快,服务器上黑名单文件里已经有记录了:

[root@ ~]# $ cat /usr/local/bin/black.list 
13.26.21.27=3

再看看服务器上的hosts.deny

[root@ ~]# cat /etc/hosts.deny
sshd:13.7.3.6:deny
sshd:92.4.0.4:deny
sshd:94.10.4.2:deny
sshd:94.4.1.6:deny
sshd:11.64.11.5:deny

2、从另一个终端窗口继续“暴力”连接服务器。
看看服务器上的黑名单文件:

[root@ ~]# cat /usr/local/bin/black.list
13.26.21.27=6

再看看服务器上的hosts.deny

[root@ ~]# cat /etc/hosts.deny
sshd:13.7.3.6:deny
sshd:92.4.0.4:deny
sshd:94.10.4.2:deny
sshd:94.4.1.6:deny
sshd:11.64.11.5:deny
sshd:13.26.21.27:deny

IP 已经被加入到服务器的hosts.deny,再用正确的密码连接服务器,被拒绝:

$ ssh root@myserver.mydomain.com -p 2333
ssh_exchange_identification: Connection closed by remote host

方案三:使用fail2ban

详情见该教程:Amazonaws官方教程链接

方案四:使用SSH Key登录,永久防止密码暴力破解

在Windows下查看[c盘->用户->自己的用户名->.ssh]下是否有"id_rsa、id_rsa.pub"文件,如果没有需要从第一步开始手动生成,有的话直接跳到第二步。

一、生成SSH密钥(以windows为例)

1、创建SSH Key
打开cmd或者Git-Bash,在控制台中输入以下命令:

ssh-keygen -t rsa -C "youremail@example.com"

密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于SSH-2的RSA密钥。这里使用的是rsa。
同时在密钥中有一个注释字段,用-C来指定所指定的注释,可以方便用户标识这个密钥,指出密钥的用途或其他有用的信息。
所以在这里输入自己的邮箱或者其他都行,当然,如果不想要这些可以直接输入:

ssh-keygen

2、输入完毕后按回车,程序会要求输入密钥的第二重保护密码。输入完密码后按回车会要求再确认一次密码。
如果不需要密码可以在要求输入密码的时候按两次回车,表示密码为空,并且确认密码为空。

3、此时[c盘>用户>自己的用户名>.ssh]目录下已经生成好了2个文件,
id_rsa.pub是公钥,相当于你的身份证号,可以给别人验证身份。
id_rsa是私钥,相当于你的身份证卡,千万不能给别人。

二、将SSH Key上传到你的Linux服务器

上传方法可选择以下2种
1.直接公钥复制文本到~/.ssh/authorized_keys(推荐熟悉Vim操作的人使用,打开粘贴回车保存即可)
2.使用scp或者FileZilla上传公钥文件。

这里只介绍方法2:

注意:上传位置是我们登录Linux所用用户home目录下的.ssh目录下,如:/root/.ssh

scp id_rsa.pub root@remotehost:/root/.ssh

如果目录不存在,需要创建~/.ssh目录,并把目录权限设置为700

把公钥改名为authorized_keys,并且把它的用户权限设成600

然后把我们上传的key.pub文件改名为:authorized_keys

mv id_rsa.pub authorized_keys
chmod 700 .ssh
chmod 600 authorized_keys

三、(可选)配置ssh服务以使用密钥登陆

默认情况下,ssh对于密钥登录的支持都是开启的

如果完成第二步后,无法连接至服务器,则按如下配置:

修改ssh配置文件:

vi /etc/ssh/sshd_config
对以下内容去掉注释:

StrictModes no
RSAAuthentication yes 
PubkeyAuthentication yes 
AuthorizedKeysFile    .ssh/authorized_keys

保存后重启sshd服务:

systemctl restart sshd

退出重新登陆服务器,这次使用密钥登陆,测试是否成功。

四、关闭原密码登陆方式

如果使用密钥登陆成功,则修改ssh配置文件,关闭密码登陆:

vi /etc/ssh/sshd_config

设置:

PasswordAuthentication no

保存后重启sshd服务的步骤同上,这样就完成了密钥登陆的配置。

结语
其实除了安全性的提升,在使用方面反而比以前更方便了。登陆只需要载入证书,然后点击连接即可。如果怕密钥泄露引起问题,可以在私钥文件本身加上一个密码,每次登陆时就可以再验证一次密码。这样,基本已经能满足日常的安全需求了。

建议阅读:

阮一峰 - 《SSH 入门教程》 - SSH 密钥登录
远程访问 - Termux Wiki

最后修改:2021 年 07 月 22 日 08 : 57 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论