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:

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

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