すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:サーバー側暗号化

最終更新日:Nov 06, 2024

Object Storage Service (OSS) は、サーバー側暗号化が設定されているバケットにアップロードされたオブジェクトを暗号化し、暗号化されたオブジェクトを保存します。 GetObjectを呼び出してオブジェクトをダウンロードすると、OSSはオブジェクトを復号して返します。 x-oss-server-side-encryptionヘッダーは、オブジェクトがサーバー側で暗号化されていることを宣言するためにレスポンスに含まれます。

説明

レスポンス内のx-oss-server-side-encryptionヘッダーの詳細については、「レスポンスヘッダー」をご参照ください。

シナリオ

OSSはサーバー側暗号化を使用して静的データを保護します。 この機能は、深層学習サンプルやオンライン共同作業ドキュメントの保存など、追加のセキュリティやコンプライアンスが必要なシナリオで構成できます。

使用上の注意

  • サーバー側の暗号化は、次のリージョンでサポートされています。中国 (杭州) 、中国 (上海) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (フフホト) 、中国 (ウランカブ) 、中国 (深セン) 、中国 (河源) 、中国 (広州) 、中国 (成都) 、中国 (香港) 、米国 (シリコンバレー) 、米国 (バージニア) 、日本 (東京) 、韓国 (ソウル) 、シンガポール、オーストラリア (シドニー)サービス終了 、マレーシア (クアラルンプール) 、インドネシア (ジャカルタ) 、フィリピン (マニラ) 、タイ (バンコク) 、ドイツ (フランクフルト) 、英国 (ロンドン) 、アラブ首長国連邦 (ドバイ).

  • KMS管理CMK (SSE-KMS) を使用するサーバー側暗号化が設定されているバケットでオブジェクトのアップロード、ダウンロード、またはアクセス操作を実行する場合は、指定されたカスタマーマスターキー (CMK) を使用する権限があり、要求が匿名ではないことを確認してください。 それ以外の場合、要求は失敗し、[この要求はkmsで禁止されています] エラーメッセージが返されます。

  • デフォルトでは、ミラーリングベースのback-to-originを使用して取得したオブジェクトは暗号化されません。

  • バケットのサーバー側の暗号化方法を設定または変更しても、バケット内の既存のオブジェクトの暗号化方法には影響しません。

  • オブジェクトは、一度に1つのサーバー側暗号化方法のみで暗号化できます。

  • バケットにサーバー側の暗号化を設定している場合でも、オブジェクトをバケットにアップロードまたはコピーするときに、オブジェクトに別の暗号化方法を使用できます。 オブジェクトに設定された暗号化方法が優先されます。 詳細は、「PutObject」をご参照ください。

暗号化方法

次の表に、さまざまなシナリオで使用できるサーバー側の暗号化方法を示します。

暗号化方法

説明

シナリオ

補足

課金ルール

SSE-KMS

Key Management Service (KMS) が管理するデフォルトのCMKを使用するか、CMKを指定してデータを暗号化または復号化できます。 この方法は、暗号化または復号化のためにネットワーク経由でKMSサーバーにデータを送信する必要がないため、費用対効果が高くなります。

セキュリティとコンプライアンスの要件を満たすようにCMKを指定する必要があります。

  • オブジェクトの暗号化に使用されるキーも暗号化され、オブジェクトのメタデータに書き込まれます。

  • オブジェクト内のデータのみが暗号化されます。 オブジェクトのメタデータは暗号化されません。

KMSに保存されているCMKを使用してデータを暗号化または復号するAPI操作を呼び出すと、課金されます。 料金の詳細については、「KMSの請求」をご参照ください。

OSS管理キーを使用したサーバー側暗号化 (SSE-OSS)

OSSが管理するキーを使用して、オブジェクトを暗号化できます。 セキュリティを向上させるために、OSSは定期的にローテーションされるマスターキーを使用して暗号化キーを暗号化します。

基本的な暗号化機能のみが必要です。 キーを手動で管理する必要はありません。

