authorization_matchers_test.cc 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. // Copyright 2021 gRPC authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <grpc/support/port_platform.h>
  15. #include <list>
  16. #include <gmock/gmock.h>
  17. #include <gtest/gtest.h>
  18. #include <grpc/grpc_security_constants.h>
  19. #include "src/core/lib/security/authorization/evaluate_args.h"
  20. #include "src/core/lib/security/authorization/matchers.h"
  21. #include "test/core/util/evaluate_args_test_util.h"
  22. namespace grpc_core {
  23. class AuthorizationMatchersTest : public ::testing::Test {
  24. protected:
  25. EvaluateArgsTestUtil args_;
  26. };
  27. TEST_F(AuthorizationMatchersTest, AlwaysAuthorizationMatcher) {
  28. EvaluateArgs args = args_.MakeEvaluateArgs();
  29. AlwaysAuthorizationMatcher matcher;
  30. EXPECT_TRUE(matcher.Matches(args));
  31. }
  32. TEST_F(AuthorizationMatchersTest, AndAuthorizationMatcherSuccessfulMatch) {
  33. args_.AddPairToMetadata("foo", "bar");
  34. args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
  35. EvaluateArgs args = args_.MakeEvaluateArgs();
  36. std::vector<std::unique_ptr<Rbac::Permission>> rules;
  37. rules.push_back(absl::make_unique<Rbac::Permission>(
  38. Rbac::Permission::MakeHeaderPermission(
  39. HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
  40. /*matcher=*/"bar")
  41. .value())));
  42. rules.push_back(absl::make_unique<Rbac::Permission>(
  43. Rbac::Permission::MakeDestPortPermission(/*port=*/123)));
  44. auto matcher = AuthorizationMatcher::Create(
  45. Rbac::Permission::MakeAndPermission(std::move(rules)));
  46. EXPECT_TRUE(matcher->Matches(args));
  47. }
  48. TEST_F(AuthorizationMatchersTest, AndAuthorizationMatcherFailedMatch) {
  49. args_.AddPairToMetadata("foo", "not_bar");
  50. args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
  51. EvaluateArgs args = args_.MakeEvaluateArgs();
  52. std::vector<std::unique_ptr<Rbac::Permission>> rules;
  53. rules.push_back(absl::make_unique<Rbac::Permission>(
  54. Rbac::Permission::MakeHeaderPermission(
  55. HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
  56. /*matcher=*/"bar")
  57. .value())));
  58. rules.push_back(absl::make_unique<Rbac::Permission>(
  59. Rbac::Permission::MakeDestPortPermission(/*port=*/123)));
  60. auto matcher = AuthorizationMatcher::Create(
  61. Rbac::Permission(Rbac::Permission::MakeAndPermission(std::move(rules))));
  62. // Header rule fails. Expected value "bar", got "not_bar" for key "foo".
  63. EXPECT_FALSE(matcher->Matches(args));
  64. }
  65. TEST_F(AuthorizationMatchersTest, OrAuthorizationMatcherSuccessfulMatch) {
  66. args_.AddPairToMetadata("foo", "bar");
  67. args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
  68. EvaluateArgs args = args_.MakeEvaluateArgs();
  69. std::vector<std::unique_ptr<Rbac::Permission>> rules;
  70. rules.push_back(absl::make_unique<Rbac::Permission>(
  71. Rbac::Permission::MakeHeaderPermission(
  72. HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
  73. /*matcher=*/"bar")
  74. .value())));
  75. rules.push_back(absl::make_unique<Rbac::Permission>(
  76. Rbac::Permission::MakeDestPortPermission(/*port=*/456)));
  77. auto matcher = AuthorizationMatcher::Create(
  78. Rbac::Permission(Rbac::Permission::MakeOrPermission(std::move(rules))));
  79. // Matches as header rule matches even though port rule fails.
  80. EXPECT_TRUE(matcher->Matches(args));
  81. }
  82. TEST_F(AuthorizationMatchersTest, OrAuthorizationMatcherFailedMatch) {
  83. args_.AddPairToMetadata("foo", "not_bar");
  84. EvaluateArgs args = args_.MakeEvaluateArgs();
  85. std::vector<std::unique_ptr<Rbac::Permission>> rules;
  86. rules.push_back(absl::make_unique<Rbac::Permission>(
  87. Rbac::Permission::MakeHeaderPermission(
  88. HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
  89. /*matcher=*/"bar")
  90. .value())));
  91. auto matcher = AuthorizationMatcher::Create(
  92. Rbac::Permission(Rbac::Permission::MakeOrPermission(std::move(rules))));
  93. // Header rule fails. Expected value "bar", got "not_bar" for key "foo".
  94. EXPECT_FALSE(matcher->Matches(args));
  95. }
  96. TEST_F(AuthorizationMatchersTest, NotAuthorizationMatcherSuccessfulMatch) {
  97. args_.AddPairToMetadata(":path", "/different/foo");
  98. EvaluateArgs args = args_.MakeEvaluateArgs();
  99. auto matcher = AuthorizationMatcher::Create(Rbac::Principal(
  100. Rbac::Principal::MakeNotPrincipal(Rbac::Principal::MakePathPrincipal(
  101. StringMatcher::Create(StringMatcher::Type::kExact,
  102. /*matcher=*/"/expected/foo",
  103. /*case_sensitive=*/false)
  104. .value()))));
  105. EXPECT_TRUE(matcher->Matches(args));
  106. }
  107. TEST_F(AuthorizationMatchersTest, NotAuthorizationMatcherFailedMatch) {
  108. args_.AddPairToMetadata(":path", "/expected/foo");
  109. EvaluateArgs args = args_.MakeEvaluateArgs();
  110. auto matcher = AuthorizationMatcher::Create(Rbac::Principal(
  111. Rbac::Principal::MakeNotPrincipal(Rbac::Principal::MakePathPrincipal(
  112. StringMatcher::Create(StringMatcher::Type::kExact,
  113. /*matcher=*/"/expected/foo",
  114. /*case_sensitive=*/false)
  115. .value()))));
  116. EXPECT_FALSE(matcher->Matches(args));
  117. }
  118. TEST_F(AuthorizationMatchersTest, HybridAuthorizationMatcherSuccessfulMatch) {
  119. args_.AddPairToMetadata("foo", "bar");
  120. args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
  121. EvaluateArgs args = args_.MakeEvaluateArgs();
  122. std::vector<std::unique_ptr<Rbac::Permission>> sub_and_rules;
  123. sub_and_rules.push_back(absl::make_unique<Rbac::Permission>(
  124. Rbac::Permission::MakeHeaderPermission(
  125. HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
  126. /*matcher=*/"bar")
  127. .value())));
  128. std::vector<std::unique_ptr<Rbac::Permission>> sub_or_rules;
  129. sub_or_rules.push_back(absl::make_unique<Rbac::Permission>(
  130. Rbac::Permission::MakeDestPortPermission(/*port=*/123)));
  131. std::vector<std::unique_ptr<Rbac::Permission>> and_rules;
  132. and_rules.push_back(absl::make_unique<Rbac::Permission>(
  133. Rbac::Permission::MakeAndPermission(std::move(sub_and_rules))));
  134. and_rules.push_back(absl::make_unique<Rbac::Permission>(
  135. Rbac::Permission::MakeOrPermission(std::move(std::move(sub_or_rules)))));
  136. auto matcher = AuthorizationMatcher::Create(Rbac::Permission(
  137. Rbac::Permission::MakeAndPermission(std::move(and_rules))));
  138. EXPECT_TRUE(matcher->Matches(args));
  139. }
  140. TEST_F(AuthorizationMatchersTest, HybridAuthorizationMatcherFailedMatch) {
  141. args_.AddPairToMetadata("foo", "bar");
  142. args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
  143. EvaluateArgs args = args_.MakeEvaluateArgs();
  144. std::vector<std::unique_ptr<Rbac::Permission>> sub_and_rules;
  145. sub_and_rules.push_back(absl::make_unique<Rbac::Permission>(
  146. Rbac::Permission::MakeHeaderPermission(
  147. HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
  148. /*matcher=*/"bar")
  149. .value())));
  150. sub_and_rules.push_back(absl::make_unique<Rbac::Permission>(
  151. Rbac::Permission::MakeHeaderPermission(
  152. HeaderMatcher::Create(/*name=*/"absent_key",
  153. HeaderMatcher::Type::kExact,
  154. /*matcher=*/"some_value")
  155. .value())));
  156. std::vector<std::unique_ptr<Rbac::Permission>> sub_or_rules;
  157. sub_or_rules.push_back(absl::make_unique<Rbac::Permission>(
  158. Rbac::Permission::MakeDestPortPermission(/*port=*/123)));
  159. std::vector<std::unique_ptr<Rbac::Permission>> and_rules;
  160. and_rules.push_back(absl::make_unique<Rbac::Permission>(
  161. Rbac::Permission::MakeAndPermission(std::move(sub_and_rules))));
  162. and_rules.push_back(absl::make_unique<Rbac::Permission>(
  163. Rbac::Permission::MakeOrPermission(std::move(std::move(sub_or_rules)))));
  164. auto matcher = AuthorizationMatcher::Create(Rbac::Permission(
  165. Rbac::Permission::MakeAndPermission(std::move(and_rules))));
  166. // Fails as "absent_key" header was not present.
  167. EXPECT_FALSE(matcher->Matches(args));
  168. }
  169. TEST_F(AuthorizationMatchersTest,
  170. ReqServerNameAuthorizationMatcherSuccessfulMatch) {
  171. EvaluateArgs args = args_.MakeEvaluateArgs();
  172. ReqServerNameAuthorizationMatcher matcher(
  173. StringMatcher::Create(StringMatcher::Type::kExact,
  174. /*matcher=*/"")
  175. .value());
  176. EXPECT_TRUE(matcher.Matches(args));
  177. }
  178. TEST_F(AuthorizationMatchersTest,
  179. ReqServerNameAuthorizationMatcherFailedMatch) {
  180. EvaluateArgs args = args_.MakeEvaluateArgs();
  181. ReqServerNameAuthorizationMatcher matcher(
  182. StringMatcher::Create(StringMatcher::Type::kExact,
  183. /*matcher=*/"server1")
  184. .value());
  185. EXPECT_FALSE(matcher.Matches(args));
  186. }
  187. TEST_F(AuthorizationMatchersTest, PathAuthorizationMatcherSuccessfulMatch) {
  188. args_.AddPairToMetadata(":path", "expected/path");
  189. EvaluateArgs args = args_.MakeEvaluateArgs();
  190. PathAuthorizationMatcher matcher(
  191. StringMatcher::Create(StringMatcher::Type::kExact,
  192. /*matcher=*/"expected/path",
  193. /*case_sensitive=*/false)
  194. .value());
  195. EXPECT_TRUE(matcher.Matches(args));
  196. }
  197. TEST_F(AuthorizationMatchersTest, PathAuthorizationMatcherFailedMatch) {
  198. args_.AddPairToMetadata(":path", "different/path");
  199. EvaluateArgs args = args_.MakeEvaluateArgs();
  200. PathAuthorizationMatcher matcher(
  201. StringMatcher::Create(StringMatcher::Type::kExact,
  202. /*matcher=*/"expected/path",
  203. /*case_sensitive=*/false)
  204. .value());
  205. EXPECT_FALSE(matcher.Matches(args));
  206. }
  207. TEST_F(AuthorizationMatchersTest,
  208. PathAuthorizationMatcherFailedMatchMissingPath) {
  209. EvaluateArgs args = args_.MakeEvaluateArgs();
  210. PathAuthorizationMatcher matcher(
  211. StringMatcher::Create(StringMatcher::Type::kExact,
  212. /*matcher=*/"expected/path",
  213. /*case_sensitive=*/false)
  214. .value());
  215. EXPECT_FALSE(matcher.Matches(args));
  216. }
  217. TEST_F(AuthorizationMatchersTest, MetadataAuthorizationMatcherSuccessfulMatch) {
  218. EvaluateArgs args = args_.MakeEvaluateArgs();
  219. MetadataAuthorizationMatcher matcher(/*invert=*/true);
  220. EXPECT_TRUE(matcher.Matches(args));
  221. }
  222. TEST_F(AuthorizationMatchersTest, MetadataAuthorizationMatcherFailedMatch) {
  223. EvaluateArgs args = args_.MakeEvaluateArgs();
  224. MetadataAuthorizationMatcher matcher(/*invert=*/false);
  225. EXPECT_FALSE(matcher.Matches(args));
  226. }
  227. TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherSuccessfulMatch) {
  228. args_.AddPairToMetadata("key123", "foo_xxx");
  229. EvaluateArgs args = args_.MakeEvaluateArgs();
  230. HeaderAuthorizationMatcher matcher(
  231. HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kPrefix,
  232. /*matcher=*/"foo")
  233. .value());
  234. EXPECT_TRUE(matcher.Matches(args));
  235. }
  236. TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherFailedMatch) {
  237. args_.AddPairToMetadata("key123", "foo");
  238. EvaluateArgs args = args_.MakeEvaluateArgs();
  239. HeaderAuthorizationMatcher matcher(
  240. HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kExact,
  241. /*matcher=*/"bar")
  242. .value());
  243. EXPECT_FALSE(matcher.Matches(args));
  244. }
  245. TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherMethodSuccess) {
  246. args_.AddPairToMetadata(":method", "GET");
  247. EvaluateArgs args = args_.MakeEvaluateArgs();
  248. HeaderAuthorizationMatcher matcher(
  249. HeaderMatcher::Create(/*name=*/":method", HeaderMatcher::Type::kExact,
  250. /*matcher=*/"GET")
  251. .value());
  252. EXPECT_TRUE(matcher.Matches(args));
  253. }
  254. TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherMethodFail) {
  255. args_.AddPairToMetadata(":method", "GET");
  256. EvaluateArgs args = args_.MakeEvaluateArgs();
  257. HeaderAuthorizationMatcher matcher(
  258. HeaderMatcher::Create(/*name=*/":method", HeaderMatcher::Type::kExact,
  259. /*matcher=*/"PUT")
  260. .value());
  261. EXPECT_FALSE(matcher.Matches(args));
  262. }
  263. TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherAuthoritySuccess) {
  264. args_.AddPairToMetadata(":authority", "localhost");
  265. EvaluateArgs args = args_.MakeEvaluateArgs();
  266. HeaderAuthorizationMatcher matcher(
  267. HeaderMatcher::Create(/*name=*/":authority", HeaderMatcher::Type::kExact,
  268. /*matcher=*/"localhost")
  269. .value());
  270. EXPECT_TRUE(matcher.Matches(args));
  271. }
  272. TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherAuthorityFail) {
  273. args_.AddPairToMetadata(":authority", "localhost");
  274. EvaluateArgs args = args_.MakeEvaluateArgs();
  275. HeaderAuthorizationMatcher matcher(
  276. HeaderMatcher::Create(/*name=*/":authority", HeaderMatcher::Type::kExact,
  277. /*matcher=*/"bad_authority")
  278. .value());
  279. EXPECT_FALSE(matcher.Matches(args));
  280. }
  281. TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherPathSuccess) {
  282. args_.AddPairToMetadata(":path", "/expected/path");
  283. EvaluateArgs args = args_.MakeEvaluateArgs();
  284. HeaderAuthorizationMatcher matcher(
  285. HeaderMatcher::Create(/*name=*/":path", HeaderMatcher::Type::kExact,
  286. /*matcher=*/"/expected/path")
  287. .value());
  288. EXPECT_TRUE(matcher.Matches(args));
  289. }
  290. TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherPathFail) {
  291. args_.AddPairToMetadata(":path", "/expected/path");
  292. EvaluateArgs args = args_.MakeEvaluateArgs();
  293. HeaderAuthorizationMatcher matcher(
  294. HeaderMatcher::Create(/*name=*/":path", HeaderMatcher::Type::kExact,
  295. /*matcher=*/"/unexpected/path")
  296. .value());
  297. EXPECT_FALSE(matcher.Matches(args));
  298. }
  299. TEST_F(AuthorizationMatchersTest,
  300. HeaderAuthorizationMatcherFailedMatchMultivaluedHeader) {
  301. args_.AddPairToMetadata("key123", "foo");
  302. args_.AddPairToMetadata("key123", "bar");
  303. EvaluateArgs args = args_.MakeEvaluateArgs();
  304. HeaderAuthorizationMatcher matcher(
  305. HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kExact,
  306. /*matcher=*/"foo")
  307. .value());
  308. EXPECT_FALSE(matcher.Matches(args));
  309. }
  310. TEST_F(AuthorizationMatchersTest,
  311. HeaderAuthorizationMatcherFailedMatchMissingHeader) {
  312. EvaluateArgs args = args_.MakeEvaluateArgs();
  313. HeaderAuthorizationMatcher matcher(
  314. HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kSuffix,
  315. /*matcher=*/"foo")
  316. .value());
  317. EXPECT_FALSE(matcher.Matches(args));
  318. }
  319. TEST_F(AuthorizationMatchersTest, IpAuthorizationMatcherDestIpSuccessfulMatch) {
  320. args_.SetLocalEndpoint("ipv4:1.2.3.4:123");
  321. EvaluateArgs args = args_.MakeEvaluateArgs();
  322. IpAuthorizationMatcher matcher(
  323. IpAuthorizationMatcher::Type::kDestIp,
  324. Rbac::CidrRange(/*address_prefix=*/"1.7.8.9", /*prefix_len=*/8));
  325. EXPECT_TRUE(matcher.Matches(args));
  326. }
  327. TEST_F(AuthorizationMatchersTest, IpAuthorizationMatcherDestIpFailedMatch) {
  328. args_.SetLocalEndpoint("ipv4:1.2.3.4:123");
  329. EvaluateArgs args = args_.MakeEvaluateArgs();
  330. IpAuthorizationMatcher matcher(
  331. IpAuthorizationMatcher::Type::kDestIp,
  332. Rbac::CidrRange(/*address_prefix=*/"1.2.3.9", /*prefix_len=*/32));
  333. EXPECT_FALSE(matcher.Matches(args));
  334. }
  335. TEST_F(AuthorizationMatchersTest,
  336. IpAuthorizationMatcherSourceIpSuccessfulMatch) {
  337. args_.SetPeerEndpoint("ipv6:[1:2:3::]:456");
  338. EvaluateArgs args = args_.MakeEvaluateArgs();
  339. IpAuthorizationMatcher matcher(
  340. IpAuthorizationMatcher::Type::kSourceIp,
  341. Rbac::CidrRange(/*address_prefix=*/"1:3:4::", /*prefix_len=*/16));
  342. EXPECT_TRUE(matcher.Matches(args));
  343. }
  344. TEST_F(AuthorizationMatchersTest, IpAuthorizationMatcherSourceIpFailedMatch) {
  345. args_.SetPeerEndpoint("ipv6:[1:2::3::]:456");
  346. EvaluateArgs args = args_.MakeEvaluateArgs();
  347. IpAuthorizationMatcher matcher(
  348. IpAuthorizationMatcher::Type::kSourceIp,
  349. Rbac::CidrRange(/*address_prefix=*/"1:3::", /*prefix_len=*/48));
  350. EXPECT_FALSE(matcher.Matches(args));
  351. }
  352. TEST_F(AuthorizationMatchersTest,
  353. IpAuthorizationMatcherRemoteIpSuccessfulMatch) {
  354. args_.SetPeerEndpoint("ipv6:[1:2:3::]:456");
  355. EvaluateArgs args = args_.MakeEvaluateArgs();
  356. IpAuthorizationMatcher matcher(
  357. IpAuthorizationMatcher::Type::kRemoteIp,
  358. Rbac::CidrRange(/*address_prefix=*/"1:2:4::", /*prefix_len=*/32));
  359. EXPECT_TRUE(matcher.Matches(args));
  360. }
  361. TEST_F(AuthorizationMatchersTest, IpAuthorizationMatcherRemoteIpFailedMatch) {
  362. args_.SetPeerEndpoint("ipv6:[1:2::]:456");
  363. EvaluateArgs args = args_.MakeEvaluateArgs();
  364. IpAuthorizationMatcher matcher(
  365. IpAuthorizationMatcher::Type::kRemoteIp,
  366. Rbac::CidrRange(/*address_prefix=*/"1:3::", /*prefix_len=*/32));
  367. EXPECT_FALSE(matcher.Matches(args));
  368. }
  369. TEST_F(AuthorizationMatchersTest,
  370. IpAuthorizationMatcherDirectRemoteIpSuccessfulMatch) {
  371. args_.SetPeerEndpoint("ipv4:1.2.3.4:123");
  372. EvaluateArgs args = args_.MakeEvaluateArgs();
  373. IpAuthorizationMatcher matcher(
  374. IpAuthorizationMatcher::Type::kDirectRemoteIp,
  375. Rbac::CidrRange(/*address_prefix=*/"1.7.8.9", /*prefix_len=*/8));
  376. EXPECT_TRUE(matcher.Matches(args));
  377. }
  378. TEST_F(AuthorizationMatchersTest,
  379. IpAuthorizationMatcherDirectRemoteIpFailedMatch) {
  380. args_.SetPeerEndpoint("ipv4:1.2.3.4:123");
  381. EvaluateArgs args = args_.MakeEvaluateArgs();
  382. IpAuthorizationMatcher matcher(
  383. IpAuthorizationMatcher::Type::kDirectRemoteIp,
  384. Rbac::CidrRange(/*address_prefix=*/"1.7.8.9", /*prefix_len=*/16));
  385. EXPECT_FALSE(matcher.Matches(args));
  386. }
  387. TEST_F(AuthorizationMatchersTest, PortAuthorizationMatcherSuccessfulMatch) {
  388. args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
  389. EvaluateArgs args = args_.MakeEvaluateArgs();
  390. PortAuthorizationMatcher matcher(/*port=*/123);
  391. EXPECT_TRUE(matcher.Matches(args));
  392. }
  393. TEST_F(AuthorizationMatchersTest, PortAuthorizationMatcherFailedMatch) {
  394. args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
  395. EvaluateArgs args = args_.MakeEvaluateArgs();
  396. PortAuthorizationMatcher matcher(/*port=*/456);
  397. EXPECT_FALSE(matcher.Matches(args));
  398. }
  399. TEST_F(AuthorizationMatchersTest,
  400. AuthenticatedMatcherUnAuthenticatedConnection) {
  401. EvaluateArgs args = args_.MakeEvaluateArgs();
  402. AuthenticatedAuthorizationMatcher matcher(
  403. StringMatcher::Create(StringMatcher::Type::kExact,
  404. /*matcher=*/"foo.com",
  405. /*case_sensitive=*/false)
  406. .value());
  407. EXPECT_FALSE(matcher.Matches(args));
  408. }
  409. TEST_F(AuthorizationMatchersTest,
  410. AuthenticatedMatcherAuthenticatedConnectionMatcherUnset) {
  411. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  412. GRPC_SSL_TRANSPORT_SECURITY_TYPE);
  413. EvaluateArgs args = args_.MakeEvaluateArgs();
  414. AuthenticatedAuthorizationMatcher matcher(/*auth=*/absl::nullopt);
  415. EXPECT_TRUE(matcher.Matches(args));
  416. }
  417. TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherSuccessfulUriSanMatches) {
  418. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  419. GRPC_TLS_TRANSPORT_SECURITY_TYPE);
  420. args_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME,
  421. "spiffe://foo.abc");
  422. args_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME,
  423. "https://foo.domain.com");
  424. EvaluateArgs args = args_.MakeEvaluateArgs();
  425. AuthenticatedAuthorizationMatcher matcher(
  426. StringMatcher::Create(StringMatcher::Type::kExact,
  427. /*matcher=*/"spiffe://foo.abc",
  428. /*case_sensitive=*/false)
  429. .value());
  430. EXPECT_TRUE(matcher.Matches(args));
  431. }
  432. TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherFailedUriSanMatches) {
  433. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  434. GRPC_TLS_TRANSPORT_SECURITY_TYPE);
  435. args_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME,
  436. "spiffe://bar.abc");
  437. EvaluateArgs args = args_.MakeEvaluateArgs();
  438. AuthenticatedAuthorizationMatcher matcher(
  439. StringMatcher::Create(StringMatcher::Type::kExact,
  440. /*matcher=*/"spiffe://foo.abc",
  441. /*case_sensitive=*/false)
  442. .value());
  443. EXPECT_FALSE(matcher.Matches(args));
  444. }
  445. TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherSuccessfulDnsSanMatches) {
  446. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  447. GRPC_SSL_TRANSPORT_SECURITY_TYPE);
  448. args_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME,
  449. "spiffe://bar.abc");
  450. args_.AddPropertyToAuthContext(GRPC_PEER_DNS_PROPERTY_NAME,
  451. "foo.test.domain.com");
  452. args_.AddPropertyToAuthContext(GRPC_PEER_DNS_PROPERTY_NAME,
  453. "bar.test.domain.com");
  454. EvaluateArgs args = args_.MakeEvaluateArgs();
  455. // No match found in URI SANs, finds match in DNS SANs.
  456. AuthenticatedAuthorizationMatcher matcher(
  457. StringMatcher::Create(StringMatcher::Type::kExact,
  458. /*matcher=*/"bar.test.domain.com",
  459. /*case_sensitive=*/false)
  460. .value());
  461. EXPECT_TRUE(matcher.Matches(args));
  462. }
  463. TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherFailedDnsSanMatches) {
  464. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  465. GRPC_SSL_TRANSPORT_SECURITY_TYPE);
  466. args_.AddPropertyToAuthContext(GRPC_PEER_DNS_PROPERTY_NAME,
  467. "foo.test.domain.com");
  468. EvaluateArgs args = args_.MakeEvaluateArgs();
  469. AuthenticatedAuthorizationMatcher matcher(
  470. StringMatcher::Create(StringMatcher::Type::kExact,
  471. /*matcher=*/"bar.test.domain.com",
  472. /*case_sensitive=*/false)
  473. .value());
  474. EXPECT_FALSE(matcher.Matches(args));
  475. }
  476. TEST_F(AuthorizationMatchersTest,
  477. AuthenticatedMatcherSuccessfulSubjectMatches) {
  478. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  479. GRPC_TLS_TRANSPORT_SECURITY_TYPE);
  480. args_.AddPropertyToAuthContext(GRPC_X509_SUBJECT_PROPERTY_NAME,
  481. "CN=abc,OU=Google");
  482. EvaluateArgs args = args_.MakeEvaluateArgs();
  483. // No match found in URI SANs and DNS SANs, finds match in Subject.
  484. AuthenticatedAuthorizationMatcher matcher(
  485. StringMatcher::Create(StringMatcher::Type::kExact,
  486. /*matcher=*/"CN=abc,OU=Google",
  487. /*case_sensitive=*/false)
  488. .value());
  489. EXPECT_TRUE(matcher.Matches(args));
  490. }
  491. TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherFailedSubjectMatches) {
  492. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  493. GRPC_SSL_TRANSPORT_SECURITY_TYPE);
  494. args_.AddPropertyToAuthContext(GRPC_X509_SUBJECT_PROPERTY_NAME,
  495. "CN=abc,OU=Google");
  496. EvaluateArgs args = args_.MakeEvaluateArgs();
  497. AuthenticatedAuthorizationMatcher matcher(
  498. StringMatcher::Create(StringMatcher::Type::kExact,
  499. /*matcher=*/"CN=def,OU=Google",
  500. /*case_sensitive=*/false)
  501. .value());
  502. EXPECT_FALSE(matcher.Matches(args));
  503. }
  504. TEST_F(
  505. AuthorizationMatchersTest,
  506. AuthenticatedMatcherWithoutClientCertMatchesSuccessfullyOnEmptyPrincipal) {
  507. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  508. GRPC_TLS_TRANSPORT_SECURITY_TYPE);
  509. EvaluateArgs args = args_.MakeEvaluateArgs();
  510. AuthenticatedAuthorizationMatcher matcher(
  511. StringMatcher::Create(StringMatcher::Type::kExact,
  512. /*matcher=*/"")
  513. .value());
  514. EXPECT_TRUE(matcher.Matches(args));
  515. }
  516. TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherFailedNothingMatches) {
  517. args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  518. GRPC_SSL_TRANSPORT_SECURITY_TYPE);
  519. EvaluateArgs args = args_.MakeEvaluateArgs();
  520. AuthenticatedAuthorizationMatcher matcher(
  521. StringMatcher::Create(StringMatcher::Type::kExact,
  522. /*matcher=*/"foo",
  523. /*case_sensitive=*/false)
  524. .value());
  525. EXPECT_FALSE(matcher.Matches(args));
  526. }
  527. TEST_F(AuthorizationMatchersTest, PolicyAuthorizationMatcherSuccessfulMatch) {
  528. args_.AddPairToMetadata("key123", "foo");
  529. EvaluateArgs args = args_.MakeEvaluateArgs();
  530. std::vector<std::unique_ptr<Rbac::Permission>> rules;
  531. rules.push_back(absl::make_unique<Rbac::Permission>(
  532. Rbac::Permission::MakeHeaderPermission(
  533. HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kExact,
  534. /*matcher=*/"foo")
  535. .value())));
  536. PolicyAuthorizationMatcher matcher(Rbac::Policy(
  537. Rbac::Permission(Rbac::Permission::MakeOrPermission(std::move(rules))),
  538. Rbac::Principal::MakeAnyPrincipal()));
  539. EXPECT_TRUE(matcher.Matches(args));
  540. }
  541. TEST_F(AuthorizationMatchersTest, PolicyAuthorizationMatcherFailedMatch) {
  542. args_.AddPairToMetadata("key123", "foo");
  543. EvaluateArgs args = args_.MakeEvaluateArgs();
  544. std::vector<std::unique_ptr<Rbac::Permission>> rules;
  545. rules.push_back(absl::make_unique<Rbac::Permission>(
  546. Rbac::Permission::MakeHeaderPermission(
  547. HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kExact,
  548. /*matcher=*/"bar")
  549. .value())));
  550. PolicyAuthorizationMatcher matcher(Rbac::Policy(
  551. Rbac::Permission(Rbac::Permission::MakeOrPermission(std::move(rules))),
  552. Rbac::Principal::MakeAnyPrincipal()));
  553. EXPECT_FALSE(matcher.Matches(args));
  554. }
  555. } // namespace grpc_core
  556. int main(int argc, char** argv) {
  557. ::testing::InitGoogleTest(&argc, argv);
  558. grpc_init();
  559. int ret = RUN_ALL_TESTS();
  560. grpc_shutdown();
  561. return ret;
  562. }