Key Management Service (KMS) は、リクエスト署名を使用してAPI呼び出し元のIDを検証します。 これにより、API操作を呼び出すときのデータセキュリティが確保されます。
セキュリティ検証
セキュリティ検証は、KMSのアプリケーションアクセスポイント (AAP) にバインドされたクライアントキーに基づいて行われ、非対称署名アルゴリズムを使用して次の操作を実行します。
APIリクエストを送信するユーザーのIDを確認します。
ユーザーがリクエストを送信する前に、ユーザーは署名を生成するためにAAPにバインドされているクライアントキーを指定する必要があります。 ユーザのアイデンティティは、サーバ上のクライアント鍵に基づいて識別される。 このようにして、アクセス許可を効率的に管理することができる。
送信中にAPIリクエストが改ざんされているかどうかを確認します。
サーバは、受信した要求の署名を検証する。 送信中にリクエストが改ざんされた場合、リクエストは署名検証に合格できません。
次のプロセスでは、APIリクエストのセキュリティ検証について説明します。
クライアントは、APIリクエストのHTTPヘッダーと本文に基づいて、文字列署名を生成します。
クライアントは、AAPにバインドされているクライアント鍵の秘密鍵を使用してステップ1で生成された文字列に署名し、API要求の署名を生成します。 PrivateKeyDataパラメーターは、秘密鍵を指定します。
クライアントは、API要求データおよび署名をサーバに送信する。
サーバが要求を受信した後、サーバはクライアント鍵の公開鍵を使用して署名を検証する。 署名が検証に合格した場合、API要求は受け入れられる。 署名が検証に失敗した場合、APIリクエストは拒否されます。
説明サーバーは、バックエンドでAAPにバインドされているクライアント鍵の公開鍵を取得します。
署名プロセス
APIリクエストがセキュリティ検証に合格することを確認するには、クライアントでAPIリクエストに署名して署名を生成し、HTTP Authorizationヘッダーを使用して署名を送信します。 次の例は、HTTP認証ヘッダーを示しています。
Authorization = "TOKEN" + " " + Signature
署名は、AAPにバインドされたクライアント鍵の秘密鍵を使用して生成され、API要求に署名します。 次のプロセスでは、署名を生成する方法について説明します。
AAPにバインドされているクライアントキーを取得します。
クライアント鍵の秘密鍵は、API要求に対する署名を生成するために必要とされる。 既存のクライアントキーを使用するか、クライアントキーを作成できます。 クライアントキーが有効になっていることを確認します。
APIリクエストの文字列を生成します。
string-to-signには、HTTPリクエストメソッド、HTTPリクエストヘッダー、HTTPリクエストボディなどの情報が含まれます。 string-to-signの形式は次のとおりです。
SignString = HTTP-METHOD + "\n" + CONTENT-SHA256 + "\n" + CONTENT-TYPE + "\n" + DATE + "\n" + CanonicalizedKMSHeaders + "\n" + CanonicalizedResource
\n
は改行、プラス記号(+)
は文字列連結演算子です。 次の表に、その他のヘッダーを示します。ヘッダー
説明
例
HTTPメソッド
HTTP リクエストの方式。
PUT、GET、POST
コンテンツ-SHA256
リクエストコンテンツのSHA-256ハッシュ値。
AE71057543002AD513AB88D78509A1214192C09F20302C4BF8F59B7EB565 ****
コンテンツタイプ
HTTP リクエストボディの型
application/x-protobuf
日付
HTTPリクエストの標準タイムスタンプヘッダー。 このヘッダーはRFC 1123形式に従います。 時間は協定世界時 (UTC) です。
9月27日月曜日2021 11:47:26 GMT
CanonicalizedKMSHeaders
HTTPリクエストの先頭に
x-kms
が付いたカスタムヘッダーで構成される文字列。x-kms-acccesskeyid:KAAP.9c84ad54-d3c5-47c3-b0e7-7c26d509 ****\nx-kms-apiname: 暗号化 \nx-kms-apiversion:dkms-gcs-0.2\nx-kms-signaturemethod:RSA_PKCS1_SHA_256
CanonicalizedResource
値は
/
として固定されます。/
HTTPリクエストに本文がない場合、
CONTENT-SHA256
およびCONTENT-TYPE
ヘッダーは空の文字列になります。 string-to-signの形式は次のとおりです。SignString = HTTP-METHOD + "\n" + "\n" + "\n" + DATE + "\n" + CanonicalizedKMSHeaders + "\n" + CanonicalizedResource
KMS APIには、
x-kms
というプレフィックスが付いたカスタムヘッダーが導入されています。 APIリクエストでカスタムヘッダーを指定した場合、このヘッダーの値は署名の計算に使用されます。 次のプロセスでは、CanonicalizedKMSHeaders
ヘッダーを生成する方法について説明します。先頭に
x-kms
が付いているすべてのHTTPヘッダー名を小文字に変換します。すべてのカスタムリクエストヘッダーをアルファベット順に並べ替えます。
各ヘッダーとヘッダーの値の間の区切り文字の両側のスペースをすべて削除します。 例:
CONTENT-TYPE: application/x-protobuf
はCONTENT-TYPE: application/x-protobuf
に変換されます。CanonicalizedKMSHeadersヘッダーを取得するには、すべてのヘッダーとヘッダーの値を
\n
区切り文字で区切ります。
リクエストの署名を生成します。
KMS APIは、署名アルゴリズム
RSA_PKCS1_SHA_256
のみをサポートします。 次の式を使用して署名を生成できます。Signature=Base64(RSA_PKCS1_SHA_256(SignString, AAP_KEY))
署名を生成するときは、次の項目に注意してください。
Base64の署名アルゴリズムによって生成された値をエンコードする必要があります。
文字列に署名するには、RSASSA-PKCS1-v1_5署名アルゴリズムを使用する必要があります。 RSASSA-PKCS1-v1_5署名アルゴリズムの詳細については、RFC 3447をご覧ください。
署名を生成したら、署名をAuthorizationヘッダーに追加します。
string-to-signは
UTF-8
でエンコードする必要があります。 文字列に漢字が含まれている場合は、署名を計算する前に文字列をUTF-8
でエンコードする必要があります。リクエストには、
CONTENT-SHA256
およびCONTENT-TYPE
ヘッダーは必要ありません。CONTENT-SHA256
ヘッダーとCONTENT-TYPE
ヘッダーが空の場合、ヘッダーの値を改行\n
に置き換える必要があります。
署名の例
次の例は、APIリクエストの署名方法を示しています。 この例では、Encrypt操作が使用されます。
KMS APIは、AAPにバインドされている次のクライアントキーとEncrypt操作の暗号化パラメーターを使用します。
AAPにバインドされているクライアントキー
{ "KeyId": "KAAP.9c84ad54-d3c5-47c3-b0e7-7c26d509****", "PrivateKeyData": "MIIJqwIB****UcQ==" }
暗号化操作の暗号化パラメーター
keyId = "1234abcd-12ab-34cd-56ef-12345678****" plaintext = "plain text"
次のプロセスは、署名プロセスを示しています。
KMS APIの定義に基づいて、次のHTTPリクエストを作成します。
POST / HTTP/1.1 Date: Mon, 27 Sep 2021 11:47:26 GMT Host: kst-xxxx.cryptoservice.kms.aliyuncs.com Accept: application/x-protobuf Content-SHA256: AE71057543002AD513AB88D78509A1214192C09F20302C4BF8F59B7EB565**** Content-Length: 40 Content-Type: application/x-protobuf x-kms-acccesskeyid: KAAP.9c84ad54-d3c5-47c3-b0e7-7c26d509**** x-kms-apiversion: dkms-gcs-0.2 x-kms-apiname: Encrypt x-kms-signaturemethod: RSA_PKCS1_SHA_256 <The encryption parameters are serialized into byte streams in the Protocol Buffers format.>
プロトコル・バッファ形式のバイト・ストリームは、要求本体として使用される。 リクエストの
Content-Type
ヘッダーの値は、application/x-protobuf
に設定されます。Content-SHA256
ヘッダーの値は、SHA-256を使用してリクエスト本文を計算した後に生成される大文字の16進文字列に設定されます。文字列記号を作成します。
POST\nAE71057543002AD513AB88D78509A1214192C09F20302C4BF8F59B7EB56551E2\napplication/x-protobuf\nMon, 27 Sep 2021 11:47:26 GMT\nx-kms-acccesskeyid:KAAP.9c84ad54-xxxx-xxxx-xxxx-7c26d509a55d\nx-kms-apiname:Encrypt\nx-kms-apiversion:dkms-gcs-0.2\nx-kms-signaturemethod:RSA_PKCS1_SHA_256\n/
クライアント鍵の秘密鍵を使用して署名を生成し、Base64で署名をエンコードします。
BPwBSB9NkxxuepqJ2zRtLT8jgv0FIAELJI2U79k8OPO7M7Y18Sz6+njTSwYWeIIQpJIJKx+mGBl/aR9opPbfQ+PhH+78rIPLJYNAJRvvaSUW/cRr4BMc1ByRXvuBmIcI81MQGutuU8uLnQYh9AURdklpqcW3ODz5OfsbuuxTGV17COoSO10tW3ltADumaMczFGTM0qCYi/pyh8p8i/gpwC3EXo540n5mqEmLexYIWb5/Fo+VonqZxZ3UuhZPw3vQ8uvqMGqvvw0xxKsblGuEdNSHcy/GYGRTFYugwOojZxd7TpADTqys+7SYaBWT38HnQLcH04DeD5rKkhRK7au8HQ==
署名を含むHTTPリクエストを送信します。
POST / HTTP/1.1 Date: Mon, 27 Sep 2021 11:47:26 GMT Host: kst-xxxx.cryptoservice.kms.aliyuncs.com Accept: application/x-protobuf Content-SHA256: AE71057543002AD513AB88D78509A1214192C09F20302C4BF8F59B7EB565**** Content-Length: 40 Content-Type: application/x-protobuf x-kms-acccesskeyid: KAAP.9c84ad54-d3c5-47c3-b0e7-7c26d509**** x-kms-apiversion: dkms-gcs-0.2 x-kms-apiname: Encrypt x-kms-signaturemethod: RSA_PKCS1_SHA_256 Authorization: TOKEN BPwBSB9NkxxuepqJ2zRtLT8jgv0FIAELJI2U79k8OPO7M7Y18Sz6+njTSwYWeIIQpJIJKx+mGBl/aR9opPbfQ+PhH+78rIPLJYNAJRvvaSUW/cRr4BMc1ByRXvuBmIcI81MQGutuU8uLnQYh9AURdklpqcW3ODz5OfsbuuxTGV17COoSO10tW3ltADumaMczFGTM0qCYi/pyh8p8i/gpwC3EXo540n5mqEmLexYIWb5/Fo+VonqZxZ3UuhZPw3vQ8uvqMGqvvw0xxKsblGuEdNSHcy/GYGRTFYugwOojZxd7TpADTqys+7SYaBWT38HnQLcH04DeD5rKkhRK7au8HQ== <The encryption parameters are serialized to byte streams in the Protocol Buffers format.>