利用OWASP的Coraza與核心規則集強化Apache APISIX

開放全球應用安全項目(OWASP)是一個線上社群,專門提供有關物聯網、系統軟體及網路應用安全的免費可用文章、方法論、文件、工具及技術。OWASP提供的資源全為免費且開放,由一個名為OWASP基金會的非營利組織領導。OWASP Top 10 – 2021是基於40多個合作組織的全面數據編制而成的最新研究成果。

– OWASP網站

OWASP定期發布Top 10漏洞報告,專注於網路應用中的漏洞。

本文將介紹如何透過Apache APISIX API Gateway來修復其中一些漏洞。

OWASP Top 10 2021

2021年的報告提及:

  • A01:2021-存取控制失效
  • A02:2021-加密失敗
  • A03:2021-注入攻擊
  • A04:2021-不安全
  • A05:2021-安全配置錯誤
  • A06:2021-脆弱及過時的組件
  • A07:2021-識別與驗證失敗
  • A08:2021-軟體與數據完整性失敗
  • A09:2021-安全日誌記錄與監控失敗
  • A10:2021-伺服器端請求偽造

欲了解更多詳情,請查閱完整報告

修復漏洞取決於其具體性質。例如,解決脆弱及過時組件問題是一個流程驅動的過程,需要嚴格管理版本並淘汰舊版本。而有些漏洞則是技術性的,僅需在反向代理或API Gateway中進行適當配置,例如伺服器端請求偽造

無人關心安全性

安全性是一個敏感話題,因為加強安全性並不會為企業帶來直接價值。以職業發展為導向的經理們不會關心安全性,因為他們無法在下一次年度評估中展示他們如何通過提升X%的公司利潤來增加業績。除非董事會認真對待安全性,否則可能無人問津。因此,大多數組織實施的是基於勾選項的安全措施,即所謂的「合理否認」。若您有意妥善實施安全性,我在之前的博客文章中已分享了一些想法:”將安全性視為風險“。

總而言之,確保應用程序安全可能無法獲得大量預算,甚至沒有預算。因此,我們必須精明行事,尋找現有組件。幸運的是,OWASP提供了一個即用型配置來應對Top 10安全問題,該配置名為核心規則集。不幸的是,它針對的是ModSecurity:

ModSecurity,又稱Modsec,是一款開源的網頁應用程式防火牆(WAF)。最初設計為Apache HTTP Server的一個模組,後來發展成為提供一系列HTTP請求和響應過濾功能及其他安全特性,適用於多種平台,包括Apache HTTP Server、Microsoft IIS和Nginx。此軟體依Apache許可證2.0版釋出,完全免費。

維基百科上的ModSecurity

儘管理論上可以透過Apache APISIX配置來設定Nginx,但還有一種更直接的方法。

OWASP核心規則集與Coraza

核心規則集的描述非常符合我們的需求:

OWASP® ModSecurity核心規則集(CRS)是一套用於ModSecurity或相容網頁應用程式防火牆的通用攻擊檢測規則。CRS旨在保護網頁應用程式免受廣泛攻擊,包括OWASP十大風險,同時盡量減少誤報。CRS提供對多種常見攻擊類別的防護,包括:

  • SQL注入(SQLi)
  • 跨站腳本(XSS)
  • 本地文件包含(LFI)
  • 遠端文件包含(RFI)
  • PHP代碼注入
  • Java代碼注入
  • HTTPoxy
  • Shellshock
  • Unix/Windows Shell注入
  • 會話固定
  • 腳本/掃描器/機器人檢測
  • 元數據/錯誤洩漏

– OWASP® ModSecurity 核心規則集網站

OWASP 亦提供 Coraza,一個可用作 Go 庫的 ModSecurity 移植版本。Coraza Proxy Wasm 基於 Coraza 構建,實現了代理-wasm ABI,該 ABI 定義了一組用於代理的 Wasm 接口。最後,Apache APISIX 提供了代理-wasm 整合。

綜合應用

讓我們總結一下:

  1. OWASP 提供了一份十大網絡安全漏洞清單。
  2. 通過核心規則集為 ModSecurity 實現了這些漏洞。
  3. Coraza 是 ModSecurity 的一個移植版本,作為代理-wasm 實現可用。

我們可以這樣配置 Apache APISIX,以合理的和安全的默認設置。讓我們開始吧。

首先,Coraza 並非 Apache APISIX 分發的一部分。然而,使用 Docker 在這裡添加它相當直接:

