Skip to content

Commit

Permalink
RBAC engine matchers implementation. (grpc#25997)
Browse files Browse the repository at this point in the history
  • Loading branch information
ashithasantosh authored Apr 19, 2021
1 parent d4f6cfd commit 628bf7f
Show file tree
Hide file tree
Showing 11 changed files with 993 additions and 63 deletions.
6 changes: 4 additions & 2 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -2061,10 +2061,12 @@ grpc_cc_library(
name = "grpc_rbac_engine",
srcs = [
"src/core/lib/security/authorization/evaluate_args.cc",
"src/core/lib/security/authorization/matchers.cc",
"src/core/lib/security/authorization/rbac_policy.cc",
],
hdrs = [
"src/core/lib/security/authorization/evaluate_args.h",
"src/core/lib/security/authorization/matchers.h",
"src/core/lib/security/authorization/rbac_policy.h",
],
language = "c++",
Expand Down Expand Up @@ -2095,10 +2097,10 @@ grpc_cc_library(
grpc_cc_library(
name = "grpc_cel_engine",
srcs = [
"src/core/lib/security/authorization/authorization_engine.cc",
"src/core/lib/security/authorization/cel_authorization_engine.cc",
],
hdrs = [
"src/core/lib/security/authorization/authorization_engine.h",
"src/core/lib/security/authorization/cel_authorization_engine.h",
],
external_deps = [
"absl/container:flat_hash_set",
Expand Down
56 changes: 49 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -737,7 +737,7 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx alts_util_test)
add_dependencies(buildtests_cxx async_end2end_test)
add_dependencies(buildtests_cxx auth_property_iterator_test)
add_dependencies(buildtests_cxx authorization_engine_test)
add_dependencies(buildtests_cxx authorization_matchers_test)
add_dependencies(buildtests_cxx aws_request_signer_test)
add_dependencies(buildtests_cxx backoff_test)
add_dependencies(buildtests_cxx bad_streaming_id_bad_client_test)
Expand Down Expand Up @@ -811,6 +811,7 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx byte_buffer_test)
add_dependencies(buildtests_cxx byte_stream_test)
add_dependencies(buildtests_cxx cancel_ares_query_test)
add_dependencies(buildtests_cxx cel_authorization_engine_test)
add_dependencies(buildtests_cxx certificate_provider_registry_test)
add_dependencies(buildtests_cxx certificate_provider_store_test)
add_dependencies(buildtests_cxx cfstream_test)
Expand Down Expand Up @@ -8022,16 +8023,16 @@ target_link_libraries(auth_property_iterator_test
endif()
if(gRPC_BUILD_TESTS)

add_executable(authorization_engine_test
src/core/lib/security/authorization/authorization_engine.cc
add_executable(authorization_matchers_test
src/core/lib/security/authorization/evaluate_args.cc
src/core/lib/security/authorization/matchers.cc
src/core/lib/security/authorization/rbac_policy.cc
test/core/security/authorization_engine_test.cc
test/core/security/authorization_matchers_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)

target_include_directories(authorization_engine_test
target_include_directories(authorization_matchers_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
Expand All @@ -8050,10 +8051,9 @@ target_include_directories(authorization_engine_test
${_gRPC_PROTO_GENS_DIR}
)

target_link_libraries(authorization_engine_test
target_link_libraries(authorization_matchers_test
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
absl::flat_hash_set
grpc_test_util
)

Expand Down Expand Up @@ -9133,6 +9133,46 @@ target_link_libraries(cancel_ares_query_test
)


endif()
if(gRPC_BUILD_TESTS)

add_executable(cel_authorization_engine_test
src/core/lib/security/authorization/cel_authorization_engine.cc
src/core/lib/security/authorization/evaluate_args.cc
src/core/lib/security/authorization/matchers.cc
src/core/lib/security/authorization/rbac_policy.cc
test/core/security/cel_authorization_engine_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)

target_include_directories(cel_authorization_engine_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
${_gRPC_PROTO_GENS_DIR}
)

target_link_libraries(cel_authorization_engine_test
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
absl::flat_hash_set
grpc_test_util
)


endif()
if(gRPC_BUILD_TESTS)

Expand Down Expand Up @@ -10282,6 +10322,7 @@ if(gRPC_BUILD_TESTS)

add_executable(evaluate_args_test
src/core/lib/security/authorization/evaluate_args.cc
src/core/lib/security/authorization/matchers.cc
src/core/lib/security/authorization/rbac_policy.cc
test/core/security/evaluate_args_test.cc
third_party/googletest/googletest/src/gtest-all.cc
Expand Down Expand Up @@ -12724,6 +12765,7 @@ if(gRPC_BUILD_TESTS)

add_executable(rbac_translator_test
src/core/lib/security/authorization/evaluate_args.cc
src/core/lib/security/authorization/matchers.cc
src/core/lib/security/authorization/rbac_policy.cc
src/core/lib/security/authorization/rbac_translator.cc
test/core/security/rbac_translator_test.cc
Expand Down
43 changes: 32 additions & 11 deletions build_autogenerated.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4246,27 +4246,20 @@ targets:
deps:
- grpc++_test_util
uses_polling: false
- name: authorization_engine_test
- name: authorization_matchers_test
gtest: true
build: test
language: c++
headers:
- src/core/lib/security/authorization/authorization_engine.h
- src/core/lib/security/authorization/evaluate_args.h
- src/core/lib/security/authorization/mock_cel/activation.h
- src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h
- src/core/lib/security/authorization/mock_cel/cel_expression.h
- src/core/lib/security/authorization/mock_cel/cel_value.h
- src/core/lib/security/authorization/mock_cel/evaluator_core.h
- src/core/lib/security/authorization/mock_cel/flat_expr_builder.h
- src/core/lib/security/authorization/matchers.h
- src/core/lib/security/authorization/rbac_policy.h
src:
- src/core/lib/security/authorization/authorization_engine.cc
- src/core/lib/security/authorization/evaluate_args.cc
- src/core/lib/security/authorization/matchers.cc
- src/core/lib/security/authorization/rbac_policy.cc
- test/core/security/authorization_engine_test.cc
- test/core/security/authorization_matchers_test.cc
deps:
- absl/container:flat_hash_set
- grpc_test_util
- name: aws_request_signer_test
gtest: true
Expand Down Expand Up @@ -4672,6 +4665,30 @@ targets:
deps:
- grpc++_test_config
- grpc++_test_util
- name: cel_authorization_engine_test
gtest: true
build: test
language: c++
headers:
- src/core/lib/security/authorization/cel_authorization_engine.h
- src/core/lib/security/authorization/evaluate_args.h
- src/core/lib/security/authorization/matchers.h
- src/core/lib/security/authorization/mock_cel/activation.h
- src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h
- src/core/lib/security/authorization/mock_cel/cel_expression.h
- src/core/lib/security/authorization/mock_cel/cel_value.h
- src/core/lib/security/authorization/mock_cel/evaluator_core.h
- src/core/lib/security/authorization/mock_cel/flat_expr_builder.h
- src/core/lib/security/authorization/rbac_policy.h
src:
- src/core/lib/security/authorization/cel_authorization_engine.cc
- src/core/lib/security/authorization/evaluate_args.cc
- src/core/lib/security/authorization/matchers.cc
- src/core/lib/security/authorization/rbac_policy.cc
- test/core/security/cel_authorization_engine_test.cc
deps:
- absl/container:flat_hash_set
- grpc_test_util
- name: certificate_provider_registry_test
gtest: true
build: test
Expand Down Expand Up @@ -5055,9 +5072,11 @@ targets:
language: c++
headers:
- src/core/lib/security/authorization/evaluate_args.h
- src/core/lib/security/authorization/matchers.h
- src/core/lib/security/authorization/rbac_policy.h
src:
- src/core/lib/security/authorization/evaluate_args.cc
- src/core/lib/security/authorization/matchers.cc
- src/core/lib/security/authorization/rbac_policy.cc
- test/core/security/evaluate_args_test.cc
deps:
Expand Down Expand Up @@ -5935,10 +5954,12 @@ targets:
language: c++
headers:
- src/core/lib/security/authorization/evaluate_args.h
- src/core/lib/security/authorization/matchers.h
- src/core/lib/security/authorization/rbac_policy.h
- src/core/lib/security/authorization/rbac_translator.h
src:
- src/core/lib/security/authorization/evaluate_args.cc
- src/core/lib/security/authorization/matchers.cc
- src/core/lib/security/authorization/rbac_policy.cc
- src/core/lib/security/authorization/rbac_translator.cc
- test/core/security/rbac_translator_test.cc
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

#include "absl/memory/memory.h"

#include "src/core/lib/security/authorization/authorization_engine.h"
#include "src/core/lib/security/authorization/cel_authorization_engine.h"

namespace grpc_core {

Expand All @@ -36,8 +36,8 @@ constexpr char kCertServerName[] = "cert_server_name";

} // namespace

std::unique_ptr<AuthorizationEngine>
AuthorizationEngine::CreateAuthorizationEngine(
std::unique_ptr<CelAuthorizationEngine>
CelAuthorizationEngine::CreateCelAuthorizationEngine(
const std::vector<envoy_config_rbac_v3_RBAC*>& rbac_policies) {
if (rbac_policies.empty() || rbac_policies.size() > 2) {
gpr_log(GPR_ERROR,
Expand All @@ -52,11 +52,11 @@ AuthorizationEngine::CreateAuthorizationEngine(
policy and one allow policy, in that order.");
return nullptr;
} else {
return absl::make_unique<AuthorizationEngine>(rbac_policies);
return absl::make_unique<CelAuthorizationEngine>(rbac_policies);
}
}

AuthorizationEngine::AuthorizationEngine(
CelAuthorizationEngine::CelAuthorizationEngine(
const std::vector<envoy_config_rbac_v3_RBAC*>& rbac_policies) {
for (const auto& rbac_policy : rbac_policies) {
// Extract array of policies and store their condition fields in either
Expand Down Expand Up @@ -90,7 +90,7 @@ AuthorizationEngine::AuthorizationEngine(
}
}

std::unique_ptr<mock_cel::Activation> AuthorizationEngine::CreateActivation(
std::unique_ptr<mock_cel::Activation> CelAuthorizationEngine::CreateActivation(
const EvaluateArgs& args) {
std::unique_ptr<mock_cel::Activation> activation;
for (const auto& elem : envoy_attributes_) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef GRPC_CORE_LIB_SECURITY_AUTHORIZATION_AUTHORIZATION_ENGINE_H
#define GRPC_CORE_LIB_SECURITY_AUTHORIZATION_AUTHORIZATION_ENGINE_H
#ifndef GRPC_CORE_LIB_SECURITY_AUTHORIZATION_CEL_AUTHORIZATION_ENGINE_H
#define GRPC_CORE_LIB_SECURITY_AUTHORIZATION_CEL_AUTHORIZATION_ENGINE_H

#include <grpc/support/port_platform.h>

Expand All @@ -34,7 +34,7 @@

namespace grpc_core {

// AuthorizationEngine makes an AuthorizationDecision to ALLOW or DENY the
// CelAuthorizationEngine makes an AuthorizationDecision to ALLOW or DENY the
// current action based on the condition fields in provided RBAC policies.
// The engine may be constructed with one or two policies. If two polcies,
// the first policy is deny-if-matched and the second is allow-if-matched.
Expand All @@ -44,19 +44,19 @@ namespace grpc_core {
// are compatible with this engine.
//
// Example:
// AuthorizationEngine*
// auth_engine = AuthorizationEngine::CreateAuthorizationEngine(rbac_policies);
// auth_engine->Evaluate(evaluate_args); // returns authorization decision.
class AuthorizationEngine {
// CelAuthorizationEngine* engine =
// CelAuthorizationEngine::CreateCelAuthorizationEngine(rbac_policies);
// engine->Evaluate(evaluate_args); // returns authorization decision.
class CelAuthorizationEngine {
public:
// rbac_policies must be a vector containing either a single policy of any
// kind, or one deny policy and one allow policy, in that order.
static std::unique_ptr<AuthorizationEngine> CreateAuthorizationEngine(
static std::unique_ptr<CelAuthorizationEngine> CreateCelAuthorizationEngine(
const std::vector<envoy_config_rbac_v3_RBAC*>& rbac_policies);

// Users should use the CreateAuthorizationEngine factory function
// instead of calling the AuthorizationEngine constructor directly.
explicit AuthorizationEngine(
// Users should use the CreateCelAuthorizationEngine factory function
// instead of calling the CelAuthorizationEngine constructor directly.
explicit CelAuthorizationEngine(
const std::vector<envoy_config_rbac_v3_RBAC*>& rbac_policies);
// TODO([email protected]): add an Evaluate member function.

Expand All @@ -81,4 +81,4 @@ class AuthorizationEngine {

} // namespace grpc_core

#endif /* GRPC_CORE_LIB_SECURITY_AUTHORIZATION_AUTHORIZATION_ENGINE_H */
#endif /* GRPC_CORE_LIB_SECURITY_AUTHORIZATION_CEL_AUTHORIZATION_ENGINE_H */
Loading

0 comments on commit 628bf7f

Please sign in to comment.