SSH访问控制,多次失败登录即封掉IP,防止暴力破解

如何统计出系统中谁在破解你的密码及破解的次数(分析/var/log/secure)

分析/var/log/secure的IP地址 计算次数 并格式化输出 
[root@template ~]# cat /var/log/secure|awk -F "[ :]+" '{ip[$14]=ip[$14]+1} END{for (item in ip) {printf "%-20s %-s \n",item,ip[item] }}'

一、系统:CentOS 6.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地址,如果次数达到5次则将该IP写到 /etc/hosts.deny中。

三、步骤:

1、先把始终允许的IP填入 /etc/hosts.allow ,这很重要!比如: sshd:19.16.18.1:allow sshd:19.16.18.2:allow

2、脚本 /root/secure_ssh.sh

#! /bin/bash cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /root/black.txt DEFINE="5" for i in `cat  /root/black.txt` do   IP=`echo $i |awk -F= '{print $1}'`   NUM=`echo $i|awk -F= '{print $2}'`   if [ $NUM -gt $DEFINE ];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 /root/secure_ssh.sh

四、测试:

1、开两个终端窗口,一个ssh连上服务器,另一个用错误的密码连接服务器几次。

很快,服务器上黑名单文件里已经有记录了: [root@ ~]# $ cat /root/black.txt 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 black.txt 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

注: 1.脚本为同事编写。

2.服务器sshd端口已改为2333,事实证明,改了端口后,暴力破解的ssh连接数锐减。

 分析安全日志
/var/log/secure
定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][09]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort nr
定位有多少IP在爆破主机的root帐号:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
定位有哪些IP在爆破:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
access_log
查看 IP
[root@localhost logs]# cat access_log | awk '{print $1}'
显示访问前10 位的IP 地址,便于查找攻击源
[root@localhost logs]# cat access_log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10
显示指定时间以后的日志
[root@localhost logs]# cat access_log |awk '$4>="[1/Jan/2020:00:00:00"'
查看某一时间内的 IP 连接情况
[root@localhost logs]# grep "2020:05"access_log |awk '{print $4}'|sort|uniq –c |sort -nr
查看指定的 IP 做了什么
[root@localhost logs]# cat access_log |grep 192.168.3.3| awk '{print $1"\t"$8}'| sort|uniq –c |sort –nr|less
查看最近访问量最高的文件
[root@localhost logs]# cat access_log |tail 10000| awk '{print $7}'| sort|uniq –c |sort –nr|less
 

shell-将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问

应用场景:防止恶意IP尝试ssh登录
脚本说明:将密码输入错误超过四次得ip地址通过iptable防火墙访问。
分析:
首先,需要知道ssh远程访问记录在哪一个文件中  /var/log/secure
其次,模拟远程访问输错密码,查看日志文件
再次,通过日志可以看到关键信息“Failed password”表示错误密码有可能事手误引起得,所以设定几次错误为恶意试探密码,建议设置为4;还有需要将恶意试探密码主机得ip提取出来,对提取得ip地址进行统计计数
最后,需要明确怎么在脚本中通过iptables策略设置阻止恶意ip访问策略添加到哪里合适;防火墙2配置文件等。
模拟远程访问,查看日志


发现每一次错误密码后,显示主机ip时前都有 Failed password
所以我还可以借助Failed password字段来获取 恶意访问ip。二ip在倒数第三个字段(以空格为分隔符)
awk '/Failed password/ {print $(NF-3)}' /var/log/secure


设定4次错误为恶意试探密码,并提取得ip地址进行统计计数
首先我没需要将恶意IP地址进行统计
[root@cotenos ~]# awk  '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) print i,IP[i]}' /var/log/secure


对超过4次的错误的ip进行选取
[root@cotenos ~]# awk  '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) {if ($IP[i] >= 4)  print i,IP[i]}}' /var/log/secure


或者
[root@cotenos ~]# awk '/Failed password/ {print $(NF-3)}' /var/log/secure | sort | uniq -c | awk '$1>=4 {print $2}'


最后将获取的ip遍历,使用firewalld-cmd命令对ip进行阻隔
总代码
#!/bin/bash
bath=/var/log/secure
 
ip=`awk '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) {if ($IP[i] >= 4) print i}}' $bath`
for i in $ip
do
        firewall-cmd --add-rich-rule="rule family=ipv4 source address=$i/32 service name=ssh dorp"
 
done
 

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux SSH访问控制是指通过配置SSH服务器,限制哪些用户可以通过SSH协议远程登录服务器,并且可以进一步限制用户的权限和操作。下面是一些常见的Linux SSH访问控制方法: 1. 使用防火墙:可以使用iptables或者firewalld等防火墙工具,限制SSH服务只能从特定的IP地址或者IP地址段进行访问。 2. 修改SSH配置文件:可以通过修改SSH服务器的配置文件(通常是/etc/ssh/sshd_config),来限制SSH登录的用户和权限。以下是一些常见的配置选项: - AllowUsers:指定允许登录的用户列表,其他用户将被拒绝访问。 - DenyUsers:指定禁止登录的用户列表,其他用户将被允许访问。 - AllowGroups:指定允许登录的用户组列表,属于其他用户组的用户将被拒绝访问。 - DenyGroups:指定禁止登录的用户组列表,属于其他用户组的用户将被允许访问。 - PermitRootLogin:设置是否允许root用户通过SSH登录,建议禁止root登录以增加安全性。 3. 使用密钥认证:可以使用SSH密钥对进行认证,而不是使用密码。这种方式更加安全,可以通过配置文件(通常是~/.ssh/authorized_keys)来指定允许使用哪些密钥进行登录。 4. 使用限制登录shell:可以通过修改用户的登录shell,限制用户只能执行特定的命令或者脚本。例如,可以将用户的登录shell设置为/bin/false或者/sbin/nologin,这样用户只能通过SSH登录,但无法执行其他操作。 5. 使用PAM模块:可以使用PAM(Pluggable Authentication Modules)模块来对SSH登录进行更加细粒度的控制。通过配置PAM模块,可以实现诸如限制登录时间、限制登录次数、强制使用二次认证等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值