Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

配置 gRPC 服务

总结 配置 gRPC 服务器以使客户端能够在网络设备上使用 gRPC 服务,包括:gRPC 网络操作接口 (gNOI) 服务、gRPC 网络管理接口 (gNMI) 服务和 gRPC 路由信息库接口 (gRIBI) 服务。

本主题讨论如何在 Junos 设备上配置 gRPC 服务,包括身份验证选项以及如何配置每个选项。在服务器和客户端可以建立 gRPC 会话之前,必须满足以下各节中讨论的要求:

了解基于 gRPC 的服务的身份验证和授权

gNOI、gNMI 和 gRIBI 接口使用 gRPC 远程过程调用框架进行传输。gRPC 服务器在网络设备上运行,并侦听指定端口上的连接请求。gRPC 客户端应用程序在远程网络管理系统 (NMS) 上运行,并与指定主机和端口上的服务器建立 gRPC 通道。客户端通过 SSL 加密的 gRPC 会话执行 RPC 以执行网络服务操作。 图 1 说明了 gRPC 客户端和服务器之间的简单连接。

图 1:gRPC 服务器和客户端交互 gRPC Server and Client Interaction

gRPC 通道使用通道凭据来处理服务器和客户端之间的身份验证。标准通道凭据使用 X.509 数字证书对服务器和客户端进行身份验证。数字证书提供了一种通过称为 证书颁发机构证书颁发机构 (CA) 的受信任第三方对用户进行身份验证的方法。CA 验证证书持有者的身份并对证书进行“签名”,以证明证书未被伪造或更改。X.509 标准定义了证书的格式。数字证书可用于通过证书验证在两个终结点之间建立安全连接。若要建立 gRPC 通道,需要身份验证的每个终结点(设备或应用程序)必须在交换中提供 X.509 证书。

Junos 设备支持仅服务器身份验证以及基于 SSL 的 gRPC 会话的相互身份验证。配置仅服务器身份验证时,服务器会在建立通道时提供其公钥证书。客户端使用服务器的根 CA 证书对服务器进行身份验证。配置相互身份验证后,客户端还会在连接到服务器时提供其证书,并且服务器会验证证书。如果证书验证成功,则允许客户端进行调用。我们建议您配置相互身份验证并使用 CA 签名证书以获得最强的安全性,但接受自签名证书。

公钥基础设施 (PKI) 支持公共加密密钥的分发和识别,使用户既能通过互联网等网络安全地交换数据,又能验证另一方的身份。对于基于 gRPC 的服务,Junos PKI 必须包含充当 gRPC 服务器的本地设备的证书。如果使用相互身份验证,则 Junos PKI 还必须包含验证连接到设备的任何 gRPC 客户端的证书所需的根 CA 证书。

表 1 概述了当 gRPC 客户端连接到设备以执行基于 gRPC 的服务时,仅服务器身份验证和相互身份验证的一般要求。gRPC 服务器的证书必须在公用名 (CN) 字段中定义服务器的主机名,或者必须在使用者备用名称(主题 AltName 或 SAN)IP 地址字段中定义服务器的 IP 地址。客户端应用程序必须使用相同的值来建立与服务器的连接。如果证书定义了“使用者AltName IP 地址”字段,则在身份验证过程中将忽略“公用名”字段。

表 1:gRPC 会话的仅服务器身份验证和相互身份验证要求
要求 仅服务器身份验证 相互身份验证
证书

服务器必须具有 X.509 公钥证书。

如果客户端连接到服务器的 IP 地址而不是主机名,则服务器的证书必须包含使用者AltName (SAN) IP 地址扩展字段和服务器的 IP 地址。

服务器和客户端必须各自具有 X.509 公钥证书。

如果客户端连接到服务器的 IP 地址而不是主机名,则服务器的证书必须包含使用者AltName (SAN) IP 地址扩展字段和服务器的 IP 地址。

Junos PKI

服务器的本地证书必须加载到 Junos PKI 中。

必须在 Junos PKI 中加载服务器的本地证书和每个客户端的根 CA 证书。

通道凭据

建立 gRPC 通道时,客户端必须传入服务器的根 CA 证书。

建立 gRPC 通道时,客户端必须传入其证书和密钥以及服务器的根 CA 证书。

