一個朋友將自己的企業站放在其雲端否主機上,流量不大,但由於使用的是經常受到CC攻擊,主要表現就是IO和CPU爆增,最後就是資料庫掛掉導致網站無法存取。一開始啟用了Cloudflare,但是攻擊者瘋狂地掃描,防禦效果一般。

為了能夠精確地識別惡意IP,在啟用了Cloudflare CDN後需要在Nginx和Apache中啟用Real IP模組,然後利用腳本分析網站日誌,從日誌中蒐集異常IP,然後使用Cloudflare API批量將惡意IP添加到Cloudflare的防火牆當中。

當然,當網站遭遇非常強大的CC和DDoS攻擊時,我們可以啟用Cloudflare經典的5秒盾防攻擊,如果把握不了攻擊的頻率的話,可以設定一個定時任務,當系統負載超過某一個值(一般來攻擊會導致系統負載爆增),呼叫Cloudflare API啟用5秒盾。

Cloudflare自動封鎖惡意IP到防火牆和自動切換5秒盾腳本防CC攻擊

更多的關於網站安全和優化,這裡有:

  1. 五條關於使用免費VPS控制面板的安全建議-不讓駭客有可趁之機
  2. Linux的php-fpm優化心得-php-fpm進程佔用記憶體大和不釋放記憶體問題
  3. 啟用HSTS並加入HSTS Preload List讓網站Https存取更加安全-附刪除HSTS方法

PS:2019年3月25日更新,對於VPS的安全問題,很朋友可能會忽略VPS本身的SSH配置,這裡有強化策略:VPS主機和伺服器安全防護:SSH修改埠,添加白名單,僅限密鑰登入。

PS:2020年1月4日更新,Cloudflare Railgun是 Cloudflare 專為 Business 和 Enterprise 企業級客戶提供的終極加速方案。不過透過Cloudflare Partner可以免費開啟:免費開啟Cloudflare Railgun加速-減少連線延遲 實現動態頁面快取和加速。

一、Cloudflare自動封鎖惡意IP

1.1  找出惡意IP

利用腳本分析在一分鐘單一IP訪問的頻率,超過一定的頻率(一般來正常的訪問,一分鐘內應該不超過60次,你可以設定為更小),即認定為惡意IP。腳本如下:

#/bin/bash

#日志文件,你需要改成你自己的路径

logfile=/data/wwwlogs/

last_minutes=1 

#开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)

start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'

echo $start_time

#结束时间现在

stop_time=`date +"%Y-%m-%d %H:%M:%S"`

echo $stop_time

cur_date="`date +%Y-%m-%d`" 

echo $cur_date

#过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径

tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10

ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`

ip=`cat $logfile/log_ip_top10 | awk '{if($1>2)print $2}'`

# 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.txt,这里wzfou.com为了测试设置了2,你需要改成其它的数字

for line in $ip

do

echo $line >> $logfile/black.txt

echo $line

# 这里还可以执行CF的API来提交数据到CF防火墙

done

1.2  批次新增IP到防火牆

使用以下程式碼就可以將惡意IP批次新增到Cloudflare的防火牆了,記得替換為你的Cloudflare API。

#!/bin/bash
# Author: Zhys
# Date  : 2018

# 填Cloudflare Email邮箱
CFEMAIL="freehao123@gmail.com"
# 填Cloudflare API key
CFAPIKEY="xxxxxxxxxxxxxxxx"
# 填Cloudflare Zones ID 域名对应的ID
ZONESID="xxxxxxxxxxxxxxxxxxxx"

# /data/wwwlogs/black.txt存放恶意攻击的IP列表
# IP一行一个。
IPADDR=$(</data/wwwlogs/black.txt)

# 循环提交 IPs 到 Cloudflare  防火墙黑名单
# 模式(mode)有 block, challenge, whitelist, js_challenge
for IPADDR in ${IPADDR[@]}; do
echo $IPADDR
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" 
  -H "X-Auth-Email: $CFEMAIL" 
  -H "X-Auth-Key: $CFAPIKEY" 
  -H "Content-Type: application/json" 
  --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
done

# 删除 IPs 文件收拾干净
rm -rf /data/wwwlogs/black.txt

1.3  自動找出惡意IP並加入防火牆

直接將上面兩個腳本合併到一個腳本即可。

#/bin/bash

#日志文件,你需要改成你自己的路径

logfile=/data/wwwlogs/

last_minutes=1 

#开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)

start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'

echo $start_time

#结束时间现在

stop_time=`date +"%Y-%m-%d %H:%M:%S"`

echo $stop_time

cur_date="`date +%Y-%m-%d`" 

echo $cur_date

#过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径

tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10

ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`

ip=`cat $logfile/log_ip_top10 | awk '{if($1>2)print $2}'`

