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_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_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"