なし。

無料です。

手順

OSSコンソールの使用

方法1: バケットのサーバー側暗号化の有効化

バケットの作成時にサーバー側の暗号化を有効にする

  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、[バケットの作成] をクリックします。

  3. [バケットの作成] パネルで、パラメーターを設定します。

    次の表に、サーバー側暗号化用に設定できるパラメーターを示します。

    パラメーター

    説明

    暗号化方法

    バケット内のオブジェクトを暗号化する暗号化方法を選択します。 有効な値:

    • なし: サーバー側の暗号化は無効です。

    • OSS管理: OSSによって管理されるキーは、バケット内のオブジェクトを暗号化するために使用されます。 OSSは、各オブジェクトを異なるキーで暗号化します。 OSSは、定期的にローテーションされたマスターキーも使用して暗号化キーを暗号化します。

    • KMS: KMSまたは指定されたCMKによって管理されるデフォルトのCMKは、オブジェクトの暗号化と復号化に使用されます。

      KMS管理CMKを使用するには、KMSを有効化する必要があります。 詳細については、「専用KMSインスタンスの購入」をご参照ください。

    暗号化アルゴリズム

    AES-256のみサポートされています。

    CMK

    CMKを選択します。 このパラメーターは、暗号化方法KMSが選択されている場合にのみ使用できます。

    CMKは <alias>(CMK ID) 形式です。 <alias> はCMKのエイリアス、CMK IDはCMKのIDです。 有効な値:

    • alias/acs/oss(CMK ID): KMSによって管理されるデフォルトのCMKは、ターゲットの暗号化と復号化のためのキーを生成するために使用されます。

    • alias/<cmkname>(CMK ID)): カスタムCMKを使用して、オブジェクト暗号化用のキーを生成します。 CMK IDは、暗号化オブジェクトのメタデータに記録される。 オブジェクトは、解読権限を持つユーザーによってダウンロードされると解読されます。 <cmkname> は、CMKの作成時に設定したCMKのオプションの名前です。

      CMK IDを指定する前に、KMSコンソールのバケットと同じリージョンに通常キーまたは外部キーを作成する必要があります。 詳細については、「CMKの作成」をご参照ください。

    他のパラメーターを設定する方法の詳細については、「バケットの作成」をご参照ください。

  4. [OK] をクリックします。

既存のバケットのサーバー側暗号化の有効化

  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションツリーで、[コンテンツセキュリティ] > [サーバー側の暗号化] を選択します。

  4. [サーバー側の暗号化] ページで、[設定] をクリックし、パラメーターを設定します。 下表に、各パラメーターを説明します。

    パラメーター

    説明

    暗号化方法

    バケット内のオブジェクトを暗号化する暗号化方法を選択します。 有効な値:

    • なし: サーバー側の暗号化は無効です。

    • OSS管理: OSSによって管理されるキーは、バケット内のオブジェクトを暗号化するために使用されます。 OSSは、各オブジェクトを異なるキーで暗号化します。 OSSは、定期的にローテーションされたマスターキーも使用して暗号化キーを暗号化します。

    • KMS: KMSまたは指定されたCMKによって管理されるデフォルトのCMKは、オブジェクトの暗号化と復号化に使用されます。

      KMS管理CMKを使用するには、KMSを有効化する必要があります。 詳細については、「専用KMSインスタンスの購入」をご参照ください。

    暗号化アルゴリズム

    AES-256のみサポートされています。

    CMK

    CMKを選択します。 このパラメーターは、暗号化方法KMSが選択されている場合にのみ使用できます。

    CMKは <alias>(CMK ID) 形式です。 <alias> はCMKのエイリアス、CMK IDはCMKのIDです。 有効な値:

    • alias/acs/oss(CMK ID): KMSによって管理されるデフォルトのCMKは、ターゲットの暗号化と復号化のためのキーを生成するために使用されます。

    • alias/<cmkname>(CMK ID)): カスタムCMKを使用して、オブジェクト暗号化用のキーを生成します。 CMK IDは、暗号化オブジェクトのメタデータに記録される。 オブジェクトは、解読権限を持つユーザーによってダウンロードされると解読されます。 <cmkname> は、CMKの作成時に設定したCMKのオプションの名前です。

      CMK IDを指定する前に、KMSコンソールのバケットと同じリージョンに通常キーまたは外部キーを作成する必要があります。 詳細については、「CMKの作成」をご参照ください。

  5. [保存] をクリックします。

