CDN 和 Web Application Firewall(Web Application Firewall,簡稱WAF) 在雲端運算中具有廣泛的應用情境。CDN 主要用來加速靜態內容(如 HTML、CSS、JavaScript 等檔案),而 WAF 通常用來保護伺服器,減少Web 應用程式受到的安全威脅。阿里雲WAF支援與阿里雲CDN或非阿里雲CDN(例如網宿、加速樂、七牛、又拍等)聯合部署。本文介紹如何為使用CDN加速的業務部署WAF。
背景
使用一個網域名稱根據URI來實現動靜分離的網路架構在實際應用中非常常見,尤其是在高流量網站和複雜的Web應用中。這種網路架構可以顯著提高網站效能,最佳化資源利用,並增強使用者體驗。通常情況下我們將靜態資源(如圖片、CSS、JavaScript檔案等)通過內容分發網路(CDN)緩衝並分發到全球各地的CDN節點,使用者請求這些資源時會從最近的CDN節點擷取,顯著減少載入時間。動態內容的請求,會將請求路由到一個反向 Proxy或負載平衡器(如Nginx、HAProxy、AWS Elastic Load Balancing、阿里雲的 SLB),負載平衡器根據預定義的策略(如輪詢、最少串連、IP雜湊等)將請求分配到後端的一組應用伺服器。使用動靜分離網站的網路架構如下:
使用者請求靜態資源:
使用者裝置請求xxx.xxx.xxx/static/logo.png。
路由到最近的CDN節點,沒有緩衝資源時將該請求轉寄到來源站點。
來源站點響應請求,並返回資料。
CDN緩衝來源站點返回的資料,並將資料返回到用戶端。
使用者裝置再次請求xxx.xxx.xxx/static/logo.png。
CDN節點檢查緩衝,如果命中緩衝並直接返回資源。
使用者請求動態內容:
使用者裝置請求xxx.xxx.xxx/getInfo,將請求路由至CDN節點。
CDN根據條件回源,將請求回源到來源站點的地址。
處理動態流量,將資料返回給用戶端。
前提條件
網站基於一個網域名稱使用了動靜分離的網路架構。
已開通CDN服務,並已將網域名稱添加到CDN。更多資訊,請參見新手指引。
已開通WAF執行個體。
方法概述
WAF和CDN同時部署時採用以下網路架構:CDN(入口層,內容加速)> WAF(中介層,實現應用程式層防護)> 來源站點伺服器(ECS、SLB、VPC、IDC等)。網站業務流量會先經過CDN,然後轉寄到WAF過濾Web攻擊,最後只有正常的業務流量被轉寄到來源站點伺服器,保障網站的業務安全和資料安全。
在使用CDN加速的基礎上使用WAF防護的網路架構:
步驟一:接入WAF
通過這一步操作,您可以通過網域名稱接入或者雲產品接入的方式將您需要防護對象接入到WAF中。
登入Web Application Firewall控制台,在頂部功能表列,選擇WAF執行個體的資源群組和地區(中國內地、非中國內地)。
在左側導覽列,單擊接入管理。
接入WAF。
CNAME接入
使用CNAME的方式接入,在網域名稱接入成功後,會產生一個特定的CNAME網域名稱。
在CNAME接入頁簽,單擊接入。
在配置監聽嚮導頁,完成以下配置後,單擊下一步。
配置項
說明
網域名稱
填寫要防護的網站網域名稱。
協議類型
按實際情況選擇網站支援的協議類型。連接埠填寫伺服器位址的連接埠,本執行個體中連接埠為8080。
WAF前是否有七層代理(高防/CDN等)
選擇是。用戶端IP判定方式選擇【推薦】取指定Header欄位中的第一個IP作為用戶端源IP,避免XFF偽造。

