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

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

最終更新日:Jun 26, 2026

サーバー側の暗号化が有効なバケットにオブジェクトをアップロードすると、Object Storage Service (OSS) は保存前にオブジェクトを暗号化します。GetObject リクエストでオブジェクトをダウンロードすると、OSS は自動的にオブジェクトを復号して返します。レスポンスの x-oss-server-side-encryption ヘッダーは、オブジェクトがサーバー側で暗号化されたことを示します。

説明

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

シナリオ

OSS は、サーバー側の暗号化によって保存データを保護します。この機能は、ディープラーニングのサンプルファイルやオンライン共同編集ドキュメントのデータなど、データストレージに高いセキュリティ要件やコンプライアンス要件が求められるアプリケーションに適しています。

暗号化方式

OSS は、さまざまなシナリオ向けに 2 つのサーバー側の暗号化方式を提供します。要件に基づいて方式を選択できます。

暗号化方式

説明

シナリオ

備考

課金

Key Management Service (KMS) マネージドキーによるサーバー側の暗号化 (SSE-KMS)

KMS で管理されるデフォルトのカスタマーマスターキー (CMK) または指定された CMK を使用して、データを暗号化および復号します。データは、ネットワーク経由で KMS サーバーに送信されることなく、暗号化および復号されます。

この方式は、セキュリティとコンプライアンスの目的で、指定可能な自己管理キーを使用する必要があるシナリオに適しています。

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

  • SSE-KMS 暗号化方式はオブジェクトデータのみを暗号化し、オブジェクトのメタデータは暗号化しません。

  • OSS コンソールでデフォルトで作成される KMS キーは無料です。

  • 独自の KMS キーを使用する場合、KMS で料金が発生します。 詳細については、「KMS pricing」をご参照ください。

OSS マネージドキーによるサーバー側の暗号化 (SSE-OSS)

OSS が完全に管理するキーを使用して、各オブジェクトを暗号化します。セキュリティを強化するため、OSS はマスターキーを使用してデータ暗号化キー自体も暗号化します。

この方式は、基本的な暗号化のみが必要で、キーを管理する必要がないシナリオに適しています。

なし。

無料。

注意事項

  • SSE-KMS 暗号化が有効になっているバケット内のオブジェクトをアップロード、ダウンロード、またはアクセスする場合は、指定した CMK ID を使用する権限があり、リクエストが匿名でないことを確認してください。そうでない場合、リクエストは失敗し、This request is forbidden by kms エラーが返されます。

  • ミラーリングベースのオリジンフェッチによってバケットにミラーリングされたオブジェクトは、デフォルトでは暗号化されません。

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

  • オブジェクトに対して同時に使用できるサーバー側の暗号化方式は、1 つのみです。

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

権限

以下のリストでは、RAM ユーザーがさまざまなシナリオでサーバー側の暗号化を使用するために必要な権限について説明します。

説明

RAM ユーザーに権限を付与する方法の詳細については、「RAM ユーザーにカスタム権限を付与する」をご参照ください。

  • バケットの暗号化方式の設定

    • 対象バケットの管理権限。

    • PutBucketEncryption および GetBucketEncryption 権限。

    • 暗号化方式として SSE-KMS を設定し、CMK ID を指定する場合は、ListKeysListAliasesListAliasesByKeyId、および DescribeKey 権限も必要です。このシナリオの RAM ポリシーのサンプルを以下に示します:

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:List*",
              "kms:DescribeKey"    
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*" // このポリシーでは、Alibaba Cloud アカウント ID 配下のすべての KMS キーを呼び出すことができます。特定の CMK のみの使用を許可するには、対応する CMK ID を入力してください。
            ]
          }
        ]
      }
  • 暗号化されたバケットへのオブジェクトのアップロード

    • 対象バケットへのオブジェクトアップロード権限。

    • 暗号化方式が KMS に設定されており、CMK ID が指定されている場合は、ListKeysListAliasesListAliasesByKeyIdDescribeKeyGenerateDataKey、および Decrypt 権限も必要です。このシナリオの RAM ポリシーのサンプルを以下に示します:

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:List*",
              "kms:DescribeKey",
              "kms:GenerateDataKey",
              "kms:Decrypt"
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*" // このポリシーでは、Alibaba Cloud アカウント ID 配下のすべての KMS キーを呼び出すことができます。特定の CMK のみの使用を許可するには、対応する CMK ID を入力してください。
            ]
          }
        ]
      }
  • 暗号化されたバケットからのオブジェクトのダウンロード

    • 対象バケット内のオブジェクトへのアクセス権限。

    • 暗号化方式が KMS に設定されている場合は、Decrypt 権限も必要です。このシナリオの RAM ポリシーのサンプルを以下に示します:

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:Decrypt"
            ],
            "Resource": [
              "acs:kms:*:141661496593****:*" // このポリシーは、Alibaba Cloud アカウント ID 配下のすべての KMS キーを使用してデータを復号する権限を付与します。特定の KMS キーを使用してデータを復号する権限を付与するには、対応する CMK ID を入力してください。
            ]
          }
        ]
      }

