cos防盗刷

cos 防盗刷

简介

防止cos 被盗刷通过scf+ monitor 的方式设置cos 桶的权限

对象存储 防盗刷指引_腾讯云

使用腾讯云SCF实现COS费用封顶的最佳实践-腾讯云开发者社区-腾讯云

部署

基本是跟着使用腾讯云SCF实现COS费用封顶的最佳实践-腾讯云开发者社区-腾讯云 这个过程来就行

但是其中需要修改一下cos sdk。并且还需要设置下子用户的权限

创建一个用户

img

登录 - 腾讯云

需要注意添加两个权限,一个是和cos 相关的,一个是和monitor 相关的

img

不过这个权限给的很高了,可以测试下其他权限是否可以

不过这个权限给的很高了,可以测试下其他权限是否可以

选一个云函数环境

登录 - 腾讯云

img

然后下一步

其他步骤都是随便选择,只不过重点是控制执行的周期时间

img

之后完成

修改代码

serverless-demo/Python3.6-COSLimitSpendingDemo/src at master · colasun/serverless-demo · GitHub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# -*- coding: utf8 -*-
import sys
import os
import logging
import json
import requests
import smtplib
import time
import datetime
import math

#import tencentcloud-sdk-python
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client

from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.monitor.v20180724 import monitor_client, models
from datetime import timedelta

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)


data={
"secret_id":"",
"secret_key":"",
"region":"ap-guangzhou"
}


def checkQuota():
secret_id = data['secret_id'] # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
secret_key = data['secret_key'] # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
region = data['region'] # 替换为用户的 region,已创建桶归属的 region 可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket
# COS 支持的所有 region 列表参见 https://cloud.tencent.com/document/product/436/6224
token = None # 如果使用永久密钥不需要填入 token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见 https://cloud.tencent.com/document/product/436/14048
scheme = 'https' # 指定使用 http/https 协议来访问 COS,默认为 https,可不填
bucket = 'cos-1317182407-sadf-1317182407'

localOffset = datetime.timedelta(hours = 8) #本地时差,当前以北京为例,UTC+8
S_delay = datetime.timedelta(minutes=15) #开始时间差值,因云监控上报有时延,这里时间前置调整,时延单位为分钟
E_delay = datetime.timedelta(minutes=10) #结束时间差值,因云监控上报有时延,这里时间前置调整,时延单位为分钟

time_start = datetime.datetime.now() + localOffset - S_delay #查询云监控的开始时间,为当前时间前置15分钟。
time_end = datetime.datetime.now() + localOffset - E_delay #查询云监控的结束时间,为当前时间前置10分钟。

cred = credential.Credential(secret_id, secret_key)
# 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
httpProfile.endpoint = "monitor.tencentcloudapi.com"

# 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = monitor_client.MonitorClient(cred, region, clientProfile)

# 这里是获取云监控的分钟级数据
# MetricName 参数 InternetTraffic 指的是外网下行流量,CdnOriginTraffic指的是CDN回源流量,其他相关监控指标详见https://cloud.tencent.com/document/product/248/45140

req = models.GetMonitorDataRequest()
params = {
"Namespace": "QCE/COS",
"MetricName": "InternetTraffic",
"Period": 60,
"StartTime": time_start.strftime("%Y-%m-%d %H:%M:%S"),
"EndTime": time_end.strftime("%Y-%m-%d %H:%M:%S"),
"Instances": [
{
"Dimensions": [
{
"Name": "bucket",
"Value": bucket
}
]
}
]
}
req.from_json_string(json.dumps(params))

# 返回的resp是一个GetMonitorDataResponse的实例,与请求对象对应
resp = client.GetMonitorData(req)
# 输出json格式的字符串回包
_str = resp.to_json_string()
print(_str)
print("------------------------------------------------------")
jsObj = json.loads(_str)

for k,v in jsObj.items():
if k == "DataPoints":
for k,v in v[0].items():
if k == "Values":
_flow = sum(v)

if _flow > 5000*1024*1024: #超过5GB流量阈值
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
cosclient = CosS3Client(config)
cosclient.put_bucket_acl(
Bucket=bucket,
ACL='private'
)
print("判断阈值",_flow)
print("达到阈值,已改为私有读写权限")
else:
''' 如果需要在盗刷后自动恢复公共读权限,则去掉这段注释。
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
cosclient = CosS3Client(config)
cosclient.put_bucket_acl(
Bucket=bucket,
ACL='public-read'
)
'''
print("判断阈值",_flow)
print("未达到阈值,不做权限修改操作")


def main_handler(event, context):
checkQuota()


if __name__ == '__main__':
main_handler("", "")

需要填写ak/sk

本地测试

需要安装几个包

SDK 中心 Python_腾讯云

1
2
3
pip install --upgrade tencentcloud-sdk-python-common
pip install --upgrade tencentcloud-sdk-python
pip install -U cos-python-sdk-v5

如果出现了报错

python安装腾讯云对象存储sdk总是失败解决办法_qcloudcosxml pod 安装失败-CSDN博客

云函数

直接部署测试就行


cos防盗刷
https://tsy244.github.io/2025/05/31/技术随笔/cos防盗刷/
Author
August Rosenberg
Posted on
May 31, 2025
Licensed under