菜单
文档breadcrumb arrow Grafana Mimirbreadcrumb arrow 管理breadcrumb arrow 安全breadcrumb arrow 使用 TLS 保护通信
开源

使用 TLS 保护 Grafana Mimir 通信

Grafana Mimir 是一个分布式系统,其组件之间存在大量流量。为了实现安全通信,Grafana Mimir 支持在其组件之间使用 TLS。本文描述了设置 TLS 的过程。

生成用于配置 TLS 的证书

要在 Grafana Mimir 中通过 TLS 建立安全的组件间通信,您必须使用证书颁发机构 (CA) 生成证书。CA 应为组织私有,因为由该 CA 签名的证书将拥有与集群通信的权限。

注意

生成的证书有效期为 100,000 天。您可以通过调整命令中的 -days 选项来更改有效期。

您应该更频繁地更换证书。

您需要在扩展密钥用法字段中为证书同时设置服务器认证和客户端认证。

以下脚本生成集群的自签名证书。该脚本为客户端和服务器生成私钥 client.keyserver.key 以及证书 client.crtserver.crt。脚本将 CA 证书生成为 root.crt

# keys
openssl genrsa -out root.key
openssl genrsa -out client.key
openssl genrsa -out server.key

# root cert / certifying authority
openssl req -x509 -new -nodes -key root.key -subj "/C=US/ST=KY/O=Org/CN=root" -sha256 -days 100000 -out root.crt

# csrs - certificate signing requests
openssl req -new -sha256 -key client.key -subj "/C=US/ST=KY/O=Org/CN=client" -out client.csr
openssl req -new -sha256 -key server.key -subj "/C=US/ST=KY/O=Org/CN=localhost" -out server.csr

# certificates
openssl x509 -req -in client.csr -CA root.crt -CAkey root.key -CAcreateserial -out client.crt -days 100000 -sha256
openssl x509 -req -in server.csr -CA root.crt -CAkey root.key -CAcreateserial -out server.crt -days 100000 -sha256

在 Grafana Mimir 中配置 TLS 证书

Grafana Mimir 组件之间的每个 gRPC 连接都支持按照服务器标志和客户端标志指定的 TLS 配置。

服务器标志

您可以设置服务器将接受的加密套件和最低 TLS 版本

  • -server.tls-cipher-suites: 要使用的加密套件的逗号分隔列表。如果为空,则使用默认的 Go 加密套件。可能的值,来自https://pkg.go.dev/crypto/tls#pkg-constants
    • TLS_RSA_WITH_RC4_128_SHA
    • TLS_RSA_WITH_3DES_EDE_CBC_SHA
    • TLS_RSA_WITH_AES_128_CBC_SHA
    • TLS_RSA_WITH_AES_256_CBC_SHA
    • TLS_RSA_WITH_AES_128_CBC_SHA256
    • TLS_RSA_WITH_AES_128_GCM_SHA256
    • TLS_RSA_WITH_AES_256_GCM_SHA384
    • TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
    • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
    • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
    • TLS_ECDHE_RSA_WITH_RC4_128_SHA
    • TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
    • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
    • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
    • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
    • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
    • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    • TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
    • TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  • -server.tls-min-version: 要使用的最低 TLS 版本。允许的值:“VersionTLS10”、“VersionTLS11”、“VersionTLS12”、“VersionTLS13”。如果为空,则使用 Go TLS 最低版本。

以下服务器标志设置确定服务器是否要求客户端向服务器提供有效证书。这些标志支持 crypto/tls 标准库中定义的所有值。

对于除 NoClientCert 之外的所有值,策略定义服务器在握手期间请求客户端证书。这些值确定客户端是否必须发送证书以及服务器是否必须验证证书。

使用以下选项定义服务器证书策略

  • NoClientCert: 服务器不请求客户端证书。
  • RequestClientCert: 服务器请求客户端证书,但不要求客户端发送。
  • RequireClientCert: 服务器要求客户端至少发送一个证书,但不要求证书有效。
  • VerifyClientCertIfGiven: 服务器不要求客户端发送证书,但如果发送,则证书必须有效。
  • RequireAndVerifyClientCert: 服务器要求客户端发送至少一个有效证书。

