内置 GeoIP 库
SLS 数据加工支持对 IP 地址数据的地理位置(GeoIP)进行解析,解析IP地址被分配使用的大致地理位置范围。通过调用数据加工预定义函数 geo_parse
即可实现。
应用场景
我们需要处理的原始数据如下,是 Nginx 访问日志样例数据,其中 client_ip
字段存储的是访问客户端 IP 地址,我们需要对客户端来源地域进行分析,所以第一步需要先解析出 IP 信息对应的地理位置信息。
client_ip: 101.37.0.0
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
数据加工实现
1. 基于内置GeoIP库解析
SLS 提供了内置 GeoIP 库,可以直接调用,调用方法如下,将解析结果存入 _geo_
字段中:
e_set("_geo_", geo_parse(v("client_ip")))
解析结果如下,_geo_
字段中包含了国家、省份(州)、城市、运营商、经纬度等信息:
client_ip: 101.37.0.0
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
_geo_: {
"country_en": "CN",
"province_en": "330000",
"city_en": "330100",
"country": "中国",
"province": "浙江省",
"city": "杭州市",
"isp": "阿里云",
"lat": 30.294,
"lon": 120.162
}
也可以通过指定 keep_fields
参数来保留需要解析出哪些信息,来减少不需要的数据量,示例如下:
e_set("_geo_", geo_parse(v("client_ip"), keep_fields=("country", "province")))
2. 基于自选GeoIP库解析
如果我们已经购买了 GeoIP 库,想要在数据加工使用自选的 GeoIP 库。数据加工预定义韩式 res_oss_file
支持从 OSS 拉取自选 GeoIP 库文件,并进行解析,需要指定 ip_db
和 provider
2 个参数,示例如下:
e_set(
"geo",
geo_parse(
v("client_ip"),
ip_db=res_oss_file(
endpoint="http://oss-cn-hangzhou.aliyuncs.com",
ak_id="your ak_id",
ak_key="your ak_key",
bucket="your bucket",
file="ipipfree.ipdb",
format="binary",
),
provider="ipip",
),
)
自选 GeoIP 库默认输出3个信息,country
,province
和 city
。如果需要输出更多信息,也可以通过指定 keep_fields
参数来实现。
3. 单事件多IP解析
有的时候,客户端的访问通过了一系列的代理服务器,这些路径上的 IP 地址都会被记录在访问日志中。所以访问日志如下:
client_ip: 101.37.0.0; 101.37.0.1; 101.37.0.2
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
数据加工支持传入多 IP 的分隔符参数 ip_sep
,然后对所有 IP 逐个解析,将解析结果打包在一个 JOSN 对象中。代码如下:
e_set("_geo_", geo_parse(v("client_ip"), ip_sep=";"))
返回结果如下:
client_ip: 101.37.0.0
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
_geo_: {
"101.37.0.0": {
"country_en": "CN",
"province_en": "330000",
"city_en": "330100",
"country": "中国",
"province": "浙江省",
"city": "杭州市",
"isp": "阿里云",
"lat": 30.294,
"lon": 120.162
},
"101.37.0.1": {
"country_en": "CN",
"province_en": "330000",
"city_en": "330100",
"country": "中国",
"province": "浙江省",
"city": "杭州市",
"isp": "阿里云",
"lat": 30.294,
"lon": 120.162
},
"101.37.0.2": {
"country_en": "CN",
"province_en": "330000",
"city_en": "330100",
"country": "中国",
"province": "浙江省",
"city": "杭州市",
"isp": "阿里云",
"lat": 30.294,
"lon": 120.162
}
}
威胁情报扫描
SLS 数据加工提供内置函数 e_threat_intelligence
,可用于扫描数据内容是否存在威胁情报,比如检查访问 IP 是否存在威胁。
由阿里云威胁情报服务提供最近30天出现的威胁情报信息,每天更新一次。
应用场景
实时数据审计
我们的服务系统可能时时刻刻接受着来自世界各地的访问、或者是文件上传,如何快速识别出访问者是否有可能怀有恶意、或者上传内容是有潜在风险,从而把风险带来的损失降到尽可能低。
历史事件溯源
当攻击行为已经发生,我们最急切要做的就是溯源整个事件,找出攻击者和被攻破的原因,确定其他可能处于风险中的IT资源,预测攻击的后续行为,从而达到相似或相关的攻击行为不会在我们在成损失。
数据加工调用
这里示例同样是对访问日志的 IP 地址做扫描,需要指定扫描数据类型为 ip
、需要扫描的字段为 client_ip
、扫描结果输出字段为 _ti_
,数据加工调用代码如下:
e_threat_intelligence("ip", "client_ip", output_field="_ti_")
扫描结果如下:
client_ip: 101.37.0.0
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
_ti_: {
"confidence": 100,
"severity": 4,
"family": "",
"ioc_raw": "203.0.113.1",
"ioc_type": "ipv4",
"intel_type": "web",
"country": "中国",
"province": "浙江省",
"city": "杭州市",
"isp": "电信"
}
如果所给定的需要扫描的内容最近30天没有出现过威胁情报信息,则结果字段不会输出内容。