

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 适用于应用程序负载均衡器的 HTTP 标头修改
<a name="header-modification"></a>

应用程序负载均衡器的请求标头和响应标头都支持 HTTP 标头修改。无需更新应用程序代码，通过标头修改即可更好地控制应用程序的流量和安全性。

要启用标头修改功能，请参阅[启用标头修改](enable-header-modification.md)。

## 重命名 mTLS/TLS 标题
<a name="rename-header"></a>

借助标头重命名功能，您可以配置由应用程序负载均衡器生成并添加到请求中的 mTLS 和 TLS 标头名称。

这种 HTTP 标头修改功能可让应用程序负载均衡器轻松支持使用特殊格式请求标头和响应标头的应用程序。


| 标题 | 说明 | 
| --- | --- | 
|  X-Amzn-Mtls-Clientcert-Serial-Number  |  确保目标能够识别和验证客户端在 TLS 握手期间提供的特定证书。  | 
|  X-Amzn-Mtls-Clientcert-Issuer  |  通过识别颁发证书的证书颁发机构，帮助目标对客户端证书进行验证和确认身份。  | 
|  X-Amzn-Mtls-Clientcert-Subject  |  向目标提供有关向其颁发客户端证书的实体的详细信息，有助于在 mTLS 身份验证期间进行识别、身份验证、授权和记录。  | 
|  X-Amzn-Mtls-Clientcert-Validity  |  允许目标验证正在使用的客户端证书是否在既定有效期内，确保证书没有过期或过早使用。  | 
|  X-Amzn-Mtls-Clientcert-Leaf  |  提供 mTLS 握手中使用的客户端证书，以方便服务器对客户端进行身份验证并验证证书链。这样可以确保连接安全且得到授权。  | 
|  X-Amzn-Mtls-Clientcert  |  携带完整的客户端证书。方便目标在 mTLS 握手过程中验证证书的真实性、验证证书链并对客户端进行身份验证。  | 
|  X-Amzn-TLS-Version  |  指示用于连接的 TLS 协议版本。有助于确定通信的安全性水平、解决连接问题和确保合规性。  | 
|  X-Amzn-TLS-Cipher-Suite  |  指示用于保护 TLS 中连接的加密算法组合。这使服务器能够评估连接的安全性，帮助排查兼容性问题，以及确保遵守安全策略。  | 

## 添加响应标头
<a name="insert-header"></a>

通过使用插入标头，您可以将应用程序负载均衡器配置为在响应中添加与安全相关的标头。借助这些属性，您可以插入包括 HSTS、CORS 和 CSP 在内的各种标头。

默认情况下，这些标头为空。发生这种情况时，应用程序负载均衡器不会修改此响应标头。

启用某个响应标头时，应用程序负载均衡器会将具有所配置值的标头添加到所有响应中。如果来自目标的响应包含 HTTP 响应标头，则负载均衡器会将标头值更新为配置的值。否则，负载均衡器会将 HTTP 响应标头添加到具有所配置值的响应中。


