action:GetObjectの権限承認など)の実行、限られたリソース(例えばresource:examplebucket-1250000000/exampleobject.txtの権限承認など)へのアクセスのみを許可することをお勧めします。
大きすぎる権限を与えることで、意図しない越権操作が行われ、データセキュリティリスクが生じることを避けるため、ユーザーにすべてのリソースへのアクセス(例えばresource:*など)、またはすべての操作(例えばaction:*など)の権限を承認することは可能な限り避けるよう強く推奨します。examplebucket-1250000000/data/config.jsonおよびexamplebucket-1250000000/video/のダウンロード権限を与えても、権限ポリシーにexamplebucket-1250000000/*を設定していた場合、このバケット下のすべてのオブジェクトのダウンロードが許可されることになり、越権操作行為があった場合は意図しないデータ漏洩が発生します。examplebucket-1250000000/data/config.jsonおよびexamplebucket-1250000000/video/のアップロード権限を与えても、権限ポリシーにexamplebucket-1250000000/*を設定していた場合、このバケット下のすべてのオブジェクトのアップロードが許可されることになり、越権操作行為があった場合は意図しないオブジェクトの上書きが発生します。このようなリスクを防止するためには、最小権限の原則に従うほか、バージョン管理によってデータのすべての過去バージョンを保持し、追跡に役立てることも可能です。cos:GetBucketの出力を許可しても、権限ポリシーにcos:*を設定していた場合、バケット権限の再承認、オブジェクトの削除、バケットの削除を含む、このバケットのすべての操作が許可されることになり、データに極めて大きなリスクをもたらします。exampleobject.jpgなどの指定されたファイル、またはexamplePrefix/*などの指定されたディレクトリとすることができます。業務上の必要がない限り、すべてのリソースにアクセスする権限(ワイルドカード*)をユーザーにみだりに付与しないでください。examplebucket-1250000000内のオブジェクトexampleObject.txtのダウンロード権限を承認したい場合、それに応じて設定する必要があるコードは次のようになります。// githubが提供するmaven統合メソッドによってjava sts sdkをインポートしますimport java.util.*;import org.json.JSONObject;import com.tencent.cloud.CosStsClient;public class Demo {public static void main(String[] args) {TreeMap<String, Object> config = new TreeMap<String, Object>();try {String secretId = System.getenv("secretId");//ユーザーのSecretIdです。サブアカウントのキーを使用し、権限承認は最小権限ガイドに従って行い、使用上のリスクを低減させることをお勧めします。サブアカウントキーの取得については、https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1をご参照くださいString secretKey = System.getenv("secretKey");//ユーザーのSecretKeyです。サブアカウントのキーを使用し、権限承認は最小権限ガイドに従って行い、使用上のリスクを低減させることをお勧めします。サブアカウントキーの取得については、https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1をご参照ください// ご自身のSecretIdに置き換えますconfig.put("SecretId", secretId);// ご自身のSecretKeyに置き換えますconfig.put("SecretKey", secretKey);// 一時キーの有効期間の単位は秒であり、デフォルトでは1800秒、最長7200秒まで設定可能ですconfig.put("durationSeconds", 1800);// ご自身のbucketに置き換えますconfig.put("bucket", "examplebucket-1250000000");// bucketの所在リージョンに置き換えますconfig.put("region", "ap-guangzhou");// ここを許可するパスのプレフィックスに変更します。ご自身のウェブサイトのユーザーログインセッションによって、a.jpg または a/* または * などのように、アップロードを許可する具体的なパスを判断することができます。// 「*」を入力すると、ユーザーにすべてのリソースへのアクセスを許可することになります。業務上の必要がない限り、最小権限の原則に従って、対応する範囲のアクセス権限をユーザーに与えてください。config.put("allowPrefix", "exampleObject.txt");// キーの権限リストです。シンプルアップロード、フォームアップロード、マルチパートアップロードには次の権限が必要です。その他の権限リストについてはhttps://www.tencentcloud.com/document/product/436/31923?from_cn_redirect=1をご覧くださいString[] allowActions = new String[] {// データをダウンロードします"name/cos:GetObject"};config.put("allowActions", allowActions);JSONObject credential = CosStsClient.getCredential(config);//成功すると一時キー情報が返されます。次のようにキー情報を印刷しますSystem.out.println(credential);} catch (Exception e) {//失敗するとエラーがスローされますthrow new IllegalArgumentException("no valid secret !");}}}
examplebucket-1250000000内のオブジェクトexampleObject.txtおよびディレクトリexamplePrefix下のすべてのオブジェクトのダウンロード権限を承認したい場合、そのために書き込む必要があるPolicyは次のようになります。{"version": "2.0","statement":[{"action":["name/cos:GetObject"],"effect": "allow","resource":["qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/exampleObject.txt","qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/examplePrefix/*"]}]}
// 取得した一時キー (tmpSecretId、tmpSecretKey、sessionToken)を渡しますString tmpSecretId = "SECRETID";String tmpSecretKey = "SECRETKEY";String sessionToken = "TOKEN";COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);// bucketのリージョンを設定します。COSリージョンの略称についてはhttps://www.tencentcloud.com/document/product/436/6224?from_cn_redirect=1をご参照ください// clientConfigにはregion、https(デフォルトではhttp)、タイムアウト、プロキシなどを設定するsetメソッドが含まれます。使用にあたってはソースコードまたはよくあるご質問のJava SDKのパートを参照できますRegion region = new Region("COS_REGION");ClientConfig clientConfig = new ClientConfig(region);// httpsプロトコルを使用したURLを生成したい場合はこの行を設定します。設定することをお勧めします。// clientConfig.setHttpProtocol(HttpProtocol.https);// cosクライアントを生成しますCOSClient cosClient = new COSClient(cred, clientConfig);// バケットの命名形式はBucketName-APPIDですString bucketName = "examplebucket-1250000000";// ここでのkeyはオブジェクトキーです。オブジェクトキーはオブジェクトのバケット内での固有識別子ですString key = "exampleobject";GeneratePresignedUrlRequest req =new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);// ダウンロード時に返されるhttpヘッダーを設定しますResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();String responseContentType = "image/x-icon";String responseContentLanguage = "zh-CN";// レスポンスヘッダーに含まれるファイル名の情報を設定しますString responseContentDispositon = "filename=\\"exampleobject\\"";String responseCacheControl = "no-cache";String cacheExpireStr =DateUtils.formatRFC822Date(new Date(System.currentTimeMillis() + 24L * 3600L * 1000L));responseHeaders.setContentType(responseContentType);responseHeaders.setContentLanguage(responseContentLanguage);responseHeaders.setContentDisposition(responseContentDispositon);responseHeaders.setCacheControl(responseCacheControl);responseHeaders.setExpires(cacheExpireStr);req.setResponseHeaders(responseHeaders);// 署名の有効期限を設定します(オプション)。設定しない場合は、デフォルトでClientConfigの署名有効期限(1時間)を使用します// ここでは署名が30分後に期限切れとなるよう設定しますDate expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);req.setExpiration(expirationDate);URL url = cosClient.generatePresignedUrl(req);System.out.println(url.toString());cosClient.shutdown();
100000000001に対し、バケットexamplebucket-1250000000内のオブジェクトexampleObject.txtのダウンロード権限を承認したい場合、それに応じたアクセスポリシーは次のようになります。{"version": "2.0","principal":{"qcs": ["qcs::cam::uin/100000000001:uin/100000000001"]},"statement":[{"action":["name/cos:GetObject"],"effect": "allow","resource":["qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000.ap-guangzhou.myqcloud.com/exampleObject.txt"]}]}
100000000011(ルートアカウントのUINは100000000001)に対し、バケットexamplebucket-1250000000内のディレクトリexamplePrefix下のオブジェクトのダウンロード権限を承認したい場合、それに応じたアクセスポリシーは次のようになります。{"version": "2.0","principal":{"qcs": ["qcs::cam::uin/100000000001:uin/100000000011"]},"statement":[{"action":["name/cos:GetObject"],"effect": "allow","resource":["qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000.ap-guangzhou.myqcloud.com/examplePrefix/*"]}]}
100000000011(ルートアカウントのUINは100000000001)に対し、バケットexamplebucket-1250000000内のオブジェクトexampleObject.txtおよびディレクトリexamplePrefix下のすべてのオブジェクトのダウンロード権限を承認したい場合、それに応じたアクセスポリシーは次のようになります。{"Statement": [{"Action": ["name/cos:GetObject"],"Effect": "allow","Principal": {"qcs": ["qcs::cam::uin/100000000001:uin/100000000011"]},"Resource": ["qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/exampleObject.txt","qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/examplePrefix/*"]}],"version": "2.0"}
フィードバック