在配置轉寄嚮導頁,填寫伺服器位址後,單擊提交。
在接入管理頁,單擊目標接入對象CNAME後的複製,擷取CNAME。
說明如果您有HTTPS、SSL、負載平衡演算法等其他的配置需求,請參考網域名稱接入。
通過CNAME接入方式接入Web業務到WAF防護後,您需要設定來源站點伺服器的安全軟體或存取控制策略,允許存取WAF回源IP段的入方向流量。詳細操作參考允許存取WAF回源IP段。
雲產品接入
單擊雲產品接入頁簽,在左側雲產品類型列表,選擇您要接入的雲產品。如果您的動態流量將被CLB(HTTP/HTTPS)處理,您選擇CLB(HTTP/HTTPS)作為將要接入的雲產品。
單擊接入。單擊CLB(HTTP/HTTPS),彈出接入資產- 七層CLB面板,在面板中可以看到您已有的CLB執行個體,選擇您的目標CLB執行個體並添加您的待接入連接埠。WAF前是否有七層代理(高防/CDN等)選擇是,並選擇【推薦】取指定Header欄位中的第一個IP作為用戶端源IP,避免XFF偽造,填寫您指定的Header欄位。
說明本次操作以接入CLB(HTTP/HTTPS)為例,其他雲產品的接入方式請參考雲產品接入。
配置項
相關操作
選擇需要添加的執行個體&連接埠
定位到要添加的執行個體,單擊操作列的添加端口。
選擇要添加的HTTP或HTTPS連接埠,單擊確定。
說明如果要添加的執行個體未同步到執行個體列表,單擊同步最新資產,更新執行個體列表。
WAF前是否有七層代理(高防/CDN等)
選擇是,並選擇【推薦】取指定Header欄位中的第一個IP作為用戶端源IP,避免XFF偽造。
在本樣本中,CLB的監聽連接埠為8080,指定的Header欄位填寫header。

點擊確認,在雲產品接入頁簽中看見接入的CLB執行個體。

完成接入後,WAF會自動產生一個防護對象,並為該防護對象預設開啟Web核心防護規則。您可以在頁面,查看自動添加的防護對象,並為其配置防護規則。
如果在頁面中Web核心防護規則地區不存在預設範本,則需要手動為防護對象開啟Web核心防護規則。
步驟二:為防護對象提供Web防護
手動為防護對象開啟防護,需要您將防護對象添加到對應防護模板的生效對象中。
進入Web Application Firewall控制台在左側導覽列,選擇。在Web核心防護頁面下方Web核心防護規則地區,選擇一個規則模板。點擊操作列的編輯。
說明如果您需要建立新的模板來滿足您的防護需求,請參考建立自訂防護模板。
進入編輯模板 - Web核心防護規則頁簽,規則動作選擇攔截,生效對象添加步驟一中接入的防護對象。
點擊確認儲存本次編輯。
步驟三:修改CDN的回源地址
靜態資源有可能儲存在OSS中,也有可能儲存在後端服務裡。靜態資源儲存的位置不同,在CDN配置中的來源站點資訊也不一樣。根據不同的情況,有不同的配置方式。
靜態資源儲存在OSS
如果靜態資源儲存在OSS中並使用CDN加速,在CDN的來源站點資訊中使用基礎來源站點資訊搭配條件來源站點的方式。在CDN來源站點資訊中需要修改條件來源站點資訊。
登入CDN控制台。在左側導覽列,單擊網域名稱管理。在網域名稱列表,定位到要開啟WAF防護的網域名稱,單擊操作列的管理。
配置條件來源站點。在基本配置分頁,單擊目標條件來源站點後的操作列下的編輯,在條件來源站點視窗中完成以下配置。
參數
說明
規則條件
規則條件能夠對使用者請求中攜帶的各種參數資訊進行識別,以此來決定某個配置是否對該請求生效。在本樣本中,URI不包含/static/*的請求將被回源到目標地址。

來源站點地址
如果網域名稱通過CNAME接入模式接入WAF時,填寫接入WAF的來源站點資訊。

如果網域名稱通過雲產品接入模式接入WAF時,填寫雲產品接入WAF的公網IP。

重要條件來源站點中沒有連接埠選項,HTTP預設轉寄到來源站點地址的80連接埠,HTTPS預設轉寄到來源站點地址的443連接埠,如果需要在來源站點地址指定連接埠,您可以添加帶連接埠號碼的IP地址。
點擊確定,在條件來源站點能看到修改後的回源地址。

靜態資源儲存在後端服務
如果靜態資源儲存在後端服務中並使用CDN加速,在CDN來源站點資訊中只需要修改基礎來源站點資訊。

登入CDN控制台。在左側導覽列,單擊網域名稱管理。在網域名稱列表,定位到要開啟WAF防護的網域名稱,單擊操作列的管理。
在基本配置分頁,單擊新增來源站點資訊。完成如下配置後,單擊確定。
參數
說明
來源站點資訊
如果網域名稱通過CNAME接入模式接入WAF時,選擇來源站點網域名稱並填寫接入WAF的CNAME地址。

如果網域名稱通過雲產品接入模式接入WAF時,選擇IP並填寫雲產品接入WAF的公網IP。

優先順序
設定支援的主備優先順序,主優先順序大於備優先順序。
權重
當多個來源站點的優先順序相同時,設定來源站點的權重,實現按權重的負載平衡。
連接埠
填寫CDN節點回到來源站點的請求連接埠,本執行個體中連接埠為8080。
如果在步驟一中是通過CNAME接入模式接入WAF,需要刪除原來的回源地址。
CDN配置完成後,不會立即生效,具體的生效時間受DNS生效時間、CDN配置同步、緩衝重新整理和預熱等因素的影響。為確保配置能夠及時生效,建議在配置過完成後執行緩衝重新整理和預熱:主動清除舊緩衝,並預熱新內容,確保使用者訪問時能夠擷取最新配置內容。
步驟四:配置HTTPS認證
HTTPS認證部署至CDN平台,啟用HTTPS安全加速服務,實現用戶端與CDN節點間請求的加密傳輸。
在左側導覽列,單擊網域名稱管理。在網域名稱管理頁面,找到目標網域名稱,單擊操作列的管理。
在指定網域名稱的左側導覽列,單擊HTTPS配置。在HTTPS認證地區,單擊修改配置。
在HTTPS設定介面,開啟HTTPS安全加速開關,並配置認證相關參數。

如果您已在阿里雲數位憑證管理服務中購買了認證,請選擇Apsara Stack Security(SSL)認證中心,並在認證名稱中選擇已購買的認證。您可以在認證管理中查看,已有的認證。
說明請檢查已購買認證綁定的網域名稱和加速網域名稱是否相同。
如果您使用的是第三方服務商簽發的認證,請選擇自訂上傳(認證+私密金鑰),您需要在設定認證名稱後,上傳認證(公開金鑰)和私密金鑰,該認證將在阿里雲數位憑證管理服務中儲存。您可以在認證管理中查看。
參數
說明
認證名稱
為要上傳的認證設定一個名稱。
支援使用英文字母、英文句號、數字、底線(_)和短劃線(-)。
說明認證名稱不能與已有認證名稱重複。已有認證可以在認證管理中查看。
如果系統提示認證重複,請修改認證名稱後再重新上傳。
認證(公開金鑰)
填寫認證檔案內容的PEM編碼。
您可以使用文本編輯工具開啟PEM格式的認證檔案,複製其中的內容並粘貼到該文字框。
範例請參見輸入框下方的pem編碼參考範例。
私密金鑰
填寫認證私密金鑰內容的PEM編碼。
您可以使用文本編輯工具開啟KEY格式的認證私密金鑰檔案,複製其中的內容並粘貼到該文字框。
範例請參見輸入框下方的pem編碼參考範例。
說明如果您得到的是以“-----BEGIN PRIVATE KEY-----”開頭,以“-----END PRIVATE KEY-----”結尾的私密金鑰,您需要使用OpenSSL工具執行以下命令進行轉換,然後將
new_server_key.pem的內容粘貼到該文字框。openssl rsa -in old_server_key.pem -out new_server_key.pem
單擊確定,完成配置。
驗證
在瀏覽器中輸入的URI為xxx.xxx.xxx/123.php,本次訪問被攔截,訪問伺服器的動態流量受到WAF的安全防護。

進入Web Application Firewall控制台,點擊左側進入頁面,在Web核心防護規則地區查看攻擊記錄。本樣本中,該筆URI為xxx.xxx.xxx/123.php的請求被Webshell規則攔截。

訪問靜態資源路徑xxx.xxx.xxxx/static/1.png,按下F12鍵或右鍵點擊頁面並選擇檢查開啟開發人員工具,在開發人員工具中,點擊頂部導覽列上的Network標籤,請求的Header中能看到被CDN加速。
說明X-cache表示是否命中緩衝,miss表示不命中,hit表示命中。
經過上述的驗證,訪問靜態資源的流量被CDN加速,訪問伺服器的動態流量受到WAF的安全防護。