Security Model(安全模型)
Consul依靠轻量级gossip机制和RPC系统来提供各种功能。 这两个系统都有不同的安全机制,这些机制源于他们的设计。 但是,Consul的安全机制有一个共同的目标:提供机密性,完整性和身份验证。
八卦协议由Serf提供支持,Serf使用对称密钥或共享密钥密码系统。 这里有关于Serf安全性的更多细节。 有关如何在Consul中启用Serf的gossip加密的详细信息,请参阅此处的加密文档。
RPC系统支持使用端到端TLS和可选的客户端身份验证。 TLS是一种广泛部署的非对称密码系统,是Web安全的基础。
这意味着Consul通信可以防止窃听,篡改和欺骗。 这使得可以通过不受信任的网络(例如EC2和其他共享主机提供商)运行Consul。
»Secure Configuration(安全配置)
Consul威胁模型仅适用于Consul以安全配置运行的情况。 Consul不以默认安全配置运行。如果未启用以下任何设置,则此威胁模型的某些部分将无效。如下面部分所述,还必须对Consul威胁模型之外的项目采取额外的安全预防措施。
- 启用ACL默认拒绝访问。必须将Consul配置为使用具有白名单(默认拒绝)方法的ACL。这会强制所有请求具有显式匿名访问权限或提供ACL令牌。
- 加密已启用。必须启用并配置TCP和UDP加密,以防止Consul代理之间的明文通信。至少应启用verify_outgoing以验证每台具有唯一TLS证书的服务器的服务器真实性。还需要verify_server_hostname来防止受损代理作为服务器重新启动并被授予对所有机密的访问权限。
verify_incoming通过相互身份验证提供额外的代理验证,但并不是强制执行威胁模型所必需的,因为请求还必须包含有效的ACL令牌。细微之处在于,当前verify_incoming = false将允许服务器仍然接受来自客户端的未加密连接(以允许逐步推出TLS)。仅此一项并未违反威胁模型,但任何选择不使用TLS的配置错误的客户端都将违反该模型。我们建议将此设置为true。如果留下,则必须采取谨慎措施,以确保所有Consul客户端如上所述使用verify_outgoing = true,但所有外部API / UI访问必须通过HTTPS禁用HTTP监听器。
»Known Insecure Configurations(已知的不安全配置)
除了配置上述非默认设置外,Consul还有几个非默认选项,可能会带来额外的安全风险。
- 使用网络公开API启用脚本检查。如果Consul代理(客户端或服务器)将其HTTP API暴露给localhost之外的网络,则enable_script_checks必须为false,否则即使配置了ACL,脚本检查也会出现远程代码执行威胁。如果必须公开HTTP API并且可以从1.3.0开始提供,则enable_local_script_checks提供安全的替代方案。此功能也已反向移植到此处所述的修补程序版本0.9.4,1.1.1和1.2.4。
- 远程执行启用。 Consul包含一个consul exec功能,允许跨群集执行任意命令。默认情况下禁用此功能,从0.8.0版本开始。我们建议将其禁用。如果启用,则必须特别注意确保正确的ACL限制访问,例如,任何管理令牌都授予访问权以在群集上执行任意代码。
- 验证服务器主机名是否单独使用。从版本0.5.1到1.4.0,我们记录了verify_server_hostname是真的隐含的verify_outgoing但是由于一个错误,情况并非如此,因此只设置verify_server_hostname会导致客户端和服务器之间的明文通信。有关详细信息,请参阅CVE-2018-19653。这在1.4.1中得到修复。
»Threat Model(威胁模型)
以下是Consul威胁模型的部分内容:
领事代理与代理之间的沟通。 Consul代理之间的通信应该是安全的,不会被窃听。这需要在群集上启用传输加密,并涵盖TCP和UDP流量。
Consul agent-to-CA通信。 Consul服务器与Connect的已配置证书颁发机构提供程序之间的通信始终是加密的。
篡改传输中的数据。任何篡改都应该是可检测的,并导致Consul避免处理请求。
无需身份验证或授权即可访问数据。所有请求必须经过身份验证和授权。这要求在群集上使用默认拒绝模式启用ACL。
状态修改或恶意消息导致的损坏。丢失格式错误的消息,格式良好的消息需要身份验证和授权。
访问原始数据的非服务器成员。所有服务器必须加入群集(具有适当的身份验证和授权)才能开始参与Raft。Raft数据通过TLS传输。
针对节点的拒绝服务。对节点的DoS攻击不应该损害软件的安全立场。
基于连接的服务到服务通信。两个启用Connect的服务(本机或通过代理)之间的通信应该是安全的,不会被窃听并提供身份验证。这是通过相互TLS实现的。
以下不是Consul服务器代理的Consul威胁模型的一部分:
- 访问(读取或写入)Consul数据目录。所有Consul服务器(包括非领导者)都会将整个Consul状态保留在此目录中。数据包括所有KV,服务注册,ACL令牌,Connect CA配置等。对此目录的任何读取或写入都允许攻击者访问和篡改该数据。
- 访问(读取或写入)Consul配置目录。 Consul配置可以启用或禁用ACL系统,修改数据目录路径等。任何对此目录的读取或写入都允许攻击者重新配置Consul的许多方面。通过禁用ACL系统,这可能使攻击者可以访问所有Consul数据。
- 对正在运行的Consul服务器代理的内存访问。如果攻击者能够检查正在运行的Consul服务器代理的内存状态,则几乎所有Consul数据的机密性都可能会受到影响。如果您使用的是外部Connect CA,则根私钥材料永远不会对Consul流程可用,并且可以被认为是安全的。 Service Connect TLS证书应被视为已泄露;它们永远不会被服务器代理持久化,但至少在签名请求期间确实存在于内存中。
以下不是Consul服务器代理的Consul威胁模型的一部分:
- 访问(读取或写入)Consul数据目录。所有Consul服务器(包括非领导者)都会将整个Consul状态保留在此目录中。数据包括所有KV,服务注册,ACL令牌,Connect CA配置等。对此目录的任何读取或写入都允许攻击者访问和篡改该数据。
- 访问(读取或写入)Consul配置目录。 Consul配置可以启用或禁用ACL系统,修改数据目录路径等。任何对此目录的读取或写入都允许攻击者重新配置Consul的许多方面。通过禁用ACL系统,这可能使攻击者可以访问所有Consul数据。
- 对正在运行的Consul服务器代理的内存访问。如果攻击者能够检查正在运行的Consul服务器代理的内存状态,则几乎所有Consul数据的机密性都可能会受到影响。如果您使用的是外部Connect CA,则根私钥材料永远不会对Consul流程可用,并且可以被认为是安全的。 Service Connect TLS证书应被视为已泄露;它们永远不会被服务器代理持久化,但至少在签名请求期间确实存在于内存中。
以下不是Consul客户端代理的Consul威胁模型的一部分:
- 访问(读取或写入)Consul数据目录。 Consul客户端将使用数据目录来缓存本地状态。这包括本地服务,关联的ACL令牌,Connect TLS证书等。对此目录的读或写访问权限允许攻击者访问此数据。该数据通常是群集的完整数据的较小子集。
- 访问(读取或写入)Consul配置目录。 Consul客户端配置文件包含服务的地址和端口信息,代理的默认ACL令牌等。访问Consul配置可以使攻击者能够将服务端口更改为恶意端口,注册新服务等。此外,某些服务定义具有附加的ACL令牌,可以在群集范围内用于模拟该服务。攻击者无法更改群集范围的配置,例如禁用ACL系统。
- 对正在运行的Consul客户端代理的内存访问。其爆炸半径远小于服务器代理,但数据子集的机密性仍然可能受到损害。特别是,针对代理的API请求的任何数据(包括服务,KV和连接信息)可能会受到损害。如果代理从未请求服务器上的特定数据集,则它永远不会进入代理的内存,因为复制仅存在于服务器之间。攻击者还可能提取用于此代理上的服务注册的ACL令牌,因为令牌必须与注册的服务一起存储在内存中。
- 对本地Connect代理或服务的网络访问。服务和连接感知代理之间的通信通常是未加密的,必须通过可信网络进行。这通常是一个环回设备。这要求同一台机器上的其他进程受信任,或者使用更复杂的隔离机制,例如网络命名空间。这还要求外部进程无法与Connect服务或代理进行通信(入站端口除外)。因此,非本机Connect应用程序应仅绑定到非公共地址。
- 实施不当连接代理或服务。 Connect代理或本机集成服务必须相互关联
» External Threat Overview(外部威胁概述)
有四个组件会影响Consul威胁模型:服务器代理,客户端代理,Connect CA和Consul API客户端(包括Connect的代理)。
服务器代理通过Raft参与领导者选举和数据复制。与其他代理的所有通信都是加密的。数据以未加密的形式存储在已配置的数据目录中。存储的数据包括ACL令牌和TLS证书。如果内置CA与Connect一起使用,则根证书私钥也存储在磁盘上。外部CA提供程序不会将数据存储在此目录中。必须小心保护此数据目录,以防止攻击者冒充服务器或特定ACL用户。我们计划随着时间的推移将更多缓解措施(包括至少部分数据加密)引入数据目录,但数据目录应始终被视为机密。
要使客户端代理加入群集,它必须提供具有node:write功能的有效ACL令牌。连接请求和客户端与服务器代理之间的所有其他API请求都通过TLS进行通信。客户端为Consul API提供服务,并通过共享TLS连接将所有请求转发给服务器。每个请求都包含一个ACL令牌,用于身份验证和授权。不提供ACL令牌的请求将继承代理可配置的默认ACL令牌。
Connect CA提供程序负责存储用于签名和验证通过Connect建立的连接的根(或中间)证书的私钥。 Consul服务器代理通过加密方法与CA提供程序进行通信。此方法取决于正在使用的CA提供程序。 Consul提供了一个内置CA,可在服务器代理上本地执行所有操作。除内置CA外,Consul本身不存储任何私钥材料。
Consul API客户端(代理本身,内置UI,外部软件)必须通过TLS与Consul代理进行通信,并且必须为每个请求提供ACL令牌以进行身份验证和授权。
»Network Ports(网络端口)
有关配置网络规则以支持Consul的信息,请参阅Ports Used Consul使用的网络端口列表以及它们用于哪些功能的详细信息。
ports
This is a nested object that allows setting the bind ports for the following keys:
dns
- The DNS server, -1 to disable. Default 8600.http
- The HTTP API, -1 to disable. Default 8500.https
- The HTTPS API, -1 to disable. Default -1 (disabled). We recommend using8501
forhttps
by convention as some tooling will work automatically with this.grpc
- The gRPC API, -1 to disable. Default -1 (disabled). We recommend using8502
forgrpc
by convention as some tooling will work automatically with this. This is set to8502
by default when the agent runs in-dev
mode. Currently gRPC is only used to expose Envoy xDS API to Envoy proxies.serf_lan
- The Serf LAN port. Default 8301.serf_wan
- The Serf WAN port. Default 8302. Set to -1 to disable. Note: this will disable WAN federation which is not recommended. Various catalog and WAN related endpoints will return errors or empty results.server
- Server RPC address. Default 8300.proxy_min_port
Deprecated - Minimum port number to use for automatically assigned managed proxies. Default 20000.proxy_max_port
Deprecated - Maximum port number to use for automatically assigned managed proxies. Default 20255.sidecar_min_port
- Inclusive minimum port number to use for automatically assigned sidecar service registrations. Default 21000. Set to0
to disable automatic port assignment.sidecar_max_port
- Inclusive maximum port number to use for automatically assigned sidecar service registrations. Default 21255. Set to0
to disable automatic port assignment.