Crie cabeçalhos personalizados em serviços de back-end

Esta página descreve como configurar cabeçalhos personalizados em serviços de back-end usados pelo Application Load Balancer clássico.

Os cabeçalhos de pedidos e respostas personalizados permitem-lhe especificar cabeçalhos adicionais que o balanceador de carga pode adicionar a pedidos e respostas HTTP(S). Consoante as informações detetadas pelo balanceador de carga, estes cabeçalhos podem incluir as seguintes informações:

  • Latência para o cliente
  • Localização geográfica do endereço IP do cliente
  • Parâmetros da ligação TLS

Os cabeçalhos de pedidos personalizados são suportados para serviços de back-end, enquanto os cabeçalhos de respostas personalizados são suportados para serviços de back-end e contentores de back-end.

O balanceador de carga adiciona determinados cabeçalhos por predefinição a todos os pedidos e respostas HTTP(S) que encaminha entre back-ends e clientes. Para mais informações, consulte o artigo Segmente proxies.

Antes de começar

  • Se necessário, atualize para a versão mais recente da CLI Google Cloud:

    gcloud components update
    

Como funcionam os cabeçalhos personalizados

Os cabeçalhos personalizados funcionam da seguinte forma:

  • Quando o balanceador de carga encaminha um pedido para o back-end, o balanceador de carga adiciona cabeçalhos de pedidos.

    O equilibrador de carga adiciona cabeçalhos de pedidos personalizados apenas aos pedidos do cliente e não às sondagens de verificação do estado. Se o seu back-end exigir um cabeçalho específico para autorização que esteja em falta no pacote de verificação de funcionamento, a verificação de funcionamento pode falhar.

  • O equilibrador de carga define os cabeçalhos de resposta antes de devolver as respostas ao cliente.

Para ativar os cabeçalhos personalizados, especifica uma lista de cabeçalhos numa propriedade do serviço de back-end ou do contentor de back-end.

Especifique cada cabeçalho como uma string header-name:header-value. O cabeçalho tem de conter dois pontos a separar o nome do cabeçalho e o valor do cabeçalho.

Os nomes dos cabeçalhos têm de cumprir os seguintes requisitos:

  • O nome do cabeçalho tem de ser uma definição de nome de campo de cabeçalho HTTP válida (de acordo com o RFC 7230).
  • O nome do cabeçalho não pode ser X-User-IP nem CDN-Loop.
  • Os seguintes cabeçalhos hop-by-hop não podem ser usados: Keep-Alive, Transfer-Encoding, TE, Connection, Trailer e Upgrade. De acordo com a RFC 2616, estes cabeçalhos não são armazenados em cache nem propagados pelos proxies de destino.
  • O nome do cabeçalho não pode começar com X-Google, X-Goog-, X-GFE ou X-Amz-.
  • Um nome de cabeçalho não pode aparecer mais do que uma vez na lista de cabeçalhos adicionados.

Os valores dos cabeçalhos têm de cumprir os seguintes requisitos:

  • O valor do cabeçalho tem de ser uma definição de campo de cabeçalho HTTP válida de acordo com a RFC 7230, com formulários obsoletos não permitidos).
  • O valor do cabeçalho pode estar em branco.
  • O valor do cabeçalho pode incluir uma ou mais variáveis, entre chavetas, que se expandem para valores fornecidos pelo equilibrador de carga. Uma lista de variáveis permitidas no valor do cabeçalho encontra-se na secção seguinte.

