Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:ASM'de Envoy filtresi kullanarak HTTP yanıt üst bilgileri ekleme

Son Güncelleme:Oct 07, 2026

Web uygulamaları için HTTP yanıt üst bilgileri ekleyerek uygulama güvenliğini artırabilirsiniz. Bu konuda, Service Mesh (ASM) içinde bir Envoy filtresi kullanarak HTTP yanıt üst bilgilerinin nasıl ekleneceği açıklanmaktadır.

Önkoşullar

Arka plan bilgileri

Open Web Application Security Project (OWASP), uygulamaların güvenliğini artırmak amacıyla HTTP yanıt üst bilgilerinin nasıl kullanılacağını açıklayan en iyi uygulamalar ve bir kodlama çerçevesi sunar. Aşağıdaki tabloda temel HTTP yanıt üst bilgileri açıklanmaktadır.

HTTP yanıt üst bilgisi

Varsayılan değer

Açıklama

Content-Security-Policy

frame-ancestors none;

Diğer web sitelerinden gelen tıklama hırsızlığı (clickjacking) saldırılarını önler.

X-XSS-Protection

1;mode=block

Tarayıcının çapraz site betik çalıştırma (XSS) filtresini (varsa) etkinleştirir; böylece tarayıcı XSS saldırıları algılandığında işlemeyi durdurur.

X-Content-Type-Options

Nosniff

Tarayıcının içerik koklamasını devre dışı bırakır.

Referrer-Policy

no-referrer

İsteklerle birlikte hiçbir yönlendirici bilgisinin gönderilmeyeceğini belirtir.

X-Download-Options

noopen

Internet Explorer'ın eski sürümlerinin indirmelerin otomatik olarak yürütülmesine izin vermesini engeller.

X-DNS-Prefetch-Control

off

Web sayfalarındaki harici köprüler için DNS ön getirmeyi devre dışı bırakır.

Server

envoy

Yanıtı oluşturan sunucudur. Bu HTTP yanıt üst bilgisi, Istio giriş ağ geçidi tarafından otomatik olarak ayarlanır.

X-Powered-by

Yok

Barındırma ortamları veya diğer çerçeveler hakkında bilgi içerir. Güvenlik açığı bulunan uygulama sunucularının adını ve sürüm bilgilerini gizlemek istiyorsanız bu HTTP yanıt üst bilgisini ayarlamayın.

Feature-Policy

camera 'none';

microphone 'none';

geolocation 'none';

encrypted-media 'none';

payment 'none';

speaker 'none';

usb 'none';

Tarayıcılar tarafından kullanılabilecek özellikleri ve API işlemlerini belirtir.

Bu örnekte bir Bookinfo uygulaması kullanılmaktadır. Daha fazla bilgi için bkz. ASM örneğinde uygulama dağıtma. Uygulamanın HTTP yanıt üst bilgilerini sorgulamak için aşağıdaki curl komutunu çalıştırabilirsiniz:

curl -I http://{IP address of the ingress gateway}/productpage
# Output example
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

Komut çıktısı, uygulamanın önceki tabloda açıklanan HTTP yanıt üst bilgilerinden hiçbirini içermediğini göstermektedir. Uygulama güvenliğini artırmak amacıyla uygulamaya HTTP yanıt üst bilgileri eklemek üzere bir Envoy filtresi oluşturabilirsiniz.

Yordam

  1. ASM örneğinizin sürümüne göre bir Envoy filtresi dağıtın.

    Sürümü 1.12.4.0 veya üzeri olan bir ASM örneği için

    ASM konsolunda Market Place sayfasından bir Envoy filtresi dağıtabilirsiniz.

    1. ASM konsoluna oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneğini belirleyin.

    2. Mesh Management sayfasında ASM örneğinin adını tıklayın. Sol gezinme bölmesinde Plugin Extension Center > Market Place seçeneğini belirleyin.

    3. Market Place sayfasında Add HTTP response headers öğesini tıklayın. Plugin Detail sayfasında Create Plug-in Instance öğesini tıklayın.

    4. Plugin Effective scope bölümünde Gateway Scope seçeneğini belirleyin ve ardından Add ASM Gateway to effective scope öğesini tıklayın.

    5. Add ASM Gateway to effective scope iletişim kutusunda Select ASM Gateway bölümünde ingressgateway öğesini seçin, ingressgateway öğesini selected bölümüne eklemek için 添加 simgesini tıklayın ve ardından OK öğesini tıklayın.

      Not

      ingressgateway, ASM tarafından dağıtılan varsayılan ağ geçidinin adıdır. Bu özelliği uygulamak istediğiniz diğer ASM ağ geçitlerini de seçebilirsiniz.

    6. Plugin Config bölümünde YAML düzenleyicideki tüm içeriği silin, Plugin Switch seçeneğini açın ve eklentinin etkinleştirilmesini bekleyin.

      Eklenti etkinleştirildikten sonra ASM otomatik olarak bir Envoy filtresi oluşturur.

    Sürümü 1.12.4.0'dan önce olan bir ASM örneği için

    Bir Envoy filtresi dağıtmak için aşağıdaki komutları çalıştırabilirsiniz:

    Komutları görüntülemek için genişletin

    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:
        # You can use the workloadSelector field to select workloads in a specific namespace for the Envoy filter. 
        labels:
          istio: ingressgateway
      configPatches:
        # The Envoy configuration that you need to modify. 
      - 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: # Lua script configuration 
            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: Envoy filtresinin uygulanacağı Istio sürümünü belirtir. Değeri Istio sürümünüz olarak ayarlayın. Envoy filtresindeki bazı alanlar Istio sürümüyle uyumsuz olabilir. Istio sürümünüze bağlı olarak Envoy filtresindeki alanları değiştirmeniz gerekebilir:

    • Istio sürümünüz 1,8 veya önceki bir sürümse proxyVersion parametresini Istio sürümünüz olarak ayarlayın ve envoy.filters.network.http_connection_manager ifadesini envoy.http_connection_manager ile, envoy.filters.http.router ifadesini envoy.router ile ve type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua ifadesini type.googleapis.com/envoy.config.filter.http.lua.v2.Lua ile değiştirin.

    • Istio sürümünüz 1,9 veya sonraki bir sürümse proxyVersion parametresini Istio sürümünüz olarak ayarlayın.

  2. HTTP yanıt üst bilgilerinin başarıyla eklenip eklenmediğini kontrol etmek için aşağıdaki komutu çalıştırın:

    {IP address of the ingress gateway} ifadesini giriş ağ geçidinizin gerçek IP adresiyle değiştirin. Giriş ağ geçidinin IP adresini elde etme hakkında daha fazla bilgi için Trafiği hizmetin farklı sürümlerine yönlendirmek için Istio kaynaklarını kullanma konusundaki "Giriş ağ geçidinin IP adresini alma" bölümüne bakın.

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

    Beklenen çıktı:

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

    Komut çıktısı, uygulamanın önceki tabloda açıklanan temel HTTP yanıt üst bilgilerini içerdiğini göstermektedir.

SSS

Özel karakterler içeren bir URL kullanarak bir uygulamaya neden erişemiyorum?

Özel karakterlerin kodlama biçimleri URL kodlama kuralına uygun olmayabilir. Örneğin, Á özel karakteri için ASCII kodlaması yerine Unicode kodlaması kullanılır. Daha fazla bilgi için bkz. Envoy cannot parse non-alphanumeric characters if not urlencoded.