日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用Coraza Wasm插件在ASM網(wǎng)關(guān)上實(shí)現(xiàn)WAF能力

更新時(shí)間:

ASM通過(guò)VirtualService API提供豐富的路由能力和請(qǐng)求操縱能力,通過(guò)AuthorizationPolicy API提供豐富的安全能力,但是在一些特定場(chǎng)景下,這些API可能仍然不能滿足需求。您可以通過(guò)編寫自定義的Wasm Filter并添加到ASM網(wǎng)關(guān)或Sidecar來(lái)實(shí)現(xiàn)復(fù)雜場(chǎng)景的自定義行為。本文介紹如何通過(guò)WasmPlugin API為ASM網(wǎng)關(guān)啟用Coraza WAF。

前提條件

步驟一:制作Wasm Plugin OCI鏡像并推送至阿里云容器鏡像服務(wù)

Wasm Plugin有以下三種加載方式。本文以第二種方式為例,制作Wasm Plugin的OCI鏡像,并將其推送到阿里云容器鏡像服務(wù)。

  • 將Wasm擴(kuò)展存儲(chǔ)至configmap,并Mount至容器,ASM網(wǎng)格代理或ASM網(wǎng)關(guān)從本地文件系統(tǒng)加載。

  • 將Wasm擴(kuò)展制作成OCI鏡像上傳至鏡像倉(cāng)庫(kù),ASM網(wǎng)格代理或ASM網(wǎng)關(guān)從鏡像倉(cāng)庫(kù)拉取。

  • 將Wasm擴(kuò)展上傳至云存儲(chǔ)或其他支持HTTP協(xié)議下載的服務(wù),ASM網(wǎng)格代理或網(wǎng)關(guān)通過(guò)網(wǎng)絡(luò)下載。

  1. 下載Coraza Wasm插件并構(gòu)建鏡像。

    1. 執(zhí)行以下命令,下載Coraza Wasm插件至本地,并解壓縮。

      wget https://github.com/corazawaf/coraza-proxy-wasm/releases/download/0.3.0/coraza-proxy-wasm-0.3.0.zip
      unzip coraza-proxy-wasm-0.3.0.zip
    2. 執(zhí)行以下命令,為Coraza Wasm插件重命名。

      上一步解壓完成后,會(huì)得到coraza-proxy-wasm.wasm文件。ASM要求Wasm插件必須命名為plugin.wasm,因此需要重命名。

      mv coraza-proxy-wasm.wasm plugin.wasm
    3. 在當(dāng)前目錄下創(chuàng)建Dockerfile文件,內(nèi)容如下:

      FROM scratch
      ADD ./plugin.wasm ./plugin.wasm
    4. 執(zhí)行如下命令構(gòu)建鏡像:

      docker build -t coraza-proxy-wasm:latest . 
  2. 推送鏡像到ACR企業(yè)版實(shí)例。

    1. 創(chuàng)建命名空間。

      1. 登錄容器鏡像服務(wù)控制臺(tái),在左側(cè)導(dǎo)航欄,單擊實(shí)例列表

      2. 實(shí)例列表頁(yè)面,單擊目標(biāo)企業(yè)版實(shí)例。

      3. 在左側(cè)導(dǎo)航欄,單擊倉(cāng)庫(kù)管理 > 命名空間,然后單擊創(chuàng)建命名空間,配置相關(guān)信息,然后單擊確定

        本示例配置命名空間名稱為wasm

    2. 在左側(cè)導(dǎo)航欄,單擊倉(cāng)庫(kù)管理 > 訪問(wèn)控制,單擊公網(wǎng)頁(yè)簽,打開(kāi)訪問(wèn)入口開(kāi)關(guān),按需添加公網(wǎng)白名單。

      如果不需要白名單控制,請(qǐng)刪除默認(rèn)的白名單。

      說(shuō)明

      本文采用公網(wǎng)地址作為演示。在實(shí)際應(yīng)用中,您可以配置專有網(wǎng)絡(luò)訪問(wèn)以實(shí)現(xiàn)更高的私密性和更好的網(wǎng)絡(luò)性能。更多信息,請(qǐng)參見(jiàn)配置專有網(wǎng)絡(luò)的訪問(wèn)控制

    3. 執(zhí)行以下命令,登錄ACR企業(yè)版實(shí)例,輸入密碼。

      docker login --username=登錄用戶名 enterprise-registry.cn-hangzhou.cr.aliyuncs.com
    4. 執(zhí)行以下命令,將鏡像推送到鏡像倉(cāng)庫(kù)。

      docker tag ${ImageId} enterprise-registry.cn-hangzhou.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
      docker push enterprise-registry.cn-hangzhou.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
    5. 驗(yàn)證鏡像是否推送成功。

      1. 登錄容器鏡像服務(wù)控制臺(tái),在左側(cè)導(dǎo)航欄,單擊實(shí)例列表

      2. 實(shí)例列表頁(yè)面,單擊目標(biāo)企業(yè)版實(shí)例。

      3. 在左側(cè)導(dǎo)航欄,單擊倉(cāng)庫(kù)管理 > 鏡像倉(cāng)庫(kù),單擊coraza-proxy-wasm,然后在左側(cè)導(dǎo)航欄,單擊鏡像版本

        若顯示剛推送的標(biāo)簽為latest的鏡像,表明鏡像推送成功。

步驟二:配置鏡像拉取權(quán)限

創(chuàng)建私有倉(cāng)庫(kù)后,您需要使用容器鏡像服務(wù)配置的口令創(chuàng)建Secret。ASM網(wǎng)格代理或ASM網(wǎng)關(guān)將使用Secret中的授權(quán)信息在拉取鏡像時(shí)進(jìn)行認(rèn)證。

  1. 執(zhí)行以下命令,創(chuàng)建Secret。

    kubectl create secret docker-registry -n istio-system coraza-wasm-proxy --docker-server=enterprise-registry.cn-hangzhou.cr.aliyuncs.com --docker-username=用戶名 --docker-password=密碼

    Secret需要保持與Wasm Plugin處于同一命名空間。本文的Wasm Plugin命名空間為istio-system,因此對(duì)應(yīng)的Secret在istio-system命名空間。在實(shí)際使用中,請(qǐng)您根據(jù)實(shí)際情況調(diào)整以上命令中-n參數(shù)后的命名空間名稱。

  2. 執(zhí)行以下命令,檢查Secret是否創(chuàng)建成功。

    kubectl -n isito-system get secret coraza-wasm-proxy 

步驟三:應(yīng)用WasmPlugin API到ASM

WasmPlugin API用于聲明在目標(biāo)網(wǎng)關(guān)或網(wǎng)格代理上使用的插件及相關(guān)配置。

  1. 使用以下內(nèi)容,創(chuàng)建wasm-plugin.yaml。

    apiVersion: extensions.istio.io/v1alpha1
    kind: WasmPlugin
    metadata:
      name: coraza-proxy-wasm
      namespace: istio-system
    spec:
      imagePullPolicy: IfNotPresent
      imagePullSecret: coraza-wasm-proxy
      selector:
        matchLabels:
          istio: ingressgateway
      url: oci://enterprise-registry.cn-hangzhou.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
      phase: AUTHN
      pluginConfig:
        directives_map:
          default:
            - "SecDebugLogLevel 9"
            - "SecRuleEngine On"
            - "SecRule REQUEST_HEADERS:x-user-type \"@streq baned\" \"id:101,phase:1,t:lowercase,deny,msg:'denied by header'\""
        default_directives: default

    字段

    說(shuō)明

    spec.url

    指定OCI鏡像的地址和Tag。

    spec.imagePullSecret

    指定用于進(jìn)行鏡像倉(cāng)庫(kù)鑒權(quán)的Secret。

    spec.selector

    指定生效的工作負(fù)載。

    spec.phase

    指定插件生效的階段。

    sepc.pluginConfig

    指定插件配置。

    • directives_map:定義名為defaultdirective,其中規(guī)則指定當(dāng)請(qǐng)求攜帶x-user-type Header,且值為baned時(shí),拒絕該請(qǐng)求。

    • default_directives:指定默認(rèn)的directivedefault

  2. 在ASM實(shí)例對(duì)應(yīng)的KubeConfig環(huán)境下,執(zhí)行以下命令,將WasmPlugin應(yīng)用到ASM實(shí)例。

    kubectl apply -f wasm-plugin.yaml

步驟四:驗(yàn)證WasmPlugin API是否生效

  1. 執(zhí)行以下命令,訪問(wèn)httpbin應(yīng)用。

    請(qǐng)將http://120.27.XXX.XX/替換為實(shí)際的網(wǎng)關(guān)地址。關(guān)于如何獲取網(wǎng)關(guān)地址,請(qǐng)參見(jiàn)獲取入口網(wǎng)關(guān)地址

    curl -v http://120.27.XXX.XX/

    預(yù)期輸出:

    *   Trying 120.27.XXX.XX:80...
    * Connected to 120.27.XXX.XX (120.27.XXX.XX) port 80 (#0)
    > GET / HTTP/1.1
    > Host: 120.27.XXX.XX
    > User-Agent: curl/7.86.0
    > Accept: */*
    >
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 200 OK
    < server: istio-envoy
    < date: Fri, 27 Oct 2023 03:21:19 GMT
    < content-type: text/html; charset=utf-8
    < content-length: 9593
    < access-control-allow-origin: *
    < access-control-allow-credentials: true
    < x-envoy-upstream-service-time: 2
    ......

    可以看到請(qǐng)求返回200 OK,符合預(yù)期。

  2. 執(zhí)行以下命令,為請(qǐng)求添加header:x-user-type: baned,再次訪問(wèn)httpbin應(yīng)用。

    請(qǐng)將http://120.27.XXX.XX/替換為實(shí)際的網(wǎng)關(guān)地址。

    curl -v -H 'x-user-type: baned' http://120.27.XXX.XX/

    預(yù)期輸出:

    *   Trying 120.27.XXX.XX:80...
    * Connected to 120.27.XXX.XX (120.27.XXX.XX) port 80 (#0)
    > GET / HTTP/1.1
    > Host: 120.27.XXX.XX
    > User-Agent: curl/7.86.0
    > Accept: */*
    > x-user-type: baned
    >
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 403 Forbidden
    < date: Fri, 27 Oct 2023 03:22:19 GMT
    < server: istio-envoy
    < content-length: 0
    <
    * Connection #0 to host 120.27.XXX.XX left intact

    可以看到請(qǐng)求返回403 Forbidden,被網(wǎng)關(guān)拒絕,符合預(yù)期。