配置 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 客户端和服务器之间的简单连接。
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 地址”字段,则在身份验证过程中将忽略“公用名”字段。
要求 | 仅服务器身份验证 | 相互身份验证 |
---|---|---|
证书 | 服务器必须具有 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 服务器的证书,请执行以下操作:
对于相互身份验证,请对 gRPC 客户端的信息重复上述步骤,以生成客户端的密钥和证书。客户端证书不需要 SAN IP 扩展字段。
在 Junos PKI 中加载 gRPC 服务器的本地证书
运行 gRPC 服务器的网络设备必须具有向 gRPC 客户端标识设备的 X.509 证书。要在 Junos 设备上执行基于 gRPC 的服务,必须在 Junos PKI 中加载本地网络设备的公钥证书和密钥。加载证书并执行初始配置后,gRPC 客户端可以使用任何微服务来更新证书。例如,gRPC 客户端可以使用 gNOI CertificateManagement
服务安装新证书或替换现有证书。
要在 PKI 中加载本地设备的证书和密钥,请执行以下操作:
启用 gRPC 服务
基于 gRPC 的服务使用基于安全套接字层 (SSL) 技术的 API 连接设置。对于基于 SSL 的连接,必须指定标识 gRPC 服务器的本地证书。
启用 gRPC 服务并指定本地证书后,网络设备将使用仅限服务器的身份验证。然后,可以通过完成 为 gRPC 服务配置相互(双向)身份验证中所述的步骤来选择配置相互身份验证。
若要为 gRPC 服务配置网络设备并指定用于服务器身份验证的本地证书,请执行以下操作:
若要配置相互身份验证而不是仅服务器身份验证,还必须完成 为 gRPC 服务配置相互(双向)身份验证中的步骤。
为 gRPC 服务配置相互(双向)身份验证
可以为 gRPC 会话配置相互(双向)身份验证,从而使用 SSL 证书将网络设备验证为 gRPC 服务器,将网络管理系统验证为 gRPC 客户端。Junos 设备使用外部客户端提供的凭据对客户端进行身份验证并授权连接。
您可以使用以下选项之一在 Junos 设备上配置相互身份验证:
-
直接在
[edit system services extension-service request-response grpc ssl mutual-authentication]
层次结构级别下配置相互身份验证设置。 -
最初设置仅服务器身份验证,然后使用 gNOI
CertificateManagement
服务在设备上加载必要的 CA 证书。
如果直接在设备配置中配置相互身份验证,则设备配置优先于 使用 gNOI 服务完成的任何设置。
准备工作:
-
将充当 gRPC 服务器的网络设备的证书和密钥加载到设备的 PKI 中,如 在 Junos PKI 中加载 gRPC 服务器的本地证书中所述。
-
启用 gRPC 服务并配置本地服务器身份验证,如 启用 gRPC 服务中所述。
以下各节讨论配置相互身份验证的不同方法。您可以使用最适合您的环境的方法。
在设备配置中配置相互身份验证
若要直接在网络设备配置中为 gRPC 客户端配置身份验证,请执行以下操作:
-
将用于验证客户端证书的根 CA 证书下载到充当 gRPC 服务器的本地设备。
-
在层次结构中
[edit security pki]
为客户端证书的根 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
命令。加载证书后,进入配置模式并继续配置相互身份验证。
-
启用相互身份验证并指定客户端证书的要求。
[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-certificate
require-certificate-and-verify
。建议仅在测试环境中使用
no-certificate
此选项。 -
指定将用于验证客户端证书的证书颁发机构配置文件。
证书颁发机构配置文件是在步骤 2 中配置的。
[edit system services extension-service request-response grpc ssl] user@host# set mutual-authentication certificate-authority certificate-authority
例如,要指定名为
gnoi-client
的证书颁发机构配置文件:[edit system services extension-service request-response grpc ssl] user@host# set mutual-authentication certificate-authority gnoi-client
-
提交配置。
[edit] user@host# commit and-quit
使用 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 证书捆绑包,则设备将隐式使用相互身份验证并采用以下配置,即使设备上未显式配置也是如此。[edit system services extension-service request-response grpc ssl] mutual-authentication { certificate-authority gnoi-ca-bundle; client-certificate-request require-certificate-and-verify; }
-
CertificateManagagment
如果服务发送加载新 CA 证书捆绑包的请求,服务器将从设备中清除先前 CA 捆绑包的证书并加载新证书。 -
CertificateManagagment
如果使用该服务加载 CA 证书捆绑包,并且还配置了[edit system services extension-service request-response grpc ssl mutual-authentication]
语句层次结构,则配置的语句优先。
配置 gRPC 服务的用户帐户
通道凭据附加到 gRPC 通道,并使客户端应用程序能够访问服务。调用凭据附加到特定的 RPC 请求,并提供有关使用客户端应用程序的用户的信息。您必须在每个 RPC 请求中提供呼叫凭据,这需要网络设备的用户帐户。用户必须在网络设备上本地定义用户帐户,或者用户必须由 TACACS+ 服务器进行身份验证,然后该服务器将用户映射到设备上本地定义的用户模板帐户。
要创建用户帐户,请执行以下操作:
配置 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.service/rpc
其中 package
、 和 rpc
是service
该服务的原型定义文件中相应语句中定义的名称。例如:
/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 授权的登录类,请执行以下操作: