使用 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 權限允許用戶放置和刪除合法保留。
思考與結論
對象鎖定是針對勒索軟件的一個非常不錯的主動措施。但是,如上所示,它可能并不適用于所有情況。有一點是當對象經常被更新,且舊的對象無效時。又如果對象的壽命很短,隨著時間的推移會出現歷史無效數據的積累,最終由于合規等模式根本拒絕任何更改,存儲的數據最終會過多,造成存儲被撐爆。
在數據敏感或已知重要的情況下,對象鎖定會帶來高水平的保護并降低風險。在數據安全方面,對象鎖定無疑是另一層保護的有效手段。