在以下示例中,服务器授权标志 -server.http-tls-client-auth-server.grpc-tls-client-auth 都使用了最具限制性的选项 RequiredAndVerifyClientCert

    # Path to the TLS Cert for the HTTP Server
    -server.http-tls-cert-path=/path/to/server.crt

    # Path to the TLS Key for the HTTP Server
    -server.http-tls-key-path=/path/to/server.key

    # Type of Client Auth for the HTTP Server
    -server.http-tls-client-auth="RequireAndVerifyClientCert"

    # Path to the Client CA Cert for the HTTP Server
    -server.http-tls-ca-path="/path/to/root.crt"

    # Path to the TLS Cert for the gRPC Server
    -server.grpc-tls-cert-path=/path/to/server.crt

    # Path to the TLS Key for the gRPC Server
    -server.grpc-tls-key-path=/path/to/server.key

    # Type of Client Auth for the gRPC Server
    -server.grpc-tls-client-auth="RequireAndVerifyClientCert"

    # Path to the Client CA Cert for the gRPC Server
    -server.grpc-tls-ca-path=/path/to/root.crt

客户端标志

您可以在 Grafana Mimir 中以类似的方式为 gRPC 客户端配置 TLS 私钥、证书和证书颁发机构。

要为组件启用 TLS,请使用包含后缀 *.tls-enabled=true 的客户端配置标志,例如 -querier.frontend-client.tls-enabled=true

以下 Grafana Mimir 组件支持组件间通信的 TLS,并显示了其相应的配置标志前缀

  • Query-scheduler gRPC 客户端,用于连接 query-frontends:-query-scheduler.grpc-client-config.*
  • Querier gRPC 客户端,用于连接 store-gateways:-querier.store-gateway-client.*
  • Querier gRPC 客户端,用于连接 query-frontends 和 query-schedulers:-querier.frontend-client.*
  • Query-frontend gRPC 客户端,用于连接 query-schedulers:-query-frontend.grpc-client-config.*
  • Ruler gRPC 客户端,用于连接其他 ruler 实例:-ruler.client.*
  • Ruler gRPC 客户端,用于连接 query-frontend:-ruler.query-frontend.grpc-client-config.*
  • Distributor gRPC 客户端,用于将匹配配置集的序列转发到专用的远程端点:-distributor.forwarding.grpc-client.*
  • Alertmanager gRPC 客户端,用于连接其他 Alertmanager 实例:-alertmanager.alertmanager-client.*
  • 由 distributors、queriers 和 rulers 使用的 gRPC 客户端,用于连接 ingesters:-ingester.client.*
  • 所有 Mimir 组件使用的 etcd 客户端,仅在使用 etcd 后端运行哈希环或 HA 跟踪器时需要:-<prefix>.etcd.*
  • 所有 Mimir 组件使用的 Memberlist 客户端,用于 gossip 哈希环,仅在使用 memberlist 运行哈希环时需要:-memberlist.
  • 所有 Mimir 组件使用的 Memcached 客户端:-blocks-storage.bucket-store.chunks-cache.memcached.*, -blocks-storage.bucket-store.index-cache.memcached.*, -blocks-storage.bucket-store.metadata-cache.memcached.*, -query-frontend.results-cache.memcached.*, -ruler-storage.cache.memcached.*

上面列出的每个组件都支持以下 TLS 配置选项,并显示了其相应的标志后缀

  • *.tls-enabled=<boolean>: 在客户端启用 TLS。
  • *.tls-server-name=<string>: 覆盖服务器证书上的预期名称。
  • *.tls-insecure-skip-verify=<boolean>: 跳过验证服务器证书。
  • *.tls-cipher-suites=<string>: 接受的加密套件的逗号分隔列表。有关支持的加密套件列表,请参阅Grafana Mimir 配置参数
  • *.tls-min-version=<string>: 所需的最低 TLS 版本。有关支持的版本列表,请参阅Grafana Mimir 配置参数
  • *.tls-cert-path=<string>: 客户端证书的路径。
  • *.tls-key-path=<string>: 客户端证书密钥的路径。
  • *.tls-ca-path=<string>: 用于验证服务器证书的 CA 证书路径。

以下示例展示了如何在连接到 query-frontend 的 querier 中配置 gRPC 客户端标志

    # Path to the TLS Cert for the gRPC Client
    -querier.frontend-client.tls-cert-path=/path/to/client.crt

    # Path to the TLS Key for the gRPC Client
    -querier.frontend-client.tls-key-path=/path/to/client.key

    # Path to the TLS CA for the gRPC Client
    -querier.frontend-client.tls-ca-path=/path/to/root.crt