通道凭据附加到 gRPC 通道,并使客户端应用程序能够访问服务。另一方面,调用凭据附加到特定的服务操作(RPC 请求),并提供有关使用客户端应用程序的人员的信息。调用凭据按请求发送,即针对每个 RPC 调用发送。要在 Junos 设备上执行基于 gRPC 的操作,必须在请求中提供调用凭据。用户必须在设备上本地定义用户帐户,或者用户必须由 TACACS+ 服务器进行身份验证,然后将用户映射到设备上本地定义的用户模板帐户。您可以在 RPC 的 metadata 参数中提供调用凭据(用户名和密码)。如果身份验证成功,Junos 设备将使用指定用户的帐户权限执行 RPC 请求。

注意:

作为为 Junos 设备上执行的每个 RPC 传入呼叫凭据的替代方法,您可以使用瞻博网络扩展工具包 jnx_authentication_service API 在 gRPC 会话开始时登录设备一次,并在通道中执行的所有后续 RPC 进行身份验证。您可以从 瞻博网络下载站点下载 JET 客户端 IDL 库。

默认情况下,Junos 设备授权经过身份验证的 gRPC 客户端执行所有 gRPC RPC。可以选择将 gRPC 用户的登录类配置为显式允许或拒绝特定的 gRPC RPC。若要指定 RPC,请配置 allow-grpc-rpc-regexps and deny-grpc-rpc-regexps 语句并定义与 RPC 匹配的正则表达式。有关详细信息,请参阅 配置 gRPC RPC 授权

获取 X.509 证书

SSL 加密的 gRPC 会话使用 X.509 公钥证书对 gRPC 服务器和客户端进行身份验证。对于仅服务器身份验证,gRPC 服务器必须具有证书。对于相互身份验证,gRPC 服务器和客户端都必须具有证书。证书的要求是:

  • 证书可以由证书颁发机构 (CA) 签名,也可以自签名。

  • 证书必须采用 PEM 编码。

  • gRPC 服务器的证书必须在公用名 (CN) 字段中定义 gRPC 服务器的主机名,或者必须在 SubjectAltName (SAN) IP 地址字段中定义 gRPC 服务器的 IP 地址。gRPC 客户端必须使用相同的值来建立与服务器的连接。如果证书定义了 SubjectAltName IP 地址,则在身份验证过程中将忽略公用名字段。

要使用 OpenSSL 获取 gRPC 服务器的证书,请执行以下操作:

  1. 生成私钥,并以位为单位指定密钥长度。
  2. 如果 gRPC 客户端连接到 gRPC 服务器的 IP 地址,请更新 openssl.cnf 或等效配置文件,以使用 gRPC 服务器的 IP 地址定义 subjectAltName=IP 扩展。
  3. 生成证书签名请求 (CSR),其中包含实体的公钥和有关其身份的信息。

    或者,您可以在单个命令中提供 CSR 信息,例如:

  4. 通过执行以下操作之一生成证书:
    • 将 CSR 发送到证书颁发机构以请求 X.509 证书,并提供配置文件以包含任何其他扩展名。

    • 使用 CA 签署 CSR 以生成证书,如果需要引用配置文件和扩展,请包含 -extfile 该选项。

    • 使用服务器密钥对 CSR 进行签名以生成自签名证书,如果需要引用配置文件和扩展,请包含该 -extfile 选项。

  5. 验证证书的公用名 (CN) 字段和扩展名(如果提供)是否正确。

对于相互身份验证,请对 gRPC 客户端的信息重复上述步骤,以生成客户端的密钥和证书。客户端证书不需要 SAN IP 扩展字段。

在 Junos PKI 中加载 gRPC 服务器的本地证书

运行 gRPC 服务器的网络设备必须具有向 gRPC 客户端标识设备的 X.509 证书。要在 Junos 设备上执行基于 gRPC 的服务,必须在 Junos PKI 中加载本地网络设备的公钥证书和密钥。加载证书并执行初始配置后,gRPC 客户端可以使用任何微服务来更新证书。例如,gRPC 客户端可以使用 gNOI CertificateManagement 服务安装新证书或替换现有证书。

