配置 gRPC 服务
配置 gRPC 服务器,使客户端能够在网络设备上使用 gRPC 服务,包括:gRPC 网络作接口 (gNOI) 服务、gRPC 网络管理接口 (gNMI) 服务和 gRPC 路由信息库接口 (gRIBI) 服务。
本主题讨论如何在 Junos 设备上配置 gRPC 服务,包括身份验证选项以及如何配置每个选项。在服务器和客户端可以建立 gRPC 会话之前,必须满足以下部分中讨论的要求:
了解基于 gRPC 的服务的身份验证和授权
gNMI、gNOI 和 gRIBI 接口使用 gRPC 远程过程调用框架进行传输。gRPC 服务器在网络设备上运行,并侦听指定端口上的连接请求。gRPC 客户端应用程序在远程网络管理系统 (NMS) 上运行,并与指定主机和端口上的服务器建立 gRPC 通道。客户端通过 SSL 加密的 gRPC 会话执行 RPC,以执行网络服务作。 图 1 演示了 gRPC 客户端和服务器之间的简单连接。
gRPC 通道使用通道凭据来处理服务器和客户端之间的身份验证。标准通道凭据使用 X.509 数字证书对服务器和客户端进行身份验证。数字证书提供了一种通过称为 证书颁发机构 或 证书颁发机构 (CA) 的受信任第三方对用户进行身份验证的方法。通讯局核实证书持有人的身份,并在证书上“签名”,以证明证书没有被伪造或更改。X.509 标准定义了证书的格式。数字证书可用于通过证书验证在两个端点之间建立安全连接。若要建立 gRPC 通道,每个需要身份验证的端点(设备或应用程序)必须在交换中提供 X.509 证书。
Junos 设备既支持纯服务器身份验证,也支持基于 SSL 和 TLS 的 gRPC 会话的相互身份验证。配置仅服务器身份验证后,服务器将在建立通道时提供其公钥证书。客户端使用服务器的根 CA 证书对服务器进行身份验证。配置相互认证后,客户端在连接到服务器时也会提供其证书,服务器将对证书进行验证。如果证书验证成功,则允许客户端进行调用。尽管接受自签名证书,但建议您配置相互身份验证并使用 CA 签名的证书,以实现最强的安全性。
公钥基础架构 (PKI) 支持公钥加密密钥的分发和识别,使用户既可以通过互联网等网络安全地交换数据,又可以验证对方的身份。对于基于 gRPC 的服务,Junos PKI 必须包含充当 gRPC 服务器的本地设备的证书。如果使用相互身份验证,则 Junos PKI 还必须包含验证连接到设备的任何 gRPC 客户端的证书所需的根 CA 证书。
表 1 概述了当 gRPC 客户端连接到设备以执行基于 gRPC 的服务时,仅服务器身份验证和相互身份验证的一般要求。gRPC 服务器的证书必须在“公用名 (CN)”字段中定义服务器的主机名,或者必须在“使用者备用名称(subjectAltName 或 SAN)IP 地址”字段中定义服务器的 IP 地址。客户端应用程序必须使用相同的值来建立与服务器的连接。如果证书定义了 SubjectAltName IP 地址字段,则在身份验证过程中将忽略“公用名”字段。
| 要求 | 仅限服务器的身份验证 | 相互身份验证 |
|---|---|---|
| 证书 | 服务器必须具有 X.509 公钥证书。 如果客户端连接到服务器的 IP 地址而不是主机名,则服务器的证书必须包含带有服务器 IP 地址的 subjectAltName (SAN) IP 地址扩展字段。 |
服务器和客户端必须各自具有 X.509 公钥证书。 如果客户端连接到服务器的 IP 地址而不是主机名,则服务器的证书必须包含带有服务器 IP 地址的 subjectAltName (SAN) IP 地址扩展字段。 |
| Junos PKI | 服务器的本地证书必须加载到 Junos PKI 中。 |
服务器的本地证书和每个客户端的根 CA 证书必须加载到 Junos PKI 中。 |
| 通道凭据 | 建立 gRPC 通道时,客户端必须传入服务器的根 CA 证书。 |
建立 gRPC 通道时,客户端必须传入其证书和密钥以及服务器的根 CA 证书。 |
通道凭据附加到 gRPC 通道,使客户端应用程序能够访问服务。另一方面,呼叫凭据附加到特定服务作(RPC 请求),并提供有关使用客户端应用程序的人员的信息。呼叫凭据是按请求发送的,即针对每个 RPC 调用。要在 Junos 设备上执行基于 gRPC 的作,必须在请求中提供呼叫凭据。用户必须在设备上本地定义用户帐户,或者必须通过 TACACS+ 服务器对用户进行身份验证,然后 TACACS+ 服务器将用户映射到设备上本地定义的用户模板帐户。您可以在 RPC metadata 的参数中提供调用凭据(用户名和密码)。如果身份验证成功,Junos 设备将使用指定用户的帐户权限执行 RPC 请求。
作为为 Junos 设备上执行的每个 RPC 传入呼叫凭据的替代方法,您可以在 gRPC 会话开始时使用瞻博网络扩展工具包 jnx_authentication_service API 登录到设备一次,然后对通道中执行的所有后续 RPC 进行身份验证。您可以从 瞻博网络下载站点下载 JET 客户端 IDL 库。
默认情况下,Junos 设备授权经过身份验证的 gRPC 客户端执行所有 gRPC RPC。可以选择将 gRPC 用户的登录类配置为显式允许或拒绝特定的 gRPC RPC。要指定 RPC,请配置 allow-grpc-rpc-regexps 和 deny-grpc-rpc-regexps 语句并定义与 RPC 匹配的正则表达式。有关详细信息,请参阅 配置 gRPC RPC 授权 。
获取 X.509 证书
gRPC 会话使用 X.509 公钥证书对 gRPC 服务器和客户端进行身份验证。对于仅限服务器的身份验证,gRPC 服务器必须具有证书。为了进行相互身份验证,gRPC 服务器和客户端都必须具有证书。证书的要求是:
-
证书可以由 CA 签名或自签名。
-
证书必须经过 PEM 编码。
-
gRPC 服务器的证书必须在“公用名 (CN)”字段中定义 gRPC 服务器的主机名,或者必须在“SubjectAltName (SAN) IP 地址”字段中定义 gRPC 服务器的 IP 地址。gRPC 客户端必须使用相同的值来建立与服务器的连接。如果证书定义了 SubjectAltName IP 地址,则在身份验证过程中将忽略“公用名”字段。
要使用 OpenSSL 获取 gRPC 服务器的证书,请执行以下作:
对于相互身份验证,请使用 gRPC 客户端的信息重复上述步骤,以生成客户端的密钥和证书。客户端证书不需要 SAN IP 扩展字段。
在 Junos PKI 中加载 gRPC 服务器的本地证书
运行 gRPC 服务器的网络设备必须具有向 gRPC 客户端标识设备的 X.509 证书。要在 Junos 设备上执行基于 gRPC 的服务,必须在 Junos PKI 中加载本地网络设备的公钥、证书和密钥。加载证书并执行初始配置后,gRPC 客户端可以使用任何微服务来更新证书。例如,gRPC 客户端可以使用 gNOI CertificateManagement 服务安装新证书或替换现有证书。
要在 PKI 中加载本地设备的证书和密钥:
启用 gRPC 服务
基于 gRPC 的服务使用基于安全套接字层 (SSL) 或传输层安全性 (TLS) 技术的 API 连接设置。对于这些连接,必须指定用于标识 gRPC 服务器的本地证书。
启用 gRPC 服务并指定本地证书后,网络设备将使用仅限服务器的身份验证。然后,可以通过完成 为 gRPC 服务配置相互(双向)身份验证中所述的步骤来选择性地配置相互身份验证。
您可以为 gRPC 服务配置网络设备,并在以下层次结构级别之一指定用于服务器身份验证的本地证书:
-
[edit system services http servers]- 使用此语句层次结构可以配置一个或多个在唯一端口上托管不同服务集的 gRPC 服务器。此外,每台服务器可以支持不同的侦听地址、证书和路由实例。 -
[edit system services extension-service request-response grpc ssl]- 如果只需要一个 gRPC 服务器来支持同一侦听地址和端口上的所有 gRPC 服务,请使用此语句层次结构。
若要为 gRPC 服务配置设备,请按照满足环境要求的层次结构级别的说明进行作。
[edit system services http servers]
要在 [edit system services http servers] 层次结构级别配置一个或多个 gRPC 服务器,请执行以下作:
导航到 gRPC 服务器层次结构级别,并指定服务器的标识符。
[edit] user@host# edit system services http servers server name
例如:
[edit] user@host# edit system services http servers server grpc-server1
配置要用于 gRPC 服务的端口。每个 gRPC 服务器的端口必须是唯一的。
[edit system services http servers server name] user@host# set port port-number
例如:
[edit system services http servers server grpc-server1] user@host# set port 32767
配置此服务器托管的 gRPC 服务。
[edit system services http servers server name] user@host# set grpc [service1 service2 ...]
在此示例中,服务器托管 gNMI 服务和 gNOI 服务。
[edit system services http servers server grpc-server1] user@host# set grpc [gnmi gnoi]
指定向客户端标识服务器的本地证书。
输入之前使用
request security pki local-certificate load作模式命令加载到 Junos PKI 中的本地证书的标识符。[edit system services http servers server name] user@host# set tls local-certificate certificate-id
以下示例配置本地证书
gnoi-server:[edit system services http servers server grpc-server1] user@host# set tls local-certificate gnoi-server
(选答)指定服务器侦听传入连接的 IPv4 或 IPv6 地址。
[edit system services http servers server name] user@host# set listen-address address
例如:
[edit system services http servers server grpc-server1] user@host# set ip-address 192.168.2.1
注意:如果未指定 IP 地址,则默认地址 :: 用于侦听传入连接。
(选答)如果与默认路由实例不同,请配置要用于此 gRPC 服务器的路由实例。
[edit system services http servers server name] user@host# set routing-instance routing-instance
以下示例使用 mgmt-junos 路由实例。
[edit system services http servers server grpc-server1] user@host# set routing-instance mgmt-junos
(选答)配置此 gRPC 服务器支持的最大连接数。
[edit system services http servers server name] user@host# set max-connections connections
以下示例最多配置 10 个连接。默认值为 5。
[edit system services http servers server grpc-server1] user@host# set max-connections 10
提交配置。
user@host# commit
若要配置相互身份验证而不是仅服务器身份验证,还必须完成 为 gRPC 服务配置相互(双向)身份验证中的步骤。
[edit system services extension-service request-response grpc ssl]
要在 [edit system services extension-service request-response grpc ssl] 层次结构级别配置单个 gRPC 服务器,请执行以下作:
导航到 gRPC 服务的基于 SSL 的 API 连接设置。
[edit] user@host# edit system services extension-service request-response grpc ssl
配置要用于 gRPC 服务的端口。
[edit system services extension-service request-response grpc ssl] user@host# set port port-number
例如:
[edit system services extension-service request-response grpc ssl] user@host# set port 32767
指定向客户端标识服务器的本地证书。
输入之前使用
request security pki local-certificate load作模式命令加载到 Junos PKI 中的本地证书的标识符。[edit system services extension-service request-response grpc ssl] user@host# set local-certificate certificate-id
以下示例配置本地证书
gnoi-server:[edit system services extension-service request-response grpc ssl] user@host# set local-certificate gnoi-server
将设备配置为使用证书的 PKI 数据库。
[edit system services extension-service request-response grpc ssl] user@host# set use-pki
使设备能够在不终止 gRPC 会话的情况下重新加载证书。
[edit system services extension-service request-response grpc ssl] user@host# set hot-reloading
(选答)指定要侦听传入连接的 IP 地址。
[edit system services extension-service request-response grpc ssl] user@host# set ip-address address
例如:
[edit system services extension-service request-response grpc ssl] user@host# set ip-address 192.168.2.1
注意:如果未指定 IP 地址,则默认地址 :: 用于侦听传入连接。
(选答)配置扩展服务的跟踪以调试可能出现的任何问题。
[edit] user@host# top user@host# set system services extension-service traceoptions file jsd user@host# set system services extension-service traceoptions flag all
注意:要查看扩展服务的 Junos OS Evolved 跟踪文件,请使用
show trace application jsd和show trace application jsd live作模式命令。提交配置。
user@host# commit
若要配置相互身份验证而不是仅服务器身份验证,还必须完成 为 gRPC 服务配置相互(双向)身份验证中的步骤。
为 gRPC 服务配置相互(双向)身份验证
您可以为 gRPC 会话配置双向身份验证,使用证书将网络设备作为 gRPC 服务器进行身份验证,将 NMS 作为 gRPC 客户端进行身份验证。Junos 设备使用外部客户端提供的凭据对客户端进行身份验证并授权连接。
您可以使用以下选项之一在 Junos 设备上配置相互身份验证:
-
直接在配置中配置相互身份验证设置。
-
最初设置仅限服务器的身份验证,然后使用 gNOI
CertificateManagement服务在设备上加载必要的 CA 证书。
如果直接在设备配置中配置相互认证,则设备配置优先于使用 gNOI 服务完成的任何设置。
开始之前:
-
将充当 gRPC 服务器的网络设备的证书和密钥加载到设备的 PKI 中,如 在 Junos PKI 中加载 gRPC 服务器的本地证书中所述。
-
启用 gRPC 服务并配置本地服务器身份验证,如 启用 gRPC 服务中所述。
以下各节讨论配置相互身份验证的不同方法。您可以使用最适合您的环境的任何方法。
在设备配置中配置相互认证
要直接在网络设备配置中为 gRPC 客户端配置身份验证,请执行以下作:
将用于验证客户端证书的根 CA 证书下载到充当 gRPC 服务器的本地设备。
在层次结构中
[edit security pki]为客户端证书的根 CA 配置 CA 配置文件。[edit security pki] user@host# set ca-profile ca-profile-name ca-identity ca-identifier
例如:
[edit security pki] user@host# set ca-profile gnoi-client ca-identity clientRootCA
提交配置。
[edit] user@host# commit and-quit
在作模式下,将用于验证客户端证书的根 CA 证书加载到 Junos PKI 中。指定在前面步骤中配置的
ca-profile标识符。user@host> request security pki ca-certificate load ca-profile ca-profile filename cert-path
例如:
user@host> request security pki ca-certificate load ca-profile gnoi-client filename /var/tmp/clientRootCA.crt Fingerprint: 00:2a:30:e9:59:94:db:f1:a1:5c:d1:c9:d4:5f:db:8f:f1:f0:8d:c4 (sha1) 02:3b:a0:b8:95:0c:a2:fa:15:18:57:3d:a3:10:e9:ac (md5) 69:97:90:39:de:75:a0:1d:94:1e:06:a8:be:8c:66:e5:41:95:fd:dc:14:8a:e7:3a:e0:42:9e:f9:f7:dd:c8:c2 (sha256) Do you want to load this CA certificate ? [yes,no] (no) yes CA certificate for profile gnoi-client loaded successfully
提示:要加载 CA 证书包,请发出
request security pki ca-certificate ca-profile-group load ca-group-name ca-group-name filename bundle-path命令。加载证书后,进入配置模式并继续配置相互认证。您必须在配置服务器的同一层级下配置相互身份验证。执行层次结构级别部分中概述的步骤。
[编辑系统服务 HTTP 服务器]
要为在 [edit system services http servers] 层次结构级别上配置的服务器配置相互身份验证,请执行以下作:
导航至
tls服务器配置下的语句。[edit] user@host# edit system services http servers server name tls
例如:
[edit] user@host# edit system services http servers server grpc-server1 tls
启用相互身份验证并指定客户端证书的要求。
[edit system services http servers server name tls] user@host# set mutual-authentication authentication-type requirement
例如,要指定最强的身份验证(这需要证书及其验证),请使用
request-and-require-cert-and-verify,这也是默认设置。[edit system services http servers server grpc-server1 tls] user@host# set mutual-authentication authentication-type request-and-require-cert-and-verify
指定将用于验证客户端证书的 CA 配置文件。
CA 配置文件已在 CA 配置文件配置的步骤 2 中配置。
[edit system services http servers server name tls] user@host# set mutual-authentication certificate-authority certificate-authority
例如,要指定名为
gnoi-client的 CA 配置文件:[edit system services http servers server grpc-server1 tls] user@host# set mutual-authentication certificate-authority gnoi-client
提交配置。
[edit system services http servers server name tls] user@host# commit and-quit
[编辑系统服务扩展-服务请求-响应 gRPC SSL]
要为在 [edit system services extension-service request-response grpc ssl] 层次结构级别上配置的服务器配置相互身份验证,请执行以下作:
启用相互身份验证并指定客户端证书的要求。
[edit system services extension-service request-response grpc ssl] user@host# set mutual-authentication client-certificate-request requirement
例如,要指定最强的身份验证(这需要证书及其验证),请使用
require-certificate-and-verify。[edit system services extension-service request-response grpc ssl] user@host# set mutual-authentication client-certificate-request require-certificate-and-verify
注意:默认值为
no-certificate。其他选项有:request-certificate、request-certificate-and-verify、require-certificaterequire-certificate-and-verify、。我们建议您仅在测试环境中使用该
no-certificate选项。指定将用于验证客户端证书的 CA 配置文件。
CA 配置文件已在 CA 配置文件配置的步骤 2 中配置。
[edit system services extension-service request-response grpc ssl] user@host# set mutual-authentication certificate-authority certificate-authority
例如,要指定名为
gnoi-client的 CA 配置文件:[edit system services extension-service request-response grpc ssl] user@host# set mutual-authentication certificate-authority gnoi-client
提交配置。
[edit system services extension-service request-response grpc ssl] user@host# commit and-quit
使用 gNOI CertificateManagement Service 配置相互身份验证
您可以使用 gNOI CertificateManagement 服务在 gRPC 客户端和 gRPC 服务器之间设置相互身份验证,而不是直接在设备配置中配置设置。您最初设置仅限服务器的身份验证,然后使用 gNOI CertificateManagement 服务 RPC 加载客户端 CA 证书。有关使用 gNOI CertificateManagement 服务加载证书的信息,请参阅 gNOI 证书管理服务。
gRPC 服务器仅支持一个用于 gNOI 服务的全局 CA 证书包。使用 gNOI CertificateManagement 服务加载 CA 证书包时,设备会隐式使用相互身份验证。但是,您应该注意以下几点:
-
该
CertificateManagement服务始终使用ca-profile-group保留标识符gnoi-ca-bundle加载 CA 证书包。 -
如果使用
CertificateManagement该服务加载 CA 证书包,设备将隐式使用相互身份验证。 -
CertificateManagement如果服务发送请求以加载新的 CA 证书包,则服务器将从设备中清除前一个 CA 包的证书并加载新证书。 -
如果您使用该
CertificateManagement服务加载 CA 证书包,并且还在设备配置中显式配置了相互认证,则配置的语句优先。
为 gRPC 服务配置用户帐户
通道凭据附加到 gRPC 通道,使客户端应用程序能够访问服务。呼叫凭据附加到特定的 RPC 请求,并提供有关使用客户端应用程序的用户的信息。必须在每个 RPC 请求中提供呼叫凭据,这需要网络设备的用户帐户。用户必须在网络设备上本地定义用户帐户,或者必须通过 TACACS+ 服务器对用户进行身份验证,然后 TACACS+ 服务器将用户映射到设备上本地定义的用户模板帐户。
要创建用户帐户,请执行以下作:
配置 gRPC RPC 授权
默认情况下,Junos 设备授权经过身份验证的 gRPC 客户端执行所有 gRPC RPC。可以将 Junos 登录类配置为显式允许或拒绝 gRPC RPC。要指定 RPC,请配置 allow-grpc-rpc-regexps 和 deny-grpc-rpc-regexps 语句并定义与 RPC 匹配的正则表达式。如果允许和拒绝列表中存在冲突的表达式,则拒绝列表优先。如果 RPC 与任一列表不匹配,则默认情况下允许 RPC。
Junos 设备使用以下语法来指定 gRPC RPC:
/package.service/rpc
其中 package、 service、是在 rpc 该服务的原型定义文件中的相应语句中定义的名称。例如:
/gnmi.gNMI/Get /gnoi.certificate.CertificateManagement/Rotate /gnoi.system.System/Reboot /gnoi.system.System/RebootStatus /gribi.gRIBI/.*
您可以使用一个或多个表达式配置多个 allow-grpc-rpc-regexps 和 deny-grpc-rpc-regexps 语句。将每个表达式括在引号 (“ ”) 内。将多个表达式括在方括号 [ ] 中,并用空格分隔这些表达式。
allow-grpc-rpc-regexps ["regex1" "regex2" ... ] allow-grpc-rpc-regexps "regex3"
若要创建定义 gRPC RPC 授权的登录类,请执行以下作:
变更历史表
是否支持某项功能取决于您使用的平台和版本。使用 功能浏览器 查看您使用的平台是否支持某项功能。