All Products
Search
Document Center

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

Last Updated:Jul 02, 2025

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

Prasyarat

Informasi Latar Belakang

Open Web Application Security Project (OWASP) menyediakan praktik terbaik dan kerangka 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 menghentikan rendering saat serangan XSS terdeteksi.

X-Content-Type-Options

Nosniff

Menonaktifkan sniffing konten pada browser.

Referrer-Policy

no-referrer

Menentukan untuk tidak mengirimkan informasi referrer bersama permintaan.

X-Download-Options

noopen

Mencegah versi lama Internet Explorer dari mengizinkan unduhan dieksekusi secara otomatis.

X-DNS-Prefetch-Control

off

Menonaktifkan prefetch DNS untuk tautan eksternal di halaman web.

Server

envoy

Server yang menghasilkan respons. Header respons HTTP ini secara otomatis disetel oleh gateway ingress Istio.

X-Powered-by

Tidak tersedia

Berisi informasi tentang lingkungan hosting atau framework lainnya. Jangan setel header respons HTTP ini jika Anda ingin menyembunyikan nama dan informasi 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 bagi browser.

Dalam contoh ini, aplikasi Bookinfo digunakan. Untuk informasi lebih lanjut, lihat Terapkan Aplikasi di Instance ASM. Anda dapat menjalankan perintah curl berikut untuk memeriksa header respons HTTP aplikasi:

curl -I http://{alamat IP gateway ingress}/productpage
# Contoh keluaran
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

Keluaran perintah menunjukkan bahwa aplikasi tidak mengandung salah satu header respons HTTP yang dijelaskan dalam tabel sebelumnya. Anda dapat membuat filter Envoy untuk menambahkan header respons HTTP guna meningkatkan keamanan aplikasi.

Prosedur

  1. Terapkan filter Envoy berdasarkan versi instance ASM Anda.

    Untuk instance 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 kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi 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. Di bagian Plugin Effective scope, pilih Gateway Scope dan klik Add ASM Gateway to effective scope.

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

      Catatan

      ingressgateway adalah nama gateway ingress default. Anda juga dapat memilih gateway lain tempat header respons HTTP yang ditambahkan akan berlaku.

    6. Di bagian Plugin Config, hapus semua konten dari editor kode YAML, aktifkan Plugin Switch, dan tunggu hingga plugin diaktifkan.

      Setelah plugin diaktifkan, ASM secara otomatis membuat filter Envoy.

    Untuk instance ASM dengan versi lebih lama dari 1.12.4.0

    Anda dapat menjalankan perintah berikut untuk menerapkan filter Envoy:

    Perluas untuk Melihat Perintah

    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 berlaku. Atur nilainya sesuai dengan versi Istio Anda. Beberapa bidang dalam filter Envoy mungkin tidak kompatibel dengan versi Istio. Anda mungkin perlu memodifikasi bidang dalam filter Envoy berdasarkan versi Istio Anda:

    • Jika versi Istio Anda adalah 1.8 atau lebih lama, atur parameter proxyVersion ke versi Istio Anda dan ganti envoy.filters.network.http_connection_manager dengan envoy.http_connection_manager, envoy.filters.http.router dengan envoy.router, dan 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 adalah 1.9 atau lebih baru, atur parameter proxyVersion ke versi Istio Anda.

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

    Ganti {alamat IP gateway ingress} dengan alamat IP aktual gateway ingress Anda. Untuk informasi lebih lanjut tentang cara mendapatkan alamat IP gateway ingress, lihat "Dapatkan Alamat IP Gateway Ingress" dalam topik Gunakan Sumber Daya Istio untuk Merutekan Lalu Lintas ke Versi Layanan yang Berbeda.

    curl -I http://{alamat IP gateway ingress}/productpage

    Keluaran 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';

    Keluaran perintah menunjukkan bahwa aplikasi mengandung header respons HTTP dasar yang dijelaskan dalam tabel sebelumnya.

FAQ

Mengapa saya tidak dapat mengakses aplikasi menggunakan URL dengan karakter spesial?

Format pengodean karakter spesial mungkin tidak sesuai dengan aturan pengodean URL. Misalnya, pengodean Unicode digunakan alih-alih pengodean ASCII untuk karakter spesial Á. Untuk informasi lebih lanjut, lihat Envoy tidak dapat mem-parsing karakter non-alfanumerik jika tidak di-urlencode.