認証情報を Authorization ヘッダーで渡す代わりに、クエリ文字列パラメーターとして URL に直接埋め込むことができます。これにより、アクセス認証情報を公開することなく、Object Storage Service (OSS) リソースへの期限付きリンクを共有できます。
V4 署名アルゴリズムを使用して、セキュリティを向上させます。詳しくは、「URL に V4 署名を含める (推奨)」をご参照ください。
SDK を使用した署名付き URL の生成
OSS SDK は V1 署名を自動的に処理します。SDK を使用する場合、署名を手動で構築する必要はありません。次の表に、サポートされている各言語の署名実装と使用例を示します。
| SDK | 署名実装 | 使用例 |
|---|---|---|
| Java | OSSV1Signer.java | Java |
| PHP | SignerV1.php | PHP |
| Node.js | signatureUrl.js | Node.js |
| Browser.js | Browser.js | — |
| Python | auth.py | Python |
| Android | ObjectURLPresigner.java | Android |
| iOS | OSSClient.m | iOS |
| Go | v1.go | Go |
| C++ | SignerV1.cc | C++ |
| C | oss_auth.c | C |
| .NET | OssClient.cs | .NET |
| Ruby | bucket.rb | Ruby |
署名付き URL の手動構築
署名付き URL を自分で構築するには、次のものが必要です。
AccessKey ID と AccessKey Secret、または Security Token Service (STS) からの一時アクセス認証情報
ターゲットリソースのバケット名とオブジェクトパス
目的の HTTP メソッド (
GET、PUTなど)Unix タイムスタンプ形式の有効期限
URL 形式
V1 署名付き URL は次の構造を持ちます。
https://<bucket>.oss-<region>.aliyuncs.com/<object>?OSSAccessKeyId=<key-id>&Expires=<unix-timestamp>&Signature=<encoded-signature>STS からの一時アクセス認証情報を使用するには、security-token パラメーターを追加します。
https://<bucket>.oss-<region>.aliyuncs.com/<object>?OSSAccessKeyId=<key-id>&Expires=<unix-timestamp>&Signature=<encoded-signature>&security-token=<sts-token>IP アドレスまたは virtual private cloud (VPC) によるアクセスを制限するには、対応するアクセス制御パラメーターを含めます。
https://<bucket>.oss-<region>.aliyuncs.com/<object>?OSSAccessKeyId=<key-id>&Expires=<unix-timestamp>&Signature=<encoded-signature>&x-oss-ac-subnet-mask=32URL パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
OSSAccessKeyId | 文字列 | はい | URL の署名に使用される AccessKey ID。 |
Expires | 数値 | はい | Unix タイムスタンプ形式の有効期限 (1970-01-01 00:00:00 UTC からの秒数)。OSS はこの時刻以降に受信したリクエストを拒否します。たとえば、現在時刻が 1141889060 で、URL を 60 秒間有効にしたい場合、これを 1141889120 に設定します。OSS コンソールのデフォルトの有効期間は 3,600 秒で、最大は 32,400 秒です。有効期間を変更するには、「オブジェクト URL の使用」をご参照ください。 |
Signature | 文字列 | はい | URL エンコードされ、Base64 エンコードされた HMAC-SHA1 署名。詳細については、以下の「署名式」をご参照ください。 |
security-token | 文字列 | いいえ | STS からのセキュリティトークン。一時アクセス認証情報を使用する場合にのみ必須です。詳細については、「STS が提供する一時アクセス認証情報を使用して OSS にアクセスする」をご参照ください。AssumeRole 操作を呼び出すか、さまざまなプログラミング言語用の STS SDK を使用して、一時アクセス認証情報を取得できます。一時アクセス認証情報には、セキュリティトークンと一時 AccessKey ペア (AccessKey ID + AccessKey Secret) が含まれます。 |
x-oss-ac-source-ip | 文字列 | いいえ | IP アドレスまたは CIDR ブロック。署名生成時にのみ使用されます。URL 自体には含めないでください。x-oss-ac-subnet-mask と一緒に使用する必要があります。 |
x-oss-ac-subnet-mask | 数値 | いいえ | サブネットマスク長 (先頭の 1 ビット数)。OSS は、リクエストのソース IP とこのマスクに対してビット単位の AND 演算を実行し、署名を検証します。このパラメーターが改ざんされた場合、署名検証は失敗します。 |
x-oss-ac-vpc-id | 文字列 | いいえ | VPC ID。OSS は、リクエストが指定された VPC から送信されたことを検証し、ソース IP または CIDR ブロックもチェックします。 |
x-oss-ac-forward-allow | ブール値 | いいえ | リクエストが転送されたときに、署名検証のために X-Forwarded-For ヘッダーを使用するかどうか。有効な値: true、false (デフォルト)。これを true に設定すると、リクエストヘッダーが改ざんされる可能性があります。 |
署名式
Signature パラメーターは、Authorization ヘッダーと同じアルゴリズムを使用しますが、1 つの違いがあります。署名文字列では、Date ヘッダーを Expires に置き換えます。Date をリクエストに含めることはできますが、署名文字列には含めないでください。
Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ CONTENT-MD5 + "\n"
+ CONTENT-TYPE + "\n"
+ EXPIRES + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource)))CONTENT-MD5、CONTENT-TYPE、および CanonicalizedOSSHeaders については、「署名 V1」と同じルールに従ってください。
URL にSignature、Expires、またはOSSAccessKeyIdが複数回出現する場合、OSS は最初の値を使用します。OSS はリクエストを受信すると、最初にExpiresをチェックし、次にSignatureを検証します。
Python の例
次の例は、必須パラメーターのみを使用して GET リクエストの V1 署名を計算します。
import base64
import hmac
import hashlib
from urllib.parse import quote
access_key_secret = "yourAccessKeySecret"
string_to_sign = "GET\n\n\n1141889120\n/examplebucket/oss-api.pdf"
h = hmac.new(
access_key_secret.encode('utf-8'),
string_to_sign.encode('utf-8'),
hashlib.sha1
)
signature = quote(base64.b64encode(h.digest()).decode('utf-8'))
print(signature)プレースホルダー値を置き換えます。
| プレースホルダー | 説明 |
|---|---|
yourAccessKeySecret | ご利用の AccessKey Secret |
1141889120 | 有効期限の Unix タイムスタンプ |
/examplebucket/oss-api.pdf | CanonicalizedResource (/<bucket>/<object>) |
セキュリティに関する考慮事項
署名付き URL を使用してデータを共有する場合、URL を持つすべてのインターネットユーザーは、URL の有効期間内にデータにアクセスできます。事前にデータリスクを評価することを推奨します。
不正アクセスリスクを軽減するには:
x-oss-ac-source-ip、x-oss-ac-subnet-mask、およびx-oss-ac-vpc-idを使用して、IP アドレスまたは VPC によるアクセスを制限します。同じリクエストに対して、URL と
Authorizationヘッダーの両方に URL 署名を含めないでください。OSS はそのようなリクエストを拒否します。
注意事項
PUT リクエストの場合、OSS SDK はリクエストボディの MD5 ハッシュを計算し、署名付き URL に含めます。アップロードされたコンテンツの MD5 ハッシュが一致する必要があります。一致しない場合、PUT リクエストは失敗します。MD5 ハッシュを検証するには、リクエストに
Content-MD5ヘッダーを含めます。x-oss-ac-source-ipは署名生成時にのみ使用されます。配布する URL には含めないでください。
トラブルシューティング
403 AccessDenied エラーが発生するのはなぜですか。
次の一般的な原因を確認してください。
URL に
OSSAccessKeyId、Expires、またはSignatureのいずれか 1 つ以上が不足しています。これら 3 つはすべて必須です (順序は関係ありません)。リクエストが
Expiresタイムスタンプの後に到着したか、タイムスタンプが無効な形式です。システムクロックが同期されており、Expiresの値が将来の有効な Unix タイムスタンプであることを確認してください。
400 InvalidArgument エラーが発生するのはなぜですか。
OSS は、同じリクエストに対して URL と Authorization ヘッダーの両方に署名を含めることを許可していません。いずれかの場所から署名を削除してください。