站点接入ESA后,可使用Terraform批量添加WAF托管规则。
安装Terraform并配置权限
在本地安装和配置Terraform
您可以参考安装和配置Terraform,在本地使用Terraform。
由于阿里云账号(主账号)拥有资源的所有权限,其AccessKey一旦泄露风险巨大,所以建议您使用满足最小化权限需求的RAM用户的AccessKey。具体操作方式请参见创建AccessKey。
创建环境变量,用于存放身份认证信息。
在AccessKey管理页面上创建和查看您的AccessKey。
若无对应环境变量,在执行terraform模板时无法确认身份信息,将会导致调用失败。
使用在线服务(免安装和权限配置)
如果您不想安装Terraform,可以直接使用在线服务Cloud Shell。
阿里云Cloud Shell是一款帮助您运维的免费产品,预装了Terraform的组件,并配置好身份凭证(Credentials)。因此您可直接在Cloud Shell中运行Terraform的命令。更多信息,请参见使用Terraform快速创建资源。
通过Cloud Shell使用Terraform时,由于其销毁特性会导致数据丢失,因此建议您使用Cloud Shell做简单、快速的操作,例如调试。更多使用限制,请参见使用限制。
涉及的资源
提供ESA网站资源:alicloud_esa_site
配置WAF托管规则:alicloud_esa_waf_rule
配置WAF托管规则集:alicloud_esa_waf_ruleset
为站点启用WAF托管规则
创建一个名为
main.tf的配置文件,然后将以下代码复制到配置文件中,用于为指定站点创建WAF托管规则。# 1. 输入需要进行配置的站点名称 data "alicloud_esa_sites" "default" { site_name = "DOMAIN" # 将在DOMAIN处填入实际已接入ESA的站点,如example.com } # 2. 创建一个 http_managed 类型的 WAF 规则集(专门用于托管规则) resource "alicloud_esa_waf_ruleset" "managed" { site_id = data.alicloud_esa_sites.default.sites[0].site_id # 站点ID,根据site_name中的站点即可自动获取 phase = "http_managed" # WAF运行阶段,http_managed表示托管规则集 site_version = "0" # 站点版本 } # 3. 配置托管规则:将多种攻击类型的处置动作设为“拦截” resource "alicloud_esa_waf_rule" "managed_deny" { ruleset_id = alicloud_esa_waf_ruleset.managed.ruleset_id # 无需指定托管规则集ID,ESA将自动创建一个规则集 site_id = data.alicloud_esa_sites.default.sites[0].site_id phase = "http_managed" site_version = "0" config { status = "on" # 规则集状态,on-启用规则集 type = "http_managed" # 规则集类型,托管规则 expression = "true" # 请求传入类型,true-所有传入请求,也可以直接输入具体规则表达式 # 批量配置托管规则 - 应用于下列所有规则 managed_rulesets { protection_level = 2 # 防护等级,详细释义可参考文末说明 action = "deny" # 执行动作,deny-拦截,monitor-观察 attack_type = 11 # 攻击类型,详细释义可参考文末说明 } managed_rulesets { protection_level = 2 action = "deny" attack_type = 12 } managed_rulesets { protection_level = 2 action = "deny" attack_type = 13 } } }进入配置文件所在目录,执行如下命令,初始化Terraform环境。
terraform init执行如下命令,验证Terraform语法与配置。
terraform validate执行如下命令,预览执行结果。
terraform plan执行如下命令,执行Terraform脚本。
terraform apply依据提示输入
yes确认执行即可。
验证结果
在ESA控制台选择站点管理,在站点列单击目标站点。
在站点详情页面,选择安全防护>WAF>托管规则。
在托管规则标签页可以看到新增的托管规则。
单击编辑按钮,即可查看详细的规则集合。
(可选)清理资源
当您不再需要上述通过Terraform创建或管理的资源时,请运行terraform destroy命令以释放资源。
terraform destroy管理已有托管规则操作
启用托管规则集后,您可以指定规则集ID对规则集进行修改、删除等管理操作。每个账号最多仅能存在一个规则集。
获取规则集ID
您可以通过阿里云OpenAPI工具调用ListWafRulesets接口获取已有的规则集ID。
在ESA控制台选择站点管理,在站点列单击目标站点。
进入ListSites调试页面,在参数配置页的
SiteName参数中填入站点名,并点击发起调用获取SiteId。进入ListWafRulesets调试页面,在参数配置页填写以下参数,并点击发起调用:
SiteId:填写您的站点ID,即上一步所复制的信息,如
8709xxxxxx30192Phase:WAF运行阶段,填写
http_managed
发起调用后,即可在右侧调用结果页签中展示调用结果。返回的数据集中
Rulesets集合中的Id字段对应的即已有的规则集ID。
禁用所有托管规则
若需要禁用所有托管规则,可将status字段更改为off同时将protection_level字段设置为0。
修改
main.tf,进行如下修改:在
resource "alicloud_esa_waf_rule" "managed_deny"集合中增加ruleset_id字段,对应值填入获取的规则集ID。将
config中的status字段值更改为off。将所有
managed_rulesets集合中的protection_level字段值都更改为0-关闭。
# 1. 输入需要进行配置的站点名称 data "alicloud_esa_sites" "default" { site_name = "DOMAIN" # 将在DOMAIN处填入实际已接入ESA的站点,如example.com } # 2. 配置托管规则:禁用所有规则集 resource "alicloud_esa_waf_rule" "managed_deny" { ruleset_id = RULESET_ID # 已有的规则集ID site_id = data.alicloud_esa_sites.default.sites[0].site_id phase = "http_managed" site_version = "0" config { status = "off" # 规则状态,off-关闭规则 type = "http_managed" # 规则集类型,托管规则 expression = "true" # 请求传入类型,true-所有传入请求,也可以直接输入具体规则表达式 # 批量配置托管规则 - 应用于下列所有规则 managed_rulesets { protection_level = 0 # 防护等级,详细释义可参考文末说明 action = "deny" # 执行动作,deny-拦截,monitor-观察 attack_type = 11 # 攻击类型,详细释义可参考文末说明 } managed_rulesets { protection_level = 0 action = "deny" attack_type = 12 } managed_rulesets { protection_level = 0 action = "deny" attack_type = 13 } } }执行如下命令,验证Terraform语法与配置。
terraform validate执行如下命令,预览执行结果。
terraform plan执行如下命令,执行Terraform脚本。
terraform apply依据提示输入
yes确认执行即可。进入控制台可验证托管规则已被关闭。
开启或禁用特定规则
若需要开启或禁用规则集中特定的托管规则,将protection_level设置为-1,并在managed_rules中设置各规则的状态字段status。
修改
main.tf,进行如下修改:在
resource "alicloud_esa_waf_rule" "managed_deny"集合中增加ruleset_id字段,对应值填入获取的规则集ID。将对应
managed_rulesets集合中的protection_level字段值都更改为-1-自定义。在对应
managed_rulesets集合中增加需要操作的具体托管规则的managed_rules集合:id:规则ID,可在控制台查看。
action:规则的处置动作,deny-拦截,monitor-观察。status:规则状态,on-启用,off-关闭。
# 1. 输入需要进行配置的站点名称 data "alicloud_esa_sites" "default" { site_name = "DOMAIN" # 将在DOMAIN处填入实际已接入ESA的站点,如example.com } # 2. 配置托管规则:启用SQL注入集中的SQL时间盲注、帆软报表模板注入致代码执行规则,禁用SQL注入盲注Waitfor Delay规则。 resource "alicloud_esa_waf_rule" "managed_deny" { ruleset_id = RULESET_ID # 已有的规则集ID site_id = data.alicloud_esa_sites.default.sites[0].site_id phase = "http_managed" site_version = "0" config { status = "on" # 规则状态,on-开启规则 type = "http_managed" # 规则集类型,托管规则 expression = "true" # 请求传入类型,true-所有传入请求,也可以直接输入具体规则表达式 # 批量配置托管规则 - 应用于下列所有规则 managed_rulesets { protection_level = -1 # 防护等级,详细释义可参考文末说明 action = "deny" # 执行动作,deny-拦截,monitor-观察 attack_type = 11 # 攻击类型,详细释义可参考文末说明 managed_rules { action = "deny" id = 901032 status = "on" } managed_rules { action = "deny" id = 901031 status = "on" } managed_rules { action = "deny" id = 900661 status = "off" } } managed_rulesets { protection_level = 0 action = "deny" attack_type = 12 } managed_rulesets { protection_level = 0 action = "deny" attack_type = 13 } } }执行如下命令,验证Terraform语法与配置。
terraform validate执行如下命令,预览执行结果。
terraform plan执行如下命令,执行Terraform脚本。
terraform apply依据提示输入
yes确认执行即可。进入控制台查看规则详情即可验证。

