OSS支援在服務端對上傳的資料進行加密編碼(Server-Side Encryption)。上傳資料時,OSS對收到的使用者資料進行加密,然後再將得到的加密資料持久化儲存下來。下載資料時,OSS自動對儲存的加密資料進行解密並把未經處理資料返回給使用者,並在返回的HTTP請求Header中,聲明該資料進行了服務端加密。
注意事項
在佈建服務端加密之前,請確保您已瞭解該功能。詳情請參見服務端加密。
本文範例程式碼以華東1(杭州)的地區ID
cn-hangzhou為例,預設使用外網Endpoint,如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見地區和Endpoint。本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
要配置Bucket加密,您必須具有
oss:PutBucketEncryption許可權;要擷取Bucket加密配置,您必須具有oss:GetBucketEncryption許可權;要刪除Bucket加密配置,您必須具有oss:DeleteBucketEncryption許可權。具體操作,請參見為RAM使用者授予自訂的權限原則。
範例程式碼
配置Bucket加密
您可以通過以下代碼設定Bucket預設加密方式,設定成功之後,所有上傳至該Bucket但未設定加密方式的Object都會使用Bucket預設加密方式進行加密:
import argparse
import alibabacloud_oss_v2 as oss
# 建立命令列參數解析器,用於接收使用者輸入的參數
parser = argparse.ArgumentParser(description="put bucket encryption sample")
# 添加命令列參數 --region,表示儲存空間所在的地區,必填項
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# 添加命令列參數 --bucket,表示儲存空間的名稱,必填項
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 添加命令列參數 --endpoint,表示其他服務訪問 OSS 時使用的網域名稱,可選項
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# 添加命令列參數 --sse_algorithm,表示預設的伺服器端加密方法,預設值為 'KMS'
# 有效值:KMS(使用 KMS 加密)、AES256(使用 AES-256 加密)、SM4(使用國密演算法 SM4)
parser.add_argument('--sse_algorithm', help='The default server-side encryption method. Valid values: KMS, AES256, and SM4.', default='KMS')
# 添加命令列參數 --kms_master_key_id,表示當 SSEAlgorithm 設定為 KMS 且使用指定的 CMK 時的主要金鑰 ID
# 如果不使用指定的 CMK,則留空
parser.add_argument('--kms_master_key_id', help='The CMK ID that is specified when SSEAlgorithm is set to KMS and a specified CMK is used for encryption. In other cases, leave this parameter empty.', default='')
# 添加命令列參數 --kms_data_encryption,表示對象加密時使用的演算法
# 預設值為 'SM4',僅在 SSEAlgorithm 設定為 KMS 時有效
parser.add_argument('--kms_data_encryption', help='The algorithm that is used to encrypt objects. If this parameter is not specified, objects are encrypted by using AES256. This parameter is valid only when SSEAlgorithm is set to KMS. Valid value: SM4', default='SM4')
def main():
# 解析命令列參數
args = parser.parse_args()
# 從環境變數中載入憑證資訊(AccessKeyId 和 AccessKeySecret)
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 載入 SDK 的預設配置
cfg = oss.config.load_default()
# 設定憑證提供者
cfg.credentials_provider = credentials_provider
# 設定儲存空間所在的地區
cfg.region = args.region
# 如果使用者提供了自訂的 endpoint,則設定到配置中
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 使用設定物件初始化 OSS 用戶端
client = oss.Client(cfg)
# 調用 put_bucket_encryption 方法設定儲存空間的加密配置
result = client.put_bucket_encryption(
oss.PutBucketEncryptionRequest(
bucket=args.bucket, # 指定目標儲存空間的名稱
server_side_encryption_rule=oss.ServerSideEncryptionRule(
apply_server_side_encryption_by_default=oss.ApplyServerSideEncryptionByDefault(
kms_master_key_id=args.kms_master_key_id, # 主要金鑰 ID(僅在 SSEAlgorithm 為 KMS 時有效)
kms_data_encryption=args.kms_data_encryption, # 對象密碼編譯演算法(僅在 SSEAlgorithm 為 KMS 時有效)
sse_algorithm=args.sse_algorithm, # 服務端密碼編譯演算法(如 KMS、AES256 或 SM4)
),
),
)
)
# 列印操作結果的狀態代碼和請求 ID
print(f'status code: {result.status_code}, ' # HTTP 狀態代碼,表示請求是否成功
f'request id: {result.request_id}') # 請求 ID,用於追蹤請求日誌和調試
if __name__ == "__main__":
# 程式入口,調用 main 函數執行邏輯
main()
擷取Bucket加密配置
您可以使用以下代碼擷取Bucket加密配置。
import argparse
import alibabacloud_oss_v2 as oss
# 建立命令列參數解析器,用於接收使用者輸入的參數
parser = argparse.ArgumentParser(description="get bucket encryption sample")
# 添加命令列參數 --region,表示儲存空間所在的地區,必填項
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# 添加命令列參數 --bucket,表示儲存空間的名稱,必填項
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 添加命令列參數 --endpoint,表示其他服務訪問 OSS 時使用的網域名稱,可選項
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
def main():
# 解析命令列參數
args = parser.parse_args()
# 從環境變數中載入憑證資訊(AccessKeyId 和 AccessKeySecret)
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 載入 SDK 的預設配置
cfg = oss.config.load_default()
# 設定憑證提供者
cfg.credentials_provider = credentials_provider
# 設定儲存空間所在的地區
cfg.region = args.region
# 如果使用者提供了自訂的 endpoint,則設定到配置中
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 使用設定物件初始化 OSS 用戶端
client = oss.Client(cfg)
# 調用 get_bucket_encryption 方法擷取儲存空間的加密配置
result = client.get_bucket_encryption(
oss.GetBucketEncryptionRequest(
bucket=args.bucket, # 指定目標儲存空間的名稱
)
)
# 列印操作結果的狀態代碼和請求 ID
print(f'status code: {result.status_code}, '
f'request id: {result.request_id}, '
)
if __name__ == "__main__":
# 程式入口,調用 main 函數執行邏輯
main()
刪除Bucket加密配置
您可以使用以下代碼刪除Bucket加密配置。
import argparse
import alibabacloud_oss_v2 as oss
# 建立命令列參數解析器,用於接收使用者輸入的參數
parser = argparse.ArgumentParser(description="delete bucket encryption sample")
# 添加命令列參數 --region,表示儲存空間所在的地區,必填項
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# 添加命令列參數 --bucket,表示儲存空間的名稱,必填項
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 添加命令列參數 --endpoint,表示其他服務訪問 OSS 時使用的網域名稱,可選項
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
def main():
# 解析命令列參數
args = parser.parse_args()
# 從環境變數中載入憑證資訊(AccessKeyId 和 AccessKeySecret)
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 載入 SDK 的預設配置
cfg = oss.config.load_default()
# 設定憑證提供者
cfg.credentials_provider = credentials_provider
# 設定儲存空間所在的地區
cfg.region = args.region
# 如果使用者提供了自訂的 endpoint,則設定到配置中
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 使用設定物件初始化 OSS 用戶端
client = oss.Client(cfg)
# 調用 delete_bucket_encryption 方法刪除儲存空間的加密配置
result = client.delete_bucket_encryption(
oss.DeleteBucketEncryptionRequest(
bucket=args.bucket, # 指定目標儲存空間的名稱
)
)
# 列印操作結果的狀態代碼和請求 ID
print(f'status code: {result.status_code}, ' # HTTP 狀態代碼,表示請求是否成功
f'request id: {result.request_id}') # 請求 ID,用於追蹤請求
if __name__ == "__main__":
# 程式入口,調用 main 函數執行邏輯
main()
相關文檔
關於佈建服務端加密的API介面說明,請參見PutBucketEncryption。
關於擷取服務端加密配置的API介面說明,請參見GetBucketEncryption。
關於刪除服務端加密配置的API介面說明,請參見DeleteBucketEncryption。