操作手順

重要
  • KMS のキーローテーション付加価値サービスを購入した場合、サーバー側の暗号化は KMS キーの キーローテーション をサポートします。キーローテーションを有効にすると、新しいキーは新しくアップロードされたオブジェクトの暗号化にのみ使用されます。既存のオブジェクトの暗号化キーは変更されません。

  • Object Storage Service (OSS) で KMS 暗号化キーを更新すると、新しいキーは新しくアップロードされたオブジェクトの暗号化にのみ使用されます。キーの更新前にアップロードされたオブジェクトは、引き続き古いキーで暗号化されます。したがって、更新後に古いキーを削除しないでください。削除すると、既存のオブジェクトにアクセスできなくなります。

OSS コンソールを使用する

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

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

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

  2. バケット をクリックし、バケットの作成 をクリックします。

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

    次のパラメーターは、リージョンのサーバー側の暗号化を設定するために使用されます。

    パラメーター

    説明

    [暗号化の方法]

    オブジェクトの暗号化方式を選択します。有効な値:

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

    • [SSE-OSS]:OSS マネージドキーを使用して暗号化します。OSS は、オブジェクトごとに異なるキーを使用して暗号化します。保護を強化するため、OSS はマスターキーを使用してデータ暗号化キー自体も暗号化します。

    • [SSE-KMS]:KMS で管理されるデフォルトのカスタマーマスターキー (CMK) または指定された CMK を使用して、暗号化と復号を行います。

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

    [暗号化アルゴリズム]

    AES256 暗号化アルゴリズムのみがサポートされています。

    [CMK]

    このパラメーターは、暗号化方式として [SSE-KMS] を選択した場合にのみ設定が必要です。

    暗号化キーを選択します。キーの形式は <alias> (CMK ID) です。<alias> は CMK のエイリアスで、CMK ID は CMK の ID です。有効な値:

    • [alias/acs/oss (CMK ID)]:このオプションを選択すると、OSS はデフォルトのサービスキーを使用してバケット内のデータを暗号化し、バケットからオブジェクトをダウンロードするときにデータを自動的に復号します。

    • [alias/<cmkname> (CMK ID][)]:このオプションを選択すると、OSS は指定されたサービスキーを使用してバケット内のデータを暗号化し、暗号化されたオブジェクトのメタデータに CMK ID を記録します。復号権限を持つユーザーがオブジェクトをダウンロードすると、オブジェクトは自動的に復号されます。<cmkname> は、キーの作成時に指定した CMK のオプションのエイリアスです。

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

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

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

