tcp 侦听器
TCP 侦听器配置 Vault 侦听的 TCP 地址/端口:
listener "tcp" {
address = "127.0.0.1:8200"
}
listener 配置节可以设定多次使得 Vault 可以在多个接口上进行侦听。如果我们配置了多个侦听器,那么我们也必须设定 api_addr 和 cluster_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_timeoutstring: "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_behavior为use_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"