Skip to content
API Documentation
BastionGuard™
anonymous_namespace{main.cpp} Namespace Reference

Classes

struct  Options

Functions

void handleStopSignal (int) noexcept
void handleReloadSignal (int) noexcept
void printUsage (const char *executable)
Options parseOptions (const int argc, char *argv[])
bastionguard::rootguard::Policy loadPolicy (const Options &options)
void writeRuntimeStatus (const bastionguard::rootguard::Policy &policy)
void writeRuntimePolicyView (const bastionguard::rootguard::Policy &policy)
bastionguard::rootguard::Policy auditRuntimePolicy (bastionguard::rootguard::Policy policy)
void printPolicySummary (const bastionguard::rootguard::Policy &policy)
bool is_flag (const std::string &arg, const std::string &long_name, const std::string &short_name={})
int clamp_log_level (int lvl)

Variables

volatile std::sig_atomic_t gStopRequested = 0
volatile std::sig_atomic_t gReloadRequested = 0

Function Documentation

◆ auditRuntimePolicy()

◆ clamp_log_level()

int anonymous_namespace{main.cpp}::clamp_log_level ( int lvl)

Definition at line 22 of file main.cpp.

22 {
23 if (lvl <= 0) return 0;
24 if (lvl >= 3) return 3;
25 return lvl;
26}

References clamp_log_level().

Referenced by clamp_log_level(), and main().

◆ handleReloadSignal()

void anonymous_namespace{main.cpp}::handleReloadSignal ( int )
noexcept

Definition at line 34 of file main.cpp.

35{
37}
volatile std::sig_atomic_t gReloadRequested
Definition main.cpp:27

References gReloadRequested, and handleReloadSignal().

Referenced by handleReloadSignal(), and main().

◆ handleStopSignal()

void anonymous_namespace{main.cpp}::handleStopSignal ( int )
noexcept

Definition at line 29 of file main.cpp.

30{
32}
volatile std::sig_atomic_t gStopRequested
Definition main.cpp:26

References gStopRequested, and handleStopSignal().

Referenced by handleStopSignal(), and main().

◆ is_flag()

bool anonymous_namespace{main.cpp}::is_flag ( const std::string & arg,
const std::string & long_name,
const std::string & short_name = {} )

Definition at line 18 of file main.cpp.

18 {}) {
19 return arg == long_name || (!short_name.empty() && arg == short_name);
20}

References is_flag().

Referenced by is_flag(), and main().

◆ loadPolicy()

bastionguard::rootguard::Policy anonymous_namespace{main.cpp}::loadPolicy ( const Options & options)

Definition at line 76 of file main.cpp.

77{
78 using namespace bastionguard::rootguard;
79
80 const std::string content = PolicySecurity::read(
81 options.policyPath, !options.allowUnsafePolicy);
82 Policy policy = PolicyLoader::loadFromText(content, options.policyPath);
83 if (options.modeOverride)
84 policy.mode = *options.modeOverride;
85 return policy;
86}
static Policy loadFromText(const std::string &content, const std::filesystem::path &source="<memory>")
static std::string read(const std::filesystem::path &path, bool requireSecureOwnership)
std::filesystem::path policyPath
Definition main.cpp:40
std::optional< bastionguard::rootguard::Mode > modeOverride
Definition main.cpp:41

References anonymous_namespace{main.cpp}::Options::allowUnsafePolicy, bastionguard::rootguard::PolicyLoader::loadFromText(), loadPolicy(), bastionguard::rootguard::Policy::mode, anonymous_namespace{main.cpp}::Options::modeOverride, anonymous_namespace{main.cpp}::Options::policyPath, and bastionguard::rootguard::PolicySecurity::read().

Referenced by loadPolicy(), and main().

◆ parseOptions()

Options anonymous_namespace{main.cpp}::parseOptions ( const int argc,
char * argv[] )

Definition at line 53 of file main.cpp.

54{
55 Options options;
56 for (int index = 1; index < argc; ++index) {
57 const std::string_view argument(argv[index]);
58 if (argument == "--policy" && index + 1 < argc) {
59 options.policyPath = argv[++index];
60 } else if (argument == "--audit") {
62 } else if (argument == "--enforce") {
64 } else if (argument == "--allow-unsafe-policy") {
65 options.allowUnsafePolicy = true;
66 } else if (argument == "--check-policy") {
67 options.checkOnly = true;
68 } else {
69 printUsage(argv[0]);
70 throw std::invalid_argument("argomento non riconosciuto");
71 }
72 }
73 return options;
74}
void printUsage(const char *executable)
Definition main.cpp:46

References anonymous_namespace{main.cpp}::Options::allowUnsafePolicy, bastionguard::rootguard::Audit, anonymous_namespace{main.cpp}::Options::checkOnly, bastionguard::rootguard::Enforce, anonymous_namespace{main.cpp}::Options::modeOverride, parseOptions(), anonymous_namespace{main.cpp}::Options::policyPath, and printUsage().

Referenced by main(), and parseOptions().

◆ printPolicySummary()

void anonymous_namespace{main.cpp}::printPolicySummary ( const bastionguard::rootguard::Policy & policy)

Definition at line 161 of file main.cpp.

162{
163 using namespace bastionguard::rootguard;
164 std::cerr << "RootGuard policy: mode=" << toString(policy.mode)
165 << " unknown_action=" << toString(policy.unknownAction)
166 << " metadata_action=" << toString(policy.metadataAction)
167 << " global_metadata_action=" << toString(policy.globalMetadataAction)
168 << " credential_action=" << toString(policy.credentialAnomalyAction)
169 << " auto_block_services=" << (policy.autoBlockSystemServices ? "true" : "false")
170 << " block_user_home=" << (policy.blockUserHome ? "true" : "false")
171 << " global_metadata=" << (policy.monitorGlobalPrivilegeMetadata ? "true" : "false")
172 << " metadata_bursts=" << (policy.detectGlobalMetadataBursts ? "true" : "false")
173 << " sample_limit=" << policy.globalMetadataSampleLimit
174 << " burst_threshold=" << policy.metadataBurstThreshold
175 << " trusted_apps=" << policy.trustedApplications.size()
176 << " trusted=" << policy.trustedExecutables.size()
177 << " denied=" << policy.deniedExecutables.size()
178 << " protected=" << policy.protectedPaths.size()
179 << " ignored=" << policy.ignoredPaths.size() << '\n';
180}
const char * toString(Mode mode) noexcept
Definition Policy.cpp:6
std::vector< PolicyPath > trustedExecutables
Definition Policy.hpp:56
std::vector< PolicyPath > deniedExecutables
Definition Policy.hpp:57
std::uint32_t metadataBurstThreshold
Definition Policy.hpp:44
std::vector< PolicyPath > ignoredPaths
Definition Policy.hpp:59
std::uint32_t globalMetadataSampleLimit
Definition Policy.hpp:43
std::vector< PolicyPath > protectedPaths
Definition Policy.hpp:58
std::vector< PolicyPath > trustedApplications
Definition Policy.hpp:55

References bastionguard::rootguard::Policy::autoBlockSystemServices, bastionguard::rootguard::Policy::blockUserHome, bastionguard::rootguard::Policy::credentialAnomalyAction, bastionguard::rootguard::Policy::deniedExecutables, bastionguard::rootguard::Policy::detectGlobalMetadataBursts, bastionguard::rootguard::Policy::globalMetadataAction, bastionguard::rootguard::Policy::globalMetadataSampleLimit, bastionguard::rootguard::Policy::ignoredPaths, bastionguard::rootguard::Policy::metadataAction, bastionguard::rootguard::Policy::metadataBurstThreshold, bastionguard::rootguard::Policy::mode, bastionguard::rootguard::Policy::monitorGlobalPrivilegeMetadata, printPolicySummary(), bastionguard::rootguard::Policy::protectedPaths, bastionguard::rootguard::toString(), bastionguard::rootguard::Policy::trustedApplications, bastionguard::rootguard::Policy::trustedExecutables, and bastionguard::rootguard::Policy::unknownAction.

Referenced by main(), and printPolicySummary().

◆ printUsage()

void anonymous_namespace{main.cpp}::printUsage ( const char * executable)

Definition at line 46 of file main.cpp.

47{
48 std::cerr << "uso: " << executable
49 << " [--policy FILE] [--audit|--enforce]"
50 " [--allow-unsafe-policy] [--check-policy]\n";
51}

References printUsage().

Referenced by parseOptions(), and printUsage().

◆ writeRuntimePolicyView()

void anonymous_namespace{main.cpp}::writeRuntimePolicyView ( const bastionguard::rootguard::Policy & policy)

Definition at line 114 of file main.cpp.

115{
116 const std::filesystem::path path{"/run/bastionguard-rootguard.policy-view"};
117 const std::filesystem::path temporary = path.string() + ".tmp." +
118 std::to_string(::getpid());
119 std::ofstream output(temporary, std::ios::trunc);
120 if (!output)
121 return;
122 output << "block_user_home=" << (policy.blockUserHome ? "true" : "false") << '\n'
123 << "monitor_global_privilege_metadata=" << (policy.monitorGlobalPrivilegeMetadata ? "true" : "false") << '\n'
124 << "detect_global_metadata_bursts=" << (policy.detectGlobalMetadataBursts ? "true" : "false") << '\n'
125 << "global_metadata_sample_limit=" << policy.globalMetadataSampleLimit << '\n'
126 << "metadata_burst_threshold=" << policy.metadataBurstThreshold << '\n'
127 << "metadata_burst_window_ms=" << policy.metadataBurstWindowMs << '\n'
128 << "metadata_burst_cooldown_ms=" << policy.metadataBurstCooldownMs << '\n';
129 for (const auto& rule : policy.trustedApplications)
130 output << "trusted_application=" << rule.path.string() << '\n';
131 for (const auto& rule : policy.trustedExecutables)
132 output << "trusted_executable=" << rule.path.string() << '\n';
133 for (const auto& rule : policy.deniedExecutables)
134 output << "denied_executable=" << rule.path.string() << '\n';
135 for (const auto& rule : policy.protectedPaths)
136 output << (rule.recursive ? "protected_recursive=" : "protected_path=")
137 << rule.path.string() << '\n';
138 for (const auto& rule : policy.ignoredPaths)
139 output << (rule.recursive ? "ignored_recursive=" : "ignored_path=")
140 << rule.path.string() << '\n';
141 output.close();
142 if (!output)
143 return;
144 ::chmod(temporary.c_str(), 0644);
145 if (::rename(temporary.c_str(), path.c_str()) != 0)
146 std::filesystem::remove(temporary);
147}
std::uint32_t metadataBurstCooldownMs
Definition Policy.hpp:46
std::uint32_t metadataBurstWindowMs
Definition Policy.hpp:45

References bastionguard::rootguard::Policy::blockUserHome, bastionguard::rootguard::Policy::deniedExecutables, bastionguard::rootguard::Policy::detectGlobalMetadataBursts, bastionguard::rootguard::Policy::globalMetadataSampleLimit, bastionguard::rootguard::Policy::ignoredPaths, bastionguard::rootguard::Policy::metadataBurstCooldownMs, bastionguard::rootguard::Policy::metadataBurstThreshold, bastionguard::rootguard::Policy::metadataBurstWindowMs, bastionguard::rootguard::Policy::monitorGlobalPrivilegeMetadata, bastionguard::rootguard::Policy::protectedPaths, bastionguard::rootguard::Policy::trustedApplications, bastionguard::rootguard::Policy::trustedExecutables, and writeRuntimePolicyView().

Referenced by main(), and writeRuntimePolicyView().

◆ writeRuntimeStatus()

void anonymous_namespace{main.cpp}::writeRuntimeStatus ( const bastionguard::rootguard::Policy & policy)

Definition at line 88 of file main.cpp.

89{
90 using namespace bastionguard::rootguard;
91 const std::filesystem::path path{"/run/bastionguard-rootguard.status"};
92 const std::filesystem::path temporary = path.string() + ".tmp." +
93 std::to_string(::getpid());
94 std::ofstream output(temporary, std::ios::trunc);
95 if (!output)
96 return;
97 const bool effectiveServiceBlocking = policy.autoBlockSystemServices &&
98 policy.mode == Mode::Enforce &&
100 output << "mode=" << toString(policy.mode) << '\n'
101 << "metadata_action=" << toString(policy.metadataAction) << '\n'
102 << "global_metadata_action=" << toString(policy.globalMetadataAction) << '\n'
103 << "auto_block_services="
104 << (effectiveServiceBlocking ? "true" : "false") << '\n'
105 << "block_user_home=" << (policy.blockUserHome ? "true" : "false") << '\n';
106 output.close();
107 if (!output)
108 return;
109 ::chmod(temporary.c_str(), 0644);
110 if (::rename(temporary.c_str(), path.c_str()) != 0)
111 std::filesystem::remove(temporary);
112}

References bastionguard::rootguard::Policy::autoBlockSystemServices, bastionguard::rootguard::Block, bastionguard::rootguard::Policy::blockUserHome, bastionguard::rootguard::Enforce, bastionguard::rootguard::Policy::globalMetadataAction, bastionguard::rootguard::Policy::metadataAction, bastionguard::rootguard::Policy::mode, bastionguard::rootguard::toString(), and writeRuntimeStatus().

Referenced by main(), and writeRuntimeStatus().

Variable Documentation

◆ gReloadRequested

volatile std::sig_atomic_t anonymous_namespace{main.cpp}::gReloadRequested = 0

Definition at line 27 of file main.cpp.

Referenced by handleReloadSignal(), and main().

◆ gStopRequested

volatile std::sig_atomic_t anonymous_namespace{main.cpp}::gStopRequested = 0

Definition at line 26 of file main.cpp.

Referenced by handleStopSignal(), and main().