A ferramenta de linha de comandos gcloud tem uma marca para especificar os cabeçalhos de pedidos, que é --custom-request-header. Certifique-se de que inclui o nome do cabeçalho e o valor do cabeçalho entre aspas simples retas (') com esta flag.

O formato geral da flag é:

    --custom-request-header='HEADER_NAME:[HEADER_VALUE]'

Segue-se um exemplo de um valor de cabeçalho com duas variáveis, client_region e client_city, entre chavetas.

    --custom-request-header='X-Client-Geo-Location:{client_region},{client_city}'

Para clientes localizados em Mountain View, Califórnia, o balanceador de carga adiciona um cabeçalho da seguinte forma:

X-Client-Geo-Location:US,Mountain View

Para criar um serviço de back-end com cabeçalhos personalizados, consulte o artigo Configure cabeçalhos de pedidos personalizados.

Variáveis suportadas com valores de cabeçalho

As seguintes variáveis podem aparecer em valores de cabeçalho personalizados.

Variável Descrição
cdn_cache_id Código de localização e ID da instância da cache usada para publicar o pedido. Este é o mesmo valor preenchido no campo jsonPayload.cacheId dos registos de pedidos da RFC na nuvem em Logging.
cdn_cache_status Estado atual da cache. Os valores podem ser hit, miss, revalidated, stale, uncacheable ou disabled para qualquer objeto servido por um back-end ativado para o Cloud CDN.
origin_request_header Reflete o valor do cabeçalho Origin no pedido para exemplos de utilização da partilha de recursos de origem cruzada (CORS).
client_rtt_msec Tempo de transmissão de ida e volta estimado entre o balanceador de carga e o cliente HTTP(S), em milissegundos. Este é o parâmetro de tempo de ida e volta suavizado (SRTT) medido pela pilha TCP do balanceador de carga, por RFC 2988. O RTT suavizado é um algoritmo que lida com variações e anomalias que podem ocorrer nas medições de RTT.
client_region O país (ou a região) associado ao endereço IP do cliente. Este é um código de região CLDR Unicode, como US ou FR. (Para a maioria dos países, estes códigos correspondem diretamente aos códigos ISO-3166-2.)
client_region_subdivision Subdivisão, por exemplo, uma província ou um estado, do país associado ao endereço IP do cliente. É um ID de subdivisão CLDR Unicode, como USCA ou CAON. (Estes códigos Unicode são derivados das subdivisões definidas pela norma ISO-3166-2.)
client_city Nome da cidade de origem do pedido, por exemplo, Mountain View para Mountain View, Califórnia. Não existe uma lista canónica de valores válidos para esta variável. Os nomes das cidades podem conter letras US-ASCII, números, espaços e os seguintes carateres: !#$%&'*+-.^_`|~.
client_city_lat_long Latitude e longitude da cidade de onde o pedido foi originado, por exemplo, 37.386051,-122.083851 para um pedido de Mountain View.
client_ip_address O endereço IP do cliente. Normalmente, é o mesmo que o endereço IP do cliente, que é o penúltimo endereço no cabeçalho X-Forwarded-For, a menos que o cliente esteja a usar um proxy ou o cabeçalho X-Forwarded-For tenha sido adulterado.
client_port A porta de origem do cliente.
client_encrypted true se a ligação entre o cliente e o balanceador de carga estiver encriptada (através de HTTPS, HTTP/2 ou HTTP/3); caso contrário, false.
client_protocol O protocolo HTTP usado para comunicação entre o cliente e o balanceador de carga. Uma das seguintes opções: HTTP/1.0, HTTP/1.1, HTTP/2 ou HTTP/3.
device_request_type

O dispositivo do cliente, derivado dos valores do cabeçalho User-Agent.

Seguem-se os valores possíveis: DESKTOP, GAME_CONSOLE, GAME_CONSOLE, MOBILE, SET_TOP_BOX, SMART_SPEAKER, SMART_TV, TABLET, UNDETERMINED, WEARABLE.

server_ip_address O endereço IP do balanceador de carga ao qual o cliente se liga. Isto pode ser útil quando vários equilibradores de carga partilham back-ends comuns. Isto é o mesmo que o último endereço IP no cabeçalho X-Forwarded-For.
server_port O número da porta de destino ao qual o cliente se liga.
tls_sni_hostname Indicação do nome do servidor (conforme definido na RFC 6066), se fornecida pelo cliente durante o handshake do TLS ou QUIC. O nome de anfitrião é convertido em minúsculas e todos os pontos finais são removidos.
tls_version Versão do TLS negociada entre o cliente e o balanceador de carga durante o handshake SSL. Os valores possíveis incluem: TLSv1, TLSv1.1, TLSv1.2 e TLSv1.3. Se o cliente se ligar através do QUIC em vez do TLS, o valor é QUIC.
tls_cipher_suite Conjunto de cifras negociado durante o handshake TLS. O valor é composto por quatro dígitos hexadecimais definidos pelo IANA TLS Cipher Suite Registry, por exemplo, 009C para TLS_RSA_WITH_AES_128_GCM_SHA256. Este valor está vazio para QUIC e para ligações de clientes não encriptadas.
tls_ja3_fingerprint JA3 Impressão digital TLS/SSL se o cliente se ligar através de HTTPS, HTTP/2 ou HTTP/3.
tls_ja4_fingerprint JA4 Impressão digital TLS/SSL se o cliente se ligar através de HTTPS, HTTP/2 ou HTTP/3.
user_agent_family

O tipo de navegador do cliente, derivado dos valores do cabeçalho User-Agent.

Seguem-se os valores possíveis: APPLE, APPLEWEBKIT, BLACKBERRY, DOCOMO, GECKO, GOOGLE, KHTML, KOREAN, MICROSOFT, MSIE, NETFRONT, NOKIA, OBIGO, OPERA, OPENWAVE, OTHER, POLARIS, SEMC, SMIT, TELECA, USER_DEFINED.

O equilibrador de carga expande as variáveis para strings vazias quando não consegue determinar os respetivos valores. Por exemplo:

  • Variáveis de localização geográfica quando a localização do endereço IP é desconhecida
  • Parâmetros TLS quando o TLS não está em utilização
  • O {origin_request_header} quando o pedido não inclui um cabeçalho Origin
  • O cabeçalho {cdn_cache_status} quando incluído num cabeçalho de pedido

Os valores geográficos (regiões, subdivisões e cidades) são estimativas baseadas no endereço IP do cliente. Periodicamente, a Google atualiza os dados que fornecem estes valores para melhorar a precisão e refletir alterações geográficas e políticas. Mesmo que o cabeçalho X-Forwarded-For original contenha informações de localização válidas, a Google estima as localizações dos clientes através das informações do endereço IP de origem contidas nos pacotes recebidos pelo equilibrador de carga.

Os cabeçalhos adicionados pelo equilibrador de carga substituem os cabeçalhos existentes com o mesmo nome. Os nomes dos cabeçalhos não são sensíveis a maiúsculas e minúsculas. Quando os nomes dos cabeçalhos são transmitidos a um back-end HTTP/2, o protocolo HTTP/2 codifica os nomes dos cabeçalhos em letras minúsculas.

Nos valores dos cabeçalhos, os espaços em branco à esquerda e à direita são insignificantes e não são transmitidos ao back-end. Para permitir chavetas nos valores dos cabeçalhos, o equilibrador de carga interpreta duas chavetas de abertura ({{) como uma única chaveta de abertura ({) e duas chavetas de fecho (}}) como uma única chaveta de fecho (}).

Cabeçalhos personalizados do TLS mútuo

As seguintes variáveis de cabeçalho adicionais estão disponíveis se o TLS mútuo (mTLS) estiver configurado no TargetHttpsProxy do balanceador de carga.

Variável Descrição
client_cert_present true se o cliente tiver fornecido um certificado durante o handshake TLS; caso contrário, false.
client_cert_chain_verified true se a cadeia de certificados de cliente for validada em relação a um TrustStore configurado; caso contrário, false.
client_cert_error Strings predefinidas que representam as condições de erro. Para mais informações sobre as strings de erro, consulte os modos de validação do cliente mTLS.
client_cert_sha256_fingerprint Impressão digital SHA-256 codificada em Base64 do certificado do cliente.
client_cert_serial_number O número de série do certificado de cliente. Se o número de série tiver mais de 50 bytes, o elemento client_cert_error é definido como client_cert_serial_number_exceeded_size_limit e o número de série é definido como uma string vazia.
client_cert_spiffe_id

O ID SPIFFE do campo de nome alternativo de assunto (SAN). Se o valor não for válido ou exceder 2048 bytes, o ID SPIFFE é definido como uma string vazia.

Se o ID SPIFFE tiver mais de 2048 bytes, o valor de client_cert_error é definido como client_cert_spiffe_id_exceeded_size_limit.

client_cert_uri_sans

Lista separada por vírgulas codificada em Base64 das extensões SAN do tipo URI. As extensões SAN são extraídas do certificado de cliente. O SPIFFE ID não está incluído no campo client_cert_uri_sans.

Se o client_cert_uri_sans tiver mais de 512 bytes, o client_cert_error é definido como client_cert_uri_sans_exceeded_size_limit e a lista separada por vírgulas é definida como uma string vazia.

client_cert_dnsname_sans

Lista codificada em Base64 separada por vírgulas das extensões SAN do tipo DNSName. As extensões SAN são extraídas do certificado de cliente.

Se o client_cert_dnsname_sans tiver mais de 512 bytes, o client_cert_error é definido como client_cert_dnsname_sans_exceeded_size_limit e a lista separada por vírgulas é definida como uma string vazia.

client_cert_valid_not_before Data/hora (RFC 3339 formato de string de data) antes da qual o certificado de cliente não é válido. Por exemplo, 2022-07-01T18:05:09+00:00.
client_cert_valid_not_after Data/hora (RFC 3339 formato de string de data) após a qual o certificado de cliente não é válido. Por exemplo, 2022-07-01T18:05:09+00:00.
client_cert_issuer_dn

Codificação DER codificada em Base64 do campo Issuer completo do certificado.

Se client_cert_issuer_dn tiver mais de 512 bytes, a string client_cert_issuer_dn_exceeded_size_limit é adicionada a client_cert_error e client_cert_issuer_dn é definida como uma string vazia.

client_cert_subject_dn

Codificação DER codificada em Base64 do campo Subject completo do certificado.

Se o client_cert_subject_dn tiver mais de 512 bytes, a string client_cert_subject_dn_exceeded_size_limit é adicionada a client_cert_error e client_cert_subject_dn é definida como uma string vazia.

client_cert_leaf

O certificado de folha do cliente para uma ligação mTLS estabelecida em que o certificado passou na validação. A codificação de certificados está em conformidade com a norma RFC 9440. Isto significa que o certificado DER binário é codificado com Base64 e delimitado com dois pontos de cada lado.

Se client_cert_leaf exceder 16 KB sem codificação, a string client_cert_validated_leaf_exceeded_size_limit é adicionada a client_cert_error e client_cert_leaf é definida como uma string vazia.

client_cert_chain

A lista de certificados delimitada por vírgulas, na ordem TLS padrão, da cadeia de certificados de cliente para uma ligação mTLS estabelecida em que o certificado de cliente passou na validação, não incluindo o certificado principal. A codificação de certificados está em conformidade com a norma RFC 9440.

Se o tamanho combinado de client_cert_leaf e client_cert_chain antes da codificação Base64 exceder 16 KB, a string client_cert_validated_chain_exceeded_size_limit é adicionada a client_cert_error e client_cert_chain é definida como uma string vazia.

Configure cabeçalhos de pedidos personalizados

Consola

Para adicionar cabeçalhos de pedidos personalizados a um serviço de back-end existente:

  1. Aceda à página de resumo do equilíbrio de carga.
    Aceda à página Balanceamento de carga
  2. Clique em Back-ends.
  3. Clique no nome de um serviço de back-end.
  4. Clique em Editar .
  5. Clique em Configurações avançadas (afinidade de sessão, tempo limite de esgotamento de ligações, políticas de segurança).
  6. Em Cabeçalhos de pedidos personalizados, clique em Adicionar cabeçalho.
  7. Introduza o Nome do cabeçalho e o Valor do cabeçalho para o cabeçalho do pedido personalizado.
  8. Introduza quaisquer cabeçalhos de pedidos personalizados adicionais.
  9. Clique em Guardar.

Para remover um cabeçalho de pedido personalizado de um serviço de back-end:

  1. Aceda à página de resumo do equilíbrio de carga.
    Aceda à página Balanceamento de carga
  2. Clique em Back-ends.
  3. Clique no nome de um serviço de back-end.
  4. Clique em Editar .
  5. Clique em Configurações avançadas (afinidade de sessão, tempo limite de esgotamento de ligações, políticas de segurança).
  6. Clique no X junto ao nome do cabeçalho de pedido personalizado que quer remover.
  7. Clique em Guardar.

gcloud

Para especificar cabeçalhos de pedidos personalizados, use o comando gcloud compute backend-services create ou gcloud compute backend-services update com a flag --custom-request-header.

Para criar um serviço de back-end com cabeçalhos de pedidos personalizados:

gcloud compute backend-services create BACKEND_SERVICE_NAME \
    --global-health-checks \
    --global \
    --protocol HTTPS \
    --health-checks https-basic-check \
    --custom-request-header='HEADER_NAME:[HEADER_VALUE]'

Para adicionar mais cabeçalhos de pedidos, especifique um nome e um valor de cabeçalho únicos repetindo a flag --custom-request-header.

Para adicionar cabeçalhos personalizados a um serviço de back-end existente:

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --global \
    --custom-request-header='HEADER_1_NAME:[HEADER_1_VALUE]' \
    --custom-request-header='HEADER_2_NAME:[HEADER_2_VALUE]'

O passo anterior substitui todos os cabeçalhos já existentes no serviço de back-end pelos cabeçalhos de pedidos que especificar no comando.

Para remover todos os cabeçalhos de um serviço de back-end:

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --global \
    --no-custom-request-headers

API

Faça um pedido PATCH para o método backendServices.patch:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME
"customRequestHeaders": [
   "client_city:Mountain View"
]

Terraform

Para um script do Terraform que cria um balanceador de carga com cabeçalhos personalizados, consulte os exemplos do Terraform para balanceadores de carga de aplicações externos globais.

Configure cabeçalhos das respostas personalizados

Consola

Para adicionar cabeçalhos de resposta personalizados a um serviço de back-end existente:

  1. Aceda à página de resumo do equilíbrio de carga.
    Aceda à página Balanceamento de carga
  2. Clique em Back-ends.
  3. Clique no nome de um serviço de back-end.
  4. Clique em Editar .
  5. Clique em Configurações avançadas (afinidade de sessão, tempo limite de esgotamento de ligações, políticas de segurança).
  6. Em Cabeçalhos de resposta personalizados, clique em Adicionar cabeçalho.
  7. Introduza o Nome do cabeçalho e o Valor do cabeçalho para o cabeçalho da resposta personalizada.
  8. Introduza cabeçalhos de resposta personalizados adicionais.
  9. Clique em Guardar.

Para remover um cabeçalho de resposta personalizado de um serviço de back-end:

  1. Aceda à página de resumo do equilíbrio de carga.
    Aceda à página Balanceamento de carga
  2. Clique em Back-ends.
  3. Clique no nome de um serviço de back-end.
  4. Clique em Editar .
  5. Clique em Configurações avançadas (afinidade de sessão, tempo limite de esgotamento de ligações, políticas de segurança).
  6. Clique no X junto ao nome do cabeçalho de resposta personalizado que quer remover.
  7. Clique em Guardar.

gcloud

Para serviços de back-end, use o comando gcloud compute backend-services create ou gcloud compute backend-services update com a flag --custom-response-header.

Para buckets de back-end, use o comando gcloud compute backend-buckets create ou gcloud compute backend-buckets update com a flag --custom-response-header.

gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --custom-response-header='HEADER_NAME:[HEADER_VALUE]'
gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --custom-response-header='HEADER_NAME:[HEADER_VALUE]'

Exemplo com o cabeçalho X-Frame-Options:

gcloud compute backend-buckets update gaming-lab \
    --custom-response-header='X-Frame-Options: DENY'

Exemplo com o cabeçalho Strict-Transport-Security:

O exemplo seguinte mostra como adicionar um cabeçalho de resposta personalizado para suportar a HTTP Strict Transport Security (HSTS):

gcloud compute backend-services update customer-bs-name \
    --global \
    --custom-response-header='Strict-Transport-Security: max-age=63072000'

API

Para contentores de back-end, use a chamada da API Method: backendBuckets.insert ou Method: backendBuckets.update.

Para serviços de back-end, use a chamada da API Method: backendServices.insert ou Method: backendServices.update.

Use uma das seguintes chamadas da API:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets

PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET_NAME

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices

PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME

Adicione o seguinte fragmento ao corpo do pedido JSON:

"customResponseHeaders":HEADER_NAME:[HEADER_VALUE]

Terraform

Para um script do Terraform que cria um balanceador de carga com cabeçalhos personalizados, consulte os exemplos do Terraform para balanceadores de carga de aplicações externos globais.

Defina cabeçalhos de resposta para o Cloud Storage

Se precisar de definir cabeçalhos HTTP em respostas do armazenamento na nuvem, como cabeçalhos de política de recursos de origem cruzada, X-Frame-Options ou X-XSS-Protection, oGoogle Cloud oferece a opção de usar cabeçalhos personalizados para a RFC do Google Cloud com o armazenamento na nuvem. Pode fazê-lo configurando cabeçalhos personalizados ao nível do contentor de back-end do equilibrador de carga, conforme descrito nesta página.

Os cabeçalhos de resposta personalizados configurados ao nível do depósito de back-end só são adicionados às respostas se o pedido do cliente for enviado para o endereço IP do equilibrador de carga. Os cabeçalhos personalizados não são adicionados às respostas se o pedido do cliente tiver sido feito diretamente à API Cloud Storage.

Use cabeçalhos personalizados com o Google Cloud Armor

Quando configura uma política de segurança do Cloud Armor, pode configurar o Cloud Armor para inserir um cabeçalho e um valor personalizados. Se a sua política de segurança do Cloud Armor estiver configurada para inserir o mesmo nome do cabeçalho personalizado que os cabeçalhos personalizados do Application Load Balancer externo global ou do Application Load Balancer clássico, o valor do cabeçalho especificado na sua política de segurança do Cloud Armor é substituído pelo valor preenchido pelo equilibrador de carga. Se não quiser que a política do Cloud Armor seja substituída, certifique-se de que não usa o mesmo nome.

Limitações

As seguintes limitações aplicam-se aos cabeçalhos personalizados usados com balanceadores de carga globais:

  • O tamanho total de todos os cabeçalhos de pedidos personalizados (nome e valor combinados, antes da expansão de variáveis) para cada serviço de back-end não pode exceder 8 KB ou 16 cabeçalhos de pedidos.
  • O tamanho total de todos os cabeçalhos de resposta personalizados (nome e valor combinados, antes da expansão de variáveis) para cada serviço de back-end não pode exceder 8 KB ou 16 cabeçalhos de resposta.

O que se segue?