使用外部 KMS 密钥加密 AWS S3 对象编辑

识别在 S3 存储桶中使用来自外部账户的 AWS KMS 密钥进行加密的 CopyObject 事件。 攻击者如果能够访问配置错误的 S3 存储桶并拥有适当的权限,则可以使用外部 KMS 密钥加密对象,以阻止受害者访问其自己的数据。

规则类型:esql

规则索引:无

严重程度:中等

风险评分: 47

运行间隔:5 分钟

搜索的索引范围:now-9m(日期数学格式,另请参阅额外的回溯时间

每次执行的最大警报数: 100

参考资料:

标签:

  • 域:云
  • 数据源:AWS
  • 数据源:Amazon Web Services
  • 数据源:AWS S3
  • 数据源:AWS KMS
  • 用例:威胁检测
  • 战术:影响

版本: 1

规则作者:

  • Elastic

规则许可证:Elastic License v2

调查指南编辑

分类和分析

调查使用外部 KMS 密钥加密 AWS S3 对象

此规则检测使用外部 AWS KMS 密钥加密 S3 存储桶中的对象。 能够访问配置错误的 S3 存储桶的攻击者可能会使用外部密钥复制存储桶中的对象,并阻止受害者访问其自己的数据。 此规则使用 ES|QL 来查找 CopyObject 操作的使用,其中目标存储桶的 cloud.account.id 与从用于加密的 AWS KMS 密钥中解析的 key.account.id 不同。

可能的调查步骤

  • 识别参与者:查看 aws.cloudtrail.user_identity.arnaws.cloudtrail.user_identity.access_key_id 字段,以识别执行操作的用户。 验证此参与者是否通常执行此类操作,以及他们是否具有必要的权限。
  • 查看请求详细信息:检查 aws.cloudtrail.request_parameters 以了解 CopyObject 操作的具体细节。 查找任何可能表明未经授权或恶意修改或使用未知 KMS keyId 的异常参数。
  • 分析请求来源:调查 source.ipsource.geo 字段,以确定请求的地理来源。 外部或意外的位置可能表明凭据遭到泄露或存在未经授权的访问。
  • 结合时间戳进行情境化:使用 @timestamp 字段检查对象复制的时间。 在非工作时间或定期维护窗口之外进行的更改可能需要进一步审查。
  • 与其他活动关联:搜索此操作前后相关的 CloudTrail 事件,以查看相同的参与者或 IP 地址是否参与了其他可能的可疑活动。
  • 检查对象删除或访问:查找对同一 S3 存储桶的 DeleteObjectDeleteObjectsGetObject API 调用,这些调用可能表明攻击者正在访问和销毁对象(包括旧的对象版本)。
  • 询问相关人员:如果复制事件是由用户发起的,请与负责管理 S3 存储桶的人员或团队核实此操作的目的和授权。

误报分析

  • 合法的管理操作:确认 CopyObject 操作是否与变更管理系统中记录的计划更新、维护活动或合法的管理任务一致。
  • 一致性检查:将操作与用户或组织内执行的类似活动的歷史数据进行比较。 如果该操作与过去的合法活动一致,则可能表明这是一个误报。

响应和修复

  • 立即审查:如果活动未经授权,请搜索放置在 S3 存储桶中的潜在勒索信息,并查看存储桶的访问日志以查找任何可疑活动。
  • 增强监控和警报:调整监控系统,以便在出现类似的 CopyObject 操作时发出警报,尤其是在涉及敏感数据或异常文件扩展名的情况下。
  • 教育和培训:为拥有管理权限的用户提供额外培训,让他们了解有关 S3 存储桶管理的安全最佳实践的重要性,以及勒索软件的风险。
  • 审核 S3 存储桶策略和权限:对所有 S3 存储桶策略和关联权限进行全面审核,以确保它们遵循最小权限原则。
  • 事件响应:如果有恶意企图或安全漏洞的迹象,请启动事件响应协议,以减轻任何损害并防止未来再次发生。

其他信息

有关管理 S3 存储桶安全和防范勒索软件的更多指南,请参阅AWS S3 文档和 AWS 安全最佳实践。 此外,有关 S3 勒索软件防护的具体细节,请参阅以下资源:- ERMETIC 报告 - AWS S3 勒索软件暴露在野 - S3 勒索软件第 1 部分:攻击向量

设置编辑

需要在 CloudTrail 跟踪配置中启用 AWS S3 数据事件类型。

规则查询编辑

from logs-aws.cloudtrail-*

// any successful copy event
| where event.dataset == "aws.cloudtrail"
    and event.provider == "s3.amazonaws.com"
    and event.action == "CopyObject"
    and event.outcome == "success"

// abstract key account id, key id, encrypted object bucket name and object name
| dissect aws.cloudtrail.request_parameters "{%{?bucketName}=%{target.bucketName},%{?x-amz-server-side-encryption-aws-kms-key-id}=%{?arn}:%{?aws}:%{?kms}:%{?region}:%{key.account.id}:%{?key}/%{keyId},%{?Host}=%{?tls.client.server_name},%{?x-amz-server-side-encryption}=%{?server-side-encryption},%{?x-amz-copy-source}=%{?bucket.objectName},%{?key}=%{target.objectName}}"

// filter for s3 objects whose account id is different from the encryption key's account id
// add exceptions based on key.account.id or keyId for known external accounts or encryption keys
| where cloud.account.id != key.account.id

框架:MITRE ATT&CKTM