既存のバケットに対してサーバー側の暗号化を有効にする

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

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

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

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

    パラメーター

    説明

    [暗号化の方法]

    オブジェクトの暗号化方式を選択します。有効な値:

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

    • [SSE-OSS]:OSS マネージドキーを使用して暗号化します。OSS は、オブジェクトごとに異なるキーを使用して暗号化します。保護を強化するため、OSS はマスターキーを使用してデータ暗号化キー自体も暗号化します。

    • [SSE-KMS]:KMS で管理されるデフォルトのカスタマーマスターキー (CMK) または指定された CMK を使用して、暗号化と復号を行います。

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

    [暗号化アルゴリズム]

    AES256 暗号化アルゴリズムのみがサポートされています。

    [CMK]

    このパラメーターは、暗号化の方法[SSE-KMS] に設定した場合にのみ必須です。

    暗号化キーを選択します。キーの形式は <alias> (CMK ID) です。<alias> は CMK のエイリアスで、CMK ID は CMK の ID です。有効な値:

    • [デフォルトのサービスキー]:このオプションを選択すると、OSS はデフォルトのサービスキーを生成してバケット内のデータを暗号化し、バケットからオブジェクトをダウンロードするときにデータを自動的に復号します。OSS によって作成されたデフォルトのサービスキーの形式は alias/acs/oss (CMK ID) です。このサービスキーは KMS コンソールで表示できます。

      説明

      KMS コンソールでこのサービスキーを表示する前に、少なくとも 1 つのオブジェクトを宛先バケットにアップロードして、対応する暗号化キーが作成され、OSS サービスに関連付けられていることを確認する必要があります。

    • [alias/<cmkname> (CMK ID][)]:このオプションを選択すると、OSS は指定されたサービスキーを使用してバケット内のデータを暗号化し、暗号化されたオブジェクトのメタデータに CMK ID を記録します。復号権限を持つユーザーがオブジェクトをダウンロードすると、オブジェクトは自動的に復号されます。<cmkname> は、キーの作成時に指定した CMK のオプションのエイリアスです。

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

  5. 設定 をクリックします。

方法 2:オブジェクトのアップロード時にサーバー側の暗号化を設定する

詳細については、「簡易アップロード」をご参照ください。

Alibaba Cloud SDK を使用する

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

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

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

public class Demo {
    public static void main(String[] args) throws Throwable {
        // 中国 (杭州) リージョンのエンドポイントを例として使用します。実際のエンドポイントに置き換えてください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // この例では、バケットの暗号化方式を SM4 に設定します。AES256 暗号化を使用するには、SSEAlgorithm.SM4 を 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

// 依存関係をロードするためにオートローダーファイルをインポートします。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// コマンドライン引数の説明を定義します。
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located', 'required' => True], // 必須。バケットが配置されているリージョン。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS', 'required' => False], // オプション。他のサービスが OSS にアクセスするために使用できるドメイン名。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // 必須。バケットの名前。
];

// コマンドライン引数を解析するためのロングオプションリストを生成します。
$longopts = \array_map(function ($key) {
    return "$key:"; // 各パラメーターの後のコロン (:) は、値が必要であることを示します。
}, array_keys($optsdesc));

// コマンドライン引数を解析します。
$options = getopt("", $longopts); 

// 必須の引数が欠落していないか確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // 必須の引数が欠落していることをユーザーに通知します。
        exit(1); 
    }
}

// コマンドライン引数の値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケット名。

// 環境変数から認証情報 (AccessKeyId と AccessKeySecret) をロードします。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();

// 認証情報プロバイダーを設定します。
$cfg->setCredentialsProvider($credentialsProvider);

// リージョンを設定します。
$cfg->setRegion($region);

// エンドポイントが指定されている場合は、エンドポイントを設定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// OSS クライアントインスタンスを作成します。
$client = new Oss\Client($cfg);

// バケットの暗号化構成を設定するためのリクエストオブジェクトを作成します。KMS 暗号化アルゴリズムを使用し、データ暗号化方式として SM4 を指定します。
$request = new Oss\Models\PutBucketEncryptionRequest(
    bucket: $bucket, 
    serverSideEncryptionRule: new Oss\Models\ServerSideEncryptionRule(
        applyServerSideEncryptionByDefault: new Oss\Models\ApplyServerSideEncryptionByDefault(
            sseAlgorithm: 'KMS', // KMS 暗号化アルゴリズムを使用します。
            kmsDataEncryption: 'SM4' // データ暗号化方式は SM4 です。
    ))
);

// putBucketEncryption メソッドを呼び出して、バケットの暗号化構成を設定します。
$result = $client->putBucketEncryption($request);

// 応答を出力します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP 応答ステータスコード。
    'request id:' . $result->requestId // リクエストの一意の識別子。
);
const OSS = require("ali-oss");

