Skip to content
API Documentation
BastionGuard™
main.cpp File Reference

Go to the source code of this file.

Classes

struct  anonymous_namespace{main.cpp}::Options

Namespaces

namespace  anonymous_namespace{main.cpp}

Functions

void anonymous_namespace{main.cpp}::handleStopSignal (int) noexcept
void anonymous_namespace{main.cpp}::handleReloadSignal (int) noexcept
void anonymous_namespace{main.cpp}::printUsage (const char *executable)
Options anonymous_namespace{main.cpp}::parseOptions (const int argc, char *argv[])
bastionguard::rootguard::Policy anonymous_namespace{main.cpp}::loadPolicy (const Options &options)
void anonymous_namespace{main.cpp}::writeRuntimeStatus (const bastionguard::rootguard::Policy &policy)
void anonymous_namespace{main.cpp}::writeRuntimePolicyView (const bastionguard::rootguard::Policy &policy)
bastionguard::rootguard::Policy anonymous_namespace{main.cpp}::auditRuntimePolicy (bastionguard::rootguard::Policy policy)
void anonymous_namespace{main.cpp}::printPolicySummary (const bastionguard::rootguard::Policy &policy)
int main (const int argc, char *argv[])

Variables

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

Function Documentation

◆ main()

int main ( const int argc,
char * argv[] )

Definition at line 184 of file main.cpp.

185{
186 using namespace bastionguard::rootguard;
187
188 try {
189 const Options options = parseOptions(argc, argv);
190 Policy policy = loadPolicy(options);
191 printPolicySummary(policy);
192
193 if (options.checkOnly)
194 return EXIT_SUCCESS;
195
196 std::signal(SIGINT, handleStopSignal);
197 std::signal(SIGTERM, handleStopSignal);
198 std::signal(SIGHUP, handleReloadSignal);
199
200 ConsoleEventSink consoleSink;
201 MultiEventSink eventSink;
202 eventSink.add(consoleSink);
203
204 std::unique_ptr<JsonEventSink> jsonSink;
205 if (!policy.eventLog.empty()) {
206 if (const auto parent = policy.eventLog.parent_path(); !parent.empty())
207 std::filesystem::create_directories(parent);
208 jsonSink = std::make_unique<JsonEventSink>(policy.eventLog);
209 eventSink.add(*jsonSink);
210 }
211
212 const auto automaticServiceBlockingEnabled = [](const Policy& activePolicy) {
213 return activePolicy.autoBlockSystemServices &&
214 activePolicy.mode == Mode::Enforce &&
215 activePolicy.metadataAction == Action::Block;
216 };
217 AutomaticResponseSink responseSink(
218 eventSink, automaticServiceBlockingEnabled(policy));
219 RootGuardEngine engine(responseSink);
220 PolicyApplyReport report = engine.start(policy);
221 writeRuntimeStatus(policy);
223
224 std::cerr << "BastionGuard RootGuard avviato: trusted-app caricati="
225 << report.trustedApplicationsLoaded << " trusted caricati="
226 << report.trustedLoaded << " denied caricati="
227 << report.deniedLoaded << " protected caricati="
228 << report.protectedLoaded << '\n';
229 for (const auto& warning : report.warnings)
230 std::cerr << "RootGuard policy warning: " << warning << '\n';
231
232 while (gStopRequested == 0) {
233 const int result = engine.pollOnce(250);
234 if (result < 0)
235 throw std::runtime_error("errore ring buffer: " + std::to_string(result));
236
237 engine.runIntegrityCheckIfDue();
238
239 if (gReloadRequested != 0) {
241 bool auditEntered = false;
242 try {
243 /*
244 * Enter audit before opening/parsing the new file. Thus a
245 * security, syntax or path-resolution failure cannot leave
246 * the previous enforcement policy active unexpectedly.
247 */
248 engine.enterAuditMode();
249 auditEntered = true;
250 responseSink.setAutoBlockSystemServices(false);
252 Policy reloaded = loadPolicy(options);
253 const auto previousEventLog = policy.eventLog;
254 const auto reloadedReport = engine.reloadPolicy(reloaded);
255 policy = std::move(reloaded);
256 responseSink.setAutoBlockSystemServices(
257 automaticServiceBlockingEnabled(policy));
258 writeRuntimeStatus(policy);
260 std::cerr << "RootGuard policy ricaricata: trusted-app="
261 << reloadedReport.trustedApplicationsLoaded
262 << " trusted="
263 << reloadedReport.trustedLoaded << " denied="
264 << reloadedReport.deniedLoaded << " protected="
265 << reloadedReport.protectedLoaded << '\n';
266 if (policy.eventLog != previousEventLog) {
267 std::cerr << "nota: una modifica di event_log richiede riavvio\n";
268 }
269 } catch (const std::exception& error) {
270 std::cerr << "ricaricamento policy fallito; "
271 << (auditEntered
272 ? "motore lasciato in audit: "
273 : "impossibile garantire il passaggio in audit: ")
274 << error.what() << '\n';
275 }
276 }
277 }
278 std::filesystem::remove("/run/bastionguard-rootguard.status");
279 } catch (const std::exception& error) {
280 std::filesystem::remove("/run/bastionguard-rootguard.status");
281 std::cerr << "RootGuard: " << error.what() << '\n';
282 return EXIT_FAILURE;
283 }
284
285 return EXIT_SUCCESS;
286}
Options parseOptions(const int argc, char *argv[])
Definition main.cpp:53
void handleStopSignal(int) noexcept
Definition main.cpp:29
bastionguard::rootguard::Policy auditRuntimePolicy(bastionguard::rootguard::Policy policy)
Definition main.cpp:149
volatile std::sig_atomic_t gStopRequested
Definition main.cpp:26
void printPolicySummary(const bastionguard::rootguard::Policy &policy)
Definition main.cpp:161
void writeRuntimePolicyView(const bastionguard::rootguard::Policy &policy)
Definition main.cpp:114
void writeRuntimeStatus(const bastionguard::rootguard::Policy &policy)
Definition main.cpp:88
void handleReloadSignal(int) noexcept
Definition main.cpp:34
volatile std::sig_atomic_t gReloadRequested
Definition main.cpp:27
bastionguard::rootguard::Policy loadPolicy(const Options &options)
Definition main.cpp:76
std::filesystem::path eventLog
Definition Policy.hpp:54

References bastionguard::rootguard::MultiEventSink::add(), anonymous_namespace{main.cpp}::auditRuntimePolicy(), bastionguard::rootguard::Block, bastionguard::rootguard::PolicyApplyReport::deniedLoaded, bastionguard::rootguard::Enforce, bastionguard::rootguard::RootGuardEngine::enterAuditMode(), bastionguard::rootguard::Policy::eventLog, anonymous_namespace{main.cpp}::gReloadRequested, anonymous_namespace{main.cpp}::gStopRequested, anonymous_namespace{main.cpp}::handleReloadSignal(), anonymous_namespace{main.cpp}::handleStopSignal(), anonymous_namespace{main.cpp}::loadPolicy(), main(), anonymous_namespace{main.cpp}::parseOptions(), bastionguard::rootguard::RootGuardEngine::pollOnce(), anonymous_namespace{main.cpp}::printPolicySummary(), bastionguard::rootguard::PolicyApplyReport::protectedLoaded, bastionguard::rootguard::RootGuardEngine::reloadPolicy(), bastionguard::rootguard::RootGuardEngine::runIntegrityCheckIfDue(), bastionguard::rootguard::AutomaticResponseSink::setAutoBlockSystemServices(), bastionguard::rootguard::RootGuardEngine::start(), bastionguard::rootguard::PolicyApplyReport::trustedApplicationsLoaded, bastionguard::rootguard::PolicyApplyReport::trustedLoaded, bastionguard::rootguard::PolicyApplyReport::warnings, anonymous_namespace{main.cpp}::writeRuntimePolicyView(), and anonymous_namespace{main.cpp}::writeRuntimeStatus().