云服务器一般都是开放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
最后的最后,也可以在下面方向进行防护,提高安全等级。
- ssh可以修改端口,
- 添加信任主机的ip,
- 密钥免密登录禁止root密码登录,
- 复杂化的root用户密码
---------------------------------------采遍所有的坑,让别人无坑可踩---------------------------------------