背景信息
阿里云日志服务(SLS)通过提供一个Splunk插件(Add-on)实现SLS与Splunk的日志对接, 以便确保阿里云上的所有法规、审计、与其他相关日志能够导入到客户的安全运维中心(SOC)中。本文主要介绍如何在该Splunk Add-on中使用ECS实例RAM角色的鉴权方式,完成日志服务(SLS)到Splunk的日志投递过程。
SLS介绍
阿里云的日志服务(log service)是针对日志类数据的一站式服务,无需开发就能快捷完成海量日志数据的采集、消费、投递以及查询分析等功能,提升运维、运营效率。日志服务主要包括 实时采集与消费、数据投递、查询与实时分析 等功能,适用于从实时监控到数据仓库的各种开发、运维、运营与安全场景。
- 日志库(Logstore):日志服务中日志数据的采集、存储和查询单元。每个日志库隶属于一个项目,且每个项目可以创建多个日志库。您可以根据实际需求为某一个项目生成多个日志库,其中常见的做法是为一个应用中的每类日志创建一个独立的日志库。
- 分区(Shard):Logstore读写日志必定保存在某一个分区(Shard)上。每个日志库(Logstore)分若干个分区,每个分区由MD5左闭右开区间组成,每个区间范围不会相互覆盖,并且所有的区间的范围是MD5整个取值范围。
- 服务入口(Endpoint):日志服务入口是访问一个项目(Project)及其内部日志数据的 URL。它和 Project 所在的阿里云区域(Region)及 Project 名称相关。包括公网服务入口、经典/VPC网络服务入口、全球加速服务入口。
- 访问密钥(AccessKey):阿里云访问密钥是阿里云为用户使用 API(非控制台)来访问其云资源设计的安全口令。您可以用它来签名 API 请求内容以通过服务端的安全验证。
- 消费组(Consumer Group):一个消费组由多个消费者构成,同一个消费组下面的消费者共同消费一个logstore中的数据,消费者之间不会重复消费数据。
- 消费者(Consumer):消费组的构成单元,实际承担消费任务,同一个消费组下面的消费者名称必须不同。
Splunk介绍
Splunk是一个功能完备的企业级产品,提供了命令行窗口,web图形界面接口和其他接口,查询结果展示,数据查询,权限控制,分布式管理服务,数据索引,网络端口监听,数据警报,文件监听等等。
一个典型的Splunk分布式部署由三部分组成:
- 转发器(Forwarder):转发器可获取数据,然后通常会将数据继续转发至索引器。
- 索引器(Indexer):索引器会对从转发器组传入的数据进行索引;响应搜索头的搜索请求。
- 搜索头(Search Head):搜索头与用户交互,将搜索请求指向一组索引器,并合并结果返回给用户。
上图是一个典型的Splunk集群部署。索引集群由如下节点类型组成:
•单个主节点,用于管理群集。主节点是一种特殊类型的索引器。
• 多个对等节点,用于处理群集的索引功能、维护数据的多个副本及为其建立索引,以及对数据执行搜索。
• 一个或多个搜索头,用于协调所有对等节点的搜索。 索引器群集功能会自动从一个对等节点故障转移到下一个对等节点。这意味着,如果一个或多个对等节点出现故障,可继续为传入数据创建索引,且索引数据继续保持可搜索状态。 转发器分为如下三种类型: - 通用转发器(universal forwarder ):仅包含转发数据所需的组件。 - 重型转发器(heavy forwarder):完整的Splunk实例,能够索引、搜索、更改数据,同时也可以转发数据。如果需要分析数据或更改数据或根据内容做控制,则需要使用重型转发器。 - 轻型转发器:已废弃。
本文提到的阿里云日志服务的Splunk Add-on就是运行在Splunk Heavy Forwarder上的一种组件。Forwarder与Indexer之间进行消息通信,可以使用Splunk私有的事件协议实现,也可以基于Http事件接收器(Splunk Http Event Collector,简称HEC)实现。
SLS Splunk Add-on
阿里云日志服务Splunk Add-on从阿里云日志服务(SLS)采集日志并投递到Splunk。主要的特性如下:
- 通过Splunk data input创建SLS消费组,并从阿里云日志服务进行实时日志消费。
- 将采集到的日志通过Splunk私有协议(private protocol)或者HTTP Event Collector(HEC)投递到Splunk indexer。
更详细关于SLS Splunk Add-on的介绍可以参考阿里云日志服务Splunk Add-on
ECS实例RAM角色
ECS实例RAM角色允许将一个角色关联到ECS实例,在ECS实例内部基于STS(Security Token Service)临时凭证访问其他云产品的API,临时凭证将周期性更新。即可以保证云账号AccessKey安全,还可以借助访问控制RAM实现精细化控制和权限管理。
应用场景
ECS实例上部署的应用程序在云产品通信中,通过云账号或者RAM用户的AccessKey访问阿里云其他云产品(例如SLS、OSS、VPC、RDS等)的API。为了方便和快速地调用,部分用户直接把AccessKey固化在实例中,如写在配置文件中。这种方式存在权限过高、泄露信息和难以维护等问题。ECS实例RAM角色能避免此类问题,例如在ECS实例中使用STS临时凭证访问阿里云的其他云服务。
ECS实例RAM(Resource Access Management)角色让ECS实例扮演具有某些权限的角色,从而赋予实例一定的访问权限。关于角色的详细描述,请参见RAM角色概览。
功能优势
使用实例RAM角色的优势在于:
- 借助实例RAM角色,将角色和ECS实例关联起来。
- 使用STS临时凭证访问阿里云的其他云服务。
- 为不同的实例赋予包含不同授权策略的角色,使它们对不同的云资源具有不同的访问权限,实现更精细粒度的权限控制。
- 无需自行在实例中保存AccessKey,通过修改角色的授权即可变更权限,快捷地维护ECS实例所拥有的访问权限。
使用步骤
准备工作
- 确保Splunk运行在阿里云ECS上
- 如果运行在非阿里云ECS上,只能使用阿里云访问密钥AccessKey ID和AccessKey Secret来访问日志服务,其配置步骤参考阿里云日志服务Splunk Add-on
- 检查Splunk版本及运行环境
- 确保使用最新的Add-on版本
- 操作系统:Linux、Mac OS、Windows
- Splunk版本:Splunk heavy forwarder 8.0及以上版本、Splunk indexer 7.0及以上版本。
- 配置Splunk HTTP Event Collector
- 如果需要使用HEC来发送event,请确保HEC配置成功。如果选择Splunk私有协议,则可以跳过该步骤。
- 请参见Configure HTTP Event Collector on Splunk Enterprise。
- 目前创建Event Collector token时,不支持开启indexer acknowledgment功能。
为ECS实例绑定RAM角色
- 创建实例RAM角色
- 云账号登录RAM控制台,在左侧导航栏,单击RAM角色管理->创建RAM角色,当前可信实体类型选择为阿里云服务,单击下一步;选择角色类型为普通服务角色,输入角色名称(记住这个角色名称,后面配置SLS Splunk Add-on时会用到),受信服务为云服务器,点击完成。
- 为RAM角色授予权限
- 为上一步创建的RAM角色授予访问日志服务SLS的权限
- 您可以通过权限助手配置RAM权限,详情请参见配置权限助手。常用的RAM配置如下:
{ "Version": "1", "Statement": [ { "Action": [ "log:ListShards", "log:GetCursorOrData", "log:GetConsumerGroupCheckPoint", "log:UpdateConsumerGroup", "log:ConsumerGroupHeartBeat", "log:ConsumerGroupUpdateCheckPoint", "log:ListConsumerGroup", "log:CreateConsumerGroup" ], "Resource": [ "acs:log:*:*:project/<Project name>/logstore/<Logstore name>", "acs:log:*:*:project/<Project name>/logstore/<Logstore name>/*" ], "Effect": "Allow" } ] }
说明:为您的日志服务Project名称,为您的日志服务Logstore名称,请根据实际情况替换,名字替换支持通配符*。
- 为ECS实例绑定RAM角色
- 登录ECS管理控制台,在左侧导航栏点击实例与镜像->实例,找到要操作的ECS实例,选择更多->实例设置->授予/收回RAM角色,在弹窗重,选择创建前面步骤中创建好的实例RAM角色,点击确定完成授予。
- 用户也可以在创建ECS实例时,在系统配置页面的RAM角色属性中为实例选择已创建好的实例RAM角色。
安装SLS Splunk Add-on
这里提供两种通过Splunk web UI安装Splunk Add-on的方式:
- 管理应用->浏览更多应用->搜索“Splunk Add-on for Alibaba Cloud Log Service”->点击“安装”->点击“重启 Splunk服务”。
- 管理应用->从文件安装应用->上传.tgz文件,可以从https://splunkbase.splunk.com/apps下载->选择“升级应用程序选中它将覆盖已存在的应用程序”->点击“上载”按钮->点击“重启 Splunk服务”。
配置SLS Splunk Add-on
通过Splunk Web UI 选择应用,进入"Splunk Add-on for Alibaba Cloud Log Service"界面。
全局账号配置
在“配置-Account”界面, 配置ECS实例的RAM角色信息
- 添加一个账号,用户名固定不变为ECS_RAM_ROLE,密码是步骤“为ECS实例绑定RAM角色中所创建的RAM角色名称。
添加data input
在“输入”界面,点击"Create New Input"可以创建新的data input。具体的配置参数如下:
- 其中SLS AccessKey参数选择【全局账号配置】步骤中配置的账号
参数 |
必选项 & 格式 |
描述 |
取值举例 |
名字 |
Yes, String |
全局唯一的Data input名 |
|
间隔 |
Yes, Integer |
Splunk data input退出后的重启时间。 单位:s。 |
默认值: 10(s) |
索引 |
Yes, String |
Splunk索引 |
|
Yes, String |
全局账号配置中配置的"Account name"。 |
||
Yes, String |
阿里云日志服务入口。 关于HTTPS的更多信息,详见“规格及安全--HTTPS”部分。 |
cn-huhehaote.log.aliyuncs.com |
|
Yes, String |
日志服务Project。 |
- |
|
Yes, String |
日志服务Logstore。 |
- |
|
Yes, String |
日志服务消费组。 扩容时,多个data input需要配置相同的消费组名称。 更多信息详见“机制”部分。 |
- |
|
SLS cursor start time |
Yes, String |
消费起始时间。 该参数只有消费组首次创建时有效。非首次创建日志都是从上次的保存点开始消费。 注意:这里的时间是日志到达时间。 |
取值:“begin”、“end”、“ISO格式的时间(例如2018-12-26 0:0:0+8:00)”。 |
SLS heartbeat interval |
Yes, Integer |
SLS消费者与Sever间的心跳间隔。 单位:s。 |
默认值: 60(s) |
SLS data fetch interval |
Yes, Integer |
日志拉取间隔,如果日志频率较低,建议不要设的太小。 单位:s。 |
默认值: 1(s) |
Topic filter |
No, String |
Topic过滤字符串,以;间隔区分多个过滤的Topic。 如果日志的topic被命中,则该日志会被忽略掉,从而不能投递到Splunk。 |
“TopicA;TopicB”意味着topic为“TopicA”or “TopicB”的日志将被忽略。 |
Unfolded fields |
No, Json |
Json格式的topic到字段列表的映射关系。 {"topicA": ["field_nameA1", "field_nameA2", ...], "topicB": ["field_nameB1", "field_nameB2", ...], ...} |
{"actiontrail_audit_event": ["event"] } 意味着对于topic为 "actiontrail_audit_event"的日志, 该日志的 "event"字段将从字符串展开成Json格式。 |
Event source |
No, String |
Splunk event数据源 |
- |
Event source type |
No, String |
Splunk event数据源类型 |
- |
Event retry times |
No, Integer |
0表示无限重传。 |
默认值: 0次 |
Event protocol |
Yes |
Splunk event发送协议。如果选择私有协议,后续参数可以忽略。 |
HTTP for HEC HTTPS for HEC Private protocol |
Yes,只有Event protocol选择HEC时有效,String。 |
HEC host。 |
- |
|
HEC port |
Yes,只有Event protocol选择HEC时有效,Integer。 |
HEC端口。 |
- |
Yes,只有Event protocol选择HEC时有效,String。 |
HEC token。 |
||
HEC timeout |
Yes,只有Event protocol选择HEC时有效,Integer。 |
HEC超时时间。 |
默认: 120(s) |
总结
以往用户在使用SLS Splunk Add-on将日志从SLS投递到Splunk时,需要借助AccessKeyID和AccessKeySecret来实现。用户需要为对应的AK做严格的权限控制,并且在Splunk的账号配置中保存相应的AK_ID和AK_Secret。这在一定程度上增加了AK管理的复杂性,并且降低了AK的保密性。如果用户需要实现多地域部署,AK会随着多台实例扩的创建而散出去。这种情况下,当用户需要更换AK时,用户就需要逐台更新和重新部署实例中的AK信息。
现在借助于ECS实例RAM角色,用户可以将RAM角色和ECS实例关联起来,在ECS实例内部可以通过STS临时凭证访问日志服务SLS。其中STS临时凭证由系统自动生成和更新,SLS Splunk Add-on可以使用指定的实例元数据URL获取STS临时凭证,无需特别管理。