diff options
author | Tom Gundersen <teg@jklm.no> | 2014-06-01 22:01:20 +0100 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2014-06-03 10:40:28 +0200 |
commit | 682265d5e2157882861b0091c6b81fa92699b72a (patch) | |
tree | dde1a99c7c4df2c673f4dabe02b7b6ba8409aede /src | |
parent | 0bbea466dcafc0ff51811a3bc451e983c02e63bf (diff) |
resolved: run as unpriviliged "systemd-resolve" user
This service is not yet network facing, but let's prepare nonetheless.
Currently all caps are dropped, but some may need to be kept in the
future.
Diffstat (limited to 'src')
-rw-r--r-- | src/resolve/resolved.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/resolve/resolved.c b/src/resolve/resolved.c index 2eaff60fce..f61b70f46b 100644 --- a/src/resolve/resolved.c +++ b/src/resolve/resolved.c @@ -25,9 +25,13 @@ #include "resolved.h" #include "mkdir.h" +#include "capability.h" int main(int argc, char *argv[]) { _cleanup_manager_free_ Manager *m = NULL; + const char *user = "systemd-resolve"; + uid_t uid; + gid_t gid; int r; log_set_target(LOG_TARGET_AUTO); @@ -42,11 +46,23 @@ int main(int argc, char *argv[]) { goto out; } + r = get_user_creds(&user, &uid, &gid, NULL, NULL); + if (r < 0) { + log_error("Cannot resolve user name %s: %s", user, strerror(-r)); + goto out; + } + /* Always create the directory where resolv.conf will live */ - r = mkdir_label("/run/systemd/resolve", 0755); - if (r < 0) + r = mkdir_safe_label("/run/systemd/resolve", 0755, uid, gid); + if (r < 0) { log_error("Could not create runtime directory: %s", strerror(-r)); + goto out; + } + + r = drop_privileges(uid, gid, 0); + if (r < 0) + goto out; r = manager_new(&m); if (r < 0) { |