要在 PKI 中加载本地设备的证书和密钥,请执行以下操作:

  1. 将充当 gRPC 服务器的设备的证书和密钥下载到该设备。
  2. 在操作模式下,定义标识符并将本地设备的证书和密钥加载到 PKI 中。
  3. (可选)验证 PKI 数据库中是否存在证书。

启用 gRPC 服务

基于 gRPC 的服务使用基于安全套接字层 (SSL) 技术的 API 连接设置。对于基于 SSL 的连接,必须指定标识 gRPC 服务器的本地证书。

启用 gRPC 服务并指定本地证书后,网络设备将使用仅限服务器的身份验证。然后,可以通过完成 为 gRPC 服务配置相互(双向)身份验证中所述的步骤来选择配置相互身份验证。

若要为 gRPC 服务配置网络设备并指定用于服务器身份验证的本地证书,请执行以下操作:

  1. 导航到 gRPC 服务的基于 SSL 的 API 连接设置。
  2. 配置要用于 gRPC 服务的端口。

    例如:

  3. 指定本地证书。

    输入之前使用操作模式命令加载 request security pki local-certificate load 到 Junos PKI 中的本地证书的标识符。

    以下示例配置本地证书 gnoi-server

  4. 将设备配置为将 PKI 数据库用于证书。
  5. 使设备能够在不终止 gRPC 会话的情况下重新加载证书。
  6. (可选)指定要侦听传入连接的 IP 地址。

    例如:

    注意:

    如果未指定 IP 地址,则使用默认地址 :: 来侦听传入连接。

  7. (可选)配置扩展服务的跟踪以调试可能出现的任何问题。
    注意:

    要查看扩展服务的 Junos OS 演化跟踪文件,请使用 show trace application jsdshow trace application jsd live 操作模式命令。

  8. 提交配置。

若要配置相互身份验证而不是仅服务器身份验证,还必须完成 为 gRPC 服务配置相互(双向)身份验证中的步骤。

为 gRPC 服务配置相互(双向)身份验证

可以为 gRPC 会话配置相互(双向)身份验证,从而使用 SSL 证书将网络设备验证为 gRPC 服务器,将网络管理系统验证为 gRPC 客户端。Junos 设备使用外部客户端提供的凭据对客户端进行身份验证并授权连接。

您可以使用以下选项之一在 Junos 设备上配置相互身份验证:

  • 直接在 [edit system services extension-service request-response grpc ssl mutual-authentication] 层次结构级别下配置相互身份验证设置。

  • 最初设置仅服务器身份验证,然后使用 gNOI CertificateManagement 服务在设备上加载必要的 CA 证书。

如果直接在设备配置中配置相互身份验证,则设备配置优先于 使用 gNOI 服务完成的任何设置。

准备工作:

以下各节讨论配置相互身份验证的不同方法。您可以使用最适合您的环境的方法。

在设备配置中配置相互身份验证

若要直接在网络设备配置中为 gRPC 客户端配置身份验证,请执行以下操作:

  1. 将用于验证客户端证书的根 CA 证书下载到充当 gRPC 服务器的本地设备。

  2. 在层次结构中 [edit security pki] 为客户端证书的根 CA 配置证书颁发机构配置文件。

    例如:

  3. 提交配置。

  4. 在操作模式下,将用于验证客户端证书的根 CA 证书加载到 Junos PKI 中。指定 ca-profile 在前面的步骤中配置的标识符。

    例如:

    提示:

    要加载 CA 证书捆绑包,请发出 request security pki ca-certificate ca-profile-group load ca-group-name ca-group-name filename bundle-path 命令。

    加载证书后,进入配置模式并继续配置相互身份验证。

  5. 启用相互身份验证并指定客户端证书的要求。

    例如,要指定需要证书及其验证的最强身份验证,请使用 require-certificate-and-verify

    注意:

    默认值为 no-certificate。其他选项包括:、request-certificaterequest-certificate-and-verifyrequire-certificaterequire-certificate-and-verify

    建议仅在测试环境中使用 no-certificate 此选项。

  6. 指定将用于验证客户端证书的证书颁发机构配置文件。

    证书颁发机构配置文件是在步骤 2 中配置的。

    例如,要指定名为 gnoi-client的证书颁发机构配置文件:

  7. 提交配置。

使用 gNOI 证书管理服务配置相互身份验证

