All Products
Search
Document Center

Alibaba Cloud Service Mesh:Gunakan filter Envoy untuk menambahkan header respons HTTP di ASM

Last Updated:May 07, 2026

Anda dapat menambahkan header respons HTTP pada aplikasi web untuk meningkatkan keamanannya. Topik ini menjelaskan cara menggunakan filter Envoy guna menambahkan header respons HTTP di Service Mesh (ASM).

Prasyarat

Informasi latar belakang

Proyek Keamanan Aplikasi Web Terbuka (OWASP) menyediakan praktik terbaik dan kerangka kerja pengkodean untuk menjelaskan cara menggunakan header respons HTTP guna meningkatkan keamanan aplikasi. Tabel berikut menjelaskan header respons HTTP dasar.

Header respons HTTP

Nilai default

Deskripsi

Content-Security-Policy

frame-ancestors none;

Mencegah serangan clickjacking dari situs web lain.

X-XSS-Protection

1;mode=block

Mengaktifkan filter skrip lintas situs (XSS) (jika tersedia) pada browser sehingga browser dapat berhenti melakukan rendering ketika serangan XSS terdeteksi.

X-Content-Type-Options

Nosniff

Menonaktifkan content sniffing pada browser.

Referrer-Policy

no-referrer

Menentukan agar tidak mengirim informasi referrer bersama permintaan.

X-Download-Options

noopen

Mencegah versi lama Internet Explorer memungkinkan unduhan dieksekusi secara otomatis.

X-DNS-Prefetch-Control

off

Menonaktifkan DNS prefetching untuk hyperlink eksternal pada halaman web.

Server

envoy

Server yang menghasilkan respons. Header respons HTTP ini secara otomatis diatur oleh gerbang masuk Istio.

X-Powered-by

N/A

Berisi informasi tentang lingkungan hosting atau framework lainnya. Jangan atur header respons HTTP ini jika Anda ingin menyembunyikan informasi nama dan versi server aplikasi yang rentan.

Feature-Policy

camera 'none';

microphone 'none';

geolocation 'none';

encrypted-media 'none';

payment 'none';

speaker 'none';

usb 'none';

Menentukan fitur dan operasi API yang tersedia untuk browser.

Pada contoh ini, digunakan aplikasi Bookinfo. Untuk informasi selengkapnya, lihat Deploy aplikasi di instans ASM. Anda dapat menjalankan perintah curl berikut untuk mengkueri header respons HTTP aplikasi:

curl -I http://{IP address of the ingress gateway}/productpage
# Contoh output
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 5183
server: istio-envoy
date: Tue, 28 Jan 2020 08:15:21 GMT
x-envoy-upstream-service-time: 28

Output perintah menunjukkan bahwa aplikasi tidak berisi header respons HTTP apa pun yang dijelaskan dalam tabel sebelumnya. Anda dapat membuat filter Envoy untuk menambahkan header respons HTTP bagi aplikasi guna meningkatkan keamanannya.