方法2: オブジェクトをバケットにアップロードするときにバケットのサーバー側暗号化を有効にする

詳細は、「簡易アップロード (Simple upload)」をご参照ください。

OSS SDKの使用

方法1: バケットのサーバー側暗号化の有効化

OSS SDKを使用して、既存のバケットのサーバー側暗号化を有効にできます。 バケットの作成時に、OSS SDKを使用してサーバー側の暗号化を有効にすることはできません。 次のサンプルコードは、一般的なプログラミング言語のOSS SDKを使用して、既存のバケットのサーバー側暗号化を有効にする方法の例を示しています。 他のプログラミング言語のOSS SDKを使用して既存のバケットのサーバー側暗号化を有効にする方法の詳細については、「概要」をご参照ください。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.model.*;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the name of the bucket. Example: examplebucket. 
        String bucketName = "examplebucket";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // Set the encryption method to SM4 for a bucket. If AES-256 is used, replace SSEAlgorithm.SM4 with SSEAlgorithm.AES256. 
            ServerSideEncryptionByDefault applyServerSideEncryptionByDefault = new ServerSideEncryptionByDefault(SSEAlgorithm.SM4);
            ServerSideEncryptionConfiguration sseConfig = new ServerSideEncryptionConfiguration();
            sseConfig.setApplyServerSideEncryptionByDefault(applyServerSideEncryptionByDefault);
            SetBucketEncryptionRequest request = new SetBucketEncryptionRequest(bucketName, sseConfig);
            ossClient.setBucketEncryption(request);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Model\ServerSideEncryptionConfig;

// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.  
$provider = new EnvironmentVariableCredentialsProvider();
// In this example, the China (Hangzhou) region is used as the endpoint. Specify your actual endpoint. 
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

