基于阿里云SLS日志服务的数据安全管理
伴随云原生的发展,以应用为核心的可观测监控越发得到广泛应用。在应用的可观测性中,日志的收集及内容监控是可观测性监控的一个重要内容,然而日志的监控数据,并不同于某项指标的测量结果数据,其往往都会包含业务或与用户相关的敏感性信息,因此,在落实日志的收集和监控的同时,我们也要注意日志数据的安全管理。
阿里云SLS
阿里云日志服务SLS是云原生观测与分析平台,其可为Log、Metric、Trace等数据提供大规模、低成本、实时的存储、归档、监控等一系列的数据服务,其包括一站式提供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能,可满足研发、运维、运营、安全等场景的数据管理能力。
阿里云SLS功能特性
如图所示,其功能特点如下:
数据采集
- 日志服务提供50多种数据接入方案,支持采集服务器与应用相关的日志、时序数据和链路数据。
- 支持基于Logtail 采集物联网设备、阿里云产品日志、移动端等数据。
- 支持Logstash、Flume、Beats、FluentD、Telegraph等开源软件中数据的接入。
- 支持通过HTTP、HTTPS、Syslog、Kafka、Prometheus等标准协议接入数据。
查询与分析
- 支持上下文查询、日志聚类、LiveTail、重建索引等功能。
- 支持标准的SQL 92语法。
数据加工
- 日志服务提供数据加工功能,用于数据的规整、富化、流转、脱敏和过滤。
- 日志脱敏可对数据中包含的密码、手机号、地址等敏感信息进行脱敏。
消费与投递
- 日志服务提供消费与投递功能,支持通过SDK、API实时消费数据;支持通过控制台将数据实时投递至OSS、MaxCompute等阿里云产品中。
数据可视化
- 日志服务支持可视化展示查询和分析结果。提供表格、线图、柱状图等多种统计图表
- 支持直接对接Grafana、DataV等第三方图表
内容告警
- 日志服务提供告警监控、降噪、事务管理、通知分派的智能运维平台
- 支持通过告警策略对所接收到的告警进行路由分派、抑制、去重、静默、合并等操作,然后发送给通知(行动)管理系统。
- 支持通过Webhook方式接收外部监控系统中的告警消息(例如Grafana告警、Prometheus告警),并完成告警管理、告警通知等操作。
日志审计
- 覆盖基础(ActionTrail、容器服务Kubernetes版)、存储(OSS、NAS)、网络(SLB、API网关)、数据库(关系型数据库RDS、云原生分布式数据库PolarDB-X、PolarDB MySQL云原生数据库)、安全(WAF、DDoS防护、云防火墙、云安全中心)等云产品。
阿里云的数据安全方案
阿里云SLS 被定位一个集中化的数据管理平台,如上所述,其涵盖了数据从采集到审计归档的全生命周期内容。对于数据的安全,可包含两个方面的内容,分别是数据脱敏和用户安全。
数据脱敏
数据脱敏,是指数据的内容在被用户查询过程中,用户所看到的内容不会出现违反安全法规限定的内容,同时也无法根据不同的内容碎片组成违反安全法规限定的内容。阿里云SLS 提供了在采集端和服务端数据加工两种方案来满足这一需求。
采集端控制
这是一种常见的数据脱敏方法,通常日志在采集后经过相关策略的处理,再把脱敏的数据传送到SLS服务端进行存储,这种方法相对较为安全,但是由于采集端的多样性,若采集端软件不同,各采集端配置上则会较为分散,也不方便管理。此处以阿里云日志采集端logtail的配置为例来了解采集端数据脱敏的配置方法。Logtail 的日志处理流程如下图所示:
基于logtail 实现数据脱敏有字段丢弃、数据脱敏、字段加密、数据编码与解码等方法,logtail 脱敏配置样例如下:
{
"processors":[
{
"type":"processor_drop",
"detail": {
"DropKeys": ["aaa1","aaa2"]
}
},
{
"type" : "processor_desensitize",
"detail" : {
"SourceKey" : "password",
"Method" : "const",
"Match" : "full",
"ReplaceString": "********"
}
},
{
"type" : "processor_desensitize",
"detail" : {
"SourceKey" : "content",
"Method" : "md5",
"Match" : "regex",
"RegexBegin": "'password':'",
"RegexContent": "[^']*"
}
},
{
"type" : "processor_encrypt",
"detail" : {
"SourceKey" : ["field1","field2"],
"EncryptionParameters" : {
"Key": "18b2eda21fbca92d6d3442e951c15208d0ae50d0a3e5d9e45bbaea0f5121a09d519c90a676133f36d48a0288e2a928bbe83f67d9f7ef5ba5508cbe8f63b3ecb79b2394b132467424395bdb40c97f3929fad2ae627117367d9e425f4776b229af0d934e0f95a04087286bf58dda46fa16aae77db19567709ead743631ba48fe80998bdecc5ea23d66d37ce821828ab840660738c696eda24c222e1cc64929b13b391655b9056cd0729bbc44231e98e3301fbe0b401c4628a682cbf1a3b9c9b5d7ddffe196034f2a66e866e37ffa64f81235026d32c72744c5bdc831fdfc5624c53eaae44134b169de665bd3d7fb5eeeab3853c301aea39dd5358766e004702fdc6f5ae79edc975936c50c80c8d4853ead9e8b52531cbef3747cde2308f7bfe2df25b65e738035b485b58fa23772814b396ee787a9aa8c6826921d4af7e450715fae0f77ed5684631912c198430a19c50fe22ac0e2eda4e7ae91d271f2560078aa6ff88b5ffec53de505d04be1876174bebb9fdb8fbbd2faaed65c8e37669d731e9404bb52c54af5e02d4d6816534bdf72504d97581a0049aa041f773e8b4ebc21a021c728215d13d1f28fd9b9fe0a3623b19c4e03e3c056116a765f9ef594b63815eb747aade065772504dee454116a60fa29dd1b3b74ef4477e74aa1d8aee6f5c36e9f30fbe51b5561c8c3ad0d31d0ec1726d4e3166986f526800c9f358652df"
}
}
},
{
"type" : "processor_base64_encoding",
"detail" : {
"SourceKey" : "content",
"NewKey" : "content_base64"
}
},
{
"type" : "processor_base64_decoding",
"detail" : {
"SourceKey" : "content_base64",
"NewKey" : "content"
}
},
{
"type" : "processor_base64_md5",
"detail" : {
"SourceKey" : "content",
"NewKey" : "content"
}
}
]
}
数据加工
数据加工则是在数据存储到SLS 服务端后,通过相关的数据处理规则实现数据内容的脱敏,该方法易于数据的集中处理,缺点是未脱敏的数据仍会被存储到在SLS服务端,需要做好相关的用户权限控制来解决这一弊端。
- 数据加工原理
数据加工的原理如图所示,其过程是将源存储的日志中数据同步到目标的日志库中,在同步的过程中按照数据加工规则,将加工后的数据存储到目标日志库中。
- 数据加工规则引擎
使用SLS DSL提供的内置函数编写加工规则,每个函数可以看做一个加工步骤,规则引擎按步骤顺序执行函数。
配置样例
# 过滤所有健康检测的日志
e_if(e_search("actuator/health"), e_drop())
# 过滤掉无用字段
e_drop_fields("field1","field2")
# 替换掉手机号
e_set(
"message",
regex_replace(
v("message"),
r"((13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8})",
replace=r"[MASKED_PHONE]",
),
)
e_set(
"log",
regex_replace(
v("log"), r"(?i)(\suser\s).*", replace=r"\1[MASKED_NAME]"
),
)
- 性能优化
根据加工原理,数据加工任务的总体速度取决于源Shard的数量、用户配置的规则逻辑和规则复杂度。一般可以按照每Shard处理1MB/s(压缩前)流量规划,也就是大约85 GB每天每Shard规划。例如:源Logstore的数据写入速度是每天1 TB,那么需要分裂源Logstore的Shard数量为1024GB/85=12个。
- 成本优化
根据加工原理和性能指南,官方推荐节约成本的方案是使用一个或多个Logstore快速接入数据,然后使用数据加工进行快速分发,并根据实际需求设置不同目标Logstore的存储时间以及索引配置,进而降低使用成本。
举例某应用的日志,每天的写入量为100 GB,存储30天并建立全文索引,那么日志服务的成本大约是2248元/每月。官方推荐使用如下加工方案实现成本的节约。
* 构建接入源Logstore,存储3天不建立索引。
* 构建目标Logstore1,用于存储操作日志与错误日志,存储30天并建立索引。
* 构建目标logstore2,用于存储一般性日志,存储7天并建立索引。
这种情况下您的成本约为1672元/每月,与加工之前相比大约可以节省25%的成本。
用户安全
用户安全,是指数据使用者是在授权下使用数据,其所有的操作,是在权限控制下的,且不会在操作过程中,对数据产生安全风险。基于这一需求,我们可以通过阿里云提供的权限控制服务实现这一需求。
阿里云的RAM 中的相关概念如下:
- RAM用户
是一个身份实体,它通常代表您的组织中需要访问云资源的人员或应用程序。
- 用户组
多个可具有相同策略的RAM用户集合。
- RAM角色
是一种虚拟用户,没有确定的身份认证密钥,需要被一个受信的实体用户关联才能正常使用。其可实现同一实体用户的多身份切换,方便权限策略的管理。
- 权限策略
用于描述一组权限集,RAM 支持两种类型的权限策略:由阿里云管理的系统策略和由客户管理的自定义策略。系统策略,统一由阿里云创建,只能使用而不能修改。自定义策略则可更具实际的情况自主创建、更新和删除,相对更为灵活。
- RAM相关概念关系
如图所示,RAM用户、用户组及RAM角色都可以直接与权限策略关联,权限策略则可针对阿里云各服务产品的读、写和列表权限实现控制,为增强权限控制的能力,其还可以对每个产品下的资源,即用户的具体云产品的实例实现更细粒度的管理。同时,阿里云的RAM 策略增加了条件控制,对RAM用户的访问方式实现在时间、源IP、安全通道(https)、多因素认证等方式进行了识别,增加了更多的安全管控方法。
- 策略脚本结构及语法
自定义策略可以通过可视化编辑器及脚本编辑器创建,由于阿里云产品更新的较快,可视化编辑器的可选项与实际可用权限会存在不同步的情况,建议使用脚本编辑器创建。RAM中使用权限策略描述授权的具体内容,权限策略由效果(Effect)、操作(Action)、资源(Resource)、条件(Condition)和授权主体(Principal)等基本元素组成。
权限策略结构包括:版本号(Version)和授权语句列表(Statement)。每条授权语句包括授权效果(Effect)、操作(Action)、资源(Resource)以及条件(Condition,可选项)。
策略脚本样例
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"log:GetConfig",
"log:GetConsumerGroupCheckPoint",
"log:GetDashboard"
],
"Resource": [],
"Condition": {}
}
]
}
策略脚本结构
<version_block> = "Version" : ("1")
// Statement 是个列表,可以添加多个授权语句
<statement_block> = "Statement" : [ <statement>, <statement>, ... ]
// 每个Statement 由effect、action、resource、condition 组成。
<statement> = {
<effect_block>,
<action_block>,
<resource_block>,
<condition_block?>
}
// effect 的可选项为"Allow" 或 "Deny"
<effect_block> = "Effect" : ("Allow" | "Deny")
// action 是各产品的操作描述符
<action_block> = "Action" :
("*" | [<action_string>, <action_string>, ...])
// resource 是各产品具体的用户实例
<resource_block> = "Resource" :
("*" | [<resource_string>, <resource_string>, ...])
// condition 是用户访问方式的识别
<condition_block> = "Condition" :
{
<condition_type_string> : {
<condition_key_string> : [<condition_value>, <condition_value>, ...],
<condition_key_string> : [<condition_value>, <condition_value>, ...],
...
},
<condition_type_string> : {
<condition_key_string> : [<condition_value>, <condition_value>, ...],
<condition_key_string> : [<condition_value>, <condition_value>, ...],
...
}, ...
}
<condition_key_string> = ("acs:CurrentTime"|"acs:SecureTransport"|"acs:SourceIp"|"acs:MFAPresent")
<condition_value> = ("String" | "Number" | "Boolean" | "Date and time" | "IP address")
- 用户角色的设定
基于实际的工作需求,建议由如下四类用户,并根据用户组和RAM角色对每个用户实现更细粒度的管控。
用户 | 说明 | 管理 |
---|---|---|
超管账户 | 可管理所有的阿里云资源 | 基于审计实现管理控制 |
权限管理员 | 用户的权限设定 | 仅有权限控制产品的操作权限 |
运维人员 | 云产品资源配置 | 仅有被授权产品可工作的最小权限 |
使用者 | 业务范围使用者 | 仅有被授权产品可工作的最小权限 |
- 权限策略判断流程
参考文档
https://help.aliyun.com/product/28958.html
https://help.aliyun.com/product/28625.html
https://www.nginxbar.com/pages/7f0a9e