# 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.log,这里为了测试设置2,你需要改成其它的数字

for line in $ip

do

echo $line >> $logfile/black.txt

echo $line

# 这里还可以执行CF的API来提交数据到CF防火墙

done

# 填Cloudflare Email邮箱
CFEMAIL="freehao123@gmail.com"
# 填Cloudflare API key
CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxx"
# 填Cloudflare Zones ID 域名对应的ID
ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxxx"

# /data/wwwlogs/black.txt存放恶意攻击的IP列表
# IP一行一个。
IPADDR=$(</data/wwwlogs/black.txt)

# 循环提交 IPs 到 Cloudflare  防火墙黑名单
# 模式(mode)有 block, challenge, whitelist, js_challenge
for IPADDR in ${IPADDR[@]}; do
echo $IPADDR
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" 
  -H "X-Auth-Email: $CFEMAIL" 
  -H "X-Auth-Key: $CFAPIKEY" 
  -H "Content-Type: application/json" 
  --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
done

# 删除 IPs 文件收拾干净
 rm -rf /data/wwwlogs/black.txt

上面的腳本我已經放在我的下載中心,可以提供給大家下載使用,程式碼如下:

wget https://do.wzfou.net/shell/attack-ip.sh
chmod +x /qicmd/cfblockip.sh
./cfblockip.sh

wget https://do.wzfou.net/shell/attack-ip.sh
chmod +x /qicmd/attack-ip.sh
./attack-ip.sh

wget https://do.wzfou.net/shell/cf-block-attack-ip.sh
chmod +x /qicmd/cf-block-attack-ip.sh
./cf-block-attack-ip.sh

最後,設定一個定時任務,讓腳本每過一分鐘偵測一次(請根據需要來調整,關於定時任務的使用參考:Linux Crontab指令定時任務基本語法)

* * * * * /bin/bash /root/cf-block-attack-ip.sh > /tmp/ou1t.log 2>&1

自動新增惡意IP到CloudFlare防火牆的效果如下:

二、Cloudflare自動切換5秒盾腳本

網站:

  1. HTTPS://GitHub.com/MA抽/cloud flare-block

當你的伺服器受到攻擊時,系統負載就會爆增,利用腳本自動檢測系統負載,當壓力超過一定的值時就可以切換為” I’m Under Attack! “模式了。操作步驟如下:

#下载
cd /root && git clone https://github.com/Machou/Cloudflare-Block.git DDoS

#打开Cloudflare.sh,修改配置
API_KEY			You're Global API Key (https://dash.cloudflare.com/profile)
MAIL_ACCOUNT		Email of your Cloudflare account
DOMAIN			Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)

#设置定时任务
crontab -e

*/1 * * * * /root/DDoS/Cloudflare.sh 0 # check every 1 minute if protection is not enabled
*/20 * * * * /root/DDoS/Cloudflare.sh 1 # check every 20 minutes if protection is enabled

腳本預設的是檢測系統負載為10,啟動” I’m Under Attack! “模式,你以根據需要來調整。如下圖:

完整的腳本程式碼如下:

#!/bin/bash


# $1 = 1min, $2 = 5min, $3 = 15min
loadavg=$(cat /proc/loadavg|awk '{printf "%f", $1}')


# load is 10, you can modify this if you want load more than 10
maxload=10


# Configuration API Cloudflare
# You're Global API Key (https://dash.cloudflare.com/profile)
api_key=
# Email of your account Cloudflare
email=
# Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)
zone_id=     


# create file attacking if doesn't exist
if [ ! -e $attacking ]; then
  echo 0 > $attacking
fi

attacking=./attacking


hasattack=$(cat $attacking)


if [ $(echo "$loadavg > $maxload"|bc) -eq 1 ]; then

  if [[ $hasattack = 0 && $1 = 0 ]]; then

    # Active protection
    echo 1 > $attacking
    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" 
            -H "X-Auth-Email: $email" 
            -H "X-Auth-Key: $api_key" 
            -H "Content-Type: application/json" 
            --data '{"value":"under_attack"}'
  fi

  else
    if [[ $hasattack = 1 && $1 = 1 ]]; then

    # Disable Protection
    echo 0 > $attacking
    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" 
            -H "X-Auth-Email: $email" 
            -H "X-Auth-Key: $api_key" 
            -H "Content-Type: application/json" 
            --data '{"value":"high"}'
  fi
fi

exit 0

三、總結

Cloudflare是一個非常好用的防禦DDos和CC攻擊的工具,免費版本的Cloudflare結合API可以實現更加靈活的功能,對於普通的防禦足夠自己使用了。

Cloudflare防護也有一定的問題,那就是啟用了Cloudflare後取得到使用者的IP都是Cloudflare CDN節點的IP,我們也需要在伺服器設定上做進一步的最佳化。

發表評論