騰訊云COS對象存儲,在使用的過程中,為了降低開發成本或單純的出于“便捷”的考慮,往往將存儲桶設置為公有讀狀態。但這也埋下了巨大的安全風險的種子,在各種流量盜刷場景下,會快速吸干賬戶余額,正可謂“公有一時爽,盜刷就破產”。
那么對于我們這些中小企業個人用戶,盜刷都有哪些具體危害呢?
惡意競爭:盜刷流量的行為可能是某些企業或個人惡意競爭的手段,通過消耗競爭對手的流量來獲取商業利益或個人利益。經濟損失:盜刷流量會導致網站運營商面臨經濟損失,因為他們需要支付更多的非業務流量費用,同時也會影響網站或應用的正常業務體驗等。法律維權:盜刷流量是一種違法行為,在盜刷導致損失后,需要收集相關證據,上報至網警備案,追根溯源進行打擊。無形成本:包括證據采集,日志分析,多方溝通產生的時間等額外無形成本。那么有沒有一種折中方案,允許我們在使用匿名用戶訪問的情況下的安全使用呢?既在常態模式下方便用戶訪問,又能在極端情況下為我們及時止損。
【資料圖】
下面就介紹一下用過使用SCF來自動實現COS的權限修改的方式。
整體的邏輯為 創建SCF云函數-->定時拉取存bucket的準實時流量-->判斷流量是否超過閾值-->修改為私有讀方式
方案中所用到的產品包括
1.云函數(Serverless Cloud Function,SCF)
云函數的主要作用和優勢
1)可以創建主動型觸發事件,可根據需要設定觸發周期。
2)已內置騰訊云 通用云openapi SDK以及COS SDK庫,無需外部引用。
3)同園區與COS內網互訪,不產生外網流量。
2.騰訊云可觀測平臺(Tencent Cloud Observability Platform,TCOP) AKA :(云監控)
云監控主要作用
1)多維度采集COS監控項,包括外網流量,請求次數,CDN回源流量,跨地域復制流量等等。更多指標詳見
https://cloud.tencent.com/document/product/248/45140
2)數據采集延時低,通過實際測試,一般10分鐘內可采集到分鐘級數據指標。
云監控調用方法
# MetricName 參數 InternetTraffic 指的是外網下行流量 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))
返回數據
{ "Response": { "DataPoints": [ { "Dimensions": [ { "Name": "bucket", "Value": "wainsun-1253985742" } ], "Timestamps": [ 1680576000, 1680576060, 1680576120, 1680576180, 1680576240, 1680576300 ], "Values": [ 155189649, 169098752, 0, 0, 0, 0 ] } ], "EndTime": "2023-04-04 10:45:00", "MetricName": "InternetTraffic", "Msg": "", "Period": 60, "RequestId": "57d5d310-0989-47db-8982-26b1903afe85", "StartTime": "2023-04-04 10:40:00" }}
返回結果中
Timestamps以及對應的Values是我們得到并用于判斷的數據信息。通過簡單的SUM就可以得到這個時間段的總流量,從而做出限制性操作。
介紹一個具體的實踐案例,展示如何使用以上方法來實現流量費用封頂。
1. 登錄騰訊云官網,進入到SCF控制臺--函數服務--選擇園區--點擊“新建”按鈕
2. 選擇模板創建--過濾 timer關鍵詞--找到定時撥測 標簽:python3.6的模板
3. 確認配置
1)修改自定義函數名稱,修改對應函數描述。
2)確認函數代碼執行環境為運行環境:Python3.6執行方法: index.main_handler
3)啟動日志,選擇默認配置
4)修改觸發器為自定義創建,觸發方式定時觸發,周期修改為每1分鐘
5)點擊完成
4. 創建函數并設置函數代碼
創建過程很快,十幾秒可創建成功。
進入到函數管理--函數代碼--復制文章下面附件中的函數代碼內容并粘貼進來
注意,這里需要按照自己的環境,修改4個必選變量
secret_id 和 secret_key
這個是賬號的API 秘鑰,建議使用子賬號秘鑰,子賬號需要授權COS存儲桶的putbucketacl權限。
region
這個是存儲桶所在地域,更多地域信息可參見 COS地域列表
bucket
這個是存儲桶的完整名稱,通常為bucket-appid的形式,這個可以在COS控制臺的桶列表中查看到。
其他可選變量
"MetricName":"InternetTraffic",
這里默認設置為公網下行流量,其他監控指標詳見
if_flow>100*1024*1024:#超過100MB流量閾值
這里默認設置100MB,主要用于測試,測試完成后根據業務所需要的限額流量自行設置。
5. 部署與測試
點擊測試,會自動執行 :部署+1次函數 觸發
執行正常可以看到測試成功,并返回執行日志。
6. 驗證有效性
設置對應存儲桶權限為公共讀權限,并驗證匿名訪問一個對象,正??梢苑祷?00 ok
找到一個大于我們設置閾值100MB的文件,再次下載。
注意:不要使用同地域的CVM或docker測試,同地域走內網,不會產生公網下行流量。
大約10分鐘后,可以看到云函數檢查到了公網下行流量超過閾值,并將存儲桶ACL改為私有。
控制臺檢查并再次匿名測試下載資源
均符合預期。
這樣就實現了盜刷場景發生后自動及時止損。這里為什么會延時10分鐘的,這個是因為存儲桶數據的采集,向云監控推送,統一計算等等均需要時間。所以根據實踐測試,將延時設置為10分鐘。
上面通過這個實踐,我們將SCF,COS,云監控整合在一起,通過基礎數據采集,事件觸發,ACL修改等方式,實現了盜刷即停服的保護措施,同時又彌補了告警+人工處理的時效性低的問題。針對于費用敏感又必須使用匿名方式對外提供訪問的用戶,是一個比較適合的方案。
多說幾句。
上面的實踐是通過檢測外網下行流量并修改存儲桶的ACL的方式實現止損。
如果使用CDN(回源鑒權)+COS的方式,那么修改私有是沒有效果的,因為CDN的回源參數都會帶上簽名,這樣的場景就需要修改授權CDN的策略來實現止損,(需要將授權給CDN策略的allow改為deny),接口調用方式詳見。如果有朋友需要也可以在下面留言,我會再補充文檔。
再多說幾句。
如果對停服敏感,可以將代碼中這段注釋去掉。這樣就可實現盜刷流量峰值過去后即恢復服務。但可能有反復盜刷的情況。對于結果優劣各位親家自行評估。
標簽: