Skip to content

Commit

Permalink
dnsdist: Convert capabilities configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
rgacogne committed Jul 5, 2024
1 parent b8ea3cc commit 6f620be
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 17 deletions.
1 change: 1 addition & 0 deletions pdns/dnsdistdist/dnsdist-configuration.hh
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ static_assert(s_defaultPayloadSizeSelfGenAnswers < s_udpIncomingBufferSize, "The

struct Configuration
{
std::set<std::string> d_capabilitiesToRetain;
std::string d_consoleKey;
#ifdef __linux__
// On Linux this gives us 128k pending queries (default is 8192 queries),
Expand Down
29 changes: 18 additions & 11 deletions pdns/dnsdistdist/dnsdist-lua.cc
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,9 @@ static void handleNewServerSourceParameter(boost::optional<newserver_t>& vars, D
}
#ifdef SO_BINDTODEVICE
/* we need to retain CAP_NET_RAW to be able to set SO_BINDTODEVICE in the health checks */
g_capabilitiesToRetain.insert("CAP_NET_RAW");
dnsdist::configuration::updateImmutableConfiguration([](dnsdist::configuration::Configuration& config) {
config.d_capabilitiesToRetain.insert("CAP_NET_RAW");
});
#endif
}
else {
Expand Down Expand Up @@ -3295,17 +3297,22 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck)
#endif /* HAVE_LIBSSL && HAVE_OCSP_BASIC_SIGN && !DISABLE_OCSP_STAPLING */

luaCtx.writeFunction("addCapabilitiesToRetain", [](LuaTypeOrArrayOf<std::string> caps) {
if (!checkConfigurationTime("addCapabilitiesToRetain")) {
return;
}
setLuaSideEffect();
if (caps.type() == typeid(std::string)) {
g_capabilitiesToRetain.insert(boost::get<std::string>(caps));
try {
dnsdist::configuration::updateImmutableConfiguration([&caps](dnsdist::configuration::Configuration& config) {
if (caps.type() == typeid(std::string)) {
config.d_capabilitiesToRetain.insert(boost::get<std::string>(caps));
}
else if (caps.type() == typeid(LuaArray<std::string>)) {
for (const auto& cap : boost::get<LuaArray<std::string>>(caps)) {
config.d_capabilitiesToRetain.insert(cap.second);
}
}
});
setLuaSideEffect();
}
else if (caps.type() == typeid(LuaArray<std::string>)) {
for (const auto& cap : boost::get<LuaArray<std::string>>(caps)) {
g_capabilitiesToRetain.insert(cap.second);
}
catch (const std::exception& exp) {
g_outputBuffer = "addCapabilitiesToRetain cannot be used at runtime!\n";
errlog("addCapabilitiesToRetain cannot be used at runtime!");
}
});

Expand Down
6 changes: 2 additions & 4 deletions pdns/dnsdistdist/dnsdist.cc
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,6 @@ Rings g_rings;

GlobalStateHolder<servers_t> g_dstates;

std::set<std::string> g_capabilitiesToRetain;

// we are not willing to receive a bigger UDP response than that, no matter what
static constexpr size_t s_maxUDPResponsePacketSize{4096U};
static size_t const s_initialUDPPacketBufferSize = s_maxUDPResponsePacketSize + DNSCRYPT_MAX_RESPONSE_PADDING_AND_MAC_SIZE;
Expand Down Expand Up @@ -3102,7 +3100,7 @@ static void dropPrivileges()
}

bool retainedCapabilities = true;
if (!g_capabilitiesToRetain.empty() && (getegid() != newgid || geteuid() != newuid)) {
if (!dnsdist::configuration::getImmutableConfiguration().d_capabilitiesToRetain.empty() && (getegid() != newgid || geteuid() != newuid)) {
retainedCapabilities = keepCapabilitiesAfterSwitchingIDs();
}

Expand Down Expand Up @@ -3133,7 +3131,7 @@ static void dropPrivileges()
or as an unprivileged user with ambient
capabilities like CAP_NET_BIND_SERVICE.
*/
dropCapabilities(g_capabilitiesToRetain);
dropCapabilities(dnsdist::configuration::getImmutableConfiguration().d_capabilitiesToRetain);
}
catch (const std::exception& e) {
warnlog("%s", e.what());
Expand Down
2 changes: 0 additions & 2 deletions pdns/dnsdistdist/dnsdist.hh
Original file line number Diff line number Diff line change
Expand Up @@ -1056,8 +1056,6 @@ extern std::vector<std::shared_ptr<DNSCryptContext>> g_dnsCryptLocals;
bool handleDNSCryptQuery(PacketBuffer& packet, DNSCryptQuery& query, bool tcp, time_t now, PacketBuffer& response);
bool checkDNSCryptQuery(const ClientState& clientState, PacketBuffer& query, std::unique_ptr<DNSCryptQuery>& dnsCryptQuery, time_t now, bool tcp);

extern std::set<std::string> g_capabilitiesToRetain;

enum class ProcessQueryResult : uint8_t
{
Drop,
Expand Down

0 comments on commit 6f620be

Please sign in to comment.