const client = new OSS({
  // region をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、region を oss-cn-hangzhou に設定します。
  region: 'yourregion',
  // 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // bucket をご利用のバケット名に設定します。
  bucket: 'yourbucketname'
});

async function putBucketEncryption() {
  try {
    // バケットの暗号化方式を設定します。    

    const result = await client.putBucketEncryption("bucket-name", {
      SSEAlgorithm: "AES256", // この例では、AES256 暗号化を設定する方法を示します。KMS 暗号化を使用する場合は、KMSMasterKeyID プロパティを追加する必要があります。
      // KMSMasterKeyID: "yourKMSMasterKeyId"。KMS キー ID を設定します。このパラメーターは、暗号化方式が KMS の場合に設定できます。SSEAlgorithm の値が KMS で、指定したキーを使用して暗号化する場合、キー ID を入力する必要があります。それ以外の場合、このパラメーターは空にする必要があります。
    });
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

putBucketEncryption();
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpointを、バケットが配置されているリージョンのエンドポイントに置き換えます。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。 例: examplebucket。
var bucketName = "examplebucket";
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";

// ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();

// 署名バージョンを V4 に設定します。
conf.SignatureVersion = SignatureVersion.V4;

// OssClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    // バケットの暗号化を設定します。
    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 (
	"log"

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

func main() {
	// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error creating credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、必要に応じてエンドポイントを設定します。
	// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、必要に応じてリージョンを設定します。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error creating OSS client: %v", err)
	}

	// 暗号化ルールを初期化します。この例では、暗号化方式として AES256 を使用します。
	config := oss.ServerEncryptionRule{
		SSEDefault: oss.SSEDefaultRule{
			SSEAlgorithm: "AES256",
		},
	}

	// バケットの暗号化ルールを設定します。
	err = client.SetBucketEncryption("yourBucketName", config)
	if err != nil {
		log.Fatalf("Error setting bucket encryption: %v", err)
	}

	log.Println("Bucket encryption set successfully")
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。 */
            
    /* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* yourRegion を、バケットが配置されているリージョンに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
    std::string Region = "yourRegion";
    /* バケット名を設定します。 例: examplebucket。 */
    std::string BucketName = "examplebucket";

    /* ネットワークおよびその他のリソースを初期化します。 */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    SetBucketEncryptionRequest setrequest(BucketName);
    setrequest.setSSEAlgorithm(SSEAlgorithm::KMS);
    /* KMS を使用してサーバ側暗号化を設定します。 */
    auto outcome = client.SetBucketEncryption(setrequest);

    if (!outcome.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "SetBucketEncryption fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークおよびその他のリソースを解放します。 */
    ShutdownSdk();
    return 0;
}

方法 2:オブジェクトのアップロード時にサーバー側の暗号化を設定する

次のコードは、一般的な SDK を使用してオブジェクトをアップロードする際にサーバー側の暗号化を設定する方法の例を示しています。他の SDK を使用してオブジェクトをアップロードする際にサーバー側の暗号化を設定する方法の詳細については、「Alibaba Cloud SDK の概要」をご参照ください。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
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 {
        // 例として中国 (杭州) リージョンを取り上げます。実際のリージョンを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // エンドポイントに対応するリージョンを指定します。例:cn-hangzhou。
        String region = "cn-hangzhou";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。例:examplebucket。
        String bucketName = "examplebucket";
        // オブジェクトのフルパスを指定します。フルパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // ローカルファイルのフルパスを指定します。例:D:\\localpath\\examplefile.txt。
        // ローカルファイルのフルパスを指定しない場合、ファイルはプロジェクトに対応するローカルパスからアップロードされます。
        String filePath= "D:\\localpath\\examplefile.txt";
        
        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムの使用を明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
                
        try {
            // ObjectMetadata インスタンスを作成し、サーバー側の暗号化方式を AES256 に設定します。
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, "AES256");

            // PutObjectRequest インスタンスを作成します。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            putObjectRequest.setMetadata(metadata); 

            // ファイルをアップロードします。
            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;


// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンのエンドポイントに yourEndpoint を設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケット名を指定します。例:examplebucket。
$bucket= "examplebucket";
// オブジェクトのフルパスを指定します。フルパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt。
$object = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。例:D:\\localpath\\examplefile.txt。ローカルファイルのフルパスを指定しない場合、ファイルはプロジェクトに対応するローカルパスからアップロードされます。
$filePath = "D:\\localpath\\examplefile.txt";

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

    $options[OssClient::OSS_HEADERS] = array(
         // サーバー側の暗号化方式を AES256 に設定します。
        "x-oss-server-side-encryption"=>"AES256",
    );
    // uploadFile メソッドを呼び出してファイルをアップロードし、UploadOptions オブジェクトを渡します。
    $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({
  // バケットが配置されているリージョンに yourregion を設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを oss-cn-hangzhou に設定します。
  region: "oss-cn-hangzhou",
  // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // バケット名を指定します。
  bucket: "examplebucket",
});

const headers = {
  // サーバー側の暗号化方式を AES256 に設定します。
  "x-oss-server-side-encryption": "AES256",
};

async function put() {
  try {
    const result = await client.put(
      // オブジェクトのフルパスを指定します。フルパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt。
      "exampledir/exampleobject.txt",
      // ローカルファイルのフルパスを指定します。例:D:\\localpath\\examplefile.txt。ローカルファイルのフルパスを指定しない場合、ファイルはプロジェクトに対応するローカルパスからアップロードされます。
      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

# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())

# バケットが配置されているリージョンのエンドポイントに yourEndpoint を設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'

# バケット名を指定します。
bucket_name = 'examplebucket0703'
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# ファイルはバイナリモードで開く必要があります。
# ローカルファイルのフルパスを指定します。ローカルファイルのフルパスを指定しない場合、ファイルはプロジェクトに対応するローカルパスからアップロードされます。
local_file_path = 'D:\\examplefile.jpg'
with open(local_file_path, 'rb') as fileobj:
    # seek メソッドは、読み取りおよび書き込み操作が 1,000 バイト目から開始されることを指定します。ファイルをアップロードする場合、アップロードは 1,000 バイト目から開始され、ファイルの末尾まで続行します。
    fileobj.seek(1000, os.SEEK_SET)
    # tell メソッドは現在の位置を返します。
    current = fileobj.tell()

    # サーバー側の暗号化方式を AES256 に設定します。
    headers = {
        'x-oss-server-side-encryption': 'AES256',
    }

    # オブジェクトのフルパスを指定します。フルパスにバケット名を含めることはできません。
    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() {
	// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// OSSClient インスタンスを作成します。
	// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。実際のエンドポイントを指定してください。
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// バケット名を指定します。例:examplebucket。
	bucket, err := client.Bucket("examplebucket")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
  // オブジェクトのフルパスを指定します。フルパスにバケット名を含めることはできません。例:D:\\localpath\\examplefile.txt。
  // ローカルファイルのフルパスを指定します。例:D:\\examplefile.jpg。ローカルファイルのフルパスを指定しない場合、ファイルはプロジェクトに対応するローカルパスからアップロードされます。
  // サーバー側の暗号化方式を AES256 に設定します。
	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 をインストールするには、「ossutil のインストール」をご参照ください。

次の例では、examplebucket という名前の既存バケットで、サーバー側の暗号化方式を AES256 に設定する方法を示します。

ossutil api put-bucket-encryption --bucket examplebucket --server-side-encryption-rule "{\"ApplyServerSideEncryptionByDefault\":{\"SSEAlgorithm\":\"AES256\"}}"

このコマンドの詳細については、「put-bucket-encryption」をご参照ください。

方法 2:オブジェクトのアップロード時にサーバー側の暗号化を設定する

ossutil を使用すると、オブジェクトのアップロード時にサーバー側の暗号化方式を指定できます。ossutil をインストールするには、「ossutil のインストール」をご参照ください。次の例では、オブジェクトのアップロード時にサーバー側の暗号化方式を AES256 に設定する方法を示します。

ossutil cp examplefile.txt oss://examplebucket --metadata=x-oss-server-side-encryption:AES256

このコマンドの詳細については、「cp (オブジェクトのアップロード)」をご参照ください。

KMS マネージドキーによる暗号化と復号

KMS が管理するカスタマーマスターキー (CMK) を使用してデータ暗号化キーを生成し、データを暗号化できます。エンベロープ暗号化は、不正なデータアクセスを防ぐための追加のセキュリティ層となります。KMS を使用すると、キーの機密性、完全性、可用性を確保するために多額の投資をすることなく、データの暗号化、復号、電子署名検証などのビジネス機能に集中できます。

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

image

SSE-KMS を使用する場合、次のタイプのキーを使用できます。

  • OSS が管理するデフォルトの KMS キーを使用する

    OSS は、デフォルトの KMS CMK を使用して、オブジェクトごとに異なるキーを生成して暗号化し、オブジェクトのダウンロード時に自動的に復号します。この機能を初めて使用すると、OSS は KMS 内に OSS マネージドの CMK を作成します。

    設定方法:

    • バケットの暗号化方式を設定する

      バケットの暗号化方式に KMS を設定し、暗号化アルゴリズムとして AES256 または SM4 を指定しますが、CMK ID は指定しません。このバケットにアップロードされたすべてのオブジェクトは、デフォルトで暗号化されます。

    • 宛先オブジェクトの暗号化方式を設定する

      オブジェクトをアップロードするか、そのメタデータを変更する際に、リクエストに x-oss-server-side-encryption パラメーターを含めてその値を KMS に設定すると、OSS はデフォルトの KMS CMK と AES256 暗号化アルゴリズムを使用してオブジェクトを暗号化します。 詳細については、「PutObject」をご参照ください。

  • Bring-Your-Own-Key (BYOK) を使用する

    KMS コンソールでキーマテリアルを使用して CMK を生成した後、OSS は指定された KMS CMK を使用して、オブジェクトごとに異なるキーを生成して暗号化できます。CMK ID は暗号化されたオブジェクトのメタデータに保存されます。オブジェクトは、復号権限を持つユーザーがダウンロードした場合にのみ自動的に復号されます。

    キーマテリアルには 2 つのソースがあります。

    • Alibaba Cloud が提供するキーマテリアル:KMS コンソールでキーを作成する際に、キーマテリアルソースとして Alibaba Cloud KMS を選択します。

    • 独自のキーマテリアル:KMS コンソールでキーを作成する際に、キーマテリアルソースとして 外部 を選択し、必要に応じて外部キーマテリアルをインポートします。外部キーマテリアルのインポート方法の詳細については、「キーマテリアルのインポート」をご参照ください。

    設定方法:

    • バケットの暗号化方式を設定する

      バケットの暗号化方式に KMS を設定し、暗号化アルゴリズムとして AES256 または SM4 を指定し、 CMK ID を指定します。このバケットにアップロードされたすべてのオブジェクトは、デフォルトで暗号化されます。

    • 宛先オブジェクトの暗号化方式を設定する

      オブジェクトをアップロードするか、そのメタデータを変更するときは、x-oss-server-side-encryption パラメーターを KMS に、x-oss-server-side-encryption-key-id パラメーターを指定の CMK ID に設定します。 OSS は、指定された KMS CMK と AES256 暗号化アルゴリズムを使用してオブジェクトを暗号化します。 詳細については、「PutObject」をご参照ください。

OSS マネージドキーを使用した暗号化と復号

OSS はデータ暗号化キーを生成および管理し、強力な多要素セキュリティ対策でそれらを保護します。データは、業界標準の高度暗号化標準 (AES) 256 アルゴリズムを使用して暗号化されます。オブジェクトにアクセスする際、データは自動的に復号されます。

設定方法:

  • バケットの暗号化方式の設定

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

  • 宛先オブジェクトの暗号化方式の設定

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

関連 API オペレーション

前述の操作は、API オペレーションに基づいて実装されています。アプリケーションに高度なカスタム要件がある場合は、REST API リクエストを直接発行できます。REST API リクエストを直接発行するには、署名を計算するコードを手動で記述する必要があります。詳細については、「PutBucketEncryption」をご参照ください。

よくある質問

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

OSS は、サーバー側の暗号化設定を有効にした後にアップロードされるオブジェクトのみを暗号化します。既存のオブジェクトは暗号化されません。既存のオブジェクトを暗号化するには、CopyObject API で上書きしてください。