summaryrefslogtreecommitdiff
path: root/gnu/build/activation.scm
diff options
context:
space:
mode:
authorTobias Geerinckx-Rice <me@tobias.gr>2023-07-23 02:00:00 +0200
committerTobias Geerinckx-Rice <me@tobias.gr>2024-08-11 02:00:00 +0200
commit71f0676a295841e2cc662eec0d3e9b7e69726035 (patch)
treea39d569981af5fbe9b19634a935c536709698915 /gnu/build/activation.scm
parent4e58dfee6c7456d1e662f66041b8a157efe8710a (diff)
privilege: Add POSIX capabilities(7) support.
* gnu/system/privilege.scm (<privileged-program>): Add a field representing the program's POSIX capabilities. (privileged-program-capabilities): New public procedure. * doc/guix.texi (Privileged Programs): Document it. * gnu/build/activation.scm (activate-privileged-programs): Take a LIBCAP package argument providing setcap(8) to apply said capabilities. * gnu/services.scm (privileged-program->activation-gexp): Pass said package argument where supported. Include privileged-program-capabilities in the compatibility hack.
Diffstat (limited to 'gnu/build/activation.scm')
-rw-r--r--gnu/build/activation.scm17
1 files changed, 12 insertions, 5 deletions
diff --git a/gnu/build/activation.scm b/gnu/build/activation.scm
index 77eb150477d..a57ca78a86a 100644
--- a/gnu/build/activation.scm
+++ b/gnu/build/activation.scm
@@ -288,9 +288,10 @@ they already exist."
288 ;; Place where privileged copies of programs are stored. 288 ;; Place where privileged copies of programs are stored.
289 "/run/privileged/bin") 289 "/run/privileged/bin")
290 290
291(define (activate-privileged-programs programs) 291(define (activate-privileged-programs programs libcap)
292 "Turn PROGRAMS, a list of file privileged-programs records, into privileged 292 "Turn PROGRAMS, a list of file privileged-programs records, into privileged
293copies stored under %PRIVILEGED-PROGRAM-DIRECTORY." 293copies stored under %PRIVILEGED-PROGRAM-DIRECTORY, using LIBCAP's setcap(8)
294binary if needed."
294 (define (ensure-empty-directory directory) 295 (define (ensure-empty-directory directory)
295 (if (file-exists? directory) 296 (if (file-exists? directory)
296 (for-each (compose delete-file 297 (for-each (compose delete-file
@@ -301,7 +302,7 @@ copies stored under %PRIVILEGED-PROGRAM-DIRECTORY."
301 string<?)) 302 string<?))
302 (mkdir-p directory)) ) 303 (mkdir-p directory)) )
303 304
304 (define (make-privileged-program program setuid? setgid? uid gid) 305 (define (make-privileged-program program setuid? setgid? uid gid capabilities)
305 (let ((target (string-append %privileged-program-directory 306 (let ((target (string-append %privileged-program-directory
306 "/" (basename program))) 307 "/" (basename program)))
307 (mode (+ #o0555 ; base permissions 308 (mode (+ #o0555 ; base permissions
@@ -309,7 +310,10 @@ copies stored under %PRIVILEGED-PROGRAM-DIRECTORY."
309 (if setgid? #o2000 0)))) ; setgid bit 310 (if setgid? #o2000 0)))) ; setgid bit
310 (copy-file program target) 311 (copy-file program target)
311 (chown target uid gid) 312 (chown target uid gid)
312 (chmod target mode))) 313 (chmod target mode)
314 (when (and capabilities libcap)
315 (system* (string-append libcap "/sbin/setcap")
316 "-q" capabilities target))))
313 317
314 (define (make-deprecated-wrapper program) 318 (define (make-deprecated-wrapper program)
315 ;; This will eventually become a script that warns on usage, then vanish. 319 ;; This will eventually become a script that warns on usage, then vanish.
@@ -331,13 +335,16 @@ copies stored under %PRIVILEGED-PROGRAM-DIRECTORY."
331 (setgid? (privileged-program-setgid? program)) 335 (setgid? (privileged-program-setgid? program))
332 (user (privileged-program-user program)) 336 (user (privileged-program-user program))
333 (group (privileged-program-group program)) 337 (group (privileged-program-group program))
338 (capabilities (privileged-program-capabilities program))
334 (uid (match user 339 (uid (match user
335 ((? string?) (passwd:uid (getpwnam user))) 340 ((? string?) (passwd:uid (getpwnam user)))
336 ((? integer?) user))) 341 ((? integer?) user)))
337 (gid (match group 342 (gid (match group
338 ((? string?) (group:gid (getgrnam group))) 343 ((? string?) (group:gid (getgrnam group)))
339 ((? integer?) group)))) 344 ((? integer?) group))))
340 (make-privileged-program program-name setuid? setgid? uid gid) 345 (make-privileged-program program-name
346 setuid? setgid? uid gid
347 capabilities)
341 (make-deprecated-wrapper program-name))) 348 (make-deprecated-wrapper program-name)))
342 (lambda args 349 (lambda args
343 ;; If we fail to create a privileged program, better keep going 350 ;; If we fail to create a privileged program, better keep going