PostObject 操作を使用してファイルをアップロードする場合、Object Storage Service (OSS) では、各アップロードリクエストにセキュリティのための署名を含める必要があります。POST V1 署名では、AccessKey Secret を使用して、アップロードポリシーおよび有効期限などのリクエストパラメーターを含む文字列に署名し、その結果として署名を算出します。アプリケーションサーバーがこの署名を生成し、アップロードポリシーとともにクライアントに提供します。クライアントは、この情報をもとにアップロードリクエストを構築します。OSS がリクエストを受信すると、署名の認証を行います。OSS は、有効な署名を含むリクエストのみを受け付け、それ以外のリクエストはすべて拒否します。
OSS では、よりセキュアな V4 署名アルゴリズムもサポートされています。セキュリティを強化するため、V4 署名の利用を推奨します。詳細については、「V4 署名」をご参照ください。
POST 署名の概要
HTTP POST リクエストでは、V1 署名アルゴリズムがサポートされています。フォームおよびポリシーは、アップロードリクエストのセキュリティおよび準拠性を確保する上で重要な役割を果たします。
フォーム
フォームとは、ファイルおよび関連するメタデータを渡すために使用される POST リクエスト内のフィールドのコレクションです。以下のフォーム要素は、POST V1 署名に固有のものです。その他の一般的なフォーム要素については、「PostObject のフォーム要素」をご参照ください。
|
フィールド |
型 |
説明 |
|
OSSAccessKeyId |
String |
AccessKey ペアから取得した AccessKey ID。 デフォルト値:なし
重要
|
|
Signature |
String |
AccessKey Secret およびポリシーから算出された署名。OSS はこの署名を使用して POST リクエストを認証します。詳細については、「PostObject」をご参照ください。 デフォルト値:なし 重要
|
ポリシー
ポリシーフォームフィールドは、HTML フォームを使用して OSS へファイルをアップロードする際の権限および制約を定義するセキュリティポリシーです。ポリシーは JSON 形式で定義され、許可されるバケット名、オブジェクトプレフィックス、有効期限、許可される HTTP メソッド、コンテンツサイズの制限、およびコンテンツタイプの制限などのパラメーターを用いて、アップロード操作を制限します。
ポリシーには、expiration フィールドおよび conditions フィールドを必ず含めてください。
{
"expiration": "2023-12-03T13:00:00.000Z",
"conditions": [
{"bucket": "examplebucket"},
["content-length-range", 1, 10],
["eq", "$success_action_status", "201"],
["starts-with", "$key", "user/eric/"],
["in", "$content-type", ["image/jpg", "image/png"]],
["not-in", "$cache-control", ["no-cache"]]
]
}
ポリシーには、以下の要素が含まれます。
-
expiration
ポリシーの有効期限を ISO 8601 GMT 形式で指定します。たとえば、
2023-12-03T13:00:00.000Zは、POST リクエストが 2023 年 12 月 3 日 13 時までに開始される必要があることを意味します。 -
conditions
POST リクエスト内のフォームフィールドの有効な値を指定します。
フィールド
型
必須
説明
条件一致モード
bucket
String
いいえ
バケット名。
bucket
content-length-range
String
いいえ
アップロード対象のオブジェクトの許容最小サイズおよび最大サイズ(バイト単位)。
content-length-range
success_action_status
String
いいえ
アップロード成功時の状態コード。
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci
key
String
いいえ
アップロード対象のオブジェクト名。
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci
content-type
String
いいえ
アップロード対象のファイルタイプを制限します。
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci
cache-control
String
いいえ
オブジェクトのキャッシュ動作を指定します。
eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci
署名の算出プロセス
-
UTF-8 エンコーディングされたポリシーを作成します。
-
署名対象文字列を構築します。
ポリシーを Base64 エンコーディングします。その結果得られる文字列が、署名対象文字列 (StringToSign) です。
-
署名を算出します。
署名対象文字列に対して AccessKey Secret を使用して署名を実行します。署名方式は
Signature = base64(hmac-sha1(AccessKeySecret,base64(policy)))です。
POST 署名算出の完全な例
以下の Java の例では、与えられたポリシーに対する POST 署名の算出プロセス全体を示します。
import org.apache.commons.codec.binary.Base64;
public class Demo {
public static void main(String[] args) {
// このコード例を実行する前に、OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
String accessKeySecret = System.getenv().get("OSS_ACCESS_KEY_SECRET");
// ステップ 1: ポリシーを作成します。
String policy = "{\n" +
" \"expiration\": \"2023-12-03T13:00:00.000Z\",\n" +
" \"conditions\": [\n" +
" {\"bucket\": \"examplebucket\"},\n" +
" [\"content-length-range\", 1, 10],\n" +
" [\"eq\", \"$success_action_status\", \"201\"],\n" +
" [\"starts-with\", \"$key\", \"user/eric/\"],\n" +
" [\"in\", \"$content-type\", [\"image/jpg\", \"image/png\"]],\n" +
" [\"not-in\", \"$cache-control\", [\"no-cache\"]]\n" +
" ]\n" +
"}";
// ステップ 2: 署名対象文字列 (StringToSign) を構築します。
String stringToSign = new String(Base64.encodeBase64(policy.getBytes()));
// ステップ 3: 署名を算出します。
String signature = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, stringToSign);
System.out.println("signature:" + signature);
}
}
以下の結果が返されます。
signature:hR2cJnoG9uzrZLDAmrfOtUjtkSM=