1. 背景
為了避免CC攻擊刷費用問題對計費系統的影響,設計了HTTPDNS鑒權機制。
2. 鑒權方案
由於老使用者已經發布了產品,採用的是非鑒權功能方式接入,這部分產品的使用者需要繼續可以訪問非鑒權介面。
所以我們開放一個新的鑒權介面,產品新版本可以逐漸遷移至新介面,當舊app使用者減少到一定量後,可以關閉非鑒權介面,以避免對計費系統的影響,如下圖所示。
2.1 老使用者移轉方案
關閉非鑒權介面,會導致老版本的存量正在使用產品的使用者,無法訪問HttpDNS服務。
引導老使用者更新版本,逐漸遷移至鑒權介面。
當非鑒權介面存量產品使用者下降,直至可以接受關閉非鑒權介面帶來的損失的時候,可以手動關閉非鑒權介面。
2.2 新使用者使用方式情節
為避免鑒權帶來的額外接入成本,非鑒權介面預設是開啟的。
如果僅需要鑒權介面功能,請手動關閉非鑒權存取權限。
2.3 非鑒權介面開關的管理
開啟時,可能會引入安全隱患。
只有關閉非鑒權介面開關時,才能避免被攻擊導致的費用。
3. 簽名產生和鑒權機制
3.1 簽名產生演算法及樣本
新鑒權介面
其中的 {account_id} 需要替換為使用者的HTTPDNS Account ID,在HTTPDNS控制台上可以獲得這個ID。
鑒權介面可以添加IP參數,是否添加該參數及參數內容不影響簽名的計算。
簽名演算法
sign = md5sum( host-secret-timestamp )
鑒權欄位說明
欄位 | 描述 |
host | 需要被解析的host,與URL中的host參數取同樣的值。 |
secret | 由伺服器負責產生,查看方式:控制台 > 鑒權配置 > 鑒權secretkey。 |
timestamp | 簽名失效時間,1970年1月1日以來的秒數(整形正數,固定長度10)。 |
簽名樣本
樣本1(普通解析API介面):
原請求:http://47.74.222.190/{account_id}/d?host=www.aliyun.com
假設密鑰為:IAmASecret,希望在北京時間2018-08-15 15:00:00失效(時間戳記1534316400)
sign = md5sum(“www.aliyun.com-IAmASecret-1534316400”) = 60c71e98b6d7fcbb366243e224eab457
樣本2(批量解析API介面):
原請求:
http://47.74.222.190/{account_id}/resolve?host=www.aliyun.com,www.taobao.com
假設密鑰為:IAmASecret,希望在北京時間2018-08-15 15:00:00失效(時間戳記1534316400)
sign = md5sum(“www.aliyun.com,www.taobao.com-IAmASecret-1534316400”) = 12a3f6b1b14a46ca813ca6439beb59a4
此方案優缺點
用戶端時間不同
密鑰放在用戶端丟失有風險
無需去伺服器拉取
3.2 鑒權響應
鑒權成功時,HTTP響應的狀態代碼為200,響應結果同原HTTPDNS響應。
鑒權失敗時,HTTP響應的狀態代碼為403或400,響應結果同時也返回具體的錯誤碼,響應結果用JSON格式表示。
{ "code": "InvalidSignature" }
3.3 狀態代碼說明
HTTP狀態代碼 | 錯誤碼 | 描述 |
403 | SignatureExpired | 時間戳記已到期 |
403 | InvalidSignature | 簽名不正確 |
400 | InvalidDuration | 簽名有效期間過長(最長86400秒) |
400 | InvalidSignature | 簽名格式不正確 |
400 | InvalidTimestamp | 時間戳記格式不正確 |
400 | AccountNotExists | 賬戶不存在或被禁用 |