Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Audit Logging] Audit logging config translation by rbac service config parser #33145

Merged
merged 23 commits into from
May 17, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
7ac6a4d
audit logging in service config parser
rockspore May 5, 2023
72487d0
remove unused using decl and hdrs
rockspore May 5, 2023
d2f15ec
Automated change: Fix sanity tests
rockspore May 5, 2023
bbe16bf
Merge pull request #20 from rockspore/create-pull-request/patch-72487d0
rockspore May 5, 2023
16bd834
stdout audit logger impl
rockspore May 5, 2023
f8f5ee1
generate projects
rockspore May 5, 2023
195f90f
Automated change: Fix sanity tests
rockspore May 5, 2023
50d7ad7
Merge branch 'stdout-logger' of github.com:rockspore/grpc into servic…
rockspore May 5, 2023
1c224f3
Merge pull request #21 from rockspore/create-pull-request/patch-f8f5ee1
rockspore May 5, 2023
296ac6c
Merge branch 'stdout-logger' of github.com:rockspore/grpc into servic…
rockspore May 5, 2023
0e598e9
remove fixture by using stdout logger
rockspore May 5, 2023
361798a
merge from origin
rockspore May 5, 2023
67e5571
Automated change: Fix sanity tests
rockspore May 5, 2023
769dbc5
Merge pull request #22 from rockspore/create-pull-request/patch-361798a
rockspore May 5, 2023
9864edf
Merge branch 'master' of github.com:grpc/grpc into service-config-parser
rockspore May 16, 2023
6adbc3f
public json hdr
rockspore May 16, 2023
7a556e7
Automated change: Fix sanity tests
rockspore May 16, 2023
0aa5024
Merge pull request #25 from rockspore/create-pull-request/patch-6adbc3f
rockspore May 16, 2023
a438bbb
address PR comments
rockspore May 17, 2023
a3a3a64
Merge branch 'service-config-parser' of github.com:rockspore/grpc int…
rockspore May 17, 2023
935af66
address PR comments
rockspore May 17, 2023
ccc6633
iwyu, clang_format and PR comments
rockspore May 17, 2023
0577455
fix test with json bug fixed
rockspore May 17, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
81 changes: 53 additions & 28 deletions src/core/ext/filters/rbac/rbac_service_config_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "absl/types/optional.h"