可以使用 gNOI CertificateManagagment 服务在 gRPC 客户端和 gRPC 服务器之间设置相互身份验证,而不是直接在设备配置中配置设置。最初设置仅服务器身份验证,然后使用 gNOI CertificateManagement 服务 RPC 加载客户端 CA 证书。有关使用 gNOI 服务加载证书的信息,请参阅 gNOI CertificateManagagment 证书管理服务。

gRPC 服务器仅支持 gNOI 服务的一个全局 CA 证书捆绑包。使用 gNOI CertificateManagagment 服务加载 CA 证书捆绑包时,设备会隐式使用相互身份验证。但是,您应该注意以下几点:

  • 该服务CertificateManagagment始终使用保留的标识符gnoi-ca-bundle加载 ca-profile-group CA 证书捆绑包。

  • 如果使用该服务加载 CertificateManagagment CA 证书捆绑包,则设备将隐式使用相互身份验证并采用以下配置,即使设备上未显式配置也是如此。

  • CertificateManagagment如果服务发送加载新 CA 证书捆绑包的请求,服务器将从设备中清除先前 CA 捆绑包的证书并加载新证书。

  • CertificateManagagment如果使用该服务加载 CA 证书捆绑包,并且还配置了[edit system services extension-service request-response grpc ssl mutual-authentication]语句层次结构,则配置的语句优先。

配置 gRPC 服务的用户帐户

通道凭据附加到 gRPC 通道,并使客户端应用程序能够访问服务。调用凭据附加到特定的 RPC 请求,并提供有关使用客户端应用程序的用户的信息。您必须在每个 RPC 请求中提供呼叫凭据,这需要网络设备的用户帐户。用户必须在网络设备上本地定义用户帐户,或者用户必须由 TACACS+ 服务器进行身份验证,然后该服务器将用户映射到设备上本地定义的用户模板帐户。

要创建用户帐户,请执行以下操作:

  1. 使用唯一用户名配置语句 user ,并包括该 class 语句以指定具有用户要执行的所有操作所需的权限的登录类。例如:
  2. 对于本地用户帐户,请配置用户的密码。

    可以省略本地用户模板帐户的密码,因为用户是通过远程身份验证服务器进行身份验证的。

  3. (可选)配置 full-name 语句以指定用户名。
  4. 提交配置以激活设备上的用户帐户。
  5. 在 gRPC 客户端将在 gRPC 会话中执行 RPC 的每个网络设备上重复上述步骤。

配置 gRPC RPC 授权

默认情况下,Junos 设备授权经过身份验证的 gRPC 客户端执行所有 gRPC RPC。您可以将 Junos 登录类配置为显式允许或拒绝 gRPC RPC。若要指定 RPC,请配置 allow-grpc-rpc-regexps and deny-grpc-rpc-regexps 语句并定义与 RPC 匹配的正则表达式。如果允许列表和拒绝列表中存在冲突的表达式,则拒绝列表优先。如果 RPC 与任一列表都不匹配,则默认情况下允许该 RPC。

Junos 设备使用以下语法指定 gRPC RPC:

其中 package、 和 rpcservice该服务的原型定义文件中相应语句中定义的名称。例如:

您可以使用一个或多个表达式配置多个 allow-grpc-rpc-regexpsdeny-grpc-rpc-regexps 语句。将每个表达式括在引号 (“ ”) 内。将多个表达式括在方括号 [ ] 中,并用空格分隔这些表达式。

若要创建定义 gRPC RPC 授权的登录类,请执行以下操作:

  1. 配置登录类名称和权限。

    例如:

  2. 在类中,为类允许的 RPC 配置正则表达式。

    例如,以下语句允许 gNMI Get() RPC 和所有 gNOI System 服务 RPC。

  3. 为类拒绝的 RPC 配置正则表达式。

    例如,以下语句拒绝 gNMI Set() RPC,并拒绝服务和 gNOI CertificateManagement 服务的所有 gRIBI RPC。

  4. 将登录类分配给相应的 gRPC 用户。

    例如,以下语句将 grpc-operatorgrpc-user 分配给用户。

在网络设备上启用 gRPC 服务后,将远程网络管理系统设置为 gRPC 客户端。要使客户端能够执行 gNOI 操作,请按照 配置 gNOI 服务中所述配置客户端。