使用 CEPH S3 保护数据免受勒索软件的侵害

安全 数据安全
勒索软件攻击 会让组织损失数百万美元,需要数百小时来重建设备和复原攻击期间被破坏的数据。通常,组织从 受感染的机器 收到勒索信,通知他们自己的数据已成为目标的时候,才知道遭受了 网络攻击。

勒索软件是由威胁实施者用于勒索受害者钱财的 恶意软件 。这种形式的网络攻击是目前盈利最高的犯罪业务模式之一。

勒索软件攻击 会让组织损失数百万美元,需要数百小时来重建设备和复原攻击期间被破坏的数据。通常,组织从 受感染的机器 收到勒索信,通知他们自己的数据已成为目标的时候,才知道遭受了 网络攻击。  典型的 勒索软件攻击通常包含几个步骤。  

首先,系统或 控制服务器 被入侵,安装上 恶意软件。 接下来, 恶意软件 通过使用勒索软件 加密 数据,取得对机器的控制权。 然后,遭到攻击的机器显示消息和"勒索信",说明攻击者对个人或企业的要求,告诉他们除非支付赎金,否则 加密的文件 不可访问。

每隔几个月就会出现一种新的恶意元素,它会导致新的不知情和无意识的用户成为勒索软件的受害者。他们的所有数据都被无限期地加密,在向攻击者支付一定金额之前不承诺恢复数据。另外支付赎金本身也仍然是一场赌博,很可能是一种两空的结果。