try {
    // Set the default server-side encryption method of the bucket to SSE-OSS. 
    $config = new ServerSideEncryptionConfig("AES256");
    $ossClient->putBucketEncryption($bucket, $config);

    // Set the default server-side encryption method of the bucket to KMS without specifying a CMK ID. 
    $config = new ServerSideEncryptionConfig("KMS");
    $ossClient->putBucketEncryption($bucket, $config);

    // Set the default server-side encryption method of the bucket to KMS and specify a CMK ID. 
    $config = new ServerSideEncryptionConfig("KMS", "your kms id");
    $ossClient->putBucketEncryption($bucket, $config);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n"); 
const OSS = require("ali-oss");

const client = new OSS({
  // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou. 
  region: 'yourregion',
  // Obtain access credentials from environment variables. Before you run the sample code, make sure that you have configured environment variables OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET. 
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // Specify the name of the bucket. 
  bucket: 'yourbucketname'
});

async function putBucketEncryption() {
  try {
    // Configure an encryption method for the bucket.     

    const result = await client.putBucketEncryption("bucket-name", {
      SSEAlgorithm: "AES256", // In this example, the AES-256 encryption algorithm is used. To use KMS for encryption, you must specify KMSMasterKeyID. 
      // KMSMasterKeyID: "yourKMSMasterKeyId". Specify the CMK ID. This parameter is available and required when SSEAlgorithm is set to KMS and a specific CMK is used for encryption. In other cases, leave this parameter empty. 
    });
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

putBucketEncryption();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import ServerSideEncryptionRule
# Obtain access credentials from the environment variables. Before you run the sample code, make sure that you have configured environment variables OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET. 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
# Specify the name of the bucket. Example: examplebucket. 
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# Create encryption configurations for the bucket. In this example, AES-256 encryption is used. 
rule = ServerSideEncryptionRule()
rule.sse_algorithm = oss2.SERVER_SIDE_ENCRYPTION_AES256
# Specify the CMK ID. The CMK ID can be specified only if you use the OSS-KMS encryption method. If you want to use a specified CMK for encryption, enter the CMK ID. If you want to use the default CMK managed by KMS for encryption, leave this parameter empty. If you use AES-256 encryption, you must leave this parameter empty. 
rule.kms_master_keyid = ""

# Apply the encryption configurations to the bucket. 
result = bucket.put_bucket_encryption(rule)

# Display the returned HTTP status code. 
print('http response code:', result.status)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
var endpoint = "yourEndpoint";
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Specify the name of the bucket. Example: examplebucket. 
var bucketName = "examplebucket";
// Create an OSSClient instance. 
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    // Configure server-side encryption for the bucket. 
    var request = new SetBucketEncryptionRequest(bucketName, "KMS", null);
    client.SetBucketEncryption(request);
    Console.WriteLine("Set bucket:{0} Encryption succeeded ", bucketName);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
package main

import (
  "fmt"
  "os"

  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Create an OSSClient instance. 
	// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. 
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

  // Initialize an encryption rule. In this example, the AES-256 encryption algorithm is used. 
  config := oss.ServerEncryptionRule{SSEDefault: oss.SSEDefaultRule{SSEAlgorithm: "AES256"}}
  err = client.SetBucketEncryption("yourBucketName", config)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* Initialize information about the account that is used to access OSS. */
            
    /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    /* Specify the name of the bucket. Example: examplebucket. */
    std::string BucketName = "examplebucket";

    /* Initialize resources, such as network resources. */
    InitializeSdk();

    ClientConfiguration conf;
    /* Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    SetBucketEncryptionRequest setrequest(BucketName);
    setrequest.setSSEAlgorithm(SSEAlgorithm::KMS);
    /* Configure server-side encryption based on KMS. */
    auto outcome = client.SetBucketEncryption(setrequest);

    if (!outcome.isSuccess()) {
        /* Handle exceptions. */
        std::cout << "SetBucketEncryption fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* Release resources, such as network resources. */
    ShutdownSdk();
    return 0;
}

方法2: オブジェクトをバケットにアップロードするときにバケットのサーバー側暗号化を有効にする

次のサンプルコードは、オブジェクトをオブジェクトにアップロードするときに、一般的なプログラミング言語のOSS SDKを使用してバケットのサーバー側暗号化を有効にする方法の例を示しています。 オブジェクトをバケットにアップロードするときに、他のプログラミング言語のOSS SDKを使用してバケットのサーバー側暗号化を有効にする方法の詳細については、「概要」をご参照ください。

Java

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyun.oss.model.ObjectMetadata;
import java.io.File;

public class Put {
    public static void main(String[] args) throws Exception {
        // In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the name of the bucket. Example: examplebucket. 
        String bucketName = "examplebucket";
        // Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. 
        String objectName = "exampledir/exampleobject.txt";
        // Specify the full path of the local file that you want to upload. Example: D:\\localpath\\examplefile.txt. 
        // By default, if you do not specify the full path of the local file, the local file is uploaded from the path of the project to which the sample program belongs. 
        String filePath= "D:\\localpath\\examplefile.txt";
        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        try {
            // Create an ObjectMetadata object and set the server-side encryption method to AES-256. 
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, "AES256");

            // Create a PutObjectRequest object. 
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            putObjectRequest.setMetadata(metadata); 

            // Upload the local file. 
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

PHP

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;


// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
$provider = new EnvironmentVariableCredentialsProvider();
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Specify the name of the bucket. Example: examplebucket. 
$bucket= "examplebucket";
// Specify the full path of the object. Example: exampledir/exampleobject.txt. Do not include the bucket name in the full path of the object. 
$object = "exampledir/exampleobject.txt";
// Specify the full path of the local file that you want to upload. Example: D:\\localpath\\examplefile.txt. By default, if you do not specify the full path of the local file, the local file is uploaded from the path of the project to which the sample program belongs. 
$filePath = "D:\\localpath\\examplefile.txt";

try{
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

    $options[OssClient::OSS_HEADERS] = array(
         // Set the server-side encryption method to AES-256. 
        "x-oss-server-side-encryption"=>"AES256",
    );
    // Use the uploadFile method to upload the local file and pass the UploadOptions object. 
    $ossClient->uploadFile($bucket, $object, $filePath, $options);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . "OK" . "\n");

Node.js

const OSS = require("ali-oss");
const path = require("path");

const client = new OSS({
  // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou. 
  region: "oss-cn-hangzhou",
  // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // Specify the name of the bucket. 
  bucket: "examplebucket",
});

const headers = {
  // Set the server-side encryption method to AES-256. 
  "x-oss-server-side-encryption": "AES256",
};

async function put() {
  try {. 
    const result = await client.put(
      // Specify the full path of the object. Example: exampledir/exampleobject.txt. Do not include the bucket name in the full path of the object. 
      "exampledir/exampleobject.txt",
      // Specify the full path of the local file that you want to upload. Example: D:\\localpath\\examplefile.txt. By default, if you do not specify the full path of the local file, the local file is uploaded from the path of the project to which the sample program belongs. 
      path.normalize("D:\\examplefile.jpg"),
      { headers }
    );
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();

Python

# -*- coding: utf-8 -*-
import oss2
import os
from oss2.credentials import EnvironmentVariableCredentialsProvider

# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())

# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'

# Specify the name of the bucket. 
bucket_name = 'examplebucket0703'
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# The file must be opened in binary mode. 
# Specify the full path of the local file. By default, if you do not specify the full path of the local file, the local file is uploaded from the path of the project to which the sample program belongs. 
local_file_path = 'D:\\examplefile.jpg'
with open(local_file_path, 'rb') as fileobj:
    # Use the seek method to read data from byte 1,000 of the file. The data is uploaded from byte 1000 to the last byte of the local file. 
    fileobj.seek(1000, os.SEEK_SET)
    # Use the tell method to obtain the current position. 
    current = fileobj.tell()

    # Set the server-side encryption method to AES-256. 
    headers = {
        'x-oss-server-side-encryption': 'AES256',
    }

    # Specify the full path of the object. Do not include the bucket name in the full path of the object. 
    object_key = 'exampledir/object1.jpg'
    bucket.put_object(object_key, fileobj, headers=headers)

Go

package main

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
)

func main() {
	// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Create an OSSClient instance. 
	// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. 
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Specify the name of the bucket. Example: examplebucket. 
	bucket, err := client.Bucket("examplebucket")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
  // Specify the full path of the object. Example: exampledir/exampleobject.txt. Do not include the bucket name in the full path of the object. 
  // Specify the full path of the local file that you want to upload. Example: D:\\localpath\\examplefile.txt. By default, if you do not specify the full path of the local file, the local file is uploaded from the path of the project to which the sample program belongs. 
  // Set the server-side encryption method to AES-256. 
	err = bucket.PutObjectFromFile("D:\\localpath\\examplefile.txt", "D:\\examplefile.jpg", oss.ServerSideEncryption("AES256"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

ossutilの使用

方法1: バケットのサーバー側暗号化の有効化

ossutilを使用すると、既存のバケットのサーバー側暗号化を有効にできます。 バケットの作成時にossutilを使用してサーバー側の暗号化を有効にすることはできません。

既存のバケットのサーバー側暗号化を有効にする方法の詳細については、「バケット暗号化」をご参照ください。

方法2: オブジェクトをバケットにアップロードするときにバケットのサーバー側暗号化を有効にする

ossutilを使用すると、オブジェクトをアップロードするときにオブジェクトの暗号化方法を指定できます。 詳細については、「オブジェクトのアップロードとオブジェクトの暗号化方法の指定」をご参照ください。

OSS APIの使用

ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。

  • RESTful APIを使用すると、既存のバケットのサーバー側暗号化を有効にできます。 バケットの作成時にサーバー側の暗号化を有効にすることはできません。

    既存のバケットのサーバー側暗号化を有効にする方法の詳細については、「PutBucketEncryption」をご参照ください。

  • RESTful APIを使用すると、オブジェクトのアップロード時にサーバー側の暗号化方法を指定できます。 詳細は、「PutObject」をご参照ください。

暗号化と復号化にKMS管理CMKを使用する

KMS管理CMKを使用して、オブジェクト暗号化用の暗号化キーを生成できます。 エンベロープ暗号化メカニズムはさらに、不正データアクセスを防止する。 KMSにより、キーのセキュリティ、整合性、可用性を手動で維持する必要がなくなります。 これにより、データの暗号化、データの復号化、デジタル署名の生成と検証に集中できます。

次の図は、SSE-KMSの暗号化ロジックを示しています。

image

SSE-KMSを使用してデータを暗号化する場合、次のキーを使用できます。

  • デフォルトのKMS管理CMK

    OSSは、デフォルトのKMS管理CMKに基づいて生成されたキーを使用して、オブジェクトを暗号化し、オブジェクトのダウンロード時にオブジェクトを復号します。 SSE-KMSを初めて使用するとき、OSSはKMSでCMKを作成します。

    設定方法:

    • バケットのサーバー側暗号化を設定する

      バケットの暗号化方法をKMSに設定する CMK IDを指定せずに このようにして、このバケットにアップロードされたオブジェクトは暗号化されます。

    • 特定のオブジェクトの暗号化方法を設定する

      オブジェクトをアップロードするとき、またはオブジェクトのメタデータを変更するときは、リクエストにx-oss-server-side-encryptionヘッダーを含め、ヘッダーをKMSに設定します。 このように、OSSはKMSが管理するデフォルトのCMKとAES-256の暗号化アルゴリズムを使用してオブジェクトを暗号化します。 詳細は、「PutObject」をご参照ください。

  • Bring Your Own Key (BYOK) を使用して生成されたCMK

    KMSコンソールでBYOKマテリアルを使用してCMKを生成すると、OSSはCMKに基づいて生成されたキーを使用してさまざまなオブジェクトを暗号化し、CMK IDは暗号化されたオブジェクトのメタデータに記録されます。 オブジェクトは、解読権限を持つユーザーによってダウンロードされた場合にのみ自動的に解読されます。

    BYOK資料は、次のいずれかのソースから入手できます。

    • Alibaba Cloudが提供するBYOKマテリアル: KMSでキーを作成する場合、キーマテリアルのソースとしてAlibaba Cloud KMSを選択します。

    • ユーザーが提供するBYOKマテリアル: KMSでキーを作成するときは、キーマテリアルのソースとして [外部] を選択し、外部キーマテリアルをインポートします。 外部キーをインポートする方法の詳細については、「キーマテリアルのインポート」をご参照ください。

    設定方法:

    • バケットのサーバー側暗号化を設定する

      バケットの暗号化方法をKMSに設定する CMK IDを指定します。 このようにして、このバケットにアップロードされたオブジェクトは暗号化されます。

    • 特定のオブジェクトの暗号化方法を設定する

      オブジェクトをアップロードするとき、またはオブジェクトのメタデータを変更するときは、リクエスト内でx-oss-server-side-encryptionヘッダーをKMSに設定し、x-oss-server-side-encryption-key-IDヘッダーを使用してCMK idを指定します。 このように、OSSは、KMSによって管理される指定されたCMKとAES-256暗号化アルゴリズムを使用してオブジェクトを暗号化します。 詳細は、「PutObject」をご参照ください。

OSS管理キーを使用した暗号化と復号化

OSSは、データの暗号化に使用されるデータキーを生成および管理し、データを保護するための強力で多要素のセキュリティ対策を提供します。 SSE-OSSはAES-256暗号化アルゴリズムを使用します データを暗号化します。

設定方法:

  • バケットのサーバー側暗号化を設定する

    暗号化方法をSSE-OSSに設定し、暗号化アルゴリズムとしてAES-256を指定します。 このように、バケットにアップロードされたすべてのオブジェクトはデフォルトで暗号化されます。

  • 特定のオブジェクトの暗号化方法を設定する

    オブジェクトをアップロードしたり、オブジェクトのメタデータを変更したりするときは、リクエストにx-oss-server-side-encryptionパラメーターを含め、パラメーターをAES256に設定します。. OSSはOSS管理キーを使用してオブジェクトを暗号化します。 詳細は、「PutObject」をご参照ください。

必要な権限。

RAMユーザーがサーバー側の暗号化を使用してさまざまなシナリオでオブジェクトを暗号化および復号化する場合、RAMユーザーは必要な権限を持っている必要があります。

説明

RAMユーザーに権限を付与する方法の詳細については、「RAMポリシーの一般的な例」をご参照ください。

  • バケットのサーバー側暗号化を設定する

    • バケットを管理するための権限。

    • PutBucketEncryptionおよびGetBucketEncryptionを呼び出す権限。

    • 暗号化方法をSSE-KMSに設定し、指定したCMKを使用してデータを暗号化する場合に、ListKeysListaliasListAliasesByKeyId、およびDescribeKeyを呼び出すための操作権限。 次のサンプルコードは、RAMポリシーをアタッチしてRAMユーザーに上記の権限を付与する方法の例を示しています。

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:List*",
              "kms:DescribeKey"    
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*" // The RAM user is allowed to use all KMS-managed CMKs that belong to the Alibaba Cloud account. To specify that only a specific CMK is available for the RAM user, enter the CMK ID. 
            ]
          }
        ]
      }
  • 暗号化メソッドが設定されているバケットにオブジェクトをアップロードする

    • バケットにオブジェクトをアップロードする権限。

    • ListKeysListAliasesListAliases ByKeyIdDescribeKeyGenerateDataKey、およびDecryptに暗号化方法を設定し、指定したCMKを使用してデータを暗号化する場合に、次の操作を呼び出す権限。 次のサンプルコードは、RAMポリシーをアタッチしてRAMユーザーに上記の権限を付与する方法の例を示しています。

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:List*",
              "kms:DescribeKey",
              "kms:GenerateDataKey",
              "kms:Decrypt"
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*" // The RAM user is allowed to use all CMKs that belong to the Alibaba Cloud account. To specify that only a specific CMK is available for the RAM user, enter the CMK ID. 
            ]
          }
        ]
      }
  • 暗号化方式が設定されているバケットからオブジェクトをダウンロードする

    • バケット内のオブジェクトにアクセスするための権限。

    • 暗号化メソッドが使用され、指定されたCMKがSSE-KMSされている場合に、Decrypt操作を呼び出す権限。 次のサンプルコードは、RAMポリシーをアタッチしてRAMユーザーに上記の権限を付与する方法の例を示しています。

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:Decrypt"
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*" // The RAM user has the permissions to use all CMKs that belong to the Alibaba Cloud account. To specify that only a specific CMK is available for the RAM user to decrypt objects, enter the CMK ID. 
            ]
          }
        ]
      }

よくある質問

バケットのサーバー側暗号化を設定した後、OSSはバケット内の既存のオブジェクトを暗号化しますか?

いいえ。OSSは、バケットにサーバー側暗号化が設定された後にアップロードされたオブジェクトのみを暗号化し、バケット内の既存のオブジェクトは暗号化しません。 バケット内の既存のオブジェクトを暗号化する場合は、CopyObject操作を呼び出して既存のオブジェクトを上書きできます。