自动导入基于威胁情报源的IP黑名单
应用场景
在企业网络安全防护中,及时阻断来自已知恶意源、僵尸网络、攻击者的IP访问是构建纵深防御体系的重要环节。传统的人工维护IP黑名单方式存在以下痛点:
- 威胁情报更新频繁,人工维护成本高且易遗漏;
- 开源威胁情报源分散,难以统一管理和导入;
- 海量IP数据手动导入防火墙处理速度较慢;
- 缺乏自动化机制,无法实现实时或周期性防护更新。
云防火墙提供了一键式流量封堵功能,您只需将恶意IP地址整理后上传至防火墙,则可实现对所有恶意访问的拦截,显著提升拦截效率。
本文介绍如何通过调用云防火墙的“导入IP黑名单用于流量过滤”API接口导入IP黑名单,实现从威胁情报源自动获取恶意IP并批量导入云防火墙黑名单的场景化方案,帮助企业快速建立自动化的IP黑名单防护能力。
方案优势
- 自动化程度高:可结合定时任务触发,无需人工干预即可定期更新黑名单。
- 支持多情报源:可同时配置多个威胁情报URL,综合多个来源的IP数据。
- 高效批量处理:流式逐行读取大文件,按批次导入,避免内存溢出和API超时。
- 智能去重:全局去重机制,避免重复导入相同IP。
- 灵活部署:代码可运行于任意支持Python的环境,如云服务器、容器或函数计算。
系统影响
- 将IP地址添加到流量封堵列表后,访问该IP地址的流量以及从该IP地址发起的访问流量都将被直接拦截。
- 配置流量封堵的IP地址时,如果涉及地址转换或者存在代理的场景,需要谨慎评估拦截IP的影响。
约束与限制
基础版不支持使用流量封堵功能。
前提条件
- 已获取威胁情报IP列表的下载URL(可使用开源或商业情报源),并获取最新恶意IP列表。
- 使用IAM用户操作时,已授予该IAM用户CFW FullAccess权限,详细操作请参见通过IAM授予使用CFW的权限。
场景一:自动从开源威胁情报源导入IP黑名单
定期从威胁情报源(如Spamhaus、AbuseIPDB、USOM等)获取最新恶意IP列表,通过云防火墙API自动导入IP黑名单到流量封堵对象中,实现对已知恶意源的自动拦截。
操作步骤
- 已购买云防火墙,防火墙实例处于开启状态,且已开启流量封堵功能。
- 参见购买云防火墙选购标准版或专业版防火墙。
- 开启流量封堵。
- 在云防火墙控制台的左侧导航栏中,选择,进入流量封堵页面。
- 单击
按钮,并在弹出的确认框中,单击“确定”,开启流量封堵功能。
- 获取必要的认证和参数信息。
- 使用自动导入基于威胁情报源的IP黑名单接口,批量导入IP黑名单。
调用代码示例如下:
# 依赖安装: pip install requests huaweicloudsdkcfw huaweicloudsdkcore import requests import re # 配置参数(AK/SK等信息建议通过环境变量读取) AK = "your-access-key" SK = "your-secret-key" PROJECT_ID = "your-project-id" FW_INSTANCE_ID = "your-fw-id" REGION = "cn-south-1" EFFECT_SCOPE = [1] # 生效范围:[1]互联网边界, [2]VPC边界 URL = "https://{your-threat-source}/blacklist.txt" # 威胁情报URL BATCH_SIZE = 2000 # 每批导入的IP数量 # 初始化认证和客户端 credentials = BasicCredentials(AK, SK, PROJECT_ID) client = CfwClient.new_builder() \ .with_credentials(credentials) \ .with_region(CfwRegion.value_of(REGION)) \ .build() def import_ip_batch(client, fw_instance_id, ip_set, effect_scope, add_type=0): """批量导入IP到CFW黑名单""" if not ip_set: return 0 ip_list_str = "\n".join(ip_set) request = ImportIpBlacklistRequest() request.fw_instance_id = fw_instance_id body = ImportIpBlacklistRequestBody() body.add_type = add_type # 0=增量导入, 1=全量覆盖 body.ip_blacklist = ip_list_str body.effect_scope = effect_scope # [1]互联网边界, [2]VPC边界, [1,2]同时生效 request.body = body try: response = client.import_ip_blacklist(request) return len(ip_set) except exceptions.ClientRequestException as e: print(f"Error: status={e.status_code}, msg={e.error_msg}") return 0 # 下载并提取IP batch_ips = set() all_unique_ips = set() IP_PATTERN = re.compile( r'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}' r'(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:/(?:[12]?[0-9]|3[0-2]))?\b' ) with requests.get(URL, timeout=60, stream=True) as response: response.raise_for_status() for line in response.iter_lines(decode_unicode=True): if not line: continue line = line.strip().lstrip('#') if not line: continue for ip in IP_PATTERN.findall(line): if ip not in all_unique_ips: all_unique_ips.add(ip) batch_ips.add(ip) if len(batch_ips) >= BATCH_SIZE: import_ip_batch(client, FW_INSTANCE_ID, batch_ips, EFFECT_SCOPE) batch_ips.clear() # 处理剩余IP if batch_ips: import_ip_batch(client, FW_INSTANCE_ID, batch_ips, EFFECT_SCOPE) print(f"Total imported: {len(all_unique_ips)} unique IPs")
操作验证
- 确认执行输出中导入的IP数量符合预期。
- 检查新增的IP黑名单条目是否添加成功。
- 登录云防火墙控制台。
- 单击管理控制台左上角的
,选择区域。 - (可选)切换防火墙实例:如果有多个防火墙实例,可以在页面左上角的下拉框中进行切换。
- 在左侧导航栏选择,进入流量封堵页面。
- 检查新增的黑名单信息是否添加成功。
场景二:通过API调用查询和管理黑名单
除导入黑名单外,还可通过云防火墙API实现流量封堵对象中的IP黑名单的查询、删除等管理操作。
API查询示例
以下示例展示如何调用云防火墙API查询当前IP黑名单列表:
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkcfw.v1.region.cfw_region import CfwRegion
from huaweicloudsdkcfw.v1 import *
from huaweicloudsdkcfw.v1.model import *
# 初始化认证和客户端
credentials = BasicCredentials(AK, SK, PROJECT_ID)
client = CfwClient.new_builder() \
.with_credentials(credentials) \
.with_region(CfwRegion.value_of(REGION)) \
.build()
# 查询IP黑名单列表
request = ListIpBlacklistRequest()
request.fw_instance_id = FW_INSTANCE_ID
request.offset = 0
request.limit = 100
try:
response = client.list_ip_blacklist(request)
print(f"Total blacklisted IPs: {response.data.total}")
for item in response.data.records:
print(f" IP: {item.ip}, Type: {item.type}, Created: {item.create_time}")
except Exception as e:
print(f"Query failed: {str(e)}") API调用关键接口说明
| 接口名称 | 功能描述 | 请求方法 |
|---|---|---|
| ImportIpBlacklist | 批量导入IP黑名单 | POST |
| ListIpBlacklist | 查询IP黑名单列表 | GET |
| DeleteIpBlacklist | 删除IP黑名单条目 | DELETE |