访问控制与日志

向量Bucket提供访问控制和日志管理功能,确保数据安全性、合规性和可观测性。

访问控制

向量Bucket支持Bucket PolicyRAM Policy

  • Bucket Policy:基于资源的授权策略,可以将其附加到Bucket上,用于授权其他阿里云账户、子账户或匿名用户访问指定的向量资源。

  • RAM Policy:基于身份的授权策略,可以将其附加到RAM用户、用户组或角色上,定义其能够访问哪些向量Bucket资源。

支持的Action列表

API

Action

接口描述

PutVectorBucket

oss:PutVectorBucket

创建向量Bucket。

GetVectorBucket

oss:GetVectorBucket

获取向量Bucket的详细信息。

ListVectorBuckets

oss:ListVectorBuckets

列举请求者拥有的所有向量Bucket。

DeleteVectorBucket

oss:DeleteVectorBucket

删除向量Bucket。

PutBucketLogging

oss:PutBucketLogging

开启向量Bucket日志转存功能。

oss:PutObject

开启源向量Bucket日志转存功能时,设置源向量Bucket日志写入另一个目标Bucket。

GetBucketLogging

oss:GetBucketLogging

查看向量Bucket日志转存配置。

DeleteBucketLogging

oss:DeleteBucketLogging

关闭向量Bucket日志转存功能。

PutBucketPolicy

oss:PutBucketPolicy

设置指定向量Bucket的授权策略。

GetBucketPolicy

oss:GetBucketPolicy

获取指定向量Bucket的授权策略。

DeleteBucketPolicy

oss:DeleteBucketPolicy

删除指定向量Bucket的授权策略。

PutVectorIndex

oss:PutVectorIndex

创建向量索引。

GetVectorIndex

oss:GetVectorIndex

获取向量索引的详细信息。

ListVectorIndexes

oss:ListVectorIndexes

列举向量Bucket中的所有向量索引。

DeleteVectorIndex

oss:DeleteVectorIndex

删除向量索引。

PutVectors

oss:PutVectors

写入向量数据。

GetVectors

oss:GetVectors

获取指定的向量数据。

ListVectors

oss:ListVectors

列举向量索引中的所有向量数据。

DeleteVectors

oss:QueryVectors

进行向量相似性检索。

QueryVectors

oss:DeleteVectors

删除向量索引中的指定向量数据。

资源描述格式

资源级别

格式

示例

所有向量资源

acs:ossvector:*:*:*

acs:ossvector:*:*:*

向量 Bucket

acs:ossvector:{region}:{account_id}:bucket/{bucket_name}

acs:ossvector:*:*:bucket/my-vector-bucket

向量索引

acs:ossvector:{region}:{account_id}:bucket/{bucket_name}/index/{index_name}

acs:ossvector:*:*:bucket/my-vector-bucket/index/my-index

向量数据

acs:ossvector:{region}:{account_id}:bucket/{bucket_name}/index/{index_name}/vector/{vector_key}

