云服务器一般都是开放22端口,总有人进行远程登陆暴力破解。为了防护,所以写了个脚本。

原理是,每一次登陆失败都会记录再系统日志中。(/var/log/secure)

示例内容

……
Jan  8 21:17:23  sshd[4784]: Failed password for root from 8.217.69.95 port 37064 ssh2
……
Jan  8 21:17:26  sshd[4788]: Failed password for root from 8.217.69.95 port 37858 ssh2
……
Jan  8 21:17:27  sshd[4792]: Failed password for root from 8.217.69.95 port 38642 ssh2
……
Jan  8 21:17:30  sshd[4795]: Failed password for root from 8.217.69.95 port 39302 ssh2

 

 

 

脚本说明

1.先匹配失败的sshd记录,记录下ip 次数写入黑名单文件

2.黑名单中取出,ip 次数。当次数大于自己设置的值(允许访问失败的最大次数)加入黑名单。建议大一些,或者配置密钥登陆,不然有可能自己输错密码把自己的ip加入黑名单。

3.吼吼吼吼吼吼吼吼吼吼吼吼吼吼吼,忘记想说啥了,秃头记忆差。。。。

#!/bin/bash
# -----------------------------------------------------------------
# -------- 创建日期:2021-12                                --------
# -------- 作者:ywjia                                      --------
# -------- 邮箱:duxingren201955@163.com                    --------
# -----------------------------------------------------------------
#预防暴力破解
#定时任务每分钟执行
#  0 */1 * * * sh /root/secure_deny.sh &>/dev/null
#文件名称,路径
    file_name='secure'
    file_path='/var/log'
#生成的黑名单文件,名称,路径
    file_deny_list='deny_ip.list'
    file_deny_path='/root'
#修改的系统黑名单文件-绝对路径
    sys_file_deny='/etc/hosts.deny'
#每分钟失败访问次数,当前5次。超多次数的ip将会拉黑,认为是攻击者爆破
    ssh_num_min=5
#月份为单位,每分钟-/var/log/secure-追加 文件内 secure_2021_11
    save_date=$(date "+%Y_%m")
    save_secure_file=$file_path/${file_name}_$save_date

# 打印log-详细日志-sh_deny_ip.log
function print_info_log(){
    echo -e "\e[1;34m INFO:$(date "+%Y-%m-%d %H:%M:%S") \e[0m $1." | tee -a /sh_deny_ip.log
}


#获取访问失败的ip范围
function get_deny_ip(){
    awk '/Failed/{print $(NF-3)}' $file_path/$file_name |sort |uniq -c |awk '{print $2"="$1}' >$file_deny_path/$file_deny_list
#    置空文件 /var/log/secure
    cat $file_path/$file_name >> $save_secure_file &&  > $file_path/$file_name
}
#设置黑名单ip
function set_deny_ip(){
    for i in $(cat $file_deny_path/$file_deny_list)
    do
        ip=$(echo $i |awk -F "=" '{print $1}')
        count=$(echo $i |awk -F "=" '{print $2}')
        grep $i $sys_file_deny &>/dev/null
        [ $? -ne 0 ] && [ $count -gt $ssh_num_min ] &&  echo "sshd:$ip:deny" >> $sys_file_deny && print_info_log "当前加入的黑名单ip是:$ip 访问次数是:$count"
    done
}
#主函数执行
function main(){
    print_info_log "------开始执行脚本-----------"
        print_info_log "------加载准·黑名单ip列表开始------"
            get_deny_ip
        print_info_log "------判断准·黑名单ip列表是否存在需要处理的ip------"
            deny_ip_num=$(wc $file_deny_path/$file_deny_list |awk '{print $1}')
            [ $deny_ip_num -eq 0 ] && print_info_log "------不需要处理------" && exit 0
        print_info_log "------开始处理准·黑名单ip---符合条件的ip将加入黑名单---"
            set_deny_ip
    print_info_log "------脚本执行结束,成功"
}
#-----------
main
#----------

 

最后查看下运行日志

[root@iZ8vb4nxo286gdt29kkfspZ log]# cat /sh_deny_ip.log 
 INFO:2022-01-12 18:53:03  ------开始执行脚本-----------.
 INFO:2022-01-12 18:53:03  ------加载准·黑名单ip列表开始------.
 INFO:2022-01-12 18:53:03  ------判断准·黑名单ip列表是否存在需要处理的ip------.
 INFO:2022-01-12 18:53:03  ------开始处理准·黑名单ip---符合条件的ip将加入黑名单---.
 INFO:2022-01-12 18:53:03  当前加入的黑名单ip是:212.192.246.142 访问次数是:15.
 INFO:2022-01-12 18:53:03  ------脚本执行结束,成功.
[root@iZ8vb4nxo286gdt29kkfspZ log]# cat /etc/hosts.deny 
#
# hosts.deny    This file contains access rules which are used to
#        deny connections to network services that either use
#        the tcp_wrappers library or that have been
#        started through a tcp_wrappers-enabled xinetd.
#
#        The rules in this file can also be set up in
#        /etc/hosts.allow with a 'deny' option instead.
#
#        See 'man 5 hosts_options' and 'man 5 hosts_access'
#        for information on rule syntax.
#        See 'man tcpd' for information on tcp_wrappers
#
sshd:212.192.246.142:deny

 

最后的最后,也可以在下面方向进行防护,提高安全等级。

  1. ssh可以修改端口,
  2. 添加信任主机的ip,
  3. 密钥免密登录禁止root密码登录,
  4. 复杂化的root用户密码

 

---------------------------------------采遍所有的坑,让别人无坑可踩---------------------------------------