ログのセキュリティを保証するには、Log Service API のすべての HTTP リクエストがセキュリティ認証を渡す必要があります。 現在、このセキュリティ認証は Alibaba Cloud AccessKey ペアに基づいており、対称暗号化アルゴリズムを使用して完了しています。
- リクエスタは、API リクエストコンテンツ (HTTP ヘッダーとボディを含む) に基づいて SignString を生成します。
- リクエスタは、Alibaba Cloud のアクセス キー ペア (AccessKeyID と AccessKeySecret) を使用して、最初のステップで生成された署名文字列に署名し、この API リクエストのデジタル署名を形成します。
- リクエスタは、API リクエストコンテンツとデジタル署名の両方をサーバーに送信します。
- リクエストを受け取った後、Log Service はステップの 1 と 2 を繰り返し、このリクエストに対して期待デジタル署名を計算します。 注意:Log Service は、このリクエストで使用される AccessKey ペアをバックエンドから取得します。
- サーバーは、リクエストされたデジタル署名とリクエスタから送信されたデジタル署名を比較します。 両者が同じであれば、セキュリティリクエストを渡します。 それ以外の場合、リクエストは直ちに拒否されます。
次の図はプロセス全体を直感的に説明したものです。

- API リクエストを送信するユーザーを確認します。 ユーザーはリクエストを送信する前にデジタル署名を生成するキーペアを指定する必要があるので、サーバーはこのキーペアを使ってユーザーの ID を確認し、アクセス許可を管理することができます。
- ネットワーク送信中にユーザーリクエストが改ざんされていないか確認してください。 Log Service が受信したリクエスト内容のデジタル署名を再計算するためです。 リクエスト内容がネットワーク送信中に改ざんされていると、電子署名が一致しません。
API リクエストへの署名
API リクエストのセキュリティ認証を渡すには、クライアントでこの API リクエストに署名 (つまり、正しいデジタル署名を生成) し、HTTP ヘッダー認証を使用するする必要があります。以下の特別な形式です。
Authorization:LOG <AccessKeyId>:<Signature>
この形式では、 Authorization ヘッダー値には AccessKey ペアの AccessKey ID が含まれ、対応する AccessKey シークレットが署名値を作成するために使用されます。 署名値を作成するには、次の手順に従います。
ステップ 1:適切な Alibaba Cloud AccessKey ペアの準備
API リクエストのデジタル署名を生成するには、AccessKey ID と AccessKey Secret で構成される AccessKey ペアを使用する必要があります。 既存の AccessKey ペアを使用することも、新しいペアを作成することもできます。 AccessKey ペアのステータスは "Active" でなければなりません。
ステップ 2:リクエストの署名文字列の生成Log Service API の署名文字列は、HTTP リクエストの方法、ヘッダー、およびボディを使用して生成されます。 詳細な生成方法は次のとおりです。
SignString = VERB + "\n"
+ CONTENT-MD5 + "\n"
+ CONTENT-TYPE + "\n"
+ DATE + "\n"
+ CanonicalizedLOGHeaders + "\n"
+ CanonicalizedResource
上記の式では、\n
は改行文字、プラス記号 (+
) は文字列の連結演算を示します。 その他の部分は次のように定義されています。
名前 | 定義 | 例 |
---|---|---|
VERB | HTTP リクエストの方法名 | PUT、GET、POST |
CONTENT-MD5 | HTTP リクエストボディの型 | 875264590688CA6171F6228AF5BBB3D2 |
CONTENT-TYPE | HTTP リクエストボディの型 | application/x-protobuf |
DATE | RFC 1123 形式に準拠し、GMT 標準時を使用する HTTP リクエストの標準タイムスタンプヘッダー。 | Mon, 3 Jan 2010 08:33:47 GMT |
CanonicalizedLOGHeaders | HTTP リクエストで x-log と x-acs の接頭辞を含むカスタムヘッダーで構成された文字列 (具体的な構築方法については、以下の説明をご参照ください)。
|
x-log-apiversion:0.6.0\nx-log-bodyrawsize:50\nx-log-signaturemethod:hmac-sha1 |
CanonicalizedResource | HTTP リクエストリソースによって構築された文字列 (詳細を満たすための特殊構築方法) | /logstores/app_log |
ボディのない HTTP リクエストの場合、CONTENT-MD5 フィールドと CONTENT-TYPE フィールドはそれぞれ null 文字列です。 そのようなケースで署名文字列を生成する方法を説明します。
SignString = VERB + "\n"
+ "\n"
+ "\n"
+ DATE + "\n"
+ CanonicalizedLOGHeaders + "\n"
+ CanonicalizedResource
パブリックリクエストヘッダー で説明されているように、カスタムリクエストヘッダー x-log-date
は Log Service API に導入されています。 リクエストでヘッダーを指定すると、リクエスト署名を計算するためにヘッダー値は HTTP 標準リクエストヘッダーデータの値に置き換わります。
- 接頭辞が
x-log
およびx-acs
のすべての HTTP リクエストヘッダーの名前を小文字に変換します。 - 前の手順で取得したすべてのLog Serviceカスタムリクエストヘッダーを、昇順に辞書で並べ替えます。
- リクエストヘッダーとコンテンツ間のセパレータの両端にあるスペースをすべて削除します。
- すべてのヘッダーとコンテンツを
\n
セパレーターで区切り、最終的な CanonicalizedHeaders を作成します。
- CanonicalizedResource を空の文字列 ("") に設定します。
- アクセスする Log Service リソースを入力します (例:/logstores/logstorename)。
logstorename
が存在しない場合、フィールドは空白にします。 - リクエストにクエリ文字列 (
QUERY_STRING
) が含まれる場合、疑問符 (?
) とクエリ文字列を CanonicalizedResource 文字列の末尾に追加します。
QUERY_STRING
は、URL 内のリクエストパラメーターを 50 音の順番に並べ替えた後に生成される文字列です。 文字列を形成するパラメーター名とパラメーター値の間に等号 (=
) を指定します。 パラメーター名 - 値のペアを 50 音の昇順に並べ替えます。 次に、&
を使用して、ペアを接続して文字列を形成します。 式は次のとおりです。
QUERY_STRING = "KEY1=VALUE1" + "&" + "KEY2=VALUE2"
ステップ 3:リクエストのデジタル署名の生成
現在、Log Service API は 1 つのデジタル署名アルゴリズム、つまりデフォルトの署名アルゴリズム hmac-sha1
のみをサポートしています。 全体の署名式は以下のとおりです。
Signature = base64(hmac-sha1(UTF8-Encoding-Of(SignString), AccessKeySecret))
RFC 2104 で定義されている HMAC-SHA1 を署名方法として使用します。 前述の数式で使用した AccessKey Secret は、最終的な承認ヘッダーで使用する AccessKey ID に対応する必要があります。 対応していない場合、リクエストはサーバーによる認証を渡すことができません。
デジタル署名値が計算された後、本ページの冒頭で説明されているように、この値を使用して、 Authorization ヘッダー形式で Log Service API 用に完全なセキュリティ認証ヘッダーを構築し、HTTP リクエストにセキュリティ承認ヘッダーを入力します。 その後、HTTP リクエストを送ることができます。
リクエスト署名プロセスの例
リクエスト署名プロセス全体の理解を深めるために、2 つの例でプロセスを実演します。 まず、Log Service API シグネチャに使用される AccessKey ペアは次のようになります。
AccessKeyId = "bq2sjzesjmo86kq*********"
AccessKeySecret = "4fdO2fTDDnZPU/L7CHNd********"
例 1:
次の GET リクエストを送信して、ali-test-project プロジェクト内のすべての Logstore を一覧表示します。 HTTP リクエストは以下のとおりです。
GET /logstores HTTP 1.1
Mon, 09 Nov 2015 06:11:16 GMT
Host: ali-test-project.regionid.example.com
x-log-apiversion: 0.6.0
x-log-signaturemethod: hmac-sha1
前述の Log Service API リクエストによって生成される署名文字列は次のとおりです。
GET\n\n\nMon, 09 Nov 2015 06:11:16 GMT\nx-log-apiversion:0.6.0\nx-log-signaturemethod:hmac-sha1\n/logstores? logstoreName=&offset=0&size=1000
GET リクエストとして、このリクエストには HTTP ボディがありません。 したがって、生成された署名文字列の CONTENT-TYPE フィールドおよび CONTENT-MD5 フィールドは空の文字列です。 さきほど指定した AccessKey Secret を使用してリクエスト署名を計算するには、取得した署名は次のようになります。
jEYOTCJs2e88o+y5F4/S5IsnBJQ=
最後に、デジタル署名された HTTP リクエストコンテンツを次のように送信します。
GET /logstores HTTP 1.1
Mon, 09 Nov 2015 06:11:16 GMT
Host: ali-test-project.regionid.example.com
x-log-apiversion: 0.6.0
x-log-signaturemethod: hmac-sha1
Authorization: LOG bq2sjzesjmo86kq35behupbq:jEYOTCJs2e88o+y5F4/S5IsnBJQ=
例 2:
プロジェクト ali-test-project の Logstore テストログストアに次のログを書き込む必要があります。
topic=""
time=1447048976
source="10.10.10.1"
"TestKey": "TestContent"
したがって、Log Service API 定義に従って、次の HTTP リクエストを構築する必要があります。
POST /logstores/test-logstore HTTP/1.1
Date: Mon, 09 Nov 2015 06:03:03 GMT
Host: test-project.regionid.example.com
x-log-apiversion: 0.6.0
x-log-signaturemethod: hmac-sha1
Content-MD5: 1DD45FA4A70A9300CC9FE7305AF2C494
Content-Length: 52
x-log-apiversion:0.6.0
x-log-bodyrawsize:50
x-log-compresstype:lz4
x-log-signaturemethod:hmac-sha1
<Log contents are serialized to byte streams in the ProtoBuffer format>
この HTTP リクエストでは、書き込まれたログコンテンツはまず ProtoBuffer 形式にシリアル化され ( 詳細については「ProtoBuffer 形式」をご参照ください)、リクエストボディとして使用されます。 したがって、このリクエストの Content-Type ヘッダー値は、application/x-protobuf です。 同様に、Content-MD5 ヘッダー値は MD5 パラメーターです。 上記の署名文字列構築方法によると、リクエストに対応する署名文字列は次のとおりです。
POST\n1DD45FA4A70A9300CC9FE7305AF2C494\napplication/x-protobuf\nMon, 09 Nov 2015 06:03:03 GMT\nx-log-apiversion:0.6.0\nx-log-bodyrawsize:50\nx-log-compresstype:lz4\nx-log-signaturemethod:hmac-sha1\n/logstores/test-logstore
同じように、さきほど指定した AccessKeySecret を使用して署名を計算した場合、結果のシグネチャは次のようになります。
XWLGYHGg2F2hcfxWxMLiNk****
最後に、デジタル署名された HTTP リクエストコンテンツを以下のように送信します。
POST /logstores/test-logstore HTTP/1.1
Date: Mon, 09 Nov 2015 06:03:03 GMT
Host: test-project.regionid.example.com
x-log-apiversion: 0.6.0
x-log-signaturemethod: hmac-sha1
Content-MD5: 1DD45FA4A70A9300CC9FE7305AF2C494
Content-Length: 52
x-log-apiversion:0.6.0
x-log-bodyrawsize:50
x-log-compresstype:lz4
x-log-signaturemethod:hmac-sha1
Authorization: LOG bq2sjzesjmo86kq35behupbq:XWLGYHGg2F2hcfxWxMLiNk****
<Log contents are serialized to byte streams in the ProtoBuffer format>