DDOS是一类比较常见的针对用户系统的攻击类型,通过利用协议漏洞、或者直接发起大规模请求等方式耗尽服务资源,导致正常请求无法得到处理。
常见的DDOS攻击类型:
-
传输层攻击: 比较典型的攻击类型包括SYN Flood攻击、连接数攻击等。这类攻击通过占用服务器的连接池资源从而达到拒绝服务的目的。主要在SLB侧进行防护。
-
Connection Flood:是典型的利用小流量冲击大带宽网络服务的攻击方式,这种攻击的原理是利用真实的IP地址向服务器发起大量的连接。并且建立连接之后很长时间不释放,占用服务器的资源,造成服务器上残余连接(WAIT状态)过多,效率降低,甚至资源耗尽,无法响应其他客户所发起的链接。
-
HTTP Flood攻击(即CC攻击)、游戏假人攻击等。这类攻击占用服务器的应用处理资源,消耗服务器计算资源,从而达到拒绝服务的目的。
ASM网关支持很多7层的功能,可以配置一些高级规则来过滤恶意流量,下面按照从简单到复杂的顺序,逐步介绍防护措施:
网关黑白名单
ASM的网关支持配置黑白名单,目前支持三个字段:
最常用的是配置IP黑名单,可以封禁一些出现频率较高的恶意IP。这种方式最为简单、直接。能够有效防护Connection Flood和HTTP Flood攻击。
您还可以根据实际情况,配置HTTP域名和Port黑白名单来缩小攻击面。
具体配置方式请参考:https://help.aliyun.com/document_detail/467886.html
说明:ASM网关黑白名单支持动态加载,并不需要网关重启。您可以随时配置开启网关黑白名单,不会导致正常流量被中断。
授权策略
如果黑白名单不能满足您的需求,您可以考虑配置授权策略。
授权策略支持更多字段,能够对请求进行更多限制。比如只允许对/productpage路径使用GET方法调用;或者禁止使用POST方法访问/details路径,甚至可以限定只有携带了指定的JWT才可以访问。
关于授权策略的详细使用方法,请参考:https://aliyuque.antfin.com/alibabacloudservicemesh/product-and-engineer/vf0nzcf68vzhpxr5
说明:授权策略同样支持动态加载,规则比黑白名单更加丰富。配置中的路径、域名等字段只支持前缀、后缀和精准匹配,暂时不支持正则匹配。
OPA插件
ASM目前支持对指定命名空间的工作负载使用OPA进行鉴权。支持用户自定义OPA策略。开启OPA策略后,用户可以自行编写Rego脚本。Rego是一种高级的声明式的语言,是专门为OPA建立的,支持了丰富的内置函数。自定编写Rego脚本为鉴权提供了极大的灵活度,可以满足您绝大部分的定制配置,比如支持正则匹配请求中的某些字段。
如何在ASM中开启OPA插件请参考:https://help.aliyun.com/document_detail/308209.html
以下Rego表示一个简单的RBAC控制策略:
package istio.authz
import input.attributes.request.http as http_request
allow {
roles_for_user[r]
required_roles[r]
}
roles_for_user[r] {
r := user_roles[user_name][_]
}
required_roles[r] {
perm := role_perms[r][_]
perm.method = http_request.method
perm.path = http_request.path
}
user_name = parsed {
[_, encoded] := split(http_request.headers.authorization, " ")
[parsed, _] := split(base64url.decode(encoded), ":")
}
user_roles = {
"guest1": ["guest", "admin"],
"admin1": ["admin"]
}
role_perms = {
"guest": [
{"method": "GET", "path": "/productpage"},
],
"admin": [
{"method": "GET", "path": "/productpage"},
{"method": "GET", "path": "/api/v1/products"},
],
}
OPA可以提供比黑白名单和授权策略更强大的防护能力。比如恶意流量的path或者请求参数中有某些特殊字符,并且出现位置不固定,使用黑白名单和授权策略则无法完成这个任务。Rego可以轻松的实现正则匹配。
package istio.authz
import input.attributes.request.http as http_request
# 如果path路径中包含418,或agent包含curl,就拒绝该请求。
package istio.authz
import input.attributes.request.http as http_request
allow {
not contains(http_request.headers["user-agent"], "curl")
not contains(http_request.path, "418")
}
OPA的优点是更加灵活,但是需要使用者有一定的Rego语言基础。但是随着OPA在云原生领域越来越普及,相信会有越来越多的用户使用。
OPA的缺点:如果用户没有接触过Rego,有一定的学习成本;如果用户第一次在ASM控制台开启OPA,需要重启一下业务pod。如果攻击已经出现,这个可能会有流量风险。当前ASM团队也在持续优化OPA策略,会朝着流量零损失的方向持续改进。
总结
安全对于业务的重要程度可以用氧气和人来做比喻,平时感觉不到,只有当出现的攻击事件的时候才会感觉急迫,一刻也不能耽搁。所以还是要从平时做起,有价值的业务必然会承担更高的攻击风险,平时就该着力构建业务安全的堡垒。