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