这是来自各种来源的可视化数据:Information Is Beautiful(https://informationisbeautiful.net/visualizations/ransomware-attacks/) 。

从图表中可以看出,每年,这都是一笔不小的数目支出。

然而,对于对象数据,很少有人尝试解决这种恶意软件。

传统解决方案

解决此类问题的传统解决方案包括访问控制,通过存储桶或用户(https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-iam-policies.html)、 角色 (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)、 服务(https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) 或实施边界(https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) 进行限制。

所有这些解决方案都通过限制而不是缓解来发挥作用,即确保攻击不会发生,而不是确保它不会发生。

图片

对象锁定和 S3 版本控制

使用Object Lock (https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html) ,问题就消失了,因为对象本身变得不可变。因此,启用了对象锁的存储桶成为一次写入多次读取 (WORM)模型的继承者。

传统上,当更新对象时,对象的现有副本会完全被更新的上传所取代。启用对象锁定后,较新的上传只会获得另一个标签(versionId),而较旧的对象仍保留在原位,也由标签标识。较新的上传成为对象的当前版本。

Ceph 的对象网关包括与 Amazon S3 API 兼容的Ceph 的 S3 API,(https://docs.ceph.com/en/latest/radosgw/s3/)

使用对象锁定,每个对象都可以通过合法保留或保留期或两者的组合来锁定。

在详细了解这些内容之前,让我们花点时间想一下为什么需要此设置:

  • 传统的解决方案是被动的,而不是主动的。
  • 外部解决方案(例如勒索软件扫描器)需要访问您的数据,并具有与之相关的价格标签。
  • 您已经在使用 S3,并且更喜欢利用内置功能。

如果您发现自己属于这些类别,以下内容可能会有所帮助。

保留期(RETENTION PERIOD)

保留期是一种保护层,可在用户指定的固定时间内锁定对象。根据用户提供的Retain until Date锁定对象。日期过去后,除非被合法保留锁定,否则对象将再次变为可变。

合法保留(LEGAL HOLD)

合法保留是防止对象被删除的另一层保护。它们没有与之关联的保留期。合法保留锁定对象,直到它们被手动移除。任何拥有s3:PutObjectLegalHold权限的用户都可以应用和删除它们。

可以在对象上设置合法保留和保留模式的组合。

保留模式(RETENTION MODES)

用户可以选择两种具有不同保护级别的保留模式:


图片

一些现实使用的场景

对象锁定仅适用于启用了版本控制的存储桶。通过扩展,当创建一个启用了对象锁定的存储桶时,它默认启用了版本控制。

设置

部署了一个 3 个节点的 Ceph 集群,其中 RADOS 网关和 S3 是唯一运行的服务。使用的端点是 RADOS 网关节点之一。

在下面的示例中,我们试图找出保留期和合法保留的工作原理,其中哪个更宽松。我们已经知道合规模式是其中最严格的,所以让我们首先在实践中看看。

图片

保留期

合规模式

  • 创建启用对象锁定的存储桶:
$ aws --endpoint-url=http://172.31.117.5 s3api create-bucket --bucket test-bucket --object-lock-enabled-for-bucket
  • 使用任一保留策略添加对象锁定配置(此处选择合规性)
$ aws --endpoint-url=http://172.31.117.5 s3api put-object-lock-configuration --bucket test-bucket --object-lock-configuration '{"ObjectLockEnabled":"Enabled","Rule":{"DefaultRetention":{"Mode":"COMPLIANCE","Days":90}}}'
  • 将任何对象添加到存储桶
$ aws --endpoint-url=http://172.31.117.5 s3api put-object --bucket test-bucket --body some-object.png --key some-object.png  {     "ETag": "\"0700710d411b6bb8e62c48afbef55ab6\"",     "VersionId": "vuKWwf0EJi70w5EYsLLh2eU9Sun2Wod" }
  • 确保对象的对象保留模式设置为合规性
$ aws --endpoint-url=http://172.31.117.5 s3api get-object-retention --bucket test-bucket --key some-object.png  {     "Retention": {         "Mode": "COMPLIANCE",         "RetainUntilDate": "2022-10-26T07:48:57.740441+00:00"     } }
  • 删除对象(不带版本 ID)
$ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png {     "DeleteMarker": true,     "VersionId": "OsXsNSWZe2oLisQ4.kEeDo1xjwklui0" }

指定VersionId会导致权限被拒绝错误。删除对象的特定版本没有多大意义,因为删除时对象不会被永久删除,而是会在对象上放置一个“删除标记”,该对象将成为其最新版本。

  • 列出对象版本以查明是否已设置删除标记
$ aws --endpoint-url=http://172.31.117.5 s3api list-object-versions --bucket test-bucket {     "Versions": [         {             "ETag": "\"0700710d411b6bb8e62c48afbef55ab6\"",             "Size": 10485760,             "StorageClass": "STANDARD",             "Key": "some-object.png",             "VersionId": "vuKWwf0EJi70w5EYsLLh2eU9Sun2Wod",             "IsLatest": false,             "LastModified": "2022-07-28T07:48:57.740000+00:00",             "Owner": {                 "DisplayName": "test",                 "ID": "test"             }         }     ],     "DeleteMarkers": [         {             "Owner": {                 "DisplayName": "test",                 "ID": "test"             },             "Key": "some-object.png",             "VersionId": "OsXsNSWZe2oLisQ4.kEeDo1xjwklui0",             "IsLatest": true,             "LastModified": "2022-07-28T07:50:04.717000+00:00"         }     ] }
  • 对对象重新发出删除命令
$ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png --version-id vuKWwf0EJi70w5EYsLLh2eU9Sun2Wod An error occurred (AccessDenied) when calling the DeleteObject operation: forbidden by object lock
  • 我们看到我们设置的对象锁禁止对象删除。但是如果我们尝试删除它呢?
$ aws --endpoint-url=http://172.31.117.5 s3api put-object-retention --bucket test-bucket --key some-object.png --version-id vuKWwf0EJi70w5EYsLLh2eU9Sun2Wod --retention '{ "Mode": "GOVERNANCE", "RetainUntilDate": "2025-01-01T00:00:00" }' An error occurred (AccessDenied) when calling the PutObjectRetention operation: can't change retention mode from COMPLIANCE to GOVERNANCE

好的,但是如果我们尝试缩短保留期呢?

$ aws --endpoint-url=http://172.31.117.5 s3api put-object-retention --bucket test-bucket --key some-object.png --version-id vuKWwf0EJi70w5EYsLLh2eU9Sun2Wod --retention '{ "Mode": "COMPLIANCE", "RetainUntilDate": "2022-08-01T00:00:00" }' An error occurred (AccessDenied) when calling the PutObjectRetention operation: proposed retain-until date shortens an existing retention period and governance bypass check failed

所以从上面可以看出,一旦设置了合规模式,就无法在指定的保留日期过去之前删除对象。

治理模式

  • 现在让我们用治理模式复制以上所有内容,看看它有什么不同。
$ aws --endpoint-url=http://172.31.117.5 s3api create-bucket --bucket test-bucket --object-lock-enabled-for-bucket $ aws --endpoint-url=http://172.31.117.5 s3api put-object-lock-configuration --bucket test-bucket --object-lock-configuration '{"ObjectLockEnabled":"Enabled","Rule":{"DefaultRetention":{"Mode":"GOVERNANCE","Days":90}}}' $ aws --endpoint-url=http://172.31.117.5 s3api put-object --bucket test-bucket --body some-object.png --key some-object.png {     "ETag": "\"0700710d411b6bb8e62c48afbef55ab6\"",     "VersionId": "Ma6soN3GryqETDZsgz8Re3dPHf-caC9" }
  • 一旦对象创建完成,现在让我们尝试删除它。
$ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png {     "DeleteMarker": true,     "VersionId": "SfuC0rhMyBDjo.LO0wLcQVqaAy9A5za" } $ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png --version-id Ma6soN3GryqETDZsgz8Re3dPHf-caC9 An error occurred (AccessDenied) when calling the DeleteObject operation: forbidden by object lock $ aws --endpoint-url=http://172.31.117.5 s3api get-object-retention --bucket test-bucket --key some-object.png --version-id Ma6soN3GryqETDZsgz8Re3dPHf-caC9 {     "Retention": {         "Mode": "GOVERNANCE",         "RetainUntilDate": "2022-10-26T10:11:46.921668+00:00"     } }
  • 所以我们知道我们不能删除对象,和以前一样,但是我们可以绕过治理模式吗?
$ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png --version-id Ma6soN3GryqETDZsgz8Re3dPHf-caC9 --bypass-governance {     "VersionId": "Ma6soN3GryqETDZsgz8Re3dPHf-caC9" } $ aws --endpoint-url=http://172.31.117.5 s3api list-object-versions --bucket test-bucket {     "DeleteMarkers": [         {             "Owner": {                 "DisplayName": "test",                 "ID": "test"             },             "Key": "some-object.png",             "VersionId": "SfuC0rhMyBDjo.LO0wLcQVqaAy9A5za",             "IsLatest": true,             "LastModified": "2022-07-28T10:12:50.432000+00:00"         }     ] }

我们可以。但这只是因为用户测试创建了存储桶并具有完全控制权。如果另外一个人尝试作为另一个没有s3:BypassGovernanceRetention权限的用户来做呢?

{   "Version": "2022-07-28",   "Statement": [     {       "Effect": "Deny",       "Principal": {         "AWS": [           "*"         ]       },       "Action": "s3:BypassGovernanceRetention",       "Resource": "*"     }   ] }

在应用上述拒绝所有用户权限的策略后,我们创建另一个对象,然后重新尝试使用绕过删除它。

$ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png --version-id O6P4CX9Q8KDvQpRv.7Qse7a1.6xXJP6 --bypass-governance An error occurred (AccessDenied) when calling the DeleteObject operation: forbidden by object lock

我们在这里看到,即使用户完全控制了存储桶,删除s3:BypassGovernanceRetention权限也可以保护存储桶不被删除。

合法持有

通过合法保留,可以看到类似的情况:

  • 创建一个桶并将对象放入其中
$ aws --endpoint-url=http://172.31.117.5 s3api create-bucket --bucket test-bucket --object-lock-enabled-for-bucket $ aws --endpoint-url=http://172.31.117.5 s3api put-object --bucket test-bucket --body some-object.png --key some-object.png {     "ETag": "\"0700710d411b6bb8e62c48afbef55ab6\"",     "VersionId": "8jCB7AaXQoibKbVSrA3fnHqER-7QYrN" }
  • 添加合法保留
$ aws --endpoint-url=http://172.31.117.5 s3api put-object-legal-hold --bucket test-bucket --key some-object.png --legal-hold Status=ON
  • 尝试删除对象
$ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png {     "DeleteMarker": true,     "VersionId": "iYZ6Fm4fKmPQGqJ55uuIIm--6o5GOJX" } $ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png --version-id 8jCB7AaXQoibKbVSrA3fnHqER-7QYrN An error occurred (AccessDenied) when calling the DeleteObject operation: forbidden by object lock
  • 合法保留禁止对象删除,但在这种情况下,我们可以禁用它并继续删除。
$ $ aws --endpoint-url=http://172.31.117.5 s3api put-object-legal-hold --bucket test-bucket --key some-object.png --version-id 8jCB7AaXQoibKbVSrA3fnHqER-7QYrN --legal-hold Status=OFF $ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png --version-id 8jCB7AaXQoibKbVSrA3fnHqER-7QYrN {     "VersionId": "8jCB7AaXQoibKbVSrA3fnHqER-7QYrN" } $ aws --endpoint-url=http://172.31.117.5 s3api list-object-versions --bucket test-bucket {     "DeleteMarkers": [         {             "Owner": {                 "DisplayName": "test",                 "ID": "test"             },             "Key": "some-object.png",             "VersionId": "iYZ6Fm4fKmPQGqJ55uuIIm--6o5GOJX",             "IsLatest": true,             "LastModified": "2022-07-28T08:34:25.281000+00:00"         }     ] }

此外,我们也可以删除删除标记。

$ aws --endpoint-url=http://172.31.117.5 s3api delete-object --bucket test-bucket --key some-object.png --version-id iYZ6Fm4fKmPQGqJ55uuIIm--6o5GOJX {     "DeleteMarker": true,     "VersionId": "iYZ6Fm4fKmPQGqJ55uuIIm--6o5GOJX" } $ aws --endpoint-url=http://172.31.117.5 s3api list-object-versions --bucket test-bucket

但是如果我们拒绝所需的许可会发生什么?

{   "Version": "2022-07-28",   "Statement": [     {       "Effect": "Deny",       "Principal": {         "AWS": [           "*"         ]       },       "Action": "s3:PutObjectLegalHold",       "Resource": "*"     }   ] }

应用上述存储桶策略后,我们会看到以下情况:

$ aws --endpoint-url=http://172.31.117.5 s3api put-object-legal-hold --bucket test-bucket --key some-object.png --version-id VgtT3qRPjleP5tILYI8X0f7XUL7i2jL --legal-hold Status=OFF An error occurred (AccessDenied) when calling the PutObjectLegalHold operation: Unknown

我们注意到没有s3:PutObjectLegalHold权限的用户将无法删除合法保留。

与治理模式不同,只有一个 S3 权限允许用户放置和删除合法保留。

思考与结论

对象锁定是针对勒索软件的一个非常不错的主动措施。但是,如上所示,它可能并不适用于所有情况。有一点是当对象经常被更新,且旧的对象无效时。又如果对象的寿命很短,随着时间的推移会出现历史无效数据的积累,最终由于合规等模式根本拒绝任何更改,存储的数据最终会过多,造成存储被撑爆。

在数据敏感或已知重要的情况下,对象锁定会带来高水平的保护并降低风险。在数据安全方面,对象锁定无疑是另一层保护的有效手段。

责任编辑:武晓燕 来源: 新钛云服
相关推荐

2021-03-01 09:40:54

数据安全软件

2022-05-18 17:47:19

VeritasKubernetes数据

2023-09-02 01:50:55

2018-07-09 05:51:13

2023-05-05 11:44:06

2023-04-28 14:07:04

2020-11-12 09:38:31

安全数据勒索软件

2021-08-02 10:06:53

勒索软件恶意软件安全

2020-07-19 07:40:56

勒索软件网络攻击漏洞

2020-08-18 09:24:00

勒索病毒网络安全攻击

2021-07-27 12:38:07

Kubernetes攻击者勒索软件

2024-03-13 09:00:00

人工智能Nightshade人工智能毒化

2021-03-05 10:17:32

保护组织勒索软件网络安全

2022-10-26 09:55:23

2022-11-08 12:36:56

2023-03-20 10:09:13

2019-03-14 08:56:49

物联网安全物联网产品物联网

2022-05-20 15:59:03

勒索软件网络安全

2018-03-25 10:52:06

Amazon S3数据存储

2018-05-17 22:30:01

Amazon S3收集存储
点赞
收藏

51CTO技术栈公众号