相关参考
phase 参数说明
Terraform的 alicloud_esa_waf_ruleset和 alicloud_esa_waf_rule资源中,phase 字段用于指定WAF运行阶段,取值说明如下表所示。
参数值 | 含义 | 说明 |
| 自定义规则 | 用于创建自定义的访问控制规则,支持灵活的匹配表达式和多种执行动作。 |
| 白名单规则 | 允许特定流量绕过其他安全检查,用于放行可信流量。 |
| 托管规则 | 由阿里云维护的预配置规则集,用于防御常见Web攻击(如SQL注入、XSS等)。 |
| 扫描防护规则 | 检测和拦截恶意扫描行为,如目录遍历、端口扫描等。 |
| 频次控制规则 | 基于请求频率限制访问,防止恶意攻击和资源滥用。 |
| IP访问规则 | 基于IP地址或IP段控制访问权限。 |
| 高级模式Bots | 用于针对特定请求创建Bots防护规则集。 |
| 安全规则 | 依托海量威胁情报库,识别恶意请求并自动执行挑战处置。 |
防护等级说明
Terraform的alicloud_esa_waf_ruleset资源中,protection_level字段取值与实际等级的映射关系可参考:
等级取值 | 对应防护等级 | 说明 |
-1 | 自定义 | 自定义配置特定规则集中的规则时使用。 |
0 | 关闭 | 表示禁用该规则。 |
1 | 宽松 | 满足最基本的防护需要,使用中等等级规则存在误拦截时启用。 |
2 | 中等 | 推荐配置值,为默认防护等级。 |
3 | 严格 | 适用于涉及金融数据等需要严格防护的场景业务,或使用中等等级规则存在漏过时启用。 |
4 | 超严格 | 适用于重保时期,确保完全无漏过的场景下启用。 |
规则集攻击类型说明
Terraform的alicloud_esa_waf_ruleset资源中,attack_type字段取值与实际攻击类型的映射关系可参考:
攻击类型取值 | 对应攻击类型 | 说明 |
11 | SQL注入 | SQL 注入是一种攻击方式,攻击者通过在输入字段中插入恶意 SQL 代码,以便执行未经授权的 SQL 查询。该攻击利用应用程序对用户输入验证的不足,可能导致数据泄露、删除或修改数据库内容。 |
12 | 跨站脚本 | 跨站脚本攻击是指攻击者在网页中插入恶意脚本,导致浏览器执行这些脚本,通常以窃取用户信息(如 Cookies)或植入恶意代码为目的。XSS 攻击分为反射型、存储型和 DOM 型。 |
13 | 代码执行 | 远程代码执行攻击允许攻击者在目标系统上执行任意代码,这通常是通过漏洞利用、上传恶意文件或注入代码实现的。RCE 攻击通常具有极高的危害性。 |
14 | CRLF | 换行符注入攻击允许攻击者在 HTTP 响应中插入额外的头部,通过操控响应结构。在某些情况下,攻击者可以利用该漏洞进行 XSS 或 HTTP 响应拆分。 |
15 | 本地文件包含 | 本地文件包含攻击是指攻击者利用应用程序的漏洞,通过提供恶意路径来加载服务器上的本地文件。这种攻击可以导致敏感信息泄露,甚至执行代码。 |
16 | 远程文件包含 | 远程文件包含攻击允许攻击者通过提供外部 URL,让应用程序包含一个远程的恶意文件。与本地文件包含类似,RFI 攻击可以导致恶意代码的执行。 |
17 | WebShell | WebShell 是一种基于 Web 的反向控制工具,通常被攻击者上传到已被攻陷的服务器上。它允许攻击者通过 Web 界面对服务器进行操作,如执行命令、管理文件等。 |
19 | 跨站请求伪造 | 攻击者冒用用户身份执行非授权操作(如转账、改密),利用用户对目标站点的登录状态实施欺诈。 |
21 | SEMA | SEMA攻击利用搜索引擎配置不当,诱导爬虫索引敏感文件,从而窃取机密信息。 |
22 | OS命令注入 | 操作系统命令注入攻击通过在程序中嵌入恶意操作系统命令,使服务器执行这些命令,从而实现攻击目的。 |
23 | 表达式注入 | 表达式注入攻击是指通过嵌入恶意表达式,使服务器执行这些表达式,从而实现攻击目的。 |
24 | Java反序列化 | Java 反序列化攻击通过反序列化恶意对象,使服务器在反序列化过程中执行恶意代码。 |
25 | PHP反序列化 | PHP 反序列化攻击通过反序列化恶意对象,使服务器在反序列化过程中执行恶意代码。 |
26 | SSRF | 服务器端请求伪造(SSRF)攻击通过伪造服务器端请求,使服务器访问内部或外部资源,从而实现攻击目的。 |
27 | 路径穿透 | 路径穿透攻击通过注入相对路径(如 |
28 | 协议违背 | 攻击者通过恶意篡改通信协议规则,利用双方对协议理解的差异,诱导系统执行非预期的恶意操作。 |
29 | 任意文件上传 | 任意文件上传攻击通过上传恶意文件,使服务器执行这些文件,从而实现攻击目的。 |
30 | .NET 反序列化 | 反序列化是将数据从一种格式(例如 JSON、XML 或二进制)转换回对象的过程。在.NET 应用中,不安全的反序列化可能导致任意代码执行。如果攻击者能够控制反序列化的数据,他们可能会注入恶意数据,从而执行任意代码。 |
31 | 扫描器行为 | 这通常指的是 Web 应用程序扫描器的行为和特点。这些工具自动化地扫描 Web 应用以发现潜在的安全漏洞。它们定位常见的漏洞如 SQL 注入、跨站脚本等,通过生成并发送大量请求来分析应用的响应。 |
33 | 业务逻辑缺陷 | 业务逻辑缺陷是应用程序在实现其业务流程时存在的漏洞。这些漏洞通常不能通过传统的输入验证和输出编码来防御。它们可能允许攻击者通过操纵应用程序的正常工作流程来实现未授权访问或其他恶意行为。 |
34 | 任意文件读取 | 任意文件读取漏洞允许攻击者读取系统上任何文件,通常通过 HTTP 请求中的文件路径参数。利用这种漏洞,攻击者可以访问敏感信息,如配置文件、凭证和个人数据。 |
35 | 任意文件下载 | 任意文件下载漏洞类似于任意文件读取,但它专注于允许攻击者下载系统上的任意文件。这可能导致敏感信息泄露,甚至使攻击者获取系统的完整备份以进行脱机分析。 |
36 | 外部实体注入 | XXE 漏洞利用 XML 解析器在解析外部实体时的特性,允许攻击者读取系统文件、执行服务器端请求或导致拒绝服务。这种攻击通常通过包含恶意外部实体的 XML 输入实现。 |
20 | 其他 | 其他针对各种特定后台系统的漏洞攻击。 |
不同套餐的支持情况
功能分类 | 详细功能项 | Entrance(0 USD/月) | Pro(15 USD/月) | Premium(249 USD/月) | Enterprise(联系销售定制) |
5条 | 20条 | 100条 | 100条 | ||
1条 | 2条 | 5条 | 10条 | ||
频次控制-统计时长枚举 |
|
|
| ||
频次控制-持续时间枚举 |
|
|
| ||
频次控制-特征 |
|
|
| ||
频次控制-在缓存请求上应用 | |||||
50 条 | 200 条 | 400 条 | 400 条 | ||
2条 | 3条 | 5条 | 10条 | ||
支持基础规则 | 支持全部规则 | 支持全部规则 | 支持全部规则 | ||
5条 | 10条 | 20条 | |||
严格滑块 | |||||
账号级别配额,默认规则条数上限10条。 | |||||
DDoS告警 | |||||
四层代理(含四层DDoS防护) | |||||