Envoy 프록시에서 WebAssembly 플러그인 실행

Envoy 프록시에서 WebAssembly 플러그인 실행 (Run WebAssembly plug-ins in Envoy proxy)

이 주제에서는 wasm 확장을 사용하는 방법을 설명해요. 이 확장은 Consul이 Envoy 프록시용 WebAssembly(Wasm) 플러그인을 실행하도록 지시해요.

출처: 문서

본문

이 주제에서는 wasm 확장을 사용하는 방법을 설명합니다. 이 확장은 Consul이 Envoy 프록시용 WebAssembly(Wasm) 플러그인을 실행하도록 지시합니다.

Envoy용 Wasm 플러그인을 만들어 wasm 확장으로 통합할 수 있습니다. Wasm은 스택 기반 가상 머신을 위한 바이너리 명령 형식으로, 컴파일된 후에는 어디서나 실행될 가능성이 있습니다. Wasm 플러그인은 서비스 메시 애플리케이션의 사이드카 프록시에서 필터로 실행됩니다.

워크플로우 (Workflow)

Wasm Envoy 확장을 사용하려면 다음 단계를 완료하세요:

  • Wasm 플러그인을 만듭니다. 플러그인이 예상대로 작동하는지 확인해야 합니다. 정보 및 문서 링크는 WebAssembly 웹사이트를 참조하세요.
  • service defaults 또는 proxy defaults 구성 항목에서 EnvoyExtensions 블록을 구성합니다.
  • 구성 항목을 적용합니다.

EnvoyExtensions 추가 (Add the EnvoyExtensions)

proxy defaults 또는 service defaults 구성 항목에 Envoy 확장 구성을 추가합니다. 구성 항목의 EnvoyExtensions 블록에 확장 구성을 배치합니다.

  • proxy defaults에서 Envoy 확장을 구성하면 모든 서비스에 적용됩니다.
  • service defaults에서 Envoy 확장을 구성하면 특정 서비스에 적용됩니다.

Consul은 service defaults의 확장을 적용하기 전에 proxy defaults에서 구성된 Envoy 확장을 적용합니다. 결과적으로 service defaults의 Envoy 확장 구성이 proxy defaults의 구성을 재정의할 수 있습니다.

다음 예제는 Wasm 기반 웹 애플리케이션 방화벽(WAF)을 제공하기 위해 file-server라는 업스트림 서비스를 사용하는 api라는 service defaults 구성 항목을 보여줍니다.

HCL (wasm-extension-serve-waf.hcl):

Kind = "service-defaults"
Name = "api"
Protocol = "http"
EnvoyExtensions = [
  {
    Name = "builtin/wasm"
    Arguments = {
      Protocol = "http"
      ListenerType = "inbound"
      PluginConfig = {
        VmConfig = {
          Code = {
            Remote = {
              HttpURI = {
                Service = {
                  Name = "file-server"
                }
                URI = "https://file-server/waf.wasm"
              }
              SHA256  = "c9ef17f48dcf0738b912111646de6d30575718ce16c0cbde3e38b21bb1771807"
            }
          }
        }
      Configuration =  <<EOF
{
  "rules": [
    "Include @demo-conf",
    "Include @crs-setup-demo-conf",
    "SecDebugLogLevel 9",
    "SecRuleEngine On",
    "Include @owasp_crs/*.conf"
  ]
}
EOF
      }
    }
  }
]

JSON (wasm-extension-serve-waf.json):

{
    "kind": "service-defaults",
    "name": "api",
    "protocol": "http",
    "envoyExtensions": [{
        "name": "builtin/wasm",
        "arguments": {
            "protocol": "http",
            "listenerType": "inbound",
            "pluginConfig": {
                "VmConfig": {
                    "Code": {
                        "Remote": {
                            "HttpURI": {
                                "Service": {
                                    "Name": "file-server"
                                },
                                "URI": "https://file-server/waf.wasm"
                            }
                        }
                    },
                    "Configuration": {
                        "rules": [
                            "Include @demo-conf",
                            "Include @crs-setup-demo-conf",
                            "SecDebugLogLevel 9",
                            "SecRuleEngine On",
                            "Include @owasp_crs/*.conf"
                        ]
                    }

            }
        }
    }]
}

YAML (wasm-extension-serve-waf.yaml):

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceDefaults
metadata:
  name: api
spec:
  protocol: http
  envoyExtensions:
    - name: builtin/wasm
      required: true
      arguments:
        protocol: http
        listenerType: inbound
        pluginConfig:
          VmConfig:
            Code:
              Remote:
                HttpURI:
                  Service:
                    Name: file-server
                    URI: https://file-server/waf.wasm
          Configuration:
            rules:
            - Include @demo-conf
            - Include @crs-setup-demo-conf
            - SecDebugLogLevel 9
            - SecRuleEngine On
            - Include @owasp_crs/*.conf

확장 구성 방법에 대한 자세한 내용은 Wasm 확장 구성 참조를 참조하세요.

구성 항목 정의 방법에 대한 자세한 내용은 proxy defaults 구성 항목 참조 및 service defaults 구성 항목 참조를 참조하세요.

경고 (Warning)

기본 프록시 구성에 Envoy 확장을 추가하면 의도하지 않은 결과가 발생할 수 있습니다. 대부분의 경우 service defaults 구성 항목에서 EnvoyExtensions를 구성하는 것을 권장합니다.

구성 항목 적용 (Apply the configuration entry)

네트워크가 가상 머신에 배포된 경우 consul config write 명령을 사용하고 proxy defaults 또는 service defaults 구성 항목을 지정하여 구성을 적용합니다. Kubernetes 오케스트레이션 네트워크의 경우 kubectl apply 명령을 사용하세요. 다음 예제는 proxy defaults 구성 항목에서 확장을 적용합니다.

HCL:

$ consul config write wasm-extension-serve-waf.hcl

JSON:

$ consul config write wasm-extension-serve-waf.json

YAML:

$ kubectl apply wasm-extension-serve-waf.yaml

더 알아보기 (Learn more)