diff options
| author | Tobias Geerinckx-Rice <me@tobias.gr> | 2023-07-23 02:00:00 +0200 |
|---|---|---|
| committer | Tobias Geerinckx-Rice <me@tobias.gr> | 2024-08-11 02:00:00 +0200 |
| commit | 71f0676a295841e2cc662eec0d3e9b7e69726035 (patch) | |
| tree | a39d569981af5fbe9b19634a935c536709698915 /gnu/build/activation.scm | |
| parent | 4e58dfee6c7456d1e662f66041b8a157efe8710a (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.scm | 17 |
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 |
| 293 | copies stored under %PRIVILEGED-PROGRAM-DIRECTORY." | 293 | copies stored under %PRIVILEGED-PROGRAM-DIRECTORY, using LIBCAP's setcap(8) |
| 294 | binary 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 |