| 标题 | 说明 | 
| --- | --- | 
|  Strict-Transport-Security  |  在指定时间内通过浏览器强制执行仅限 HTTPS 的连接，这有助于防范攻 man-in-the-middle击、协议降级和用户错误。确保客户端和目标之间的所有通信都经过加密。  | 
|  Access-Control-Allow-Origin  |  控制是否可以从不同的源访问目标上的资源。这有助于实现安全的跨源交互，同时防止未经授权的访问。  | 
|  Access-Control-Allow-Methods  |  指定向目标发出跨源请求时允许的 HTTP 方法。用于控制可从不同源执行的操作。  | 
|  Access-Control-Allow-Headers  |  指定跨源请求中可以包含的自定义标头或非简单标头。此标头让目标可以控制来自不同源的客户端可以发送的标头。  | 
|  Access-Control-Allow-Credentials  |  指定客户端是否应在跨源请求中包含诸如 Cookie、HTTP 身份验证或客户端证书之类的凭证。  | 
|  Access-Control-Expose-Headers  |  允许目标指定客户端可以在跨源请求中访问的其他响应标头。  | 
|  Access-Control-Max-Age  |  定义浏览器可以缓存预检请求结果缓存的时长，从而减少重复预检的需要。这可以减少某些跨源请求所需的 OPTIONS 请求数量，从而有助于优化性能。  | 
|  Content-Security-Policy  |  一种通过控制网站可以加载和执行脚本、样式、图像等资源，来防止 XSS 等代码注入攻击的安全功能。  | 
|  X-Content-Type-Options  |  使用 no-sniff 指令来防止浏览器猜测资源的 MIME 类型，从而增强 Web 安全性。可确保浏览器仅根据声明的 Content-Type 来解释内容  | 
|  X-Frame-Options  |  一种通过控制是否可以将网页嵌入到框架中，从而帮助防止点击劫持攻击的标头安全机制。诸如 DENY 和 SAMEORIGIN 之类的值可以确保内容不会嵌入到恶意或不可信网站上。  | 

## 禁用标头
<a name="disable-header"></a>

借助禁用标头功能，您可以将应用程序负载均衡器配置为禁用响应中的 `server:awselb/2.0` 标头。这可以减少服务器特定信息的泄露，同时为应用程序提供额外的保护层。

属性名称为 `routing.http.response.server.enabled`。可用值为 `true` 或 `false`。默认值为 `true`。

## 限制
<a name="header-modification-limits"></a>
+ 标头值可包含以下字符
  + 字母数字字符：`a-z`、`A-Z` 和 `0-9`
  + 特殊字符：`_ :;.,\/'?!(){}[]@<>=-+*#&`|~^%`
+ 该属性的值大小不能超过 1K 字节。
+ 弹性负载均衡会执行基本的输入验证来确认标头值是否有效。但是，验证无法确认特定的标头是否支持该值。
+ 为任何属性设置空值都将导致应用程序负载均衡器还原默认行为。

# 为应用程序负载均衡器启用 HTTP 标头修改
<a name="enable-header-modification"></a>

默认情况下，标头修改功能处于关闭状态，必须在每个侦听器上启用。有关更多信息，请参阅 [HTTP 标头修改](header-modification.md)。

------
#### [ Console ]

**启用标头修改**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择该应用程序负载均衡器。

1. 在**侦听器和规则**选项卡上，选择协议和端口，从而打开侦听器的详细信息页面。

1. 在 **Attributes**（属性）选项卡上，选择 **Edit**（编辑）。

   侦听器属性分为若干组。您需要选择要启用的功能。

1. [HTTPS 侦听器] **可修改 mTLS/TLS **的标头名称

   1. 展开**可修改的 mTLS/TLS 标题名称**。

   1. 启用要修改的请求标头并提供标头的名称。有关更多信息，请参阅 [重命名 mTLS/TLS 标题](header-modification.md#rename-header)。

1. **添加响应标头**

   1. 展开**添加响应标头**。

   1. 启用要添加的响应标头并提供标头的值。有关更多信息，请参阅 [添加响应标头](header-modification.md#insert-header)。

1. **ALB 服务器响应标头**

   1. 启用或禁用**服务器标头**。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

**启用标头修改**  
使用 [modify-listener-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-listener-attributes.html) 命令。要查看属性列表，请参阅[标头修改属性](#header-modification-attributes)。

```
aws elbv2 modify-listener-attributes \
    --listener-arn listener-arn \
    --attributes "Key=attribute-name,Value=attribute-value"
```

------
#### [ CloudFormation ]

**启用标头修改**  
更新[AWS::ElasticLoadBalancingV2::Listener](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html)资源以包含属性。要查看属性列表，请参阅[标头修改属性](#header-modification-attributes)。

```
Resources:
  myHTTPlistener:
  Type: 'AWS::ElasticLoadBalancingV2::Listener'
  Properties:
    LoadBalancerArn: !Ref myLoadBalancer
    Protocol: HTTP
    Port: 80
    DefaultActions:
      - Type: "forward"
        TargetGroupArn: !Ref myTargetGroup
    ListenerAttributes:
      - Key: "attribute-name"
        Value: "attribute-value"
```

------

## 标头修改属性
<a name="header-modification-attributes"></a>

以下为应用程序负载均衡器支持的标头修改属性。

`routing.http.request.x_amzn_mtls_clientcert_serial_number.header_name`  
修改 **X-Amzn-Mtls-Clientcert-Serial-Number** 的标头名称。

`routing.http.request.x_amzn_mtls_clientcert_issuer.header_name`  
修改 **X-Amzn-Mtls-Clientcert-Issuer** 的标头名称。

`routing.http.request.x_amzn_mtls_clientcert_subject.header_name`  
修改 **X-Amzn-Mtls-Clientcert-Subject** 的标头名称。

`routing.http.request.x_amzn_mtls_clientcert_validity.header_name`  
修改 **X-Amzn-Mtls-Clientcert-Validity** 的标头名称。

`routing.http.request.x_amzn_mtls_clientcert_leaf.header_name`  
修改 **X-Amzn-Mtls-Clientcert-Leaf** 的标头名称。

`routing.http.request.x_amzn_mtls_clientcert.header_name`  
修改 **X-Amzn-Mtls-Clientcert** 的标头名称。

`routing.http.request.x_amzn_tls_version.header_name`  
修改 **X-Amzn-Tls-Version** 的标头名称。

`routing.http.request.x_amzn_tls_cipher_suite.header_name`  
修改 **X-Amzn-Tls-Cipher-Suite** 的标头名称。

`routing.http.response.server.enabled`  
指示是否允许或移除 HTTP 响应服务器标头。

`routing.http.response.strict_transport_security.header_value`  
添加 **Strict-Transport-Security** 标头，以告知浏览器只能使用 HTTPS 访问该网站，并且将来任何使用 HTTP 访问该网站的尝试都应自动转换为 HTTPS。

`routing.http.response.access_control_allow_origin.header_value`  
添加 **Access-Control-Allow-Origin** 标头，以指定允许访问服务器的源。

`routing.http.response.access_control_allow_methods.header_value`  
添加 **Access-Control-Allow-Methods** 标头，以指定从其他源访问服务器时允许使用的 HTTP 方法。

`routing.http.response.access_control_allow_headers.header_value`  
添加 **Access-Control-Allow-Headers** 标头，以指定在跨源请求期间允许使用的标头。

`routing.http.response.access_control_allow_credentials.header_value`  
添加 **Access-Control-Allow-Credentials** 标头，以指示浏览器是否应在跨源请求中包含诸如 Cookie 或身份验证之类的凭证。

`routing.http.response.access_control_expose_headers.header_value`  
添加 **Access-Control-Expose-Headers** 标头，以指示浏览器可以向发出请求的客户端公开的标头。

`routing.http.response.access_control_max_age.header_value`  
添加 **Access-Control-Max-Age** 标头，以指定预检请求的结果可以缓存的时长（以秒为单位）。

`routing.http.response.content_security_policy.header_value`  
添加 **Content-Security-Policy** 标头，以指定浏览器为了帮助减少某些类型安全威胁的风险而强制实施的限制。

`routing.http.response.x_content_type_options.header_value`  
添加 **X-Content-Type-Options** 标头，以指示是否应遵循 **Content-Type** 标头中公开的 MIME 类型，而不应进行更改。

`routing.http.response.x_frame_options.header_value`  
添加 **X-Frame-Options** 标头，以指示是否允许浏览器在 **frame**、**iframe**、**embed** 或 **object** 中呈现页面。