rgw:數(shù)據(jù)加密

rgw數(shù)據(jù)加密

rgw網(wǎng)關(guān)收到客戶端的數(shù)據(jù)后,先對數(shù)據(jù)進行加密,然后再存到rados集群里面。同理,讀取數(shù)據(jù)的時候,rgw先進行解密,然后再發(fā)送給客戶端。數(shù)據(jù)加解密的過程都是在rgw里面完成,此時rgw需要加解密的密鑰和對應(yīng)的算法。

ceph rgw(v12.2.12)里面按保存加密密鑰的方式,分為兩種情況:
1、由客戶端負責指定加密密鑰,當前僅支持AES256加密算法;
2、由rgw網(wǎng)關(guān)負責指定加密密鑰,所有網(wǎng)關(guān)實例共用此密鑰;
如果客戶端上傳、下載時指定了密鑰的同時,rgw網(wǎng)關(guān)也配置了加密密鑰,優(yōu)先使用客戶端指定的密鑰進行數(shù)據(jù)加解密。

加密密鑰保存在客戶端

也就是客戶端自己負責密鑰的管理,rgw不負責保存。每次上傳、下載數(shù)據(jù)的時候都需要指定加密密鑰和加密算法。

上傳下載對象例子

[root@ceph03 ~]# cat put.py
import boto3
import os

BUCKET = 'bk01'
KEY = os.urandom(32)

s3 = boto3.client('s3', endpoint_url="[http://192.168.10.20:7480](http://192.168.10.20:7480)")
s3.put_object(Bucket=BUCKET,
Key='foobar', Body=b'foobar',
SSECustomerKey=KEY,
SSECustomerAlgorithm='AES256')
print("put done")
print("getting object")
response = s3.get_object(Bucket=BUCKET, Key='foobar', SSECustomerKey=KEY, SSECustomerAlgorithm='AES256') print(response['Body'].read())

加密密鑰保存在rgw

在集群配置文件/etc/ceph/ceph.conf里面,通過rgw crypt default encryption key來指定,缺點就是暴露了加密密鑰。

[client.rgw.rgw1]
...
rgw crypt default encryption key = 4YSmvJtBv0aZ7geVgAsdpRnLBEwWSWlMIGnRS8a9TSA=
rgw_crypt_require_ssl = false

然后客戶端和正常的使用方式一樣,上傳數(shù)據(jù)時,rgw會對數(shù)據(jù)進行加密保存。

持久化客戶端的密鑰

rgw客戶端上傳數(shù)據(jù)時,可以指定密鑰,但后面如果忘記了這個密鑰,就會無法讀取數(shù)據(jù)了。這個時候我們存儲系統(tǒng)需要保證客戶端能夠在忘記密鑰的時候,也能讀取數(shù)據(jù)。

實現(xiàn)思路就是客戶端在上傳數(shù)據(jù)時,把指定的密鑰保存在應(yīng)用數(shù)據(jù)對象的head對象的xattr里面。這樣就算客戶端忘記密鑰了,也可以通過rados getxattr來獲取密鑰。

當然也可以增加配置項,來讓用戶決定是否開啟該功能。

修改代碼

rgw_crypt.cc文件:

int rgw_s3_prepare_decrypt(...){

...

    std::string key_bin;

    try {

        key_bin = from_base64(s->info.env->get("HTTP_X_AMZ_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY", ""));

        // save user custom encrypt key to attr. start dyp

        string custom_key = to_base64(key_bin);

        bufferlist custom_key_bl;

        custom_key_bl.append(custom_key.c_str(), custom_key.size() + 1);

        attrs.emplace(std::move(RGW_ATTR_USER_CUSTOM_KEY), std::move(custom_key_bl));

// save user custom encrypt key to attr. end dyp

    } 

...

}

rgw_common.h 文件:

#define RGW_ATTR_X_ROBOTS_TAG   RGW_ATTR_PREFIX "x-robots-tag"

// save user custom encrypt key to attr. start dyp

\#define RGW_ATTR_USER_CUSTOM_KEY   RGW_ATTR_PREFIX "user_custom_key"

// save user custom encrypt key to attr. end dyp

測試

rgw客戶端對數(shù)據(jù)加密存儲的時候,其head對象增加了名為rgw_user_custom_key的xattr:


image.png

獲取該rgw_user_custom_key的值,就可以拿到用戶指定的加密密鑰:


image.png

正常上傳對象時,則不需要保存該xattr。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容