acs:ossvector:*:*:bucket/my-vector-bucket/index/my-index/vector/*

Bucket Policy

通过 Bucket Policy 授权子账户和其他账号访问指定的 OSS 资源。

控制台

  1. 向量Bucket页面,单击目标Bucket,在左侧导航栏选择权限控制 > Bucket授权策略

  2. 单击按语法策略添加,在策略编辑器中输入策略内容。例如,授予用户my-vector-bucket的读写向量数据的权限:

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:PutVectors",
            "oss:GetVectors"
          ],
          "Principal": [
             "*"
          ],   
          "Resource": [
            "acs:ossvector:*:*:bucket/my-vector-bucket/*"
          ]
        }
      ]
    }
  3. 单击确定完成创建。

ossutil

以下示例展示了如何为向量存储空间设置授权策略,允许指定用户进行向量相关操作。使用JSON配置文件,vector-policy.json内容如下:

{
   "Version":"1",
   "Statement":[
       {
         "Action":[
           "oss:PutVectors",
           "oss:GetVectors"
        ],
        "Effect":"Deny",
        "Principal":["1234567890"],
        "Resource":["acs:ossvector:cn-hangzhou:1234567890:*"]
       }
    ]
}
ossutil vectors-api put-bucket-policy --bucket vector-example --body file://vector-policy.json

使用JSON配置参数设置向量Bucket策略:

ossutil vectors-api put-bucket-policy --bucket vector-example --body "{\"Version\":\"1\",\"Statement\":[{\"Action\":[\"oss:PutVectors\",\"oss:GetVectors\",\"oss:QueryVectors\"],\"Effect\":\"Allow\",\"Principal\":[\"1234567890\"],\"Resource\":[\"acs:ossvector:cn-hangzhou:1234567890:bucket/vector-example/*\"]}]}"

SDK

Python

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.vectors as oss_vectors

parser = argparse.ArgumentParser(description="vector put bucket policy sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--account_id', help='The account id.', required=True)

def main():
    args = parser.parse_args()

    # Loading credentials values from the environment variables
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Using the SDK's default configuration
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    cfg.account_id = args.account_id
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    vector_client = oss_vectors.Client(cfg)


    policy_content = '''
        {
           "Version":"1",
           "Statement":[
               {
                 "Action":[
                   "oss:PutVectors",
                   "oss:GetVectors"
                ],
                "Effect":"Deny",
                "Principal":["1234567890"],
                "Resource":["acs:ossvector:cn-hangzhou:1234567890:*"]
               }
            ]
         }
    '''

    result = vector_client.put_bucket_policy(oss_vectors.models.PutBucketPolicyRequest(
        bucket=args.bucket,
        body=policy_content
    ))

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
    )

if __name__ == "__main__":
    main()

Go

package main

import (
	"context"
	"flag"
	"log"
	"strings"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/vectors"
)

var (
	region     string
	bucketName string
	accountId  string
)

func init() {
	flag.StringVar(&region, "region", "", "The region in which the vector bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the vector bucket.")
	flag.StringVar(&accountId, "account-id", "", "The id of vector account.")
}

func main() {
	flag.Parse()
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	if len(accountId) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, accounId required")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region).WithAccountId(accountId)

	client := vectors.NewVectorsClient(cfg)

	request := &vectors.PutBucketPolicyRequest{
		Bucket: oss.Ptr(bucketName),
		Body: strings.NewReader(`{
			   "Version":"1",
			   "Statement":[
			   {
				 "Action":[
				   "oss:PutVectors",
				   "oss:GetVectors"
				],
				"Effect":"Deny",
				"Principal":["1234567890"],
				"Resource":["acs:ossvector:cn-hangzhou:1234567890:*"]
			   }
			  ]
			 }`),
	}
	result, err := client.PutBucketPolicy(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to put vector bucket policy %v", err)
	}

	log.Printf("put vector bucket policy result:%#v\n", result)
}

API

调用PutBucketPolicy接口为向量Bucket设置授权策略。

RAM Policy

支持RAM策略,可以通过RAM控制台RAM用户或角色配置向量Bucket相关的权限,RAM策略支持到索引(Index)级别的资源粒度。

日志管理

支持访问日志功能,可将访问记录转存到指定的OSS存储桶中,用于安全审计、性能分析和故障排查。

控制台

  1. 向量Bucket页面,单击目标Bucket,在左侧导航栏选择 日志管理 > 日志转存

  2. 开启 日志转存 开关,并配置以下参数:

    • 目标存储位置:选择用于存放日志文件的Bucket(必须与向量Bucket在同一地域)。

    • 日志前缀:设置日志文件的目录和前缀,如 MyLog-

    • 授权角色:使用默认的日志服务角色AliyunOSSLoggingDefaultRole或选择选择一个自定义角色。

ossutil

以下示例展示了如何为名为examplebucket的存储空间开启日志转存功能,日志文件前缀为MyLog-,存储访问日志的Bucketexamplebucket

  • 使用JSON配置文件,bucket-logging-status.json内容如下:

    {
      "BucketLoggingStatus": {
        "LoggingEnabled": {
          "TargetBucket": "examplebucket",
          "TargetPrefix": "MyLog-",
          "LoggingRole": "AliyunOSSLoggingDefaultRole"
        }
      }
    }

    命令示例如下:

    ossutil vectors-api put-bucket-logging --bucket examplebucket --bucket-logging-status file://bucket-logging-status.json
  • 使用JSON配置参数,命令示例如下:

    ossutil vectors-api put-bucket-logging --bucket examplebucket --bucket-logging-status "{\"BucketLoggingStatus\":{\"LoggingEnabled\":{\"TargetBucket\":\"examplebucket\",\"TargetPrefix\":\"MyLog-\",\"LoggingRole\":\"AliyunOSSLoggingDefaultRole\"}}}"

SDK

Python

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.vectors as oss_vectors

parser = argparse.ArgumentParser(description="vector put bucket logging sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--account_id', help='The account id.', required=True)
parser.add_argument('--target_bucket', help='The name of the target bucket.', required=True)

def main():
    args = parser.parse_args()

    # Loading credentials values from the environment variables
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Using the SDK's default configuration
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    cfg.account_id = args.account_id
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    vector_client = oss_vectors.Client(cfg)

    result = vector_client.put_bucket_logging(oss_vectors.models.PutBucketLoggingRequest(
        bucket=args.bucket,
        bucket_logging_status=oss_vectors.models.BucketLoggingStatus(
            logging_enabled=oss_vectors.models.LoggingEnabled(
                target_bucket=args.target_bucket,
                target_prefix='log-prefix',
                logging_role='AliyunOSSLoggingDefaultRole'
            )
        )
    ))

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
    )

if __name__ == "__main__":
    main()

Go

package main

import (
	"context"
	"flag"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/vectors"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string
	bucketName string
	accountId  string
)

func init() {
	flag.StringVar(&region, "region", "", "The region in which the vector bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the vector bucket.")
	flag.StringVar(&accountId, "account-id", "", "The id of vector account.")
}

func main() {
	flag.Parse()
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	if len(accountId) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, accounId required")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region).WithAccountId(accountId)

	client := vectors.NewVectorsClient(cfg)

	request := &vectors.PutBucketLoggingRequest{
		Bucket: oss.Ptr(bucketName),
		BucketLoggingStatus: &vectors.BucketLoggingStatus{
			&vectors.LoggingEnabled{
				TargetBucket: oss.Ptr("TargetBucket"),
				TargetPrefix: oss.Ptr("TargetPrefix"),
				LoggingRole:  oss.Ptr("AliyunOSSLoggingDefaultRole"),
			},
		},
	}
	result, err := client.PutBucketLogging(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to put vector bucket logging %v", err)
	}

	log.Printf("put vector bucket logging result:%#v\n", result)
}

API

调用PutBucketLogging接口为向量Bucket开启日志转存功能。

日志文件命名规则

转存后的日志文件命名规则如下:

<TargetPrefix><SourceBucket>YYYY-mm-DD-HH-MM-SS-UniqueString

字段

说明

TargetPrefix

日志文件的文件名前缀。

SourceBucket

产生访问日志的源Bucket名称。

YYYY-mm-DD-HH-MM-SS

日志的时间分区。从左到右分别表示:年、月、日、小时、分钟和秒。当前转存的日志是以小时粒度存放,例如:HH 为 01 时,代表为 01 点 00 分 00 秒 - 01 点 59 分 59 秒之间的日志信息,同时 MM、SS 均会推送 00。

UniqueString

系统生成的字符串,是日志文件的唯一标识。

日志的格式和示例

  • 日志格式

    OSS的访问日志包含请求者和被访问资源的相关信息,格式如下:

    RemoteIP Reserved Reserved Time "RequestURL" HTTPStatus SentBytes RequestTime "Referer" "UserAgent" "HostName" "RequestID" "LoggingFlag" "RequesterAliyunID" "Operation" "BucketName" "ObjectName" ObjectSize ServerCostTime "ErrorCode" RequestLength "UserID" DeltaDataSize "SyncRequest" "StorageClass" "TargetStorageClass" "TransmissionAccelerationAccessPoint" "AccessKeyID" "BucketARN"

    字段

    示例值

    说明

    RemoteIP

    192.168.0.1

    请求者的IP地址。

    Reserved

    -

    保留字段,固定值为-

    Reserved

    -

    保留字段,固定值为-

    Time

    03/Jan/2021:14:59:49 +0800

    OSS收到请求的时间。

    RequestURL

    GET /example.jpg HTTP/1.0

    包含query string的请求URL。

    OSS会忽略以x-开头的query string参数,但这个参数会被记录在访问日志中。所以您可以使用x-开头query string参数标记一个请求,然后使用这个标记快速查找该请求对应的日志。

    HTTPStatus

    200

    OSS返回的HTTP状态码。

    SentBytes

    999131

    请求产生的下行流量。单位:Byte。

    RequestTime

    127

    完成本次请求耗费的时间。单位:ms。

    Referer

    http://www.aliyun.com/product/oss

    请求的HTTP Referer。

    UserAgent

    curl/7.15.5

    HTTPUser-Agent头。

    HostName

    examplebucket.oss-cn-hangzhou.aliyuncs.com

    请求访问的目标域名。

    RequestID

    5FF16B65F05BC932307A3C3C

    请求的Request ID。

    LoggingFlag

    true

    是否已开启日志转存。取值如下:

    • true表示已开启日志转存。

    • false表示未开启日志转存。

    RequesterAliyunID

    16571836914537****

    请求者的用户ID。取值-表示匿名访问。

    Operation

    GetObject

    请求类型。

    BucketName

    examplebucket

    请求的目标Bucket名称。

    ObjectName

    example.jpg

    请求的目标Object名称。

    ObjectSize

    999131

    目标Object大小。单位:Byte。

    ServerCostTime

    88

    OSS处理本次请求所花的时间。单位:毫秒。

    ErrorCode

    -

    OSS返回的错误码。取值-表示未返回错误码。

    RequestLength

    302

    请求的长度。单位:Byte。

    UserID

    16571836914537****

    Bucket拥有者ID。

    DeltaDataSize

    -

    Object大小的变化量。取值-表示此次请求不涉及Object的写入操作。

    SyncRequest

    -

    请求类型。取值如下:

    • -:一般请求。

    • cdn:CDN回源请求。

    • lifecycle:通过生命周期规则转储或者删除数据的请求。

    StorageClass

    Standard

    目标Object的存储类型。取值如下:

    • Standard:标准存储。

    • IA:低频访问存储。

    • Archive:归档存储。

    • Cold Archive:冷归档存储。

    • DeepCold Archive:深度冷归档存储。

    • -:未获取到Object存储类型。

    TargetStorageClass

    -

    是否通过生命周期规则或CopyObject转换了Object的存储类型。取值如下:

    • Standard:转换为标准存储。

    • IA:转换为低频访问存储。

    • Archive:转换为归档存储。

    • Cold Archive:转换为冷归档存储。

    • DeepCold Archive:转换为深度冷归档存储。

    • -:不涉及Object存储类型转换操作。

    TransmissionAccelerationAccessPoint

    -

    通过传输加速域名访问目标Bucket时使用的传输加速接入点。例如请求者通过华东1(杭州)的接入点访问目标Bucket时,值为cn-hangzhou

    取值-表示未使用传输加速域名或传输加速接入点与目标Bucket所在地域相同。

    AccessKeyID

    LTAI****************

    请求者的AccessKey ID。

    • 通过控制台的方式发起请求时,日志字段中会显示为以TMP开头的临时AccessKey ID。

    • 通过工具、SDK以长期密钥的方式发起请求时,日志字段中显示为常见的AccessKey ID,示例值为LTAI****************

    • 通过STS临时访问凭证发起请求时,显示为以STS开头的临时AccessKey ID。

    说明

    AccessKey ID字段显示为-,表示匿名请求。

    BucketArn

    acs:oss***************

    Bucket的全局唯一资源描述符。

  • 日志示例

    192.168.0.1 - - [03/Jan/2021:14:59:49 +0800] "GET /example.jpg HTTP/1.0" 200 999131 127 "http://www.aliyun.com/product/oss" "curl/7.15.5" "examplebucket.oss-cn-hangzhou.aliyuncs.com" "5FF16B65F05BC932307A3C3C" "true" "16571836914537****" "GetObject" "examplebucket" "example.jpg" 999131 88 "-" 302 "16571836914537****" - "cdn" "standard" "-" "-" "LTAI****************" "acs:oss***************"

    日志文件转存到OSS指定Bucket后,您可以通过日志服务对日志文件进行分析。对日志文件进行分析前,您需要通过数据导入方式将OSS日志文件导入到日志服务。有关数据导入的具体操作,请参见导入OSS数据。有关日志服务分析功能的更多信息,请参见查询与分析概述