ログのセキュリティを保証するには、Log Service API のすべての HTTP リクエストがセキュリティ認証を渡す必要があります。 現在、このセキュリティ認証は Alibaba Cloud AccessKeyに基づいており、対称暗号化アルゴリズムを使用して完了しています。

プロセスは次のとおりです。
  1. リクエスタは、API リクエストコンテンツ (HTTP ヘッダーとボディを含む) に基づいて SignString を生成します。
  2. リクエスタは、Alibaba Cloud のアクセス キー ペア (AccessKeyID と AccessKeySecret) を使用して、最初のステップで生成された署名文字列に署名し、この API リクエストのデジタル署名を形成します。
  3. リクエスタは、API リクエストコンテンツとデジタル署名の両方をサーバーに送信します。
  4. リクエストを受け取った後、Log Service はステップの 1 と 2 を繰り返し、このリクエストに対して期待デジタル署名を計算します。 注意:Log Service は、このリクエストで使用される AccessKey ペアをバックエンドから取得します。
  5. サーバーは、リクエストされたデジタル署名とリクエスタから送信されたデジタル署名を比較します。 両者が同じであれば、セキュリティリクエストを渡します。 それ以外の場合、リクエストは直ちに拒否されます。

次の図はプロセス全体を直感的に説明したものです。

図 1. セキュリティ検証プロセス
前述のセキュリティ認証プロセスは、次の目的にも使用できます。
  • 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 は改行文字、プラス記号 (+) は文字列の連結演算を示します。 その他の部分は次のように定義されています。

表 1. 文字列定義の署名
名前 定義
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-logx-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 標準リクエストヘッダーデータの値に置き換わります。

CanonicalizedLOGHeaders 構築方法は以下のとおりです。
  1. 接頭辞が x-log および x-acs のすべての HTTP リクエストヘッダーの名前を小文字に変換します。
  2. 前の手順で取得したすべてのLog Serviceカスタムリクエストヘッダーを、昇順に辞書で並べ替えます。
  3. リクエストヘッダーとコンテンツ間のセパレータの両端にあるスペースをすべて削除します。
  4. すべてのヘッダーとコンテンツを \n セパレーターで区切り、最終的な CanonicalizedHeaders を作成します。
正規化リソースの構築方法は次のとおりです。
  1. CanonicalizedResource を空の文字列 ("") に設定します。
  2. アクセスする Log Service リソースを入力します (例:/logstores/logstorename)。 logstorename が存在しない場合、フィールドは空白にします。
  3. リクエストにクエリ文字列 (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 を使用して署名を計算した場合、結果のシグネチャは次のようになります。

XWLGYHGg2F2hcfxWxMLiNkGki6g=

最後に、デジタル署名された 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:XWLGYHGg2F2hcfxWxMLiNkGki6g=
<Log contents are serialized to byte streams in the ProtoBuffer format>