#include <grpc/support/log.h>
Expand All @@ -39,6 +40,7 @@ namespace grpc_core {

namespace {

using experimental::AuditLoggerFactory;
using experimental::AuditLoggerRegistry;

// RbacConfig: one or more RbacPolicy structs
Expand Down Expand Up @@ -198,8 +200,8 @@ struct RbacConfig {
int action;
std::map<std::string, Policy> policies;
// Defaults to 0 since its json field is optional.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/0/kNone/

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

int audit_condition = 0;
std::vector<AuditLogger> audit_loggers;
Rbac::AuditCondition audit_condition;
markdroth marked this conversation as resolved.
Show resolved Hide resolved
std::vector<std::unique_ptr<AuditLoggerFactory::Config>> logger_configs;

Rules() = default;
Rules(const Rules&) = delete;
Expand Down Expand Up @@ -757,7 +759,7 @@ void RbacConfig::RbacPolicy::Rules::AuditLogger::JsonPostLoad(
auto config_or =
LoadJsonObjectField<Json::Object>(json.object(), args, name, errors);
if (config_or.has_value()) {
config = std::move(config_or.value());
config = std::move(*config_or);
}
}

Expand All @@ -769,35 +771,26 @@ Rbac RbacConfig::RbacPolicy::Rules::TakeAsRbac(std::string name) {
Rbac rbac;
rbac.name = std::move(name);
rbac.action = static_cast<Rbac::Action>(action);
rbac.audit_condition = static_cast<Rbac::AuditCondition>(audit_condition);
rbac.audit_condition = audit_condition;
for (auto& p : policies) {
rbac.policies.emplace(p.first, p.second.TakeAsRbacPolicy());
}
for (auto& logger : audit_loggers) {
auto config_or = AuditLoggerRegistry::ParseConfig(
logger.name, Json::FromObject(std::move(logger.config)));
// The config should have been validated when the service config is
// generated.
GPR_ASSERT(config_or.ok());
rbac.logger_configs.push_back(std::move(config_or.value()));
}
rbac.logger_configs = std::move(logger_configs);
return rbac;
}

const JsonLoaderInterface* RbacConfig::RbacPolicy::Rules::JsonLoader(
const JsonArgs&) {
// Audit logger configs handled in post load.
static const auto* loader =
JsonObjectLoader<Rules>()
.Field("action", &Rules::action)
.OptionalField("policies", &Rules::policies)
.OptionalField("audit_condition", &Rules::audit_condition)
.OptionalField("audit_loggers", &Rules::audit_loggers)
.Finish();
static const auto* loader = JsonObjectLoader<Rules>()
.Field("action", &Rules::action)
.OptionalField("policies", &Rules::policies)
.Finish();
return loader;
}

void RbacConfig::RbacPolicy::Rules::JsonPostLoad(const Json&, const JsonArgs&,
void RbacConfig::RbacPolicy::Rules::JsonPostLoad(const Json& json,
const JsonArgs& args,
ValidationErrors* errors) {
// Validate action field.
auto rbac_action = static_cast<Rbac::Action>(action);
Expand All @@ -806,14 +799,46 @@ void RbacConfig::RbacPolicy::Rules::JsonPostLoad(const Json&, const JsonArgs&,
ValidationErrors::ScopedField field(errors, ".action");
errors->AddError("unknown action");
}
auto rbac_audit_condition =
static_cast<Rbac::AuditCondition>(audit_condition);
if (rbac_audit_condition != Rbac::AuditCondition::kNone &&
rbac_audit_condition != Rbac::AuditCondition::kOnAllow &&
rbac_audit_condition != Rbac::AuditCondition::kOnDeny &&
rbac_audit_condition != Rbac::AuditCondition::kOnDenyAndAllow) {
ValidationErrors::ScopedField field(errors, ".audit_condition");
errors->AddError("unknown audit condition");
// Parse and validate audit_condition field.
auto it = json.object().find("audit_condition");
markdroth marked this conversation as resolved.
Show resolved Hide resolved
int condition = static_cast<int>(Rbac::AuditCondition::kNone);
if (it != json.object().end()) {
if (it->second.type() != Json::Type::kNumber) {
ValidationErrors::ScopedField field(errors, ".audit_condition");
errors->AddError("is not a number");
} else {
GPR_ASSERT(absl::SimpleAtoi(it->second.string(), &condition));
}
}
switch (condition) {
case static_cast<int>(Rbac::AuditCondition::kNone):
case static_cast<int>(Rbac::AuditCondition::kOnAllow):
case static_cast<int>(Rbac::AuditCondition::kOnDeny):
case static_cast<int>(Rbac::AuditCondition::kOnDenyAndAllow):
break;
default: {
ValidationErrors::ScopedField field(errors, ".audit_condition");
errors->AddError("unknown audit condition");
}
}
audit_condition = static_cast<Rbac::AuditCondition>(condition);
if (json.object().find("audit_loggers") == json.object().end()) return;
// Parse and validate audit logger configs.
markdroth marked this conversation as resolved.
Show resolved Hide resolved
auto configs = LoadJsonObjectField<std::vector<AuditLogger>>(
json.object(), args, "audit_loggers", errors);
if (configs.has_value()) {
for (size_t i = 0; i < configs->size(); ++i) {
auto& logger = (*configs)[i];
auto config = AuditLoggerRegistry::ParseConfig(
logger.name, Json::FromObject(std::move(logger.config)));
if (!config.ok()) {
ValidationErrors::ScopedField field(
errors, absl::StrCat(".audit_loggers[", i, "]"));
errors->AddError(config.status().message());
continue;
}
logger_configs.push_back(std::move(*config));
}
}
}

Expand Down