34 #include <gmock/gmock.h>
35 #include <gtest/gtest.h>
37 #include "absl/functional/bind_front.h"
38 #include "absl/memory/memory.h"
39 #include "absl/strings/match.h"
40 #include "absl/strings/str_cat.h"
41 #include "absl/strings/str_format.h"
42 #include "absl/strings/str_join.h"
43 #include "absl/strings/str_replace.h"
44 #include "absl/time/time.h"
45 #include "absl/types/optional.h"
86 #include "src/proto/grpc/testing/echo.grpc.pb.h"
87 #include "src/proto/grpc/testing/xds/ads_for_test.grpc.pb.h"
88 #include "src/proto/grpc/testing/xds/cds_for_test.grpc.pb.h"
89 #include "src/proto/grpc/testing/xds/eds_for_test.grpc.pb.h"
90 #include "src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.h"
91 #include "src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.h"
92 #include "src/proto/grpc/testing/xds/v3/ads.grpc.pb.h"
93 #include "src/proto/grpc/testing/xds/v3/aggregate_cluster.grpc.pb.h"
94 #include "src/proto/grpc/testing/xds/v3/cluster.grpc.pb.h"
95 #include "src/proto/grpc/testing/xds/v3/discovery.grpc.pb.h"
96 #include "src/proto/grpc/testing/xds/v3/endpoint.grpc.pb.h"
97 #include "src/proto/grpc/testing/xds/v3/fault.grpc.pb.h"
98 #include "src/proto/grpc/testing/xds/v3/http_connection_manager.grpc.pb.h"
99 #include "src/proto/grpc/testing/xds/v3/http_filter_rbac.grpc.pb.h"
100 #include "src/proto/grpc/testing/xds/v3/listener.grpc.pb.h"
101 #include "src/proto/grpc/testing/xds/v3/lrs.grpc.pb.h"
102 #include "src/proto/grpc/testing/xds/v3/route.grpc.pb.h"
103 #include "src/proto/grpc/testing/xds/v3/router.grpc.pb.h"
104 #include "src/proto/grpc/testing/xds/v3/tls.grpc.pb.h"
116 using ::envoy::config::listener::v3::FilterChainMatch;
117 using ::envoy::config::rbac::v3::Policy;
118 using ::envoy::config::rbac::v3::RBAC_Action;
119 using ::envoy::config::rbac::v3::RBAC_Action_ALLOW;
120 using ::envoy::config::rbac::v3::RBAC_Action_DENY;
121 using ::envoy::config::rbac::v3::RBAC_Action_LOG;
122 using ::envoy::extensions::filters::http::rbac::v3::RBAC;
123 using ::envoy::extensions::filters::http::rbac::v3::RBACPerRoute;
124 using ::envoy::extensions::transport_sockets::tls::v3::DownstreamTlsContext;
125 using ::envoy::extensions::transport_sockets::tls::v3::UpstreamTlsContext;
126 using ::envoy::type::matcher::v3::StringMatcher;
128 using ::grpc::experimental::ExternalCertificateVerifier;
129 using ::grpc::experimental::IdentityKeyCertPair;
130 using ::grpc::experimental::StaticDataCertificateProvider;
132 constexpr
char kClientCertPath[] =
"src/core/tsi/test_creds/client.pem";
133 constexpr
char kClientKeyPath[] =
"src/core/tsi/test_creds/client.key";
134 constexpr
char kBadClientCertPath[] =
"src/core/tsi/test_creds/badclient.pem";
135 constexpr
char kBadClientKeyPath[] =
"src/core/tsi/test_creds/badclient.key";
147 class CertDataMapWrapper {
154 void Set(CertDataMap
data) {
164 explicit FakeCertificateProvider(CertDataMap cert_data_map)
169 bool root_being_watched,
170 bool identity_being_watched) {
171 if (!root_being_watched && !identity_being_watched)
return;
174 grpc_error_handle error =
175 GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
176 "No certificates available for cert_name \"", cert_name,
"\""));
177 distributor_->SetErrorForCert(cert_name, GRPC_ERROR_REF(error),
178 GRPC_ERROR_REF(error));
179 GRPC_ERROR_UNREF(error);
181 absl::optional<std::string> root_certificate;
182 absl::optional<grpc_core::PemKeyCertPairList> pem_key_cert_pairs;
183 if (root_being_watched) {
184 root_certificate = it->second.root_certificate;
186 if (identity_being_watched) {
187 pem_key_cert_pairs =
it->second.identity_key_cert_pairs;
195 ~FakeCertificateProvider()
override {
206 return kFactory.Create();
220 class FakeCertificateProviderFactory
227 const char*
name()
const override {
return name_; }
235 FakeCertificateProviderFactory(
237 FakeCertificateProvider::CertDataMapWrapper* cert_data_map)
242 const char*
name()
const override {
return name_; }
247 return grpc_core::MakeRefCounted<Config>(
name_);
251 CreateCertificateProvider(
255 return grpc_core::MakeRefCounted<FakeCertificateProvider>(
265 FakeCertificateProvider::CertDataMapWrapper* g_fake1_cert_data_map =
nullptr;
266 FakeCertificateProvider::CertDataMapWrapper* g_fake2_cert_data_map =
nullptr;
268 class XdsSecurityTest :
public XdsEnd2endTest {
270 void SetUp()
override {
271 BootstrapBuilder
builder = BootstrapBuilder();
272 builder.AddCertificateProviderPlugin(
"fake_plugin1",
"fake1");
273 builder.AddCertificateProviderPlugin(
"fake_plugin2",
"fake2");
274 std::vector<std::string>
fields;
281 builder.AddCertificateProviderPlugin(
"file_plugin",
"file_watcher",
284 CreateAndStartBackends(2);
287 identity_pair_ = ReadTlsIdentityPair(kClientKeyPath, kClientCertPath);
291 ReadTlsIdentityPair(kServerKeyPath, kServerCertPath);
293 ReadTlsIdentityPair(kBadClientKeyPath, kBadClientCertPath);
300 "(foo|waterzooi).test.google.(fr|be)");
305 "waterzooi.test.google.be",
306 "*.test.youtube.com",
"192.168.1.3"};
307 EdsResourceArgs
args({
308 {
"locality0", CreateEndpointsForBackends(0, 1)},
310 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
317 void UpdateAndVerifyXdsSecurityConfiguration(
322 const std::vector<StringMatcher>& san_matchers,
323 const std::vector<std::string>& expected_authenticated_identity,
324 bool test_expects_failure =
false) {
331 EdsResourceArgs
args({
335 balancer_->ads_service()->SetEdsResource(
336 BuildEdsResource(
args, service_name.c_str()));
337 auto cluster = default_cluster_;
338 cluster.mutable_eds_cluster_config()->set_service_name(service_name);
339 if (!identity_instance_name.
empty() || !root_instance_name.
empty()) {
340 auto* transport_socket =
cluster.mutable_transport_socket();
341 transport_socket->set_name(
"envoy.transport_sockets.tls");
342 UpstreamTlsContext upstream_tls_context;
343 if (!identity_instance_name.
empty()) {
344 upstream_tls_context.mutable_common_tls_context()
345 ->mutable_tls_certificate_provider_instance()
346 ->set_instance_name(
std::string(identity_instance_name));
347 upstream_tls_context.mutable_common_tls_context()
348 ->mutable_tls_certificate_provider_instance()
349 ->set_certificate_name(
std::string(identity_certificate_name));
351 if (!root_instance_name.
empty()) {
352 upstream_tls_context.mutable_common_tls_context()
353 ->mutable_validation_context()
354 ->mutable_ca_certificate_provider_instance()
355 ->set_instance_name(
std::string(root_instance_name));
356 upstream_tls_context.mutable_common_tls_context()
357 ->mutable_validation_context()
358 ->mutable_ca_certificate_provider_instance()
359 ->set_certificate_name(
std::string(root_certificate_name));
361 if (!san_matchers.empty()) {
362 auto* validation_context =
363 upstream_tls_context.mutable_common_tls_context()
364 ->mutable_validation_context();
365 for (
const auto& san_matcher : san_matchers) {
366 *validation_context->add_match_subject_alt_names() = san_matcher;
369 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
371 balancer_->ads_service()->SetCdsResource(
cluster);
373 if (test_expects_failure) {
376 [&](
const RpcResult&
result) {
379 "RPC succeeded. Failure expected. Trying again.");
392 [&](
const RpcResult&
result) {
402 <<
"code=" <<
result.status.error_code()
403 <<
" message=" <<
result.status.error_message();
407 ->last_peer_identity(),
408 expected_authenticated_identity);
411 20 * 1000, RpcOptions());
432 TEST_P(XdsSecurityTest, UnknownTransportSocket) {
433 auto cluster = default_cluster_;
434 auto* transport_socket =
cluster.mutable_transport_socket();
435 transport_socket->set_name(
"unknown_transport_socket");
436 balancer_->ads_service()->SetCdsResource(
cluster);
438 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
441 "Unrecognized transport socket: unknown_transport_socket"));
445 TLSConfigurationWithoutValidationContextCertificateProviderInstance) {
446 auto cluster = default_cluster_;
447 auto* transport_socket =
cluster.mutable_transport_socket();
448 transport_socket->set_name(
"envoy.transport_sockets.tls");
449 balancer_->ads_service()->SetCdsResource(
cluster);
451 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
454 "ca_certificate_provider_instance found."));
459 MatchSubjectAltNamesProvidedWithoutValidationContextCertificateProviderInstance) {
460 auto cluster = default_cluster_;
461 auto* transport_socket =
cluster.mutable_transport_socket();
462 transport_socket->set_name(
"envoy.transport_sockets.tls");
463 UpstreamTlsContext upstream_tls_context;
464 auto* validation_context = upstream_tls_context.mutable_common_tls_context()
465 ->mutable_validation_context();
467 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
468 balancer_->ads_service()->SetCdsResource(
cluster);
470 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
473 "ca_certificate_provider_instance found."));
478 TlsCertificateProviderInstanceWithoutValidationContextCertificateProviderInstance) {
479 auto cluster = default_cluster_;
480 auto* transport_socket =
cluster.mutable_transport_socket();
481 transport_socket->set_name(
"envoy.transport_sockets.tls");
482 UpstreamTlsContext upstream_tls_context;
483 upstream_tls_context.mutable_common_tls_context()
484 ->mutable_tls_certificate_provider_instance()
486 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
487 balancer_->ads_service()->SetCdsResource(
cluster);
489 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
492 "ca_certificate_provider_instance found."));
495 TEST_P(XdsSecurityTest, RegexSanMatcherDoesNotAllowIgnoreCase) {
496 auto cluster = default_cluster_;
497 auto* transport_socket =
cluster.mutable_transport_socket();
498 transport_socket->set_name(
"envoy.transport_sockets.tls");
499 UpstreamTlsContext upstream_tls_context;
500 upstream_tls_context.mutable_common_tls_context()
501 ->mutable_validation_context()
502 ->mutable_ca_certificate_provider_instance()
504 auto* validation_context = upstream_tls_context.mutable_common_tls_context()
505 ->mutable_validation_context();
506 StringMatcher matcher;
507 matcher.mutable_safe_regex()->mutable_google_re2();
508 matcher.mutable_safe_regex()->set_regex(
509 "(foo|waterzooi).test.google.(fr|be)");
510 matcher.set_ignore_case(
true);
511 *validation_context->add_match_subject_alt_names() = matcher;
512 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
513 balancer_->ads_service()->SetCdsResource(
cluster);
515 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
518 "StringMatcher: ignore_case has no effect for SAFE_REGEX."));
521 TEST_P(XdsSecurityTest, UnknownRootCertificateProvider) {
522 auto cluster = default_cluster_;
523 auto* transport_socket =
cluster.mutable_transport_socket();
524 transport_socket->set_name(
"envoy.transport_sockets.tls");
525 UpstreamTlsContext upstream_tls_context;
526 upstream_tls_context.mutable_common_tls_context()
527 ->mutable_validation_context()
528 ->mutable_ca_certificate_provider_instance()
529 ->set_instance_name(
"unknown");
530 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
531 balancer_->ads_service()->SetCdsResource(
cluster);
533 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
536 "Unrecognized certificate provider instance name: unknown"));
539 TEST_P(XdsSecurityTest, UnknownIdentityCertificateProvider) {
541 auto cluster = default_cluster_;
542 auto* transport_socket =
cluster.mutable_transport_socket();
543 transport_socket->set_name(
"envoy.transport_sockets.tls");
544 UpstreamTlsContext upstream_tls_context;
545 upstream_tls_context.mutable_common_tls_context()
546 ->mutable_tls_certificate_provider_instance()
547 ->set_instance_name(
"unknown");
548 upstream_tls_context.mutable_common_tls_context()
549 ->mutable_validation_context()
550 ->mutable_ca_certificate_provider_instance()
551 ->set_instance_name(
"fake_plugin1");
552 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
553 balancer_->ads_service()->SetCdsResource(
cluster);
555 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
558 "Unrecognized certificate provider instance name: unknown"));
562 NacksCertificateValidationContextWithVerifyCertificateSpki) {
564 auto cluster = default_cluster_;
565 auto* transport_socket =
cluster.mutable_transport_socket();
566 transport_socket->set_name(
"envoy.transport_sockets.tls");
567 UpstreamTlsContext upstream_tls_context;
568 upstream_tls_context.mutable_common_tls_context()
569 ->mutable_validation_context()
570 ->mutable_ca_certificate_provider_instance()
571 ->set_instance_name(
"fake_plugin1");
572 upstream_tls_context.mutable_common_tls_context()
573 ->mutable_validation_context()
574 ->add_verify_certificate_spki(
"spki");
575 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
576 balancer_->ads_service()->SetCdsResource(
cluster);
578 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
580 response_state->error_message,
582 "CertificateValidationContext: verify_certificate_spki unsupported"));
586 NacksCertificateValidationContextWithVerifyCertificateHash) {
588 auto cluster = default_cluster_;
589 auto* transport_socket =
cluster.mutable_transport_socket();
590 transport_socket->set_name(
"envoy.transport_sockets.tls");
591 UpstreamTlsContext upstream_tls_context;
592 upstream_tls_context.mutable_common_tls_context()
593 ->mutable_validation_context()
594 ->mutable_ca_certificate_provider_instance()
595 ->set_instance_name(
"fake_plugin1");
596 upstream_tls_context.mutable_common_tls_context()
597 ->mutable_validation_context()
598 ->add_verify_certificate_hash(
"hash");
599 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
600 balancer_->ads_service()->SetCdsResource(
cluster);
602 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
604 response_state->error_message,
606 "CertificateValidationContext: verify_certificate_hash unsupported"));
610 NacksCertificateValidationContextWithRequireSignedCertificateTimes) {
612 auto cluster = default_cluster_;
613 auto* transport_socket =
cluster.mutable_transport_socket();
614 transport_socket->set_name(
"envoy.transport_sockets.tls");
615 UpstreamTlsContext upstream_tls_context;
616 upstream_tls_context.mutable_common_tls_context()
617 ->mutable_validation_context()
618 ->mutable_ca_certificate_provider_instance()
619 ->set_instance_name(
"fake_plugin1");
620 upstream_tls_context.mutable_common_tls_context()
621 ->mutable_validation_context()
622 ->mutable_require_signed_certificate_timestamp()
624 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
625 balancer_->ads_service()->SetCdsResource(
cluster);
627 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
629 response_state->error_message,
631 "require_signed_certificate_timestamp unsupported"));
634 TEST_P(XdsSecurityTest, NacksCertificateValidationContextWithCrl) {
636 auto cluster = default_cluster_;
637 auto* transport_socket =
cluster.mutable_transport_socket();
638 transport_socket->set_name(
"envoy.transport_sockets.tls");
639 UpstreamTlsContext upstream_tls_context;
640 upstream_tls_context.mutable_common_tls_context()
641 ->mutable_validation_context()
642 ->mutable_ca_certificate_provider_instance()
643 ->set_instance_name(
"fake_plugin1");
644 upstream_tls_context.mutable_common_tls_context()
645 ->mutable_validation_context()
647 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
648 balancer_->ads_service()->SetCdsResource(
cluster);
650 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
652 response_state->error_message,
657 NacksCertificateValidationContextWithCustomValidatorConfig) {
659 auto cluster = default_cluster_;
660 auto* transport_socket =
cluster.mutable_transport_socket();
661 transport_socket->set_name(
"envoy.transport_sockets.tls");
662 UpstreamTlsContext upstream_tls_context;
663 upstream_tls_context.mutable_common_tls_context()
664 ->mutable_validation_context()
665 ->mutable_ca_certificate_provider_instance()
666 ->set_instance_name(
"fake_plugin1");
667 upstream_tls_context.mutable_common_tls_context()
668 ->mutable_validation_context()
669 ->mutable_custom_validator_config();
670 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
671 balancer_->ads_service()->SetCdsResource(
cluster);
673 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
675 response_state->error_message,
677 "CertificateValidationContext: custom_validator_config unsupported"));
680 TEST_P(XdsSecurityTest, NacksValidationContextSdsSecretConfig) {
682 auto cluster = default_cluster_;
683 auto* transport_socket =
cluster.mutable_transport_socket();
684 transport_socket->set_name(
"envoy.transport_sockets.tls");
685 UpstreamTlsContext upstream_tls_context;
686 upstream_tls_context.mutable_common_tls_context()
687 ->mutable_validation_context_sds_secret_config();
688 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
689 balancer_->ads_service()->SetCdsResource(
cluster);
691 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
693 response_state->error_message,
697 TEST_P(XdsSecurityTest, NacksTlsParams) {
699 auto cluster = default_cluster_;
700 auto* transport_socket =
cluster.mutable_transport_socket();
701 transport_socket->set_name(
"envoy.transport_sockets.tls");
702 UpstreamTlsContext upstream_tls_context;
703 upstream_tls_context.mutable_common_tls_context()
704 ->mutable_validation_context()
705 ->mutable_ca_certificate_provider_instance()
706 ->set_instance_name(
"fake_plugin1");
707 upstream_tls_context.mutable_common_tls_context()->mutable_tls_params();
708 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
709 balancer_->ads_service()->SetCdsResource(
cluster);
711 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
716 TEST_P(XdsSecurityTest, NacksCustomHandshaker) {
718 auto cluster = default_cluster_;
719 auto* transport_socket =
cluster.mutable_transport_socket();
720 transport_socket->set_name(
"envoy.transport_sockets.tls");
721 UpstreamTlsContext upstream_tls_context;
722 upstream_tls_context.mutable_common_tls_context()
723 ->mutable_validation_context()
724 ->mutable_ca_certificate_provider_instance()
725 ->set_instance_name(
"fake_plugin1");
726 upstream_tls_context.mutable_common_tls_context()
727 ->mutable_custom_handshaker();
728 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
729 balancer_->ads_service()->SetCdsResource(
cluster);
731 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
736 TEST_P(XdsSecurityTest, NacksTlsCertificates) {
738 auto cluster = default_cluster_;
739 auto* transport_socket =
cluster.mutable_transport_socket();
740 transport_socket->set_name(
"envoy.transport_sockets.tls");
741 UpstreamTlsContext upstream_tls_context;
742 upstream_tls_context.mutable_common_tls_context()
743 ->mutable_validation_context()
744 ->mutable_ca_certificate_provider_instance()
745 ->set_instance_name(
"fake_plugin1");
746 upstream_tls_context.mutable_common_tls_context()->add_tls_certificates();
747 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
748 balancer_->ads_service()->SetCdsResource(
cluster);
750 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
755 TEST_P(XdsSecurityTest, NacksTlsCertificateSdsSecretConfigs) {
757 auto cluster = default_cluster_;
758 auto* transport_socket =
cluster.mutable_transport_socket();
759 transport_socket->set_name(
"envoy.transport_sockets.tls");
760 UpstreamTlsContext upstream_tls_context;
761 upstream_tls_context.mutable_common_tls_context()
762 ->mutable_validation_context()
763 ->mutable_ca_certificate_provider_instance()
764 ->set_instance_name(
"fake_plugin1");
765 upstream_tls_context.mutable_common_tls_context()
766 ->add_tls_certificate_sds_secret_configs();
767 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
768 balancer_->ads_service()->SetCdsResource(
cluster);
770 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
772 response_state->error_message,
776 TEST_P(XdsSecurityTest, TestTlsConfigurationInCombinedValidationContext) {
778 auto cluster = default_cluster_;
779 auto* transport_socket =
cluster.mutable_transport_socket();
780 transport_socket->set_name(
"envoy.transport_sockets.tls");
781 UpstreamTlsContext upstream_tls_context;
782 upstream_tls_context.mutable_common_tls_context()
783 ->mutable_combined_validation_context()
784 ->mutable_default_validation_context()
785 ->mutable_ca_certificate_provider_instance()
786 ->set_instance_name(
"fake_plugin1");
787 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
788 balancer_->ads_service()->SetCdsResource(
cluster);
794 TestTlsConfigurationInValidationContextCertificateProviderInstance) {
796 auto cluster = default_cluster_;
797 auto* transport_socket =
cluster.mutable_transport_socket();
798 transport_socket->set_name(
"envoy.transport_sockets.tls");
799 UpstreamTlsContext upstream_tls_context;
800 upstream_tls_context.mutable_common_tls_context()
801 ->mutable_combined_validation_context()
802 ->mutable_validation_context_certificate_provider_instance()
803 ->set_instance_name(
"fake_plugin1");
804 transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
805 balancer_->ads_service()->SetCdsResource(
cluster);
809 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithNoSanMatchers) {
811 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
815 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithExactSanMatcher) {
817 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
822 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithPrefixSanMatcher) {
824 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
829 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithSuffixSanMatcher) {
831 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
836 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithContainsSanMatcher) {
838 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
843 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithRegexSanMatcher) {
845 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
850 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithSanMatchersUpdate) {
852 UpdateAndVerifyXdsSecurityConfiguration(
853 "fake_plugin1",
"",
"fake_plugin1",
"",
855 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
858 UpdateAndVerifyXdsSecurityConfiguration(
859 "fake_plugin1",
"",
"fake_plugin1",
"",
863 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithRootPluginUpdate) {
866 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
869 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin2" ,
"",
870 "fake_plugin1",
"", {}, {},
872 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
877 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithIdentityPluginUpdate) {
880 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
883 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin2",
888 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithBothPluginsUpdated) {
892 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin2",
"",
"fake_plugin2",
894 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
897 UpdateAndVerifyXdsSecurityConfiguration(
902 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithRootCertificateNameUpdate) {
905 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
908 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"bad",
"fake_plugin1",
914 TestMtlsConfigurationWithIdentityCertificateNameUpdate) {
917 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
920 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
926 TestMtlsConfigurationWithIdentityCertificateNameUpdateGoodCerts) {
929 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
932 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
937 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithBothCertificateNamesUpdated) {
940 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"bad",
"fake_plugin1",
943 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
948 TEST_P(XdsSecurityTest, TestTlsConfigurationWithNoSanMatchers) {
950 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"",
"", {},
954 TEST_P(XdsSecurityTest, TestTlsConfigurationWithSanMatchers) {
956 UpdateAndVerifyXdsSecurityConfiguration(
957 "fake_plugin1",
"",
"",
"",
962 TEST_P(XdsSecurityTest, TestTlsConfigurationWithSanMatchersUpdate) {
964 UpdateAndVerifyXdsSecurityConfiguration(
967 UpdateAndVerifyXdsSecurityConfiguration(
970 UpdateAndVerifyXdsSecurityConfiguration(
975 TEST_P(XdsSecurityTest, TestTlsConfigurationWithRootCertificateNameUpdate) {
978 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"",
"",
981 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"bad",
"",
"",
986 TEST_P(XdsSecurityTest, TestTlsConfigurationWithRootPluginUpdate) {
989 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"",
"",
992 UpdateAndVerifyXdsSecurityConfiguration(
996 TEST_P(XdsSecurityTest, TestFallbackConfiguration) {
997 UpdateAndVerifyXdsSecurityConfiguration(
"",
"",
"",
"", {},
1001 TEST_P(XdsSecurityTest, TestMtlsToTls) {
1003 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
1006 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"",
"",
1011 TEST_P(XdsSecurityTest, TestMtlsToFallback) {
1013 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
1016 UpdateAndVerifyXdsSecurityConfiguration(
"",
"",
"",
"", {},
1020 TEST_P(XdsSecurityTest, TestTlsToMtls) {
1022 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"",
"",
1025 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
1030 TEST_P(XdsSecurityTest, TestTlsToFallback) {
1032 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"",
"",
1035 UpdateAndVerifyXdsSecurityConfiguration(
"",
"",
"",
"", {},
1039 TEST_P(XdsSecurityTest, TestFallbackToMtls) {
1041 UpdateAndVerifyXdsSecurityConfiguration(
"",
"",
"",
"", {},
1043 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"fake_plugin1",
1048 TEST_P(XdsSecurityTest, TestFallbackToTls) {
1050 UpdateAndVerifyXdsSecurityConfiguration(
"",
"",
"",
"", {},
1052 UpdateAndVerifyXdsSecurityConfiguration(
"fake_plugin1",
"",
"",
"",
1057 TEST_P(XdsSecurityTest, TestFileWatcherCertificateProvider) {
1058 UpdateAndVerifyXdsSecurityConfiguration(
"file_plugin",
"",
"file_plugin",
"",
1063 class XdsEnabledServerTest :
public XdsEnd2endTest {
1065 void SetUp()
override {}
1067 void DoSetUp(BootstrapBuilder
builder = BootstrapBuilder()) {
1069 CreateBackends(1,
true);
1070 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends(0, 1)}});
1071 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
1075 TEST_P(XdsEnabledServerTest, Basic) {
1081 TEST_P(XdsEnabledServerTest, ListenerDeletionIgnored) {
1082 DoSetUp(BootstrapBuilder().SetIgnoreResourceDeletion());
1095 auto response_state = balancer_->ads_service()->lds_response_state();
1096 if (!response_state.has_value())
break;
1101 balancer_->ads_service()->UnsetResource(
1107 auto response_state = balancer_->ads_service()->lds_response_state();
1108 if (!response_state.has_value()) {
1120 TEST_P(XdsEnabledServerTest, BadLdsUpdateNoApiListenerNorAddress) {
1122 Listener listener = default_server_listener_;
1123 listener.clear_address();
1125 absl::StrCat(
"grpc/server?xds.resource.listening_address=",
1127 balancer_->ads_service()->SetLdsResource(listener);
1130 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1132 response_state->error_message,
1138 TEST_P(XdsEnabledServerTest, DISABLED_BadLdsUpdateBothApiListenerAndAddress) {
1140 Listener listener = default_server_listener_;
1141 listener.mutable_api_listener();
1142 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1144 default_server_route_config_);
1147 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1149 response_state->error_message,
1153 TEST_P(XdsEnabledServerTest, NacksNonZeroXffNumTrusterHops) {
1155 Listener listener = default_server_listener_;
1156 HttpConnectionManager http_connection_manager =
1157 ServerHcmAccessor().Unpack(listener);
1158 http_connection_manager.set_xff_num_trusted_hops(1);
1159 ServerHcmAccessor().Pack(http_connection_manager, &listener);
1160 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1162 default_server_route_config_);
1165 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1170 TEST_P(XdsEnabledServerTest, NacksNonEmptyOriginalIpDetectionExtensions) {
1172 Listener listener = default_server_listener_;
1173 HttpConnectionManager http_connection_manager =
1174 ServerHcmAccessor().Unpack(listener);
1175 http_connection_manager.add_original_ip_detection_extensions();
1176 ServerHcmAccessor().Pack(http_connection_manager, &listener);
1177 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1179 default_server_route_config_);
1182 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1184 response_state->error_message,
1188 TEST_P(XdsEnabledServerTest, UnsupportedL4Filter) {
1190 Listener listener = default_server_listener_;
1191 listener.mutable_default_filter_chain()->clear_filters();
1192 listener.mutable_default_filter_chain()->add_filters()->mutable_typed_config()->PackFrom(default_listener_ );
1193 balancer_->ads_service()->SetLdsResource(
1194 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
1197 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1202 TEST_P(XdsEnabledServerTest, NacksEmptyHttpFilterList) {
1204 Listener listener = default_server_listener_;
1205 HttpConnectionManager http_connection_manager =
1206 ServerHcmAccessor().Unpack(listener);
1207 http_connection_manager.clear_http_filters();
1208 ServerHcmAccessor().Pack(http_connection_manager, &listener);
1209 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1211 default_server_route_config_);
1214 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1219 TEST_P(XdsEnabledServerTest, UnsupportedHttpFilter) {
1221 Listener listener = default_server_listener_;
1222 HttpConnectionManager http_connection_manager =
1223 ServerHcmAccessor().Unpack(listener);
1224 http_connection_manager.clear_http_filters();
1225 auto* http_filter = http_connection_manager.add_http_filters();
1226 http_filter->set_name(
"grpc.testing.unsupported_http_filter");
1227 http_filter->mutable_typed_config()->set_type_url(
1228 "custom/grpc.testing.unsupported_http_filter");
1229 http_filter = http_connection_manager.add_http_filters();
1230 http_filter->set_name(
"router");
1231 http_filter->mutable_typed_config()->PackFrom(
1232 envoy::extensions::filters::http::router::v3::Router());
1233 ServerHcmAccessor().Pack(http_connection_manager, &listener);
1234 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1236 default_server_route_config_);
1239 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1242 "grpc.testing.unsupported_http_filter"));
1245 TEST_P(XdsEnabledServerTest, HttpFilterNotSupportedOnServer) {
1247 Listener listener = default_server_listener_;
1248 HttpConnectionManager http_connection_manager =
1249 ServerHcmAccessor().Unpack(listener);
1250 http_connection_manager.clear_http_filters();
1251 auto* http_filter = http_connection_manager.add_http_filters();
1252 http_filter->set_name(
"grpc.testing.client_only_http_filter");
1253 http_filter->mutable_typed_config()->set_type_url(
1254 "custom/grpc.testing.client_only_http_filter");
1255 http_filter = http_connection_manager.add_http_filters();
1256 http_filter->set_name(
"router");
1257 http_filter->mutable_typed_config()->PackFrom(
1258 envoy::extensions::filters::http::router::v3::Router());
1259 ServerHcmAccessor().Pack(http_connection_manager, &listener);
1260 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1262 default_server_route_config_);
1265 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1267 response_state->error_message,
1269 "supported on servers"));
1272 TEST_P(XdsEnabledServerTest,
1273 HttpFilterNotSupportedOnServerIgnoredWhenOptional) {
1275 Listener listener = default_server_listener_;
1276 HttpConnectionManager http_connection_manager =
1277 ServerHcmAccessor().Unpack(listener);
1278 http_connection_manager.clear_http_filters();
1279 auto* http_filter = http_connection_manager.add_http_filters();
1280 http_filter->set_name(
"grpc.testing.client_only_http_filter");
1281 http_filter->mutable_typed_config()->set_type_url(
1282 "custom/grpc.testing.client_only_http_filter");
1283 http_filter->set_is_optional(
true);
1284 http_filter = http_connection_manager.add_http_filters();
1285 http_filter->set_name(
"router");
1286 http_filter->mutable_typed_config()->PackFrom(
1287 envoy::extensions::filters::http::router::v3::Router());
1288 ServerHcmAccessor().Pack(http_connection_manager, &listener);
1289 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1291 default_server_route_config_);
1294 auto response_state = balancer_->ads_service()->lds_response_state();
1301 TEST_P(XdsEnabledServerTest, ListenerAddressMismatch) {
1303 Listener listener = default_server_listener_;
1305 listener.mutable_address()->mutable_socket_address()->set_address(
1307 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1309 default_server_route_config_);
1311 backends_[0]->notifier()->WaitOnServingStatusChange(
1316 TEST_P(XdsEnabledServerTest, UseOriginalDstNotSupported) {
1318 Listener listener = default_server_listener_;
1319 listener.mutable_use_original_dst()->set_value(
true);
1320 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1322 default_server_route_config_);
1325 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1327 response_state->error_message,
1331 class XdsServerSecurityTest :
public XdsEnd2endTest {
1333 void SetUp()
override {
1334 BootstrapBuilder
builder = BootstrapBuilder();
1335 builder.AddCertificateProviderPlugin(
"fake_plugin1",
"fake1");
1336 builder.AddCertificateProviderPlugin(
"fake_plugin2",
"fake2");
1337 std::vector<std::string>
fields;
1344 builder.AddCertificateProviderPlugin(
"file_plugin",
"file_watcher",
1347 CreateBackends(1,
true);
1350 identity_pair_ = ReadTlsIdentityPair(kServerKeyPath, kServerCertPath);
1352 ReadTlsIdentityPair(kBadClientKeyPath, kBadClientCertPath);
1355 "waterzooi.test.google.be",
1356 "*.test.youtube.com",
"192.168.1.3"};
1359 "waterzooi.test.google.be",
1360 "*.test.youtube.com",
"192.168.1.3"};
1361 EdsResourceArgs
args({
1362 {
"locality0", CreateEndpointsForBackends(0, 1)},
1364 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
1371 bool require_client_certificates) {
1372 Listener listener = default_server_listener_;
1373 auto* filter_chain = listener.mutable_default_filter_chain();
1374 if (!identity_instance_name.
empty()) {
1375 auto* transport_socket = filter_chain->mutable_transport_socket();
1376 transport_socket->set_name(
"envoy.transport_sockets.tls");
1377 DownstreamTlsContext downstream_tls_context;
1378 downstream_tls_context.mutable_common_tls_context()
1379 ->mutable_tls_certificate_provider_instance()
1380 ->set_instance_name(
std::string(identity_instance_name));
1381 downstream_tls_context.mutable_common_tls_context()
1382 ->mutable_tls_certificate_provider_instance()
1383 ->set_certificate_name(
std::string(identity_certificate_name));
1384 if (!root_instance_name.
empty()) {
1385 downstream_tls_context.mutable_common_tls_context()
1386 ->mutable_validation_context()
1387 ->mutable_ca_certificate_provider_instance()
1388 ->set_instance_name(
std::string(root_instance_name));
1389 downstream_tls_context.mutable_common_tls_context()
1390 ->mutable_validation_context()
1391 ->mutable_ca_certificate_provider_instance()
1392 ->set_certificate_name(
std::string(root_certificate_name));
1393 downstream_tls_context.mutable_require_client_certificate()->set_value(
1394 require_client_certificates);
1396 transport_socket->mutable_typed_config()->PackFrom(
1397 downstream_tls_context);
1399 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1401 default_server_route_config_);
1404 std::shared_ptr<grpc::Channel> CreateMtlsChannel() {
1405 ChannelArguments
args;
1412 IdentityKeyCertPair key_cert_pair;
1413 key_cert_pair.private_key =
ReadFile(kServerKeyPath);
1414 key_cert_pair.certificate_chain =
ReadFile(kServerCertPath);
1417 auto certificate_provider = std::make_shared<StaticDataCertificateProvider>(
1422 options.watch_identity_key_cert_pairs();
1424 ExternalCertificateVerifier::Create<SyncCertificateVerifier>(
true);
1425 options.set_verify_server_certs(
true);
1432 std::shared_ptr<grpc::Channel> CreateTlsChannel() {
1433 ChannelArguments
args;
1440 auto certificate_provider =
1441 std::make_shared<StaticDataCertificateProvider>(
ReadFile(kCaCertPath));
1446 ExternalCertificateVerifier::Create<SyncCertificateVerifier>(
true);
1447 options.set_verify_server_certs(
true);
1454 std::shared_ptr<grpc::Channel> CreateInsecureChannel(
1455 bool use_put_requests =
false) {
1456 ChannelArguments
args;
1461 if (use_put_requests) {
1470 std::function<std::shared_ptr<grpc::Channel>()> channel_creator,
1471 std::vector<std::string> expected_server_identity,
1472 std::vector<std::string> expected_client_identity,
1473 bool test_expects_failure =
false,
1477 constexpr
int kRetryCount = 100;
1479 for (; num_tries < kRetryCount ||
absl::Now() < overall_deadline;
1481 auto channel = channel_creator();
1482 auto stub = grpc::testing::EchoTestService::NewStub(
channel);
1491 request.mutable_param()->set_skip_cancelled_check(
true);
1492 request.set_message(kRequestMessage);
1495 if (test_expects_failure) {
1500 if (expected_status.has_value() &&
1501 *expected_status !=
status.error_code()) {
1503 "Expected status does not match Actual(%d) vs Expected(%d)",
1504 status.error_code(), *expected_status);
1514 std::vector<std::string> peer_identity;
1516 peer_identity.emplace_back(
1519 if (peer_identity != expected_server_identity) {
1521 "Expected server identity does not match. (actual) %s vs "
1522 "(expected) %s Trying again.",
1528 expected_client_identity) {
1531 "Expected client identity does not match. (actual) %s vs "
1532 "(expected) %s Trying again.",
1555 TEST_P(XdsServerSecurityTest, UnknownTransportSocket) {
1556 Listener listener = default_server_listener_;
1557 auto* filter_chain = listener.mutable_default_filter_chain();
1558 auto* transport_socket = filter_chain->mutable_transport_socket();
1559 transport_socket->set_name(
"unknown_transport_socket");
1560 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1562 default_server_route_config_);
1565 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1568 "Unrecognized transport socket: unknown_transport_socket"));
1571 TEST_P(XdsServerSecurityTest, NacksRequireSNI) {
1572 Listener listener = default_server_listener_;
1573 auto* filter_chain = listener.mutable_default_filter_chain();
1574 auto* transport_socket = filter_chain->mutable_transport_socket();
1575 transport_socket->set_name(
"envoy.transport_sockets.tls");
1576 DownstreamTlsContext downstream_tls_context;
1577 downstream_tls_context.mutable_common_tls_context()
1578 ->mutable_tls_certificate_provider_instance()
1579 ->set_instance_name(
"fake_plugin1");
1580 downstream_tls_context.mutable_require_sni()->set_value(
true);
1581 transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1582 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1584 default_server_route_config_);
1587 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1592 TEST_P(XdsServerSecurityTest, NacksOcspStaplePolicyOtherThanLenientStapling) {
1593 Listener listener = default_server_listener_;
1594 auto* filter_chain = listener.mutable_default_filter_chain();
1595 auto* transport_socket = filter_chain->mutable_transport_socket();
1596 transport_socket->set_name(
"envoy.transport_sockets.tls");
1597 DownstreamTlsContext downstream_tls_context;
1598 downstream_tls_context.mutable_common_tls_context()
1599 ->mutable_tls_certificate_provider_instance()
1600 ->set_instance_name(
"fake_plugin1");
1601 downstream_tls_context.set_ocsp_staple_policy(
1602 envoy::extensions::transport_sockets::tls::v3::
1603 DownstreamTlsContext_OcspStaplePolicy_STRICT_STAPLING);
1604 transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1605 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1607 default_server_route_config_);
1610 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1613 "ocsp_staple_policy: Only LENIENT_STAPLING supported"));
1617 XdsServerSecurityTest,
1618 NacksRequiringClientCertificateWithoutValidationCertificateProviderInstance) {
1619 Listener listener = default_server_listener_;
1620 auto* filter_chain = listener.mutable_default_filter_chain();
1621 auto* transport_socket = filter_chain->mutable_transport_socket();
1622 transport_socket->set_name(
"envoy.transport_sockets.tls");
1623 DownstreamTlsContext downstream_tls_context;
1624 downstream_tls_context.mutable_common_tls_context()
1625 ->mutable_tls_certificate_provider_instance()
1626 ->set_instance_name(
"fake_plugin1");
1627 downstream_tls_context.mutable_require_client_certificate()->set_value(
true);
1628 transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1629 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1631 default_server_route_config_);
1634 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1637 "TLS configuration requires client certificates but no "
1638 "certificate provider instance specified for validation."));
1641 TEST_P(XdsServerSecurityTest,
1642 NacksTlsConfigurationWithoutIdentityProviderInstance) {
1643 Listener listener = default_server_listener_;
1644 auto* filter_chain = listener.mutable_default_filter_chain();
1645 auto* transport_socket = filter_chain->mutable_transport_socket();
1646 transport_socket->set_name(
"envoy.transport_sockets.tls");
1647 DownstreamTlsContext downstream_tls_context;
1648 transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1649 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1651 default_server_route_config_);
1654 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1657 "tls_certificate_provider_instance found."));
1660 TEST_P(XdsServerSecurityTest, NacksMatchSubjectAltNames) {
1661 Listener listener = default_server_listener_;
1662 auto* filter_chain = listener.mutable_default_filter_chain();
1663 auto* transport_socket = filter_chain->mutable_transport_socket();
1664 transport_socket->set_name(
"envoy.transport_sockets.tls");
1665 DownstreamTlsContext downstream_tls_context;
1666 downstream_tls_context.mutable_common_tls_context()
1667 ->mutable_tls_certificate_provider_instance()
1668 ->set_instance_name(
"fake_plugin1");
1669 downstream_tls_context.mutable_common_tls_context()
1670 ->mutable_validation_context()
1671 ->add_match_subject_alt_names()
1672 ->set_exact(
"*.test.google.fr");
1673 transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1674 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1676 default_server_route_config_);
1679 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1681 response_state->error_message,
1685 TEST_P(XdsServerSecurityTest, UnknownIdentityCertificateProvider) {
1686 SetLdsUpdate(
"",
"",
"unknown",
"",
false);
1687 SendRpc([
this]() {
return CreateTlsChannel(); }, {}, {},
1691 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1694 "Unrecognized certificate provider instance name: unknown"));
1697 TEST_P(XdsServerSecurityTest, UnknownRootCertificateProvider) {
1699 SetLdsUpdate(
"unknown",
"",
"fake_plugin1",
"",
false);
1702 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
1705 "Unrecognized certificate provider instance name: unknown"));
1708 TEST_P(XdsServerSecurityTest,
1709 TestDeprecateTlsCertificateCertificateProviderInstanceField) {
1711 Listener listener = default_server_listener_;
1712 auto* filter_chain = listener.mutable_default_filter_chain();
1713 filter_chain->mutable_filters()->at(0).mutable_typed_config()->PackFrom(
1714 ServerHcmAccessor().Unpack(listener));
1715 auto* transport_socket = filter_chain->mutable_transport_socket();
1716 transport_socket->set_name(
"envoy.transport_sockets.tls");
1717 DownstreamTlsContext downstream_tls_context;
1718 downstream_tls_context.mutable_common_tls_context()
1719 ->mutable_tls_certificate_certificate_provider_instance()
1720 ->set_instance_name(
"fake_plugin1");
1721 transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1722 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1724 default_server_route_config_);
1726 SendRpc([
this]() {
return CreateTlsChannel(); },
1730 TEST_P(XdsServerSecurityTest, CertificatesNotAvailable) {
1731 g_fake1_cert_data_map->Set({});
1732 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1733 SendRpc([
this]() {
return CreateMtlsChannel(); }, {}, {},
1737 TEST_P(XdsServerSecurityTest, TestMtls) {
1739 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1741 SendRpc([
this]() {
return CreateMtlsChannel(); },
1745 TEST_P(XdsServerSecurityTest, TestMtlsWithRootPluginUpdate) {
1748 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1750 SendRpc([
this]() {
return CreateMtlsChannel(); },
1752 SetLdsUpdate(
"fake_plugin2",
"",
"fake_plugin1",
"",
true);
1753 SendRpc([
this]() {
return CreateMtlsChannel(); }, {}, {},
1757 TEST_P(XdsServerSecurityTest, TestMtlsWithIdentityPluginUpdate) {
1760 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1762 SendRpc([
this]() {
return CreateMtlsChannel(); },
1764 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin2",
"",
true);
1765 SendRpc([
this]() {
return CreateMtlsChannel(); },
1769 TEST_P(XdsServerSecurityTest, TestMtlsWithBothPluginsUpdated) {
1773 SetLdsUpdate(
"fake_plugin2",
"",
"fake_plugin2",
"",
true);
1775 SendRpc([
this]() {
return CreateMtlsChannel(); }, {}, {},
1777 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1778 SendRpc([
this]() {
return CreateMtlsChannel(); },
1780 SetLdsUpdate(
"fake_plugin2",
"good",
"fake_plugin2",
"good",
true);
1781 SendRpc([
this]() {
return CreateMtlsChannel(); },
1785 TEST_P(XdsServerSecurityTest, TestMtlsWithRootCertificateNameUpdate) {
1788 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1790 SendRpc([
this]() {
return CreateMtlsChannel(); },
1792 SetLdsUpdate(
"fake_plugin1",
"bad",
"fake_plugin1",
"",
true);
1793 SendRpc([
this]() {
return CreateMtlsChannel(); }, {}, {},
1797 TEST_P(XdsServerSecurityTest, TestMtlsWithIdentityCertificateNameUpdate) {
1800 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1802 SendRpc([
this]() {
return CreateMtlsChannel(); },
1804 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"good",
true);
1805 SendRpc([
this]() {
return CreateMtlsChannel(); },
1809 TEST_P(XdsServerSecurityTest, TestMtlsWithBothCertificateNamesUpdated) {
1812 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1814 SendRpc([
this]() {
return CreateMtlsChannel(); },
1816 SetLdsUpdate(
"fake_plugin1",
"good",
"fake_plugin1",
"good",
true);
1817 SendRpc([
this]() {
return CreateMtlsChannel(); },
1821 TEST_P(XdsServerSecurityTest, TestMtlsNotRequiringButProvidingClientCerts) {
1823 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
false);
1825 SendRpc([
this]() {
return CreateMtlsChannel(); },
1829 TEST_P(XdsServerSecurityTest, TestMtlsNotRequiringAndNotProvidingClientCerts) {
1831 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
false);
1833 SendRpc([
this]() {
return CreateTlsChannel(); },
1837 TEST_P(XdsServerSecurityTest, TestTls) {
1839 SetLdsUpdate(
"",
"",
"fake_plugin1",
"",
false);
1841 SendRpc([
this]() {
return CreateTlsChannel(); },
1845 TEST_P(XdsServerSecurityTest, TestTlsWithIdentityPluginUpdate) {
1848 SetLdsUpdate(
"",
"",
"fake_plugin1",
"",
false);
1850 SendRpc([
this]() {
return CreateTlsChannel(); },
1852 SetLdsUpdate(
"",
"",
"fake_plugin2",
"",
false);
1853 SendRpc([
this]() {
return CreateTlsChannel(); },
1857 TEST_P(XdsServerSecurityTest, TestTlsWithIdentityCertificateNameUpdate) {
1860 SetLdsUpdate(
"",
"",
"fake_plugin1",
"",
false);
1862 SendRpc([
this]() {
return CreateTlsChannel(); },
1864 SetLdsUpdate(
"",
"",
"fake_plugin1",
"good",
false);
1865 SendRpc([
this]() {
return CreateTlsChannel(); },
1869 TEST_P(XdsServerSecurityTest, TestFallback) {
1871 SetLdsUpdate(
"",
"",
"",
"",
false);
1873 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1876 TEST_P(XdsServerSecurityTest, TestMtlsToTls) {
1878 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1880 SendRpc([
this]() {
return CreateTlsChannel(); }, {}, {},
1882 SetLdsUpdate(
"",
"",
"fake_plugin1",
"",
false);
1883 SendRpc([
this]() {
return CreateTlsChannel(); },
1887 TEST_P(XdsServerSecurityTest, TestTlsToMtls) {
1889 SetLdsUpdate(
"",
"",
"fake_plugin1",
"",
false);
1891 SendRpc([
this]() {
return CreateTlsChannel(); },
1893 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1894 SendRpc([
this]() {
return CreateTlsChannel(); }, {}, {},
1898 TEST_P(XdsServerSecurityTest, TestMtlsToFallback) {
1900 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
false);
1902 SendRpc([
this]() {
return CreateMtlsChannel(); },
1904 SetLdsUpdate(
"",
"",
"",
"",
false);
1905 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1908 TEST_P(XdsServerSecurityTest, TestFallbackToMtls) {
1910 SetLdsUpdate(
"",
"",
"",
"",
false);
1912 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1913 SetLdsUpdate(
"fake_plugin1",
"",
"fake_plugin1",
"",
true);
1914 SendRpc([
this]() {
return CreateMtlsChannel(); },
1918 TEST_P(XdsServerSecurityTest, TestTlsToFallback) {
1920 SetLdsUpdate(
"",
"",
"fake_plugin1",
"",
false);
1922 SendRpc([
this]() {
return CreateTlsChannel(); },
1924 SetLdsUpdate(
"",
"",
"",
"",
false);
1925 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1928 TEST_P(XdsServerSecurityTest, TestFallbackToTls) {
1930 SetLdsUpdate(
"",
"",
"",
"",
false);
1932 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1933 SetLdsUpdate(
"",
"",
"fake_plugin1",
"",
false);
1934 SendRpc([
this]() {
return CreateTlsChannel(); },
1938 class XdsEnabledServerStatusNotificationTest :
public XdsServerSecurityTest {
1940 void SetValidLdsUpdate() { SetLdsUpdate(
"",
"",
"",
"",
false); }
1942 void SetInvalidLdsUpdate() {
1943 Listener listener = default_server_listener_;
1944 listener.clear_address();
1946 "grpc/server?xds.resource.listening_address=",
1948 balancer_->ads_service()->SetLdsResource(listener);
1951 void UnsetLdsUpdate() {
1952 balancer_->ads_service()->UnsetResource(
1959 TEST_P(XdsEnabledServerStatusNotificationTest, ServingStatus) {
1960 SetValidLdsUpdate();
1962 backends_[0]->notifier()->WaitOnServingStatusChange(
1965 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1968 TEST_P(XdsEnabledServerStatusNotificationTest, NotServingStatus) {
1969 SetInvalidLdsUpdate();
1971 backends_[0]->notifier()->WaitOnServingStatusChange(
1974 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
1978 TEST_P(XdsEnabledServerStatusNotificationTest, ErrorUpdateWhenAlreadyServing) {
1979 SetValidLdsUpdate();
1981 backends_[0]->notifier()->WaitOnServingStatusChange(
1984 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1986 SetInvalidLdsUpdate();
1988 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1989 }
while (!balancer_->ads_service()->lds_response_state().has_value());
1990 backends_[0]->notifier()->WaitOnServingStatusChange(
1993 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
1996 TEST_P(XdsEnabledServerStatusNotificationTest,
1997 NotServingStatusToServingStatusTransition) {
1998 SetInvalidLdsUpdate();
2000 backends_[0]->notifier()->WaitOnServingStatusChange(
2003 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2006 SetValidLdsUpdate();
2007 backends_[0]->notifier()->WaitOnServingStatusChange(
2010 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2015 TEST_P(XdsEnabledServerStatusNotificationTest,
2016 ServingStatusToNonServingStatusTransition) {
2017 SetValidLdsUpdate();
2019 backends_[0]->notifier()->WaitOnServingStatusChange(
2022 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2025 backends_[0]->notifier()->WaitOnServingStatusChange(
2028 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2032 TEST_P(XdsEnabledServerStatusNotificationTest, RepeatedServingStatusChanges) {
2034 for (
int i = 0;
i < 5;
i++) {
2036 SetValidLdsUpdate();
2037 backends_[0]->notifier()->WaitOnServingStatusChange(
2041 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2044 backends_[0]->notifier()->WaitOnServingStatusChange(
2048 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2053 TEST_P(XdsEnabledServerStatusNotificationTest, ExistingRpcsOnResourceDeletion) {
2055 SetValidLdsUpdate();
2057 backends_[0]->notifier()->WaitOnServingStatusChange(
2060 constexpr
int kNumChannels = 10;
2061 struct StreamingRpc {
2062 std::shared_ptr<Channel>
channel;
2063 std::unique_ptr<grpc::testing::EchoTestService::Stub>
stub;
2065 std::unique_ptr<ClientReaderWriter<EchoRequest, EchoResponse>>
stream;
2066 } streaming_rpcs[kNumChannels];
2070 for (
int i = 0;
i < kNumChannels;
i++) {
2071 streaming_rpcs[
i].channel = CreateInsecureChannel();
2072 streaming_rpcs[
i].stub =
2073 grpc::testing::EchoTestService::NewStub(streaming_rpcs[i].
channel);
2074 streaming_rpcs[
i].context.set_wait_for_ready(
true);
2075 streaming_rpcs[
i].stream =
2076 streaming_rpcs[
i].stub->BidiStream(&streaming_rpcs[i].
context);
2078 streaming_rpcs[
i].stream->Read(&
response);
2083 backends_[0]->notifier()->WaitOnServingStatusChange(
2086 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2088 for (
int i = 0;
i < kNumChannels;
i++) {
2090 streaming_rpcs[
i].stream->Read(&
response);
2093 auto status = streaming_rpcs[
i].stream->Finish();
2095 <<
status.error_message() <<
", " <<
status.error_details() <<
", "
2096 << streaming_rpcs[
i].context.debug_error_string();
2098 ClientContext new_context;
2105 TEST_P(XdsEnabledServerStatusNotificationTest,
2106 ExistingRpcsFailOnResourceUpdateAfterDrainGraceTimeExpires) {
2107 constexpr
int kDrainGraceTimeMs = 100;
2108 xds_drain_grace_time_ms_ = kDrainGraceTimeMs;
2111 SetValidLdsUpdate();
2113 backends_[0]->notifier()->WaitOnServingStatusChange(
2116 constexpr
int kNumChannels = 10;
2117 struct StreamingRpc {
2118 std::shared_ptr<Channel>
channel;
2119 std::unique_ptr<grpc::testing::EchoTestService::Stub>
stub;
2121 std::unique_ptr<ClientReaderWriter<EchoRequest, EchoResponse>>
stream;
2122 } streaming_rpcs[kNumChannels];
2126 for (
int i = 0;
i < kNumChannels;
i++) {
2127 streaming_rpcs[
i].channel = CreateInsecureChannel();
2128 streaming_rpcs[
i].stub =
2129 grpc::testing::EchoTestService::NewStub(streaming_rpcs[i].
channel);
2130 streaming_rpcs[
i].context.set_wait_for_ready(
true);
2131 streaming_rpcs[
i].stream =
2132 streaming_rpcs[
i].stub->BidiStream(&streaming_rpcs[i].
context);
2134 streaming_rpcs[
i].stream->Read(&
response);
2139 SetLdsUpdate(
"",
"",
"fake_plugin1",
"",
false);
2141 SendRpc([
this]() {
return CreateTlsChannel(); },
2144 for (
int i = 0;
i < kNumChannels;
i++) {
2148 EXPECT_GE(NowFromCycleCounter() - update_time,
2150 auto status = streaming_rpcs[
i].stream->Finish();
2152 <<
status.error_code() <<
", " <<
status.error_message() <<
", "
2153 <<
status.error_details() <<
", "
2154 << streaming_rpcs[
i].context.debug_error_string();
2158 using XdsServerFilterChainMatchTest = XdsServerSecurityTest;
2160 TEST_P(XdsServerFilterChainMatchTest,
2161 DefaultFilterChainUsedWhenNoFilterChainMentioned) {
2163 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2166 TEST_P(XdsServerFilterChainMatchTest,
2167 DefaultFilterChainUsedWhenOtherFilterChainsDontMatch) {
2168 Listener listener = default_server_listener_;
2170 auto* filter_chain = listener.add_filter_chains();
2171 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2172 ServerHcmAccessor().Unpack(listener));
2173 filter_chain->mutable_filter_chain_match()
2174 ->mutable_destination_port()
2176 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2178 default_server_route_config_);
2180 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2183 TEST_P(XdsServerFilterChainMatchTest,
2184 FilterChainsWithDestinationPortDontMatch) {
2185 Listener listener = default_server_listener_;
2187 auto* filter_chain = listener.add_filter_chains();
2188 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2189 ServerHcmAccessor().Unpack(listener));
2190 filter_chain->mutable_filter_chain_match()
2191 ->mutable_destination_port()
2193 listener.clear_default_filter_chain();
2194 balancer_->ads_service()->SetLdsResource(
2195 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2199 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2203 TEST_P(XdsServerFilterChainMatchTest, FilterChainsWithServerNamesDontMatch) {
2204 Listener listener = default_server_listener_;
2206 auto* filter_chain = listener.add_filter_chains();
2207 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2208 ServerHcmAccessor().Unpack(listener));
2209 filter_chain->mutable_filter_chain_match()->add_server_names(
"server_name");
2210 listener.clear_default_filter_chain();
2211 balancer_->ads_service()->SetLdsResource(
2212 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2216 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2220 TEST_P(XdsServerFilterChainMatchTest,
2221 FilterChainsWithTransportProtocolsOtherThanRawBufferDontMatch) {
2222 Listener listener = default_server_listener_;
2224 auto* filter_chain = listener.add_filter_chains();
2225 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2226 ServerHcmAccessor().Unpack(listener));
2227 filter_chain->mutable_filter_chain_match()->set_transport_protocol(
"tls");
2228 listener.clear_default_filter_chain();
2229 balancer_->ads_service()->SetLdsResource(
2230 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2234 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2238 TEST_P(XdsServerFilterChainMatchTest,
2239 FilterChainsWithApplicationProtocolsDontMatch) {
2240 Listener listener = default_server_listener_;
2242 auto* filter_chain = listener.add_filter_chains();
2243 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2244 ServerHcmAccessor().Unpack(listener));
2245 filter_chain->mutable_filter_chain_match()->add_application_protocols(
"h2");
2246 listener.clear_default_filter_chain();
2247 balancer_->ads_service()->SetLdsResource(
2248 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2252 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2256 TEST_P(XdsServerFilterChainMatchTest,
2257 FilterChainsWithTransportProtocolRawBufferIsPreferred) {
2258 Listener listener = default_server_listener_;
2260 auto* filter_chain = listener.add_filter_chains();
2261 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2262 ServerHcmAccessor().Unpack(listener));
2263 filter_chain->mutable_filter_chain_match()->set_transport_protocol(
2267 filter_chain = listener.add_filter_chains();
2268 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2269 ServerHcmAccessor().Unpack(listener));
2270 filter_chain->mutable_filter_chain_match()->add_application_protocols(
"h2");
2271 listener.clear_default_filter_chain();
2272 balancer_->ads_service()->SetLdsResource(
2273 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2277 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2280 TEST_P(XdsServerFilterChainMatchTest,
2281 FilterChainsWithMoreSpecificDestinationPrefixRangesArePreferred) {
2282 Listener listener = default_server_listener_;
2285 auto* filter_chain = listener.add_filter_chains();
2286 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2287 ServerHcmAccessor().Unpack(listener));
2289 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2293 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2296 filter_chain->mutable_filter_chain_match()->add_server_names(
"server_name");
2299 filter_chain = listener.add_filter_chains();
2300 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2301 ServerHcmAccessor().Unpack(listener));
2303 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2307 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2312 filter_chain = listener.add_filter_chains();
2313 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2314 ServerHcmAccessor().Unpack(listener));
2316 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2319 filter_chain->mutable_filter_chain_match()->add_server_names(
"server_name");
2321 filter_chain = listener.add_filter_chains();
2322 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2323 ServerHcmAccessor().Unpack(listener));
2324 filter_chain->mutable_filter_chain_match()->add_server_names(
"server_name");
2325 listener.clear_default_filter_chain();
2326 balancer_->ads_service()->SetLdsResource(
2327 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2331 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2334 TEST_P(XdsServerFilterChainMatchTest,
2335 FilterChainsThatMentionSourceTypeArePreferred) {
2336 Listener listener = default_server_listener_;
2338 auto* filter_chain = listener.add_filter_chains();
2339 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2340 ServerHcmAccessor().Unpack(listener));
2341 filter_chain->mutable_filter_chain_match()->set_source_type(
2342 FilterChainMatch::SAME_IP_OR_LOOPBACK);
2346 filter_chain = listener.add_filter_chains();
2347 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2348 ServerHcmAccessor().Unpack(listener));
2349 filter_chain->mutable_filter_chain_match()->set_source_type(
2351 filter_chain->mutable_filter_chain_match()->add_source_ports(
2354 filter_chain = listener.add_filter_chains();
2355 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2356 ServerHcmAccessor().Unpack(listener));
2357 filter_chain->mutable_filter_chain_match()->add_source_ports(
2359 listener.clear_default_filter_chain();
2360 balancer_->ads_service()->SetLdsResource(
2361 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2365 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2368 TEST_P(XdsServerFilterChainMatchTest,
2369 FilterChainsWithMoreSpecificSourcePrefixRangesArePreferred) {
2370 Listener listener = default_server_listener_;
2375 auto* filter_chain = listener.add_filter_chains();
2376 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2377 ServerHcmAccessor().Unpack(listener));
2378 auto* source_prefix_range =
2379 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2380 source_prefix_range->set_address_prefix(
ipv6_only_ ?
"::1" :
"127.0.0.1");
2381 source_prefix_range->mutable_prefix_len()->set_value(4);
2382 source_prefix_range =
2383 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2384 source_prefix_range->set_address_prefix(
ipv6_only_ ?
"::1" :
"127.0.0.1");
2385 source_prefix_range->mutable_prefix_len()->set_value(16);
2386 filter_chain->mutable_filter_chain_match()->add_source_ports(
2390 filter_chain = listener.add_filter_chains();
2391 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2392 ServerHcmAccessor().Unpack(listener));
2393 source_prefix_range =
2394 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2395 source_prefix_range->set_address_prefix(
ipv6_only_ ?
"::1" :
"127.0.0.1");
2396 source_prefix_range->mutable_prefix_len()->set_value(8);
2397 source_prefix_range =
2398 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2399 source_prefix_range->set_address_prefix(
ipv6_only_ ?
"::1" :
"127.0.0.1");
2400 source_prefix_range->mutable_prefix_len()->set_value(24);
2403 filter_chain = listener.add_filter_chains();
2404 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2405 ServerHcmAccessor().Unpack(listener));
2406 source_prefix_range =
2407 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2408 source_prefix_range->set_address_prefix(
"192.168.1.1");
2409 source_prefix_range->mutable_prefix_len()->set_value(30);
2410 filter_chain->mutable_filter_chain_match()->add_source_ports(
2414 filter_chain = listener.add_filter_chains();
2415 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2416 ServerHcmAccessor().Unpack(listener));
2417 filter_chain->mutable_filter_chain_match()->add_source_ports(
2419 listener.clear_default_filter_chain();
2420 balancer_->ads_service()->SetLdsResource(
2421 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2425 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2428 TEST_P(XdsServerFilterChainMatchTest,
2429 FilterChainsWithMoreSpecificSourcePortArePreferred) {
2430 Listener listener = default_server_listener_;
2431 auto* filter_chain = listener.add_filter_chains();
2432 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2433 ServerHcmAccessor().Unpack(listener));
2436 for (
int i = 1;
i < 65536;
i++) {
2437 filter_chain->mutable_filter_chain_match()->add_source_ports(i);
2441 filter_chain = listener.add_filter_chains();
2442 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2443 ServerHcmAccessor().Unpack(listener));
2444 auto* transport_socket = filter_chain->mutable_transport_socket();
2445 transport_socket->set_name(
"envoy.transport_sockets.tls");
2446 DownstreamTlsContext downstream_tls_context;
2447 downstream_tls_context.mutable_common_tls_context()
2448 ->mutable_tls_certificate_provider_instance()
2449 ->set_instance_name(
"fake_plugin1");
2450 transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
2451 listener.clear_default_filter_chain();
2452 balancer_->ads_service()->SetLdsResource(
2453 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port()));
2457 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2460 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchNacked) {
2461 Listener listener = default_server_listener_;
2463 auto* filter_chain = listener.add_filter_chains();
2464 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2465 ServerHcmAccessor().Unpack(listener));
2467 filter_chain = listener.add_filter_chains();
2468 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2469 ServerHcmAccessor().Unpack(listener));
2470 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2472 default_server_route_config_);
2475 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2477 response_state->error_message,
2479 "Duplicate matching rules detected when adding filter chain: {}"));
2482 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnPrefixRangesNacked) {
2483 Listener listener = default_server_listener_;
2485 auto* filter_chain = listener.add_filter_chains();
2486 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2487 ServerHcmAccessor().Unpack(listener));
2489 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2493 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2497 filter_chain = listener.add_filter_chains();
2498 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2499 ServerHcmAccessor().Unpack(listener));
2501 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2505 filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2508 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2510 default_server_route_config_);
2513 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2516 response_state->error_message,
2518 "Duplicate matching rules detected when adding filter chain: "
2519 "{prefix_ranges={{address_prefix=[::]:0, prefix_len=16}, "
2520 "{address_prefix=[::]:0, prefix_len=32}}}"));
2523 response_state->error_message,
2525 "Duplicate matching rules detected when adding filter chain: "
2526 "{prefix_ranges={{address_prefix=127.0.0.0:0, prefix_len=16}, "
2527 "{address_prefix=127.0.0.1:0, prefix_len=32}}}"));
2531 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnTransportProtocolNacked) {
2532 Listener listener = default_server_listener_;
2534 auto* filter_chain = listener.add_filter_chains();
2535 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2536 ServerHcmAccessor().Unpack(listener));
2537 filter_chain->mutable_filter_chain_match()->set_transport_protocol(
2541 filter_chain = listener.add_filter_chains();
2542 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2543 ServerHcmAccessor().Unpack(listener));
2544 filter_chain->mutable_filter_chain_match()->set_transport_protocol(
2546 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2548 default_server_route_config_);
2551 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2553 response_state->error_message,
2555 "filter chain: {transport_protocol=raw_buffer}"));
2558 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnLocalSourceTypeNacked) {
2559 Listener listener = default_server_listener_;
2561 auto* filter_chain = listener.add_filter_chains();
2562 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2563 ServerHcmAccessor().Unpack(listener));
2564 filter_chain->mutable_filter_chain_match()->set_source_type(
2565 FilterChainMatch::SAME_IP_OR_LOOPBACK);
2567 filter_chain = listener.add_filter_chains();
2568 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2569 ServerHcmAccessor().Unpack(listener));
2570 filter_chain->mutable_filter_chain_match()->set_source_type(
2571 FilterChainMatch::SAME_IP_OR_LOOPBACK);
2572 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2574 default_server_route_config_);
2577 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2579 response_state->error_message,
2581 "filter chain: {source_type=SAME_IP_OR_LOOPBACK}"));
2584 TEST_P(XdsServerFilterChainMatchTest,
2585 DuplicateMatchOnExternalSourceTypeNacked) {
2586 Listener listener = default_server_listener_;
2588 auto* filter_chain = listener.add_filter_chains();
2589 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2590 ServerHcmAccessor().Unpack(listener));
2591 filter_chain->mutable_filter_chain_match()->set_source_type(
2594 filter_chain = listener.add_filter_chains();
2595 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2596 ServerHcmAccessor().Unpack(listener));
2597 filter_chain->mutable_filter_chain_match()->set_source_type(
2599 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2601 default_server_route_config_);
2604 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2606 response_state->error_message,
2608 "filter chain: {source_type=EXTERNAL}"));
2611 TEST_P(XdsServerFilterChainMatchTest,
2612 DuplicateMatchOnSourcePrefixRangesNacked) {
2613 Listener listener = default_server_listener_;
2615 auto* filter_chain = listener.add_filter_chains();
2616 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2617 ServerHcmAccessor().Unpack(listener));
2619 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2623 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2627 filter_chain = listener.add_filter_chains();
2628 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2629 ServerHcmAccessor().Unpack(listener));
2631 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2635 filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2638 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2640 default_server_route_config_);
2643 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2646 response_state->error_message,
2648 "Duplicate matching rules detected when adding filter chain: "
2649 "{source_prefix_ranges={{address_prefix=[::]:0, prefix_len=16}, "
2650 "{address_prefix=[::]:0, prefix_len=32}}}"));
2653 response_state->error_message,
2655 "Duplicate matching rules detected when adding filter chain: "
2656 "{source_prefix_ranges={{address_prefix=127.0.0.0:0, "
2658 "{address_prefix=127.0.0.1:0, prefix_len=32}}}"));
2662 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnSourcePortNacked) {
2663 Listener listener = default_server_listener_;
2665 auto* filter_chain = listener.add_filter_chains();
2666 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2667 ServerHcmAccessor().Unpack(listener));
2668 filter_chain->mutable_filter_chain_match()->add_source_ports(8080);
2670 filter_chain = listener.add_filter_chains();
2671 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2672 ServerHcmAccessor().Unpack(listener));
2673 filter_chain->mutable_filter_chain_match()->add_source_ports(8080);
2674 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2676 default_server_route_config_);
2679 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2681 response_state->error_message,
2683 "filter chain: {source_ports={8080}}"));
2686 class XdsServerRdsTest :
public XdsEnabledServerStatusNotificationTest {
2688 XdsServerRdsTest() :
env_var_(
"GRPC_XDS_EXPERIMENTAL_RBAC") {}
2693 TEST_P(XdsServerRdsTest, Basic) {
2695 backends_[0]->notifier()->WaitOnServingStatusChange(
2698 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2701 TEST_P(XdsServerRdsTest, NacksInvalidDomainPattern) {
2702 RouteConfiguration route_config = default_server_route_config_;
2703 route_config.mutable_virtual_hosts()->at(0).add_domains(
"");
2704 SetServerListenerNameAndRouteConfiguration(
2705 balancer_.get(), default_server_listener_,
backends_[0]->port(),
2708 const auto response_state = WaitForRouteConfigNack(
DEBUG_LOCATION);
2709 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2714 TEST_P(XdsServerRdsTest, NacksEmptyDomainsList) {
2715 RouteConfiguration route_config = default_server_route_config_;
2716 route_config.mutable_virtual_hosts()->at(0).clear_domains();
2717 SetServerListenerNameAndRouteConfiguration(
2718 balancer_.get(), default_server_listener_,
backends_[0]->port(),
2721 const auto response_state = WaitForRouteConfigNack(
DEBUG_LOCATION);
2722 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2727 TEST_P(XdsServerRdsTest, NacksEmptyRoutesList) {
2728 RouteConfiguration route_config = default_server_route_config_;
2729 route_config.mutable_virtual_hosts()->at(0).clear_routes();
2730 SetServerListenerNameAndRouteConfiguration(
2731 balancer_.get(), default_server_listener_,
backends_[0]->port(),
2734 const auto response_state = WaitForRouteConfigNack(
DEBUG_LOCATION);
2735 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2740 TEST_P(XdsServerRdsTest, NacksEmptyMatch) {
2741 RouteConfiguration route_config = default_server_route_config_;
2742 route_config.mutable_virtual_hosts()
2747 SetServerListenerNameAndRouteConfiguration(
2748 balancer_.get(), default_server_listener_,
backends_[0]->port(),
2751 const auto response_state = WaitForRouteConfigNack(
DEBUG_LOCATION);
2752 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2757 TEST_P(XdsServerRdsTest, FailsRouteMatchesOtherThanNonForwardingAction) {
2758 SetServerListenerNameAndRouteConfiguration(
2759 balancer_.get(), default_server_listener_,
backends_[0]->port(),
2760 default_route_config_ );
2763 backends_[0]->notifier()->WaitOnServingStatusChange(
2766 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2772 TEST_P(XdsServerRdsTest, NonInlineRouteConfigurationNonDefaultFilterChain) {
2773 if (!GetParam().enable_rds_testing()) {
2776 Listener listener = default_server_listener_;
2777 auto* filter_chain = listener.add_filter_chains();
2778 HttpConnectionManager http_connection_manager =
2779 ServerHcmAccessor().Unpack(listener);
2780 auto* rds = http_connection_manager.mutable_rds();
2781 rds->set_route_config_name(kDefaultServerRouteConfigurationName);
2782 rds->mutable_config_source()->mutable_self();
2783 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2784 http_connection_manager);
2785 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2787 default_server_route_config_);
2789 backends_[0]->notifier()->WaitOnServingStatusChange(
2792 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2795 TEST_P(XdsServerRdsTest, NonInlineRouteConfigurationNotAvailable) {
2796 if (!GetParam().enable_rds_testing()) {
2799 Listener listener = default_server_listener_;
2800 PopulateServerListenerNameAndPort(listener,
backends_[0]->
port());
2801 HttpConnectionManager http_connection_manager =
2802 ServerHcmAccessor().Unpack(listener);
2803 auto* rds = http_connection_manager.mutable_rds();
2804 rds->set_route_config_name(
"unknown_server_route_config");
2805 rds->mutable_config_source()->mutable_self();
2806 listener.add_filter_chains()->add_filters()->mutable_typed_config()->PackFrom(
2807 http_connection_manager);
2808 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2810 default_server_route_config_);
2812 backends_[0]->notifier()->WaitOnServingStatusChange(
2815 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
2822 TEST_P(XdsServerRdsTest, MultipleRouteConfigurations) {
2823 Listener listener = default_server_listener_;
2825 auto new_route_config = default_server_route_config_;
2826 new_route_config.set_name(
"new_server_route_config");
2827 HttpConnectionManager http_connection_manager =
2828 ServerHcmAccessor().Unpack(listener);
2829 auto* rds = http_connection_manager.mutable_rds();
2830 rds->set_route_config_name(new_route_config.name());
2831 rds->mutable_config_source()->mutable_self();
2832 listener.add_filter_chains()->add_filters()->mutable_typed_config()->PackFrom(
2833 http_connection_manager);
2835 auto another_route_config = default_server_route_config_;
2836 another_route_config.set_name(
"another_server_route_config");
2837 http_connection_manager.mutable_rds()->set_route_config_name(
2838 another_route_config.name());
2839 auto* filter_chain = listener.add_filter_chains();
2840 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2841 http_connection_manager);
2842 filter_chain->mutable_filter_chain_match()->set_source_type(
2843 FilterChainMatch::SAME_IP_OR_LOOPBACK);
2845 filter_chain = listener.add_filter_chains();
2846 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2847 http_connection_manager);
2848 filter_chain->mutable_filter_chain_match()->set_source_type(
2851 filter_chain = listener.add_filter_chains();
2852 filter_chain->mutable_filter_chain_match()->add_source_ports(1234);
2853 http_connection_manager = ServerHcmAccessor().Unpack(listener);
2854 *http_connection_manager.mutable_route_config() =
2855 default_server_route_config_;
2856 filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2857 http_connection_manager);
2859 balancer_->ads_service()->SetRdsResource(new_route_config);
2860 balancer_->ads_service()->SetRdsResource(another_route_config);
2861 SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2863 default_server_route_config_);
2865 backends_[0]->notifier()->WaitOnServingStatusChange(
2868 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2873 class XdsRbacTest :
public XdsServerRdsTest {
2875 void SetServerRbacPolicies(
Listener listener,
2876 const std::vector<RBAC>& rbac_policies) {
2877 HttpConnectionManager http_connection_manager =
2878 ServerHcmAccessor().Unpack(listener);
2879 http_connection_manager.clear_http_filters();
2880 RouteConfiguration route_config = default_server_route_config_;
2882 for (
auto& rbac : rbac_policies) {
2883 auto* filter = http_connection_manager.add_http_filters();
2885 filter->set_name(filter_name);
2886 switch (GetParam().filter_config_setup()) {
2887 case XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInListener:
2888 filter->mutable_typed_config()->PackFrom(rbac);
2890 case XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute:
2891 filter->mutable_typed_config()->PackFrom(RBAC());
2893 RBACPerRoute rbac_per_route;
2894 *rbac_per_route.mutable_rbac() = rbac;
2895 filter_config.
PackFrom(rbac_per_route);
2896 auto* config_map = route_config.mutable_virtual_hosts(0)
2898 ->mutable_typed_per_filter_config();
2899 (*config_map)[filter_name] =
std::move(filter_config);
2902 auto* filter = http_connection_manager.add_http_filters();
2903 filter->set_name(
"router");
2904 filter->mutable_typed_config()->PackFrom(
2905 envoy::extensions::filters::http::router::v3::Router());
2906 ServerHcmAccessor().Pack(http_connection_manager, &listener);
2907 SetServerListenerNameAndRouteConfiguration(
2908 balancer_.get(), listener,
backends_[0]->port(), route_config);
2911 void SetServerRbacPolicy(
Listener listener,
const RBAC& rbac) {
2912 SetServerRbacPolicies(
std::move(listener), {rbac});
2915 void SetServerRbacPolicy(
const RBAC& rbac) {
2916 SetServerRbacPolicy(default_server_listener_, rbac);
2920 TEST_P(XdsRbacTest, AbsentRbacPolicy) {
2921 SetServerRbacPolicy(RBAC());
2923 backends_[0]->notifier()->WaitOnServingStatusChange(
2927 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2930 TEST_P(XdsRbacTest, LogAction) {
2932 auto*
rules = rbac.mutable_rules();
2933 rules->set_action(envoy::config::rbac::v3::RBAC_Action_LOG);
2934 SetServerRbacPolicy(rbac);
2936 backends_[0]->notifier()->WaitOnServingStatusChange(
2940 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
2943 using XdsRbacNackTest = XdsRbacTest;
2945 TEST_P(XdsRbacNackTest, NacksSchemePrincipalHeader) {
2947 auto*
rules = rbac.mutable_rules();
2948 rules->set_action(envoy::config::rbac::v3::RBAC_Action_ALLOW);
2950 auto*
header = policy.add_principals()->mutable_header();
2951 header->set_name(
":scheme");
2952 header->set_exact_match(
"http");
2953 policy.add_permissions()->set_any(
true);
2954 (*
rules->mutable_policies())[
"policy"] = policy;
2955 SetServerRbacPolicy(rbac);
2957 if (GetParam().enable_rds_testing() &&
2958 GetParam().filter_config_setup() ==
2959 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute) {
2961 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2966 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2972 TEST_P(XdsRbacNackTest, NacksGrpcPrefixedPrincipalHeaders) {
2974 auto*
rules = rbac.mutable_rules();
2975 rules->set_action(envoy::config::rbac::v3::RBAC_Action_ALLOW);
2977 auto*
header = policy.add_principals()->mutable_header();
2978 header->set_name(
"grpc-status");
2979 header->set_exact_match(
"0");
2980 policy.add_permissions()->set_any(
true);
2981 (*
rules->mutable_policies())[
"policy"] = policy;
2982 SetServerRbacPolicy(rbac);
2984 if (GetParam().enable_rds_testing() &&
2985 GetParam().filter_config_setup() ==
2986 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute) {
2988 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2993 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
2999 TEST_P(XdsRbacNackTest, NacksSchemePermissionHeader) {
3001 auto*
rules = rbac.mutable_rules();
3002 rules->set_action(envoy::config::rbac::v3::RBAC_Action_ALLOW);
3004 auto*
header = policy.add_permissions()->mutable_header();
3005 header->set_name(
":scheme");
3006 header->set_exact_match(
"http");
3007 policy.add_principals()->set_any(
true);
3008 (*
rules->mutable_policies())[
"policy"] = policy;
3009 SetServerRbacPolicy(rbac);
3011 if (GetParam().enable_rds_testing() &&
3012 GetParam().filter_config_setup() ==
3013 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute) {
3015 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
3020 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
3026 TEST_P(XdsRbacNackTest, NacksGrpcPrefixedPermissionHeaders) {
3028 auto*
rules = rbac.mutable_rules();
3029 rules->set_action(envoy::config::rbac::v3::RBAC_Action_ALLOW);
3031 auto*
header = policy.add_permissions()->mutable_header();
3032 header->set_name(
"grpc-status");
3033 header->set_exact_match(
"0");
3034 policy.add_principals()->set_any(
true);
3035 (*
rules->mutable_policies())[
"policy"] = policy;
3036 SetServerRbacPolicy(rbac);
3038 if (GetParam().enable_rds_testing() &&
3039 GetParam().filter_config_setup() ==
3040 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute) {
3042 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
3047 ASSERT_TRUE(response_state.has_value()) <<
"timed out waiting for NACK";
3055 using XdsRbacTestWithRouteOverrideAlwaysPresent = XdsRbacTest;
3057 TEST_P(XdsRbacTestWithRouteOverrideAlwaysPresent, EmptyRBACPerRouteOverride) {
3058 HttpConnectionManager http_connection_manager;
3059 Listener listener = default_server_listener_;
3060 RouteConfiguration route_config = default_server_route_config_;
3061 auto* filter = http_connection_manager.add_http_filters();
3062 filter->set_name(
"rbac");
3065 auto*
rules = rbac.mutable_rules();
3066 rules->set_action(RBAC_Action_DENY);
3068 policy.add_permissions()->set_any(
true);
3069 policy.add_principals()->set_any(
true);
3070 (*
rules->mutable_policies())[
"policy"] = policy;
3071 filter->mutable_typed_config()->PackFrom(rbac);
3075 filter_config.
PackFrom(RBACPerRoute());
3076 auto* config_map = route_config.mutable_virtual_hosts(0)
3078 ->mutable_typed_per_filter_config();
3079 (*config_map)[
"rbac"] =
std::move(filter_config);
3080 filter = http_connection_manager.add_http_filters();
3081 filter->set_name(
"router");
3082 filter->mutable_typed_config()->PackFrom(
3083 envoy::extensions::filters::http::router::v3::Router());
3084 ServerHcmAccessor().Pack(http_connection_manager, &listener);
3085 SetServerListenerNameAndRouteConfiguration(
3086 balancer_.get(), listener,
backends_[0]->port(), route_config);
3088 backends_[0]->notifier()->WaitOnServingStatusChange(
3091 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
3095 TEST_P(XdsRbacTestWithRouteOverrideAlwaysPresent,
3096 NonEmptyTopLevelRBACNonEmptyPerRouteOverride) {
3097 HttpConnectionManager http_connection_manager;
3098 Listener listener = default_server_listener_;
3099 RouteConfiguration route_config = default_server_route_config_;
3100 auto* filter = http_connection_manager.add_http_filters();
3101 filter->set_name(
"rbac");
3104 auto*
rules = rbac.mutable_rules();
3105 rules->set_action(RBAC_Action_DENY);
3107 policy.add_permissions()->set_any(
true);
3108 policy.add_principals()->set_any(
true);
3109 (*
rules->mutable_policies())[
"policy"] = policy;
3110 filter->mutable_typed_config()->PackFrom(rbac);
3113 RBACPerRoute rbac_per_route;
3114 rules = rbac_per_route.mutable_rbac()->mutable_rules();
3115 rules->set_action(RBAC_Action_ALLOW);
3116 (*
rules->mutable_policies())[
"policy"] = policy;
3117 filter_config.PackFrom(RBACPerRoute());
3118 auto* config_map = route_config.mutable_virtual_hosts(0)
3120 ->mutable_typed_per_filter_config();
3121 (*config_map)[
"rbac"] =
std::move(filter_config);
3122 filter = http_connection_manager.add_http_filters();
3123 filter->set_name(
"router");
3124 filter->mutable_typed_config()->PackFrom(
3125 envoy::extensions::filters::http::router::v3::Router());
3126 ServerHcmAccessor().Pack(http_connection_manager, &listener);
3127 SetServerListenerNameAndRouteConfiguration(
3128 balancer_.get(), listener,
backends_[0]->port(), route_config);
3130 backends_[0]->notifier()->WaitOnServingStatusChange(
3133 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {});
3137 using XdsRbacTestWithActionPermutations = XdsRbacTest;
3139 TEST_P(XdsRbacTestWithActionPermutations, EmptyRbacPolicy) {
3141 rbac.mutable_rules()->set_action(GetParam().rbac_action());
3142 SetServerRbacPolicy(rbac);
3144 backends_[0]->notifier()->WaitOnServingStatusChange(
3149 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3150 GetParam().rbac_action() == RBAC_Action_ALLOW,
3154 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionAnyPrincipal) {
3156 auto*
rules = rbac.mutable_rules();
3157 rules->set_action(GetParam().rbac_action());
3159 policy.add_permissions()->set_any(
true);
3160 policy.add_principals()->set_any(
true);
3161 (*
rules->mutable_policies())[
"policy"] = policy;
3162 SetServerRbacPolicy(rbac);
3164 backends_[0]->notifier()->WaitOnServingStatusChange(
3167 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3168 GetParam().rbac_action() == RBAC_Action_DENY,
3172 TEST_P(XdsRbacTestWithActionPermutations, MultipleRbacPolicies) {
3174 auto*
rules = always_allow.mutable_rules();
3175 rules->set_action(RBAC_Action_ALLOW);
3177 policy.add_permissions()->set_any(
true);
3178 policy.add_principals()->set_any(
true);
3179 (*
rules->mutable_policies())[
"policy"] = policy;
3181 rules = rbac.mutable_rules();
3182 rules->set_action(GetParam().rbac_action());
3183 (*
rules->mutable_policies())[
"policy"] = policy;
3184 SetServerRbacPolicies(default_server_listener_,
3185 {always_allow, rbac, always_allow});
3187 backends_[0]->notifier()->WaitOnServingStatusChange(
3190 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3191 GetParam().rbac_action() == RBAC_Action_DENY,
3195 TEST_P(XdsRbacTestWithActionPermutations, MethodPostPermissionAnyPrincipal) {
3197 auto*
rules = rbac.mutable_rules();
3198 rules->set_action(GetParam().rbac_action());
3200 auto*
header = policy.add_permissions()->mutable_header();
3201 header->set_name(
":method");
3202 header->set_exact_match(
"POST");
3203 policy.add_principals()->set_any(
true);
3204 (*
rules->mutable_policies())[
"policy"] = policy;
3205 SetServerRbacPolicy(rbac);
3206 backends_[0]->set_allow_put_requests(
true);
3208 backends_[0]->notifier()->WaitOnServingStatusChange(
3212 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3213 GetParam().rbac_action() == RBAC_Action_DENY,
3216 SendRpc([
this]() {
return CreateInsecureChannel(
true); },
3218 GetParam().rbac_action() != RBAC_Action_DENY,
3222 TEST_P(XdsRbacTestWithActionPermutations, MethodGetPermissionAnyPrincipal) {
3224 auto*
rules = rbac.mutable_rules();
3225 rules->set_action(GetParam().rbac_action());
3227 auto*
header = policy.add_permissions()->mutable_header();
3228 header->set_name(
":method");
3229 header->set_exact_match(
"GET");
3230 policy.add_principals()->set_any(
true);
3231 (*
rules->mutable_policies())[
"policy"] = policy;
3232 SetServerRbacPolicy(rbac);
3234 backends_[0]->notifier()->WaitOnServingStatusChange(
3239 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3240 GetParam().rbac_action() == RBAC_Action_ALLOW,
3246 TEST_P(XdsRbacTestWithActionPermutations, MethodPutPermissionAnyPrincipal) {
3248 auto*
rules = rbac.mutable_rules();
3249 rules->set_action(GetParam().rbac_action());
3251 auto*
header = policy.add_permissions()->mutable_header();
3252 header->set_name(
":method");
3253 header->set_exact_match(
"PUT");
3254 policy.add_principals()->set_any(
true);
3255 (*
rules->mutable_policies())[
"policy"] = policy;
3256 SetServerRbacPolicy(rbac);
3257 backends_[0]->set_allow_put_requests(
true);
3259 backends_[0]->notifier()->WaitOnServingStatusChange(
3264 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3265 GetParam().rbac_action() == RBAC_Action_ALLOW,
3269 [
this]() {
return CreateInsecureChannel(
true); }, {},
3271 GetParam().rbac_action() != RBAC_Action_ALLOW,
3275 TEST_P(XdsRbacTestWithActionPermutations, UrlPathPermissionAnyPrincipal) {
3277 auto*
rules = rbac.mutable_rules();
3278 rules->set_action(GetParam().rbac_action());
3280 policy.add_permissions()->mutable_url_path()->mutable_path()->set_exact(
3281 "/grpc.testing.EchoTestService/Echo");
3282 policy.add_principals()->set_any(
true);
3283 (*
rules->mutable_policies())[
"policy"] = policy;
3284 SetServerRbacPolicy(rbac);
3286 backends_[0]->notifier()->WaitOnServingStatusChange(
3289 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3290 GetParam().rbac_action() == RBAC_Action_DENY,
3293 auto stub = grpc::testing::EchoTestService::NewStub(CreateInsecureChannel());
3298 request.set_message(kRequestMessage);
3303 <<
status.error_code() <<
", " <<
status.error_message() <<
", "
3307 TEST_P(XdsRbacTestWithActionPermutations, DestinationIpPermissionAnyPrincipal) {
3309 auto*
rules = rbac.mutable_rules();
3310 rules->set_action(GetParam().rbac_action());
3312 auto*
range = policy.add_permissions()->mutable_destination_ip();
3315 policy.add_principals()->set_any(
true);
3316 (*
rules->mutable_policies())[
"policy"] = policy;
3317 SetServerRbacPolicy(rbac);
3319 backends_[0]->notifier()->WaitOnServingStatusChange(
3322 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3323 GetParam().rbac_action() == RBAC_Action_DENY,
3326 policy.clear_permissions();
3327 range = policy.add_permissions()->mutable_destination_ip();
3330 (*
rules->mutable_policies())[
"policy"] = policy;
3331 SetServerRbacPolicy(rbac);
3333 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3334 GetParam().rbac_action() == RBAC_Action_ALLOW,
3338 TEST_P(XdsRbacTestWithActionPermutations,
3339 DestinationPortPermissionAnyPrincipal) {
3341 auto*
rules = rbac.mutable_rules();
3342 rules->set_action(GetParam().rbac_action());
3344 policy.add_permissions()->set_destination_port(
backends_[0]->
port());
3345 policy.add_principals()->set_any(
true);
3346 (*
rules->mutable_policies())[
"policy"] = policy;
3347 SetServerRbacPolicy(rbac);
3349 backends_[0]->notifier()->WaitOnServingStatusChange(
3352 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3353 GetParam().rbac_action() == RBAC_Action_DENY,
3356 policy.clear_permissions();
3357 policy.add_permissions()->set_destination_port(1);
3358 (*
rules->mutable_policies())[
"policy"] = policy;
3359 SetServerRbacPolicy(rbac);
3361 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3362 GetParam().rbac_action() == RBAC_Action_ALLOW,
3366 TEST_P(XdsRbacTestWithActionPermutations, MetadataPermissionAnyPrincipal) {
3368 auto*
rules = rbac.mutable_rules();
3369 rules->set_action(GetParam().rbac_action());
3371 policy.add_permissions()->mutable_metadata();
3372 policy.add_principals()->set_any(
true);
3373 (*
rules->mutable_policies())[
"policy"] = policy;
3374 SetServerRbacPolicy(rbac);
3376 backends_[0]->notifier()->WaitOnServingStatusChange(
3380 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3381 GetParam().rbac_action() == RBAC_Action_ALLOW,
3384 policy.clear_permissions();
3385 policy.add_permissions()->mutable_metadata()->set_invert(
true);
3386 (*
rules->mutable_policies())[
"policy"] = policy;
3387 SetServerRbacPolicy(rbac);
3388 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3389 GetParam().rbac_action() == RBAC_Action_DENY,
3393 TEST_P(XdsRbacTestWithActionPermutations, ReqServerNamePermissionAnyPrincipal) {
3395 auto*
rules = rbac.mutable_rules();
3396 rules->set_action(GetParam().rbac_action());
3398 policy.add_principals()->set_any(
true);
3399 policy.add_permissions()->mutable_requested_server_name()->set_exact(
3401 (*
rules->mutable_policies())[
"policy"] = policy;
3402 SetServerRbacPolicy(rbac);
3404 backends_[0]->notifier()->WaitOnServingStatusChange(
3408 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3409 GetParam().rbac_action() == RBAC_Action_ALLOW,
3411 policy.clear_permissions();
3412 policy.add_permissions()->mutable_requested_server_name()->set_exact(
"");
3413 (*
rules->mutable_policies())[
"policy"] = policy;
3414 SetServerRbacPolicy(rbac);
3415 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3416 GetParam().rbac_action() == RBAC_Action_DENY,
3420 TEST_P(XdsRbacTestWithActionPermutations, NotRulePermissionAnyPrincipal) {
3422 auto*
rules = rbac.mutable_rules();
3423 rules->set_action(GetParam().rbac_action());
3425 policy.add_permissions()
3426 ->mutable_not_rule()
3427 ->mutable_requested_server_name()
3428 ->set_exact(
"server_name");
3429 policy.add_principals()->set_any(
true);
3430 (*
rules->mutable_policies())[
"policy"] = policy;
3431 SetServerRbacPolicy(rbac);
3433 backends_[0]->notifier()->WaitOnServingStatusChange(
3436 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3437 GetParam().rbac_action() == RBAC_Action_DENY,
3440 policy.clear_permissions();
3441 policy.add_permissions()->mutable_not_rule()->set_any(
true);
3442 (*
rules->mutable_policies())[
"policy"] = policy;
3443 SetServerRbacPolicy(rbac);
3445 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3446 GetParam().rbac_action() == RBAC_Action_ALLOW,
3450 TEST_P(XdsRbacTestWithActionPermutations, AndRulePermissionAnyPrincipal) {
3452 auto*
rules = rbac.mutable_rules();
3453 rules->set_action(GetParam().rbac_action());
3455 auto* and_rules = policy.add_permissions()->mutable_and_rules();
3456 and_rules->add_rules()->set_any(
true);
3457 and_rules->add_rules()->set_destination_port(
backends_[0]->
port());
3458 policy.add_principals()->set_any(
true);
3459 (*
rules->mutable_policies())[
"policy"] = policy;
3460 SetServerRbacPolicy(rbac);
3462 backends_[0]->notifier()->WaitOnServingStatusChange(
3465 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3466 GetParam().rbac_action() == RBAC_Action_DENY,
3469 and_rules = (*policy.mutable_permissions())[0].mutable_and_rules();
3470 (*and_rules->mutable_rules())[1].set_destination_port(1);
3471 (*
rules->mutable_policies())[
"policy"] = policy;
3472 SetServerRbacPolicy(rbac);
3474 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3475 GetParam().rbac_action() == RBAC_Action_ALLOW,
3479 TEST_P(XdsRbacTestWithActionPermutations, OrRulePermissionAnyPrincipal) {
3481 auto*
rules = rbac.mutable_rules();
3482 rules->set_action(GetParam().rbac_action());
3484 auto* or_rules = policy.add_permissions()->mutable_or_rules();
3485 or_rules->add_rules()->mutable_not_rule()->set_any(
true);
3486 or_rules->add_rules()->set_destination_port(
backends_[0]->
port());
3487 policy.add_principals()->set_any(
true);
3488 (*
rules->mutable_policies())[
"policy"] = policy;
3489 SetServerRbacPolicy(rbac);
3491 backends_[0]->notifier()->WaitOnServingStatusChange(
3494 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3495 GetParam().rbac_action() == RBAC_Action_DENY,
3498 or_rules = (*policy.mutable_permissions())[0].mutable_or_rules();
3499 (*or_rules->mutable_rules())[1].set_destination_port(1);
3500 (*
rules->mutable_policies())[
"policy"] = policy;
3501 SetServerRbacPolicy(rbac);
3503 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3504 GetParam().rbac_action() == RBAC_Action_ALLOW,
3508 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionMethodPostPrincipal) {
3510 auto*
rules = rbac.mutable_rules();
3511 rules->set_action(GetParam().rbac_action());
3513 auto*
header = policy.add_principals()->mutable_header();
3514 header->set_name(
":method");
3515 header->set_exact_match(
"POST");
3516 policy.add_permissions()->set_any(
true);
3517 (*
rules->mutable_policies())[
"policy"] = policy;
3518 SetServerRbacPolicy(rbac);
3519 backends_[0]->set_allow_put_requests(
true);
3521 backends_[0]->notifier()->WaitOnServingStatusChange(
3525 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3526 GetParam().rbac_action() == RBAC_Action_DENY,
3529 SendRpc([
this]() {
return CreateInsecureChannel(
true); },
3531 GetParam().rbac_action() != RBAC_Action_DENY,
3535 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionMethodGetPrincipal) {
3537 auto*
rules = rbac.mutable_rules();
3538 rules->set_action(GetParam().rbac_action());
3540 auto*
header = policy.add_principals()->mutable_header();
3541 header->set_name(
":method");
3542 header->set_exact_match(
"GET");
3543 policy.add_permissions()->set_any(
true);
3544 (*
rules->mutable_policies())[
"policy"] = policy;
3545 SetServerRbacPolicy(rbac);
3547 backends_[0]->notifier()->WaitOnServingStatusChange(
3552 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3553 GetParam().rbac_action() == RBAC_Action_ALLOW,
3559 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionMethodPutPrincipal) {
3561 auto*
rules = rbac.mutable_rules();
3562 rules->set_action(GetParam().rbac_action());
3564 auto*
header = policy.add_principals()->mutable_header();
3565 header->set_name(
":method");
3566 header->set_exact_match(
"PUT");
3567 policy.add_permissions()->set_any(
true);
3568 (*
rules->mutable_policies())[
"policy"] = policy;
3569 SetServerRbacPolicy(rbac);
3570 backends_[0]->set_allow_put_requests(
true);
3572 backends_[0]->notifier()->WaitOnServingStatusChange(
3577 [
this]() {
return CreateInsecureChannel(
true); }, {},
3579 GetParam().rbac_action() != RBAC_Action_ALLOW,
3583 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3584 GetParam().rbac_action() == RBAC_Action_ALLOW,
3588 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionUrlPathPrincipal) {
3590 auto*
rules = rbac.mutable_rules();
3591 rules->set_action(GetParam().rbac_action());
3593 policy.add_principals()->mutable_url_path()->mutable_path()->set_exact(
3594 "/grpc.testing.EchoTestService/Echo");
3595 policy.add_permissions()->set_any(
true);
3596 (*
rules->mutable_policies())[
"policy"] = policy;
3597 SetServerRbacPolicy(rbac);
3599 backends_[0]->notifier()->WaitOnServingStatusChange(
3602 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3603 GetParam().rbac_action() == RBAC_Action_DENY,
3606 auto stub = grpc::testing::EchoTestService::NewStub(CreateInsecureChannel());
3611 request.set_message(kRequestMessage);
3616 <<
status.error_code() <<
", " <<
status.error_message() <<
", "
3620 TEST_P(XdsRbacTestWithActionPermutations,
3621 AnyPermissionDirectRemoteIpPrincipal) {
3623 auto*
rules = rbac.mutable_rules();
3624 rules->set_action(GetParam().rbac_action());
3626 auto*
range = policy.add_principals()->mutable_direct_remote_ip();
3629 policy.add_permissions()->set_any(
true);
3630 (*
rules->mutable_policies())[
"policy"] = policy;
3631 SetServerRbacPolicy(rbac);
3633 backends_[0]->notifier()->WaitOnServingStatusChange(
3636 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3637 GetParam().rbac_action() == RBAC_Action_DENY,
3640 policy.clear_principals();
3641 range = policy.add_principals()->mutable_direct_remote_ip();
3644 (*
rules->mutable_policies())[
"policy"] = policy;
3645 SetServerRbacPolicy(rbac);
3647 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3648 GetParam().rbac_action() == RBAC_Action_ALLOW,
3652 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionRemoteIpPrincipal) {
3654 auto*
rules = rbac.mutable_rules();
3655 rules->set_action(GetParam().rbac_action());
3657 auto*
range = policy.add_principals()->mutable_remote_ip();
3660 policy.add_permissions()->set_any(
true);
3661 (*
rules->mutable_policies())[
"policy"] = policy;
3662 SetServerRbacPolicy(rbac);
3664 backends_[0]->notifier()->WaitOnServingStatusChange(
3667 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3668 GetParam().rbac_action() == RBAC_Action_DENY,
3671 policy.clear_principals();
3672 range = policy.add_principals()->mutable_remote_ip();
3675 (*
rules->mutable_policies())[
"policy"] = policy;
3676 SetServerRbacPolicy(rbac);
3678 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3679 GetParam().rbac_action() == RBAC_Action_ALLOW,
3683 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionAuthenticatedPrincipal) {
3685 Listener listener = default_server_listener_;
3686 auto* filter_chain = listener.mutable_default_filter_chain();
3687 auto* transport_socket = filter_chain->mutable_transport_socket();
3688 transport_socket->set_name(
"envoy.transport_sockets.tls");
3689 DownstreamTlsContext downstream_tls_context;
3690 downstream_tls_context.mutable_common_tls_context()
3691 ->mutable_tls_certificate_provider_instance()
3692 ->set_instance_name(
"fake_plugin1");
3693 downstream_tls_context.mutable_common_tls_context()
3694 ->mutable_validation_context()
3695 ->mutable_ca_certificate_provider_instance()
3696 ->set_instance_name(
"fake_plugin1");
3697 downstream_tls_context.mutable_require_client_certificate()->set_value(
true);
3698 transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
3700 auto*
rules = rbac.mutable_rules();
3701 rules->set_action(GetParam().rbac_action());
3703 policy.add_principals()
3704 ->mutable_authenticated()
3705 ->mutable_principal_name()
3706 ->set_exact(
"*.test.google.fr");
3707 policy.add_permissions()->set_any(
true);
3708 (*
rules->mutable_policies())[
"policy"] = policy;
3709 SetServerRbacPolicy(listener, rbac);
3711 backends_[0]->notifier()->WaitOnServingStatusChange(
3714 SendRpc([
this]() {
return CreateMtlsChannel(); },
3716 GetParam().rbac_action() == RBAC_Action_DENY,
3720 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionMetadataPrincipal) {
3722 auto*
rules = rbac.mutable_rules();
3723 rules->set_action(GetParam().rbac_action());
3725 policy.add_principals()->mutable_metadata();
3726 policy.add_permissions()->set_any(
true);
3727 (*
rules->mutable_policies())[
"policy"] = policy;
3728 SetServerRbacPolicy(rbac);
3730 backends_[0]->notifier()->WaitOnServingStatusChange(
3734 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3735 GetParam().rbac_action() == RBAC_Action_ALLOW,
3738 policy.clear_principals();
3739 policy.add_principals()->mutable_metadata()->set_invert(
true);
3740 (*
rules->mutable_policies())[
"policy"] = policy;
3741 SetServerRbacPolicy(rbac);
3742 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3743 GetParam().rbac_action() == RBAC_Action_DENY,
3747 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionNotIdPrincipal) {
3749 auto*
rules = rbac.mutable_rules();
3750 rules->set_action(GetParam().rbac_action());
3752 policy.add_principals()
3754 ->mutable_url_path()
3756 ->set_exact(
"/grpc.testing.EchoTestService/Echo1");
3757 policy.add_permissions()->set_any(
true);
3758 (*
rules->mutable_policies())[
"policy"] = policy;
3759 SetServerRbacPolicy(rbac);
3761 backends_[0]->notifier()->WaitOnServingStatusChange(
3764 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3765 GetParam().rbac_action() == RBAC_Action_DENY,
3768 policy.clear_principals();
3769 policy.add_principals()->mutable_not_id()->set_any(
true);
3770 (*
rules->mutable_policies())[
"policy"] = policy;
3771 SetServerRbacPolicy(rbac);
3773 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3774 GetParam().rbac_action() == RBAC_Action_ALLOW,
3778 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionAndIdPrincipal) {
3780 auto*
rules = rbac.mutable_rules();
3781 rules->set_action(GetParam().rbac_action());
3783 auto* and_ids = policy.add_principals()->mutable_and_ids();
3784 and_ids->add_ids()->set_any(
true);
3785 and_ids->add_ids()->mutable_url_path()->mutable_path()->set_exact(
3786 "/grpc.testing.EchoTestService/Echo");
3787 policy.add_permissions()->set_any(
true);
3788 (*
rules->mutable_policies())[
"policy"] = policy;
3789 SetServerRbacPolicy(rbac);
3791 backends_[0]->notifier()->WaitOnServingStatusChange(
3794 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3795 GetParam().rbac_action() == RBAC_Action_DENY,
3798 and_ids = (*policy.mutable_principals())[0].mutable_and_ids();
3799 (*and_ids->mutable_ids())[1].mutable_url_path()->mutable_path()->set_exact(
3800 "/grpc.testing.EchoTestService/Echo1");
3801 (*
rules->mutable_policies())[
"policy"] = policy;
3802 SetServerRbacPolicy(rbac);
3804 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3805 GetParam().rbac_action() == RBAC_Action_ALLOW,
3809 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionOrIdPrincipal) {
3811 auto*
rules = rbac.mutable_rules();
3812 rules->set_action(GetParam().rbac_action());
3814 auto* or_ids = policy.add_principals()->mutable_or_ids();
3815 or_ids->add_ids()->mutable_not_id()->set_any(
true);
3816 or_ids->add_ids()->mutable_url_path()->mutable_path()->set_exact(
3817 "/grpc.testing.EchoTestService/Echo");
3818 policy.add_permissions()->set_any(
true);
3819 (*
rules->mutable_policies())[
"policy"] = policy;
3820 SetServerRbacPolicy(rbac);
3822 backends_[0]->notifier()->WaitOnServingStatusChange(
3825 SendRpc([
this]() {
return CreateInsecureChannel(); }, {}, {},
3826 GetParam().rbac_action() == RBAC_Action_DENY,
3829 or_ids = (*policy.mutable_principals())[0].mutable_or_ids();
3830 (*or_ids->mutable_ids())[1].mutable_url_path()->mutable_path()->set_exact(
3831 "/grpc.testing.EchoTestService/Echo1");
3832 (*
rules->mutable_policies())[
"policy"] = policy;
3833 SetServerRbacPolicy(rbac);
3835 [
this]() {
return CreateInsecureChannel(); }, {}, {},
3836 GetParam().rbac_action() == RBAC_Action_ALLOW,
3845 XdsTest, XdsSecurityTest,
3861 XdsTest, XdsServerSecurityTest,
3865 .set_use_xds_credentials()),
3869 XdsTest, XdsEnabledServerStatusNotificationTest,
3875 XdsTest, XdsServerFilterChainMatchTest,
3879 .set_use_xds_credentials()),
3885 XdsTest, XdsServerRdsTest,
3889 .set_use_xds_credentials(),
3892 .set_use_xds_credentials()
3893 .set_enable_rds_testing()),
3901 XdsTest, XdsRbacTest,
3903 XdsTestType().set_use_xds_credentials().set_bootstrap_source(
3906 .set_use_xds_credentials()
3907 .set_enable_rds_testing()
3910 .set_use_xds_credentials()
3911 .set_filter_config_setup(
3912 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3915 .set_use_xds_credentials()
3916 .set_enable_rds_testing()
3917 .set_filter_config_setup(
3918 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3930 XdsTest, XdsRbacNackTest,
3933 XdsTestType().set_enable_rds_testing().set_bootstrap_source(
3936 .set_filter_config_setup(
3937 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3940 .set_enable_rds_testing()
3941 .set_filter_config_setup(
3942 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3951 XdsTest, XdsRbacTestWithRouteOverrideAlwaysPresent,
3954 .set_use_xds_credentials()
3955 .set_filter_config_setup(
3956 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3959 .set_use_xds_credentials()
3960 .set_enable_rds_testing()
3961 .set_filter_config_setup(
3962 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3971 XdsTest, XdsRbacTestWithActionPermutations,
3974 .set_use_xds_credentials()
3975 .set_rbac_action(RBAC_Action_ALLOW)
3978 .set_use_xds_credentials()
3979 .set_rbac_action(RBAC_Action_DENY)
3982 .set_use_xds_credentials()
3983 .set_enable_rds_testing()
3984 .set_rbac_action(RBAC_Action_ALLOW)
3987 .set_use_xds_credentials()
3988 .set_enable_rds_testing()
3989 .set_rbac_action(RBAC_Action_DENY)
3992 .set_use_xds_credentials()
3993 .set_filter_config_setup(
3994 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3995 .set_rbac_action(RBAC_Action_ALLOW)
3998 .set_use_xds_credentials()
3999 .set_filter_config_setup(
4000 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
4001 .set_rbac_action(RBAC_Action_DENY)
4004 .set_use_xds_credentials()
4005 .set_enable_rds_testing()
4006 .set_filter_config_setup(
4007 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
4008 .set_rbac_action(RBAC_Action_ALLOW)
4011 .set_use_xds_credentials()
4012 .set_enable_rds_testing()
4013 .set_filter_config_setup(
4014 XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
4015 .set_rbac_action(RBAC_Action_DENY)
4029 #if TARGET_OS_IPHONE
4033 grpc::testing::FakeCertificateProvider::CertDataMapWrapper cert_data_map_1;
4034 grpc::testing::g_fake1_cert_data_map = &cert_data_map_1;
4036 absl::make_unique<grpc::testing::FakeCertificateProviderFactory>(
4037 "fake1", grpc::testing::g_fake1_cert_data_map));
4038 grpc::testing::FakeCertificateProvider::CertDataMapWrapper cert_data_map_2;
4039 grpc::testing::g_fake2_cert_data_map = &cert_data_map_2;
4041 absl::make_unique<grpc::testing::FakeCertificateProviderFactory>(
4042 "fake2", grpc::testing::g_fake2_cert_data_map));
4045 absl::make_unique<grpc::testing::NoOpHttpFilter>(
4046 "grpc.testing.client_only_http_filter",
4049 {
"grpc.testing.client_only_http_filter"});
4051 absl::make_unique<grpc::testing::NoOpHttpFilter>(
4052 "grpc.testing.server_only_http_filter",
4055 {
"grpc.testing.server_only_http_filter"});
4057 absl::make_unique<grpc::testing::NoOpHttpFilter>(
4058 "grpc.testing.terminal_http_filter",
4061 {
"grpc.testing.terminal_http_filter"});