Dockerfile

 

FROM apache/apisix:3.8.0-debian

ENV VERSION 0.5.0                                                           #1
ENV CORAZA_FILENAME coraza-proxy-wasm-${VERSION}.zip                        #1

ADD https://github.com/corazawaf/coraza-proxy-wasm/releases/download/$VERSION/$CORAZA_FILENAME . #2

USER root                                                                   #3

RUN <<EOF

  apt-get install zip -y                                                    #4
  unzip $CORAZA_FILENAME -d /usr/local/apisix/proxywasm
  rm $CORAZA_FILENAME
  apt-get remove zip -y
  chown -R apisix:apisix /usr/local/apisix/proxywasm

EOF

USER apisix                                                                 #5

  1. 定義變量以提高可維護性
  2. 獲取 Coraza Wasm 版本。
  3. 在最近的 APISIX 版本中,用戶為 apisix 以加固安全性。由於我們需要安裝包,必須切換到 root
  4. 安裝 unzip,因為它未安裝,解壓下載的檔案,移除檔案,卸載 unzip,並更改提取文件夾的所有者。
  5. 切換回使用者 apisix

下一步是配置 APISIX 本身以使用 Coraza Wasm 插件。

YAML

 

wasm:
  plugins:
    - name: coraza-filter                                                   #1
      priority: 7999                                                        #2
      file: /usr/local/apisix/proxywasm/coraza-proxy-wasm.wasm              #3

  1. 在 Wasm 代碼中設置過濾器的名稱
  2. 設定最高優先級,以便它在任何其他插件之前運行。
  3. 指向提取的文件的路徑(參見上面的 Dockerfile

最後,我們可以將插件分配給路由或將其設置為全局規則,以應用於每個路由。我使用靜態配置:

YAML

 

global_rules:
  - id: 1
    plugins:
      coraza-filter:                                                        #1
        conf:
          directives_map:                                                   #2
            default:
              - SecDebugLogLevel 9                                          #3
              - SecRuleEngine On                                            #4
              - Include @crs-setup-conf                                     #5
              - Include @owasp_crs/*.conf                                   #6
          default_directives: default                                       #7

  1. 配置 coraza-filter 插件,現在它已可用。
  2. 定義配置。在這裡,我們定義了一個單一的 default,但我們可以定義多個並在不同的路由中使用不同的配置。
  3. 增加日誌級別以查看日誌中的情況。
  4. 啟動引擎。
  5. 使用 Coraza 設置。
  6. 使用所有規則。我們可以選擇我們想要的規則以獲得更精細的控制。
  7. 使用上面定義的 default 配置。

我們繼續定義路由以測試我們的設置。讓我們稱這個路由為 /get

Shell

 

curl localhost:9080?user=foobar

響應如預期:

JSON

 

{
  "args": {
    "user": "foobar"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Host": "localhost", 
    "User-Agent": "curl/8.4.0", 
    "X-Amzn-Trace-Id": "Root=1-65b9fa13-75900dc029e156ec764ae204", 
    "X-Forwarded-Host": "localhost"
  }, 
  "origin": "192.168.65.1, 176.153.7.175", 
  "url": "http://localhost/get?user=foobar"
}

現在,讓我們嘗試在查詢字符串中發送 JavaScript。這種請求在服務器端是不可能預期的,因此我們的基礎設施應該保護我們免受其害。

Shell

 

curl 'localhost:9080?user=<script>alert(1)</script>'

響應是 403 HTTP 狀態碼。如果我們查看日誌,我們可以看到以下提示:

Plain Text

 

Coraza: Warning. XSS Attack Detected via libinjection [file "@owasp_crs/REQUEST-941-APPLICATION-ATTACK-XSS.conf"]
Coraza: Warning. NoScript XSS InjectionChecker: HTML Injection
Coraza: Warning. Javascript method detected
Coraza: Access denied (phase 1). Inbound Anomaly Score Exceeded in phase 1

Coraza 完成了工作!

結論

多數機構並未對安全性給予足夠激勵,因此我們需巧妙應對,盡可能利用現有元件。

透過整合Coraza及核心規則集,我們能強化Apache APISIX對抗OWASP Top 10的威脅。

深入探討

本篇文章的完整原始碼可在GitHub上找到。

Source:
https://dzone.com/articles/hardening-apache-apisix-with-the-owasps-coraza-and