gRPC サービスを構成する
gRPC サーバーを設定して、gRPC ネットワーク操作インターフェイス(gNOI)サービス、gRPC ネットワーク管理インターフェイス(gNMI)サービス、gRPC ルーティング情報ベースインターフェイス(gRIBI)サービスなどのサービスを、クライアントがネットワーク デバイス上で gRPC サービスを使用できるようにします。
このトピックでは、認証のオプションや各オプションの設定方法など、Junos デバイスで gRPC サービスを設定する方法について説明します。サーバーとクライアントが gRPC セッションを確立する前に、次のセクションで説明する要件を満たす必要があります。
gRPC ベースのサービスの認証と許可について理解する
gNOI、gNMI、および gRIBI インターフェイスは、トランスポートに gRPC リモート プロシージャ コール フレームワークを使用します。gRPC サーバーはネットワーク デバイス上で実行され、指定されたポートで接続要求をリッスンします。gRPC クライアント アプリケーションは、リモート ネットワーク管理システム (NMS) で実行され、指定されたホストとポートでサーバーとの gRPC チャネルを確立します。クライアントは、SSL で暗号化された gRPC セッションを介して RPC を実行し、ネットワークサービス操作を実行します。 図 1 は、gRPC クライアントとサーバー間の単純な接続を示しています。
gRPC チャネルは、チャネル資格情報を使用してサーバーとクライアント間の認証を処理します。標準チャネル資格情報では、サーバーとクライアントの認証に X.509 デジタル証明書を使用します。デジタル証明書は、 証明機関 または 証明機関 (CA) と呼ばれる信頼できる第三者を通じてユーザーを認証する方法を提供します。CA は、証明書所有者の ID を検証し、証明書が偽造または変更されていないことを証明するために証明書に「署名」します。X.509 標準では、証明書の形式が定義されています。デジタル証明書を使用すると、証明書の検証を通じて 2 つのエンドポイント間のセキュアな接続を確立できます。gRPC チャネルを確立するには、認証を必要とする各エンドポイント (デバイスまたはアプリケーション) が交換で X.509 証明書を提供する必要があります。
Junos デバイスは、サーバーのみの認証と SSL ベースの gRPC セッションの相互認証の両方をサポートします。サーバーのみの認証が構成されている場合、サーバーはチャネルの確立時に公開鍵証明書を提供します。クライアントは、サーバーのルート CA 証明書を使用してサーバーを認証します。相互認証が構成されている場合、クライアントはサーバーに接続するときに証明書も提供し、サーバーが証明書を検証します。証明書の検証が成功すると、クライアントは呼び出しを発信できます。相互認証を構成し、CA 署名付き証明書を使用してセキュリティを強化することをお勧めしますが、自己署名証明書も受け入れられます。
公開鍵基盤(PKI)は、公開暗号鍵の配布と識別をサポートし、ユーザーがインターネットなどのネットワーク上で安全にデータを交換することと、相手方の身元を確認することの両方を可能にします。gRPC ベースのサービスの場合、Junos PKI には、gRPC サーバーとして機能するローカル デバイスの証明書が含まれている必要があります。相互認証を使用する場合、Junos PKI には、デバイスに接続する gRPC クライアントの証明書を検証するために必要なルート CA 証明も含まれている必要があります。
表 1 は、gRPC クライアントがデバイスに接続して gRPC ベースのサービスを実行する場合の、サーバーのみの認証と相互認証の一般的な要件の概要を示しています。gRPC サーバーの証明書は、サーバーのホスト名を [Common Name (CN)] フィールドで定義するか、サーバーの IP アドレスを [Subject Alternative Name (subjectAltName or SAN) IP address] フィールドで定義する必要があります。クライアント・アプリケーションは、同じ値を使用してサーバーへの接続を確立する必要があります。証明書で 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+サーバーによって認証される必要があります。その後、ユーザーはデバイス上でローカルに定義されたユーザーテンプレートアカウントにユーザーをマッピングします。呼び出し資格情報 (ユーザー名とパスワード) は、RPC の metadata
引数に指定できます。認証に成功すると、Junos デバイスは指定されたユーザーのアカウント権限を使用して RPC リクエストを実行します。
Junos デバイスで実行されるすべての RPC に呼び出し資格情報を渡す代わりに、Juniper Juniper Extension Toolkit jnx_authentication_service
API を使用して、gRPC セッションの開始時にデバイスに一度ログインすると、チャネルで実行される後続のすべての RPC が認証されます。JETクライアントIDLライブラリは、 ジュニパーネットワークスのダウンロードサイトからダウンロードできます。
デフォルトでは、Junos デバイスは、認証された gRPC クライアントにすべての gRPC RPC の実行を許可します。必要に応じて、gRPC ユーザーのログインクラスを設定して、特定の gRPC RPC を明示的に許可または拒否できます。RPCを指定するには、 allow-grpc-rpc-regexps
および 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(Secure Sockets Layer)テクノロジに基づく 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 サービスを使用して行われた設定よりもデバイス設定が優先されます。
開始する前に、以下を実行します。
-
Junos PKIでgRPCサーバーのローカル証明書を読み込むの説明に従って、gRPCサーバーとして機能するネットワークデバイスの証明書とキーをデバイスのPKIに読み込みます。
-
gRPC サービスを有効にし、「 gRPC サービスを有効にする」の説明に従ってローカル サーバー認証を構成します。
次のセクションでは、相互認証を構成するさまざまな方法について説明します。環境に最適な方法を使用できます。
デバイス構成で相互認証を設定する
gRPC クライアントの認証をネットワーク デバイス構成で直接構成するには:
クライアントの証明書を検証するために使用されるルート CA 証明書を、gRPC サーバーとして機能するローカル デバイスにダウンロードします。
クライアント証明書のルートCAの認証局プロファイルを
[edit security pki]
階層で構成します。[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 CertificateManagement サービスを使用した相互認証の設定
デバイス構成で直接設定を行う代わりに、gNOI CertificateManagement
サービスを使用して gRPC クライアントと gRPC サーバー間の相互認証を設定できます。最初にサーバーのみの認証を設定してから、gNOI CertificateManagement
サービス RPC を使用してクライアントCA 証明を読み込みます。gNOI CertificateManagement
サービスを使用した証明書のロードについては、gNOI 証明書管理 サービスを参照してください。
gRPC サーバーは、gNOI サービスに対して 1 つのグローバル CA 証明書バンドルのみをサポートします。gNOI CertificateManagement
サービスを使用して CA 証明書バンドルをロードすると、デバイスは暗黙的に相互認証を使用します。ただし、次の点に注意する必要があります。
-
CertificateManagement
サービスは、常にca-profile-group
予約済み識別子gnoi-ca-bundle
を使用して CA 証明書バンドルを読み込みます。 -
CertificateManagement
サービスを使用して CA 証明書バンドルをロードする場合、デバイスは暗黙的に相互認証を使用し、デバイスで明示的に設定されていなくても、次の設定を想定します。[edit system services extension-service request-response grpc ssl] mutual-authentication { certificate-authority gnoi-ca-bundle; client-certificate-request require-certificate-and-verify; }
-
CertificateManagement
サービスが新しい CA 証明書バンドルをロードする要求を送信すると、サーバは以前の CA バンドルの証明書をデバイスからクリアし、新しい証明書を読み込みます。 -
CertificateManagement
サービスを使用して 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
および 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/.*
1つ以上の式で複数の allow-grpc-rpc-regexps
および deny-grpc-rpc-regexps
ステートメントを設定できます。各式を引用符(" ")で囲みます。複数の式を角括弧[ ]で囲み、スペースで区切ります。
allow-grpc-rpc-regexps ["regex1" "regex2" ... ] allow-grpc-rpc-regexps "regex3"
gRPC RPCの認証を定義するログインクラスを作成するには、以下を行います。