tcp 侦听器

TCP 侦听器配置 Vault 侦听的 TCP 地址/端口:

listener "tcp" {
  address = "127.0.0.1:8200"
}

listener 配置节可以设定多次使得 Vault 可以在多个接口上进行侦听。如果我们配置了多个侦听器,那么我们也必须设定 api_addrcluster_addr 使得 Vault 可以传播正确的地址给其他节点。

侦听器的自定义响应标头

从 1.9 版开始,Vault 支持为根路径 (/) 以及 API 端点 (/v1/*) 定义自定义 HTTP 响应标头。标头是根据返回的状态代码定义的。例如,用户可以为 200 状态代码定义一组自定义响应标头,并为 307 状态代码定义另一组自定义响应标头。有一个 "/sys/config/ui" API 端点允许用户设置 UI 特定的自定义标头。如果在配置文件中配置了标头,则不允许通过 "/sys/config/ui" API 端点重新配置。在需要修改自定义标头或需要移除自定义标头的时,需要修改相应的 Vault 配置文件,并且需要向 Vault 进程发送 SIGHUP 信号。

如果在配置文件中定义了一个标头,并且 Vault 的内部进程使用了​​相同的 header,则不接受配置的标头。例如,具有 X-Vault- 前缀的自定义标头将不会被接受。启动时将在 Vault 的日志中记录一条消息,表明不接受带有 X-Vault- 前缀的标头。

优先级顺序

如果在配置文件和 "/sys/config/ui" API 端点中配置了相同的标头,则配置文件中的标头优先。例如,在 "/sys/config/ui" API 端点中定义了 "Content-Security-Policy" 标头,并且在配置文件中也定义了该标头,则在响应标头中设置配置文件中的值,而不是 "/sys/config/ui" API 端点中的值。

tcp 侦听器参数

  • address (string: "127.0.0.1:8200") – 设置要绑定的侦听地址。该值可以使用 go-sockaddr template 定义成动态值,运行时解析实际地址。
  • cluster_address (string: "127.0.0.1:8201") – 设置要绑定到集群服务器对服务器请求的地址。该端口号默认为比 address 值高 1。通常不需要设置该参数,但在 Vault 服务器相互隔离的情况下很有用,那时它们需要通过 TCP 负载均衡器或其他一些方案进行通信。该值可以使用 go-sockaddr template 定义成动态值,运行时解析实际地址。
  • http_idle_timeout (string: "5m") - 设置启用连接 keep-alives 时等待下一个请求的最长时间。如果 http_idle_timeout 为零,则使用 http_read_timeout 的值。如果两者都为零,则使用 http_read_header_timeout 的值。该参数的值需要是后缀为 "30s""1h" 的字符串。
  • http_read_header_timeout (string: "10s") - 设置允许读取请求标头的时间。该参数的值需要是后缀为 "30s""1h" 的字符串。
  • http_read_timeout (string: "30s") - 设置允许读取整个请求,包括 body 的时间。该参数的值需要是后缀为 "30s""1h" 的字符串。
  • http_write_timeout string: "0") - 设置允许对响应进行写入的最大持续时间,该值会在读取新请求的标头时重置。默认值 "0" 表示无穷大。该参数的值需要是后缀为 "30s""1h" 的字符串。
  • max_request_size (int: 33554432) – 设置请求的最大尺寸限制,以字节计。默认为 32 MB(如果没有设置或是设置为 0)。为该值设置一个小于 0 的数字将完全关闭限制。
  • max_request_duration (string: "90s") – 设置 Vault 取消请求前允许的最大时间。该值将覆盖本节的 default_max_request_duration 配置。
  • proxy_protocol_behavior (string: "") – 如果设置该参数,将为本侦听器启用 PROXY 协议版本 1 行为。可以配置的值有:
    • use_always - 始终使用 client IP 地址(理解为使用 LB 等中间代理的地址)
    • allow_authorized - 如果源 IP 地址在 proxy_protocol_authorized_addrs 列表中,那么就使用 client IP;如果源 IP 不在该列表中,那么使用源 IP
    • deny_unauthorized - 如果源 IP 地址不在 proxy_protocol_authorized_addrs 列表中则拒绝连接
  • proxy_protocol_authorized_addrs (string: <required-if-enabled> or array: <required-if-enabled> ) – 设定允许使用 PROXY 协议的源 IP 地址列表。如果 proxy_protocol_behavioruse_always 那么不需要设置该参数。源 IP 应该以逗号分隔的字符串形式给定。至少需要设置一个源 IP,proxy_protocol_authorized_addrs 不可以是空字符串或是空列表。
  • tls_disable (string: "false") – 是否禁用 TLS。 Vault 默认启用 TLS,因此必须明确禁用 TLS 才能选择使用不安全的通信。
  • tls_cert_file (string: <required-if-enabled>, reloads-on-SIGHUP) – 指定 TLS 证书的路径。证书文件必须是一个 PEM 编码的文件。要将侦听器配置为使用 CA 证书,请将主证书和 CA 证书拼接在一起。主证书应首先出现在拼接后的文件中。收到 SIGHUP 消息时, Vault 将使用该路径重新加载证书;在 Vault 运行时修改此值对 SIGHUP 无效。
  • tls_key_file (string: <required-if-enabled>, reloads-on-SIGHUP) – 指定证书私钥的路径。私钥文件必须是一个 PEM 编码的文件。如果密钥文件有密码保护,系统会在服务启动时提示输入密码。使用 SIGHUP 信号重新加载配置时,密钥文件的密码必须保持不变。收到 SIGHUP 消息时, Vault 将使用该路径重新加载证书;在 Vault 运行时修改此值对 SIGHUP 无效。
  • tls_min_version (string: "tls12") – 设置支持的 TLS 的最低版本。可以配置的值有:"tls10"、"tls11"、"tls12"或者"tls13" 警告: TLS 1.1 及更低版本被认为是不安全的。
  • tls_cipher_suites (string: "") – 设置支持的 ciphersuites,该值是一个是用逗号分隔的列表,可以在 Golang TLS 文档中查询所有可用的 ciphersuites。 注意,Go 只针对 TLSv1.2 及更早版本参考此列表;密码的顺序并不重要。要使此参数生效,必须将 tls_max_version 属性设置为 tls12 以防止协商使用 TLSv1.3,我们不推荐这样做。有关更多信息,请参阅 Go 博客文章
  • tls_prefer_server_cipher_suites (string: "false") – 设置服务器的 ciphersuite 覆盖客户端的 ciphersuite。 警告:该参数已经废弃,设置该参数没有任何作用。
  • tls_require_and_verify_client_cert (string: "false") – 为此侦听器开启对客户端的身份验证。开启后侦听器会要求客户端提供证书,然后使用系统 CA 证书进行验证。
  • tls_client_ca_file (string: "") – PEM 编码的 CA 证书文件,用来检查客户端的身份。
  • tls_disable_client_certs (string: "false") – 为此侦听器关闭对客户端的身份验证。默认情况(默认是 false)下 Vault 会在可用时请求客户端证书。
  • x_forwarded_for_authorized_addrs (string: <required-to-enable>) – 设置 X-Forwarded-For 标头中可信源 IP 地址的 CIDR,使用逗号分隔的列表或是 JSON 数组。这将开启 X-Forwarded-For 支持。
  • x_forwarded_for_hop_skips (string: "0") – 将从 X-Forwarded-For-Hop 尾部跳过的地址数。例如,对于 1.2.3.4,2.3.4.5,3.4.5.6,4.5.6.7 的标头值,如果此值设置为"1",则将用作原始客户端 IP 的地址为 3.4.5.6
  • x_forwarded_for_reject_not_authorized (string: "true") – 如果设置为 false,则如果来自未授权地址的连接中存在 X-Forwarded-For 标头,则该标头将被忽略并按原样使用客户端连接,而不是拒绝连接。
  • x_forwarded_for_reject_not_present (string: "true") – 如果设置为 false,则如果 X-Forwarded-For 标头不存在或为空,则将按原样使用客户端地址,而不是拒绝连接。

telemetry 参数

  • unauthenticated_metrics_access (bool: false) - 如果设置为 true,将允许未经身份验证的用户访问 /v1/sys/metrics 端点。

profiling 参数

  • unauthenticated_pprof_access (bool: false) - 如果设置为 true,将允许未经身份验证的用户访问 /v1/sys/pprof 端点。
  • unauthenticated_in_flight_request_access (bool: false) - 如果设置为 true,将允许未经身份验证的用户访问 /v1/sys/in-flight-req 端点。

custom_response_headers 参数

  • default (key-value-map: {}) - 一个标头名称到字符串值数组的映射,代表无论响应状态代码值是多少,都会在所有端点上设置的默认标头。
  • <specific status code> (key-value-map: {}) - 一个标头名称到字符串值数组的映射,只有在返回特定状态码的响应时设置这些标头。例如 "200" = {"Header-A": ["Value1", "Value2"]},当返回的 HTTP 响应状态吗为 "200" 时添加标头 "Header-A"
  • <collective status code> (key-value-map: {}) - 一个标头名称到字符串值数组的映射,只有在返回特定范围的状态码的响应时设置这些标头。例如 "2xx" = {"Header-A": ["Value1", "Value2"]},当返回的 HTTP 响应状态吗为 "200""204" 等时添加标头 "Header-A"

例子

配置 TLS

以下配置演示如何启用 TLS 侦听:

listener "tcp" {
  tls_cert_file = "/etc/certs/vault.crt"
  tls_key_file  = "/etc/certs/vault.key"
}

在多个接口上进行侦听

以下配置演示如何在多个接口上进行侦听,包括 localhost:

listener "tcp" {
  address = "127.0.0.1:8200"
}

listener "tcp" {
  address = "10.0.0.5:8200"
}

# Advertise the non-loopback interface
api_addr = "https://10.0.0.5:8200"
cluster_addr = "https://10.0.0.5:8201"

配置未经身份验证的用户访问 metrics 端点

以下配置演示如何允许未经身份验证的用户访问 metrics 端点:

listener "tcp" {
  telemetry {
    unauthenticated_metrics_access = true
  }
}

配置未经身份验证的用户访问 profiling 端点

以下配置演示如何允许未经身份验证的用户访问 profiling 端点:

listener "tcp" {
  profiling {
    unauthenticated_pprof_access = true
    unauthenticated_in_flight_request_access = true
  }
}

配置自定义 HTTP 响应标头

注意:此功能需要 Vault v1.9.0 及以上版本。该例子显示配置自定义 HTTP 响应标头。管理员可以在侦听器节中配置 "custom_response_headers" 子节,以设置适合其应用程序的自定义 HTTP 标头。本示例演示的是 "Strict-Transport-Security""Content-Security-Policy",它们是已知的 HTTP 标头,可以用来加强与 Vault 端点通信的应用程序的安全性。请注意,漏洞扫描通常会检查此类与安全相关的 HTTP 标头。此外,还可以配置应用程序特定的自定义标头。例如,在下面的示例中配置了 "X-Custom-Header"

listener "tcp" {
  custom_response_headers {
    "default" = {
      "Strict-Transport-Security" = ["max-age=31536000","includeSubDomains"],
      "Content-Security-Policy" = ["connect-src https://clusterA.vault.external/"],
      "X-Custom-Header" = ["Custom Header Default Value"],
    },
    "2xx" = {
      "Content-Security-Policy" = ["connect-src https://clusterB.vault.external/"],
      "X-Custom-Header" = ["Custom Header Value 1", "Custom Header Value 2"],
    },
    "301" = {
      "Strict-Transport-Security" = ["max-age=31536000"],
      “Content-Security-Policy" = ["connect-src https://clusterC.vault.external/"],
    },
  }
}

当一个标头在多个状态码配置节中被定义时,将返回与最具体的响应代码匹配的标头。例如,对于下面的配置示例,307 响应将返回 307 Custom header value,而 306 将返回 3xx Custom header value

listener "tcp" {
  custom_response_headers {
    "default" = {
       "X-Custom-Header" = ["default Custom header value"]
    },
    "3xx" = {
       "X-Custom-Header" = ["3xx Custom header value"]
    },
    "307" = {
       "X-Custom-Header" = ["307 Custom header value"]
    }
  }
}

侦听所有 IPv6 & IPv4 接口

该例子演示了 Vault 对所有 IPv6 & IPv4 接口启用侦听,包括 localhost:

listener "tcp" {
  address         = "[::]:8200"
  cluster_address = "[::]:8201"
}

侦听特定 IPv6 地址

该例子演示了如何让 Vault 仅使用 IPv6 并绑定到 IP 地址为 2001:1c04:90d:1c00:a00:27ff:fefa:58ec 的接口:

listener "tcp" {
  address         = "[2001:1c04:90d:1c00:a00:27ff:fefa:58ec]:8200"
  cluster_address = "[2001:1c04:90d:1c00:a00:27ff:fefa:58ec]:8201"
}

# Advertise the non-loopback interface
api_addr = "https://[2001:1c04:90d:1c00:a00:27ff:fefa:58ec]:8200"
cluster_addr = "https://[2001:1c04:90d:1c00:a00:27ff:fefa:58ec]:8201"

results matching ""

    No results matching ""