Prosedur

  1. Deploy filter Envoy berdasarkan versi instans ASM Anda.

    Untuk instans ASM dengan versi 1.12.4.0 atau lebih baru

    Anda dapat menerapkan filter Envoy melalui halaman Market Place di Konsol ASM.

    1. Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

    2. Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih Plugin Extension Center > Market Place.

    3. Di halaman Market Place, klik Add HTTP response headers. Di halaman Plugin Detail, klik Create Plug-in Instance.

    4. Pada bagian Plugin Effective scope, pilih Gateway Scope, lalu klik Add ASM Gateway to effective scope.

    5. Pada kotak dialog Add ASM Gateway to effective scope, pilih ingressgateway pada bagian Select ASM Gateway, klik ikon 添加 untuk menambahkan ingressgateway ke bagian selected, lalu klik OK.

      Catatan

      ingressgateway adalah nama gerbang default yang dideploy oleh ASM. Anda juga dapat memilih gerbang ASM lain tempat fitur ini akan diterapkan.

    6. Pada bagian Plugin Config, hapus semua konten dari editor YAML, aktifkan Plugin Switch, lalu tunggu hingga plugin diaktifkan.

      Setelah plug-in diaktifkan, ASM secara otomatis membuat filter Envoy.

    Untuk instans ASM dengan versi lebih lama dari 1.12.4.0

    Anda dapat menjalankan perintah berikut untuk menerapkan filter Envoy:

    Expand to view commands

    kubectl apply -f - <<EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: addheader-into-ingressgateway
      namespace: istio-system
      labels:
        asm-system: 'true'
        provider: asm
    spec:
      workloadSelector:
        # Anda dapat menggunakan bidang workloadSelector untuk memilih beban kerja di namespace tertentu untuk filter Envoy.
        labels:
          istio: ingressgateway
      configPatches:
        # Konfigurasi Envoy yang perlu Anda modifikasi.
      - applyTo: HTTP_FILTER
        match:
          context: GATEWAY
          proxy:
            proxyVersion: '^1\.9.*'
          listener:
            filterChain:
              filter:
                name: "envoy.filters.network.http_connection_manager"
                subFilter:
                  name: "envoy.filters.http.router"
        patch:
          operation: INSERT_BEFORE
          value: # Konfigurasi skrip Lua
            name: envoy.lua
            typed_config:
              "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
              inlineCode: |-
                function envoy_on_response(response_handle)
                    function hasFrameAncestors(rh)
                    s = rh:headers():get("Content-Security-Policy");
                    delimiter = ";";
                    defined = false;
                    for match in (s..delimiter):gmatch("(.-)"..delimiter) do
                        match = match:gsub("%s+", "");
                        if match:sub(1, 15)=="frame-ancestors" then
                        return true;
                        end
                    end
                    return false;
                    end
                    if not response_handle:headers():get("Content-Security-Policy") then
                    csp = "frame-ancestors none;";
                    response_handle:headers():add("Content-Security-Policy", csp);
                    elseif response_handle:headers():get("Content-Security-Policy") then
                    if not hasFrameAncestors(response_handle) then
                        csp = response_handle:headers():get("Content-Security-Policy");
                        csp = csp .. ";frame-ancestors none;";
                        response_handle:headers():replace("Content-Security-Policy", csp);
                    end
                    end
                    if not response_handle:headers():get("X-Frame-Options") then
                    response_handle:headers():add("X-Frame-Options", "deny");
                    end
                    if not response_handle:headers():get("X-XSS-Protection") then
                    response_handle:headers():add("X-XSS-Protection", "1; mode=block");
                    end
                    if not response_handle:headers():get("X-Content-Type-Options") then
                    response_handle:headers():add("X-Content-Type-Options", "nosniff");
                    end
                    if not response_handle:headers():get("Referrer-Policy") then
                    response_handle:headers():add("Referrer-Policy", "no-referrer");
                    end
                    if not response_handle:headers():get("X-Download-Options") then
                    response_handle:headers():add("X-Download-Options", "noopen");
                    end
                    if not response_handle:headers():get("X-DNS-Prefetch-Control") then
                    response_handle:headers():add("X-DNS-Prefetch-Control", "off");
                    end
                    if not response_handle:headers():get("Feature-Policy") then
                    response_handle:headers():add("Feature-Policy",
                                                    "camera 'none';"..
                                                    "microphone 'none';"..
                                                    "geolocation 'none';"..
                                                    "encrypted-media 'none';"..
                                                    "payment 'none';"..
                                                    "speaker 'none';"..
                                                    "usb 'none';");
                    end
                    if response_handle:headers():get("X-Powered-By") then
                    response_handle:headers():remove("X-Powered-By");
                    end
                end
    EOF

    proxyVersion: Menentukan versi Istio tempat filter Envoy diterapkan. Atur nilainya sesuai versi Istio Anda. Beberapa bidang dalam filter Envoy mungkin tidak kompatibel dengan versi Istio tersebut. Anda mungkin perlu menyesuaikan bidang dalam filter Envoy berdasarkan versi Istio Anda:

    • Jika versi Istio Anda 1.8 atau lebih lama, atur parameter proxyVersion sesuai versi Istio Anda dan ganti envoy.filters.network.http_connection_manager dengan envoy.http_connection_manager, envoy.filters.http.router dengan envoy.router, serta type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua dengan type.googleapis.com/envoy.config.filter.http.lua.v2.Lua.

    • Jika versi Istio Anda 1.9 atau lebih baru, atur parameter proxyVersion sesuai versi Istio Anda.

  2. Jalankan perintah berikut untuk memeriksa apakah header respons HTTP berhasil ditambahkan:

    Ganti {IP address of the ingress gateway} dengan alamat IP aktual gerbang masuk Anda. Untuk informasi selengkapnya tentang cara mendapatkan alamat IP gerbang masuk, lihat "Obtain the IP address of the ingress gateway" dalam topik Gunakan sumber daya Istio untuk mengarahkan traffic ke berbagai versi layanan.

    curl -I http://{IP address of the ingress gateway}/productpage

    Output yang diharapkan:

    HTTP/1.1 200 OK
    content-type: text/html; charset=utf-8
    content-length: 4183
    server: istio-envoy
    date: Tue, 28 Jan 2020 09:07:01 GMT
    x-envoy-upstream-service-time: 17
    content-security-policy: frame-ancestors none;
    x-frame-options: deny
    x-xss-protection: 1; mode=block
    x-content-type-options: nosniff
    referrer-policy: no-referrer
    x-download-options: noopen
    x-dns-prefetch-control: off
    feature-policy: camera 'none';microphone 'none';geolocation 'none';encrypted-media 'none';payment 'none';speaker 'none';usb 'none';

    Output perintah menunjukkan bahwa aplikasi berisi header respons HTTP dasar yang dijelaskan dalam tabel sebelumnya.

FAQ

Mengapa saya tidak dapat mengakses aplikasi menggunakan URL yang berisi karakter khusus?

Format encoding karakter khusus mungkin tidak sesuai dengan aturan encoding URL. Misalnya, encoding Unicode digunakan alih-alih encoding ASCII untuk karakter khusus Á. Untuk informasi selengkapnya, lihat Envoy cannot parse non-alphanumeric characters if not urlencoded.