使用 CEPH S3 保護(hù)數(shù)據(jù)免受勒索軟件的侵害
勒索軟件是由威脅實(shí)施者用于勒索受害者錢財(cái)?shù)?惡意軟件 。這種形式的網(wǎng)絡(luò)攻擊是目前盈利最高的犯罪業(yè)務(wù)模式之一。
勒索軟件攻擊 會(huì)讓組織損失數(shù)百萬(wàn)美元,需要數(shù)百小時(shí)來(lái)重建設(shè)備和復(fù)原攻擊期間被破壞的數(shù)據(jù)。通常,組織從 受感染的機(jī)器 收到勒索信,通知他們自己的數(shù)據(jù)已成為目標(biāo)的時(shí)候,才知道遭受了 網(wǎng)絡(luò)攻擊。 典型的 勒索軟件攻擊通常包含幾個(gè)步驟。
首先,系統(tǒng)或 控制服務(wù)器 被入侵,安裝上 惡意軟件。 接下來(lái), 惡意軟件 通過(guò)使用勒索軟件 加密 數(shù)據(jù),取得對(duì)機(jī)器的控制權(quán)。 然后,遭到攻擊的機(jī)器顯示消息和"勒索信",說(shuō)明攻擊者對(duì)個(gè)人或企業(yè)的要求,告訴他們除非支付贖金,否則 加密的文件 不可訪問(wèn)。
每隔幾個(gè)月就會(huì)出現(xiàn)一種新的惡意元素,它會(huì)導(dǎo)致新的不知情和無(wú)意識(shí)的用戶成為勒索軟件的受害者。他們的所有數(shù)據(jù)都被無(wú)限期地加密,在向攻擊者支付一定金額之前不承諾恢復(fù)數(shù)據(jù)。另外支付贖金本身也仍然是一場(chǎng)賭博,很可能是一種兩空的結(jié)果。
這是來(lái)自各種來(lái)源的可視化數(shù)據(jù):Information Is Beautiful(https://informationisbeautiful.net/visualizations/ransomware-attacks/) 。
從圖表中可以看出,每年,這都是一筆不小的數(shù)目支出。
然而,對(duì)于對(duì)象數(shù)據(jù),很少有人嘗試解決這種惡意軟件。
傳統(tǒng)解決方案
解決此類問(wèn)題的傳統(tǒng)解決方案包括訪問(wèn)控制,通過(guò)存儲(chǔ)桶或用戶(https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-iam-policies.html)、 角色 (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)、 服務(wù)(https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) 或?qū)嵤┻吔?https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) 進(jìn)行限制。
所有這些解決方案都通過(guò)限制而不是緩解來(lái)發(fā)揮作用,即確保攻擊不會(huì)發(fā)生,而不是確保它不會(huì)發(fā)生。
對(duì)象鎖定和 S3 版本控制
使用Object Lock (https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html) ,問(wèn)題就消失了,因?yàn)閷?duì)象本身變得不可變。因此,啟用了對(duì)象鎖的存儲(chǔ)桶成為一次寫(xiě)入多次讀取 (WORM)模型的繼承者。
傳統(tǒng)上,當(dāng)更新對(duì)象時(shí),對(duì)象的現(xiàn)有副本會(huì)完全被更新的上傳所取代。啟用對(duì)象鎖定后,較新的上傳只會(huì)獲得另一個(gè)標(biāo)簽(versionId),而較舊的對(duì)象仍保留在原位,也由標(biāo)簽標(biāo)識(shí)。較新的上傳成為對(duì)象的當(dāng)前版本。
Ceph 的對(duì)象網(wǎng)關(guān)包括與 Amazon S3 API 兼容的Ceph 的 S3 API,(https://docs.ceph.com/en/latest/radosgw/s3/)
使用對(duì)象鎖定,每個(gè)對(duì)象都可以通過(guò)合法保留或保留期或兩者的組合來(lái)鎖定。
在詳細(xì)了解這些內(nèi)容之前,讓我們花點(diǎn)時(shí)間想一下為什么需要此設(shè)置:
- 傳統(tǒng)的解決方案是被動(dòng)的,而不是主動(dòng)的。
- 外部解決方案(例如勒索軟件掃描器)需要訪問(wèn)您的數(shù)據(jù),并具有與之相關(guān)的價(jià)格標(biāo)簽。
- 您已經(jīng)在使用 S3,并且更喜歡利用內(nèi)置功能。
如果您發(fā)現(xiàn)自己屬于這些類別,以下內(nèi)容可能會(huì)有所幫助。
保留期(RETENTION PERIOD)
保留期是一種保護(hù)層,可在用戶指定的固定時(shí)間內(nèi)鎖定對(duì)象。根據(jù)用戶提供的Retain until Date鎖定對(duì)象。日期過(guò)去后,除非被合法保留鎖定,否則對(duì)象將再次變?yōu)榭勺儭?/p>
合法保留(LEGAL HOLD)
合法保留是防止對(duì)象被刪除的另一層保護(hù)。它們沒(méi)有與之關(guān)聯(lián)的保留期。合法保留鎖定對(duì)象,直到它們被手動(dòng)移除。任何擁有s3:PutObjectLegalHold權(quán)限的用戶都可以應(yīng)用和刪除它們。
可以在對(duì)象上設(shè)置合法保留和保留模式的組合。
保留模式(RETENTION MODES)
用戶可以選擇兩種具有不同保護(hù)級(jí)別的保留模式:
一些現(xiàn)實(shí)使用的場(chǎng)景
對(duì)象鎖定僅適用于啟用了版本控制的存儲(chǔ)桶。通過(guò)擴(kuò)展,當(dāng)創(chuàng)建一個(gè)啟用了對(duì)象鎖定的存儲(chǔ)桶時(shí),它默認(rèn)啟用了版本控制。
設(shè)置
部署了一個(gè) 3 個(gè)節(jié)點(diǎn)的 Ceph 集群,其中 RADOS 網(wǎng)關(guān)和 S3 是唯一運(yùn)行的服務(wù)。使用的端點(diǎn)是 RADOS 網(wǎng)關(guān)節(jié)點(diǎn)之一。
在下面的示例中,我們?cè)噲D找出保留期和合法保留的工作原理,其中哪個(gè)更寬松。我們已經(jīng)知道合規(guī)模式是其中最嚴(yán)格的,所以讓我們首先在實(shí)踐中看看。
保留期
合規(guī)模式
- 創(chuàng)建啟用對(duì)象鎖定的存儲(chǔ)桶:
$ aws --endpoint-url=http://172.31.117.5 s3api create-bucket --bucket test-bucket --object-lock-enabled-for-bucket
- 使用任一保留策略添加對(duì)象鎖定配置(此處選擇合規(guī)性)
$ 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}}}'
- 將任何對(duì)象添加到存儲(chǔ)桶
$ 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" }
- 確保對(duì)象的對(duì)象保留模式設(shè)置為合規(guī)性
$ 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" } }
- 刪除對(duì)象(不帶版本 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會(huì)導(dǎo)致權(quán)限被拒絕錯(cuò)誤。刪除對(duì)象的特定版本沒(méi)有多大意義,因?yàn)閯h除時(shí)對(duì)象不會(huì)被永久刪除,而是會(huì)在對(duì)象上放置一個(gè)“刪除標(biāo)記”,該對(duì)象將成為其最新版本。
- 列出對(duì)象版本以查明是否已設(shè)置刪除標(biāo)記
$ 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" } ] }
- 對(duì)對(duì)象重新發(fā)出刪除命令
$ 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
- 我們看到我們?cè)O(shè)置的對(duì)象鎖禁止對(duì)象刪除。但是如果我們嘗試刪除它呢?
$ 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
所以從上面可以看出,一旦設(shè)置了合規(guī)模式,就無(wú)法在指定的保留日期過(guò)去之前刪除對(duì)象。
治理模式
- 現(xiàn)在讓我們用治理模式復(fù)制以上所有內(nèi)容,看看它有什么不同。
$ 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" }
- 一旦對(duì)象創(chuàng)建完成,現(xiàn)在讓我們嘗試刪除它。
$ 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" } }
- 所以我們知道我們不能刪除對(duì)象,和以前一樣,但是我們可以繞過(guò)治理模式嗎?
$ 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" } ] }
我們可以。但這只是因?yàn)橛脩魷y(cè)試創(chuàng)建了存儲(chǔ)桶并具有完全控制權(quán)。如果另外一個(gè)人嘗試作為另一個(gè)沒(méi)有s3:BypassGovernanceRetention權(quán)限的用戶來(lái)做呢?
{ "Version": "2022-07-28", "Statement": [ { "Effect": "Deny", "Principal": { "AWS": [ "*" ] }, "Action": "s3:BypassGovernanceRetention", "Resource": "*" } ] }
在應(yīng)用上述拒絕所有用戶權(quán)限的策略后,我們創(chuàng)建另一個(gè)對(duì)象,然后重新嘗試使用繞過(guò)刪除它。
$ 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
我們?cè)谶@里看到,即使用戶完全控制了存儲(chǔ)桶,刪除s3:BypassGovernanceRetention權(quán)限也可以保護(hù)存儲(chǔ)桶不被刪除。
合法持有
通過(guò)合法保留,可以看到類似的情況:
- 創(chuàng)建一個(gè)桶并將對(duì)象放入其中
$ 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
- 嘗試刪除對(duì)象
$ 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
- 合法保留禁止對(duì)象刪除,但在這種情況下,我們可以禁用它并繼續(xù)刪除。
$ $ 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" } ] }
此外,我們也可以刪除刪除標(biāo)記。
$ 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
但是如果我們拒絕所需的許可會(huì)發(fā)生什么?
{ "Version": "2022-07-28", "Statement": [ { "Effect": "Deny", "Principal": { "AWS": [ "*" ] }, "Action": "s3:PutObjectLegalHold", "Resource": "*" } ] }
應(yīng)用上述存儲(chǔ)桶策略后,我們會(huì)看到以下情況:
$ 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
我們注意到?jīng)]有s3:PutObjectLegalHold權(quán)限的用戶將無(wú)法刪除合法保留。
與治理模式不同,只有一個(gè) S3 權(quán)限允許用戶放置和刪除合法保留。
思考與結(jié)論
對(duì)象鎖定是針對(duì)勒索軟件的一個(gè)非常不錯(cuò)的主動(dòng)措施。但是,如上所示,它可能并不適用于所有情況。有一點(diǎn)是當(dāng)對(duì)象經(jīng)常被更新,且舊的對(duì)象無(wú)效時(shí)。又如果對(duì)象的壽命很短,隨著時(shí)間的推移會(huì)出現(xiàn)歷史無(wú)效數(shù)據(jù)的積累,最終由于合規(guī)等模式根本拒絕任何更改,存儲(chǔ)的數(shù)據(jù)最終會(huì)過(guò)多,造成存儲(chǔ)被撐爆。
在數(shù)據(jù)敏感或已知重要的情況下,對(duì)象鎖定會(huì)帶來(lái)高水平的保護(hù)并降低風(fēng)險(xiǎn)。在數(shù)據(jù)安全方面,對(duì)象鎖定無(wú)疑是另一層保護(hù)的有效手段。