diff options
| -rw-r--r-- | doc/guix.texi | 26 | ||||
| -rw-r--r-- | gnu/build/activation.scm | 38 | ||||
| -rw-r--r-- | gnu/services.scm | 45 | ||||
| -rw-r--r-- | gnu/system.scm | 14 |
4 files changed, 104 insertions, 19 deletions
diff --git a/doc/guix.texi b/doc/guix.texi index b3c16e6507b..3c23ae46c00 100644 --- a/doc/guix.texi +++ b/doc/guix.texi | |||
| @@ -46,7 +46,7 @@ Copyright @copyright{} 2017 Federico Beffa@* | |||
| 46 | Copyright @copyright{} 2017, 2018 Carlo Zancanaro@* | 46 | Copyright @copyright{} 2017, 2018 Carlo Zancanaro@* |
| 47 | Copyright @copyright{} 2017 Thomas Danckaert@* | 47 | Copyright @copyright{} 2017 Thomas Danckaert@* |
| 48 | Copyright @copyright{} 2017 humanitiesNerd@* | 48 | Copyright @copyright{} 2017 humanitiesNerd@* |
| 49 | Copyright @copyright{} 2017, 2021 Christopher Lemmer Webber@* | 49 | Copyright @copyright{} 2017, 2021 Christine Lemmer-Webber@* |
| 50 | Copyright @copyright{} 2017, 2018, 2019, 2020 Marius Bakke@* | 50 | Copyright @copyright{} 2017, 2018, 2019, 2020 Marius Bakke@* |
| 51 | Copyright @copyright{} 2017, 2019, 2020 Hartmut Goebel@* | 51 | Copyright @copyright{} 2017, 2019, 2020 Hartmut Goebel@* |
| 52 | Copyright @copyright{} 2017, 2019, 2020, 2021 Maxim Cournoyer@* | 52 | Copyright @copyright{} 2017, 2019, 2020, 2021 Maxim Cournoyer@* |
| @@ -32398,6 +32398,30 @@ package, can be designated by this G-expression (@pxref{G-Expressions}): | |||
| 32398 | #~(string-append #$shadow "/bin/passwd") | 32398 | #~(string-append #$shadow "/bin/passwd") |
| 32399 | @end example | 32399 | @end example |
| 32400 | 32400 | ||
| 32401 | @deftp {Data Type} setuid-program | ||
| 32402 | This data type represents a program with a setuid or setgid bit set. | ||
| 32403 | |||
| 32404 | @table @asis | ||
| 32405 | @item @code{program} | ||
| 32406 | A file-like object having its setuid and/or setgid bit set. | ||
| 32407 | |||
| 32408 | @item @code{setuid?} (default: @code{#t}) | ||
| 32409 | Whether to set user setuid bit. | ||
| 32410 | |||
| 32411 | @item @code{setgid?} (default: @code{#f}) | ||
| 32412 | Whether to set group setgid bit. | ||
| 32413 | |||
| 32414 | @item @code{user} (default: @code{0}) | ||
| 32415 | UID (integer) or user name (string) for the user owner of the program, | ||
| 32416 | defaults to root. | ||
| 32417 | |||
| 32418 | @item @code{group} (default: @code{0}) | ||
| 32419 | GID (integer) goup name (string) for the group owner of the program, | ||
| 32420 | defaults to root. | ||
| 32421 | |||
| 32422 | @end table | ||
| 32423 | @end deftp | ||
| 32424 | |||
| 32401 | A default set of setuid programs is defined by the | 32425 | A default set of setuid programs is defined by the |
| 32402 | @code{%setuid-programs} variable of the @code{(gnu system)} module. | 32426 | @code{%setuid-programs} variable of the @code{(gnu system)} module. |
| 32403 | 32427 | ||
diff --git a/gnu/build/activation.scm b/gnu/build/activation.scm index 2af1d44b5f2..9f6126023c0 100644 --- a/gnu/build/activation.scm +++ b/gnu/build/activation.scm | |||
| @@ -6,6 +6,8 @@ | |||
| 6 | ;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net> | 6 | ;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net> |
| 7 | ;;; Copyright © 2018, 2019 Ricardo Wurmus <rekado@elephly.net> | 7 | ;;; Copyright © 2018, 2019 Ricardo Wurmus <rekado@elephly.net> |
| 8 | ;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be> | 8 | ;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be> |
| 9 | ;;; Copyright © 2020 Christine Lemmer-Webber <cwebber@dustycloud.org> | ||
| 10 | ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re> | ||
| 9 | ;;; | 11 | ;;; |
| 10 | ;;; This file is part of GNU Guix. | 12 | ;;; This file is part of GNU Guix. |
| 11 | ;;; | 13 | ;;; |
| @@ -24,6 +26,7 @@ | |||
| 24 | 26 | ||
| 25 | (define-module (gnu build activation) | 27 | (define-module (gnu build activation) |
| 26 | #:use-module (gnu system accounts) | 28 | #:use-module (gnu system accounts) |
| 29 | #:use-module (gnu system setuid) | ||
| 27 | #:use-module (gnu build accounts) | 30 | #:use-module (gnu build accounts) |
| 28 | #:use-module (gnu build linux-boot) | 31 | #:use-module (gnu build linux-boot) |
| 29 | #:use-module (guix build utils) | 32 | #:use-module (guix build utils) |
| @@ -279,14 +282,17 @@ they already exist." | |||
| 279 | "/run/setuid-programs") | 282 | "/run/setuid-programs") |
| 280 | 283 | ||
| 281 | (define (activate-setuid-programs programs) | 284 | (define (activate-setuid-programs programs) |
| 282 | "Turn PROGRAMS, a list of file names, into setuid programs stored under | 285 | "Turn PROGRAMS, a list of file setuid-programs record, into setuid programs |
| 283 | %SETUID-DIRECTORY." | 286 | stored under %SETUID-DIRECTORY." |
| 284 | (define (make-setuid-program prog) | 287 | (define (make-setuid-program program setuid? setgid? uid gid) |
| 285 | (let ((target (string-append %setuid-directory | 288 | (let ((target (string-append %setuid-directory |
| 286 | "/" (basename prog)))) | 289 | "/" (basename program))) |
| 287 | (copy-file prog target) | 290 | (mode (+ #o0555 ; base permissions |
| 288 | (chown target 0 0) | 291 | (if setuid? #o4000 0) ; setuid bit |
| 289 | (chmod target #o4555))) | 292 | (if setgid? #o2000 0)))) ; setgid bit |
| 293 | (copy-file program target) | ||
| 294 | (chown target uid gid) | ||
| 295 | (chmod target mode))) | ||
| 290 | 296 | ||
| 291 | (format #t "setting up setuid programs in '~a'...~%" | 297 | (format #t "setting up setuid programs in '~a'...~%" |
| 292 | %setuid-directory) | 298 | %setuid-directory) |
| @@ -302,15 +308,27 @@ they already exist." | |||
| 302 | (for-each (lambda (program) | 308 | (for-each (lambda (program) |
| 303 | (catch 'system-error | 309 | (catch 'system-error |
| 304 | (lambda () | 310 | (lambda () |
| 305 | (make-setuid-program program)) | 311 | (let* ((program-name (setuid-program-program program)) |
| 312 | (setuid? (setuid-program-setuid? program)) | ||
| 313 | (setgid? (setuid-program-setgid? program)) | ||
| 314 | (user (setuid-program-user program)) | ||
| 315 | (group (setuid-program-group program)) | ||
| 316 | (uid (match user | ||
| 317 | ((? string?) (passwd:uid (getpwnam user))) | ||
| 318 | ((? integer?) user))) | ||
| 319 | (gid (match group | ||
| 320 | ((? string?) (group:gid (getgrnam group))) | ||
| 321 | ((? integer?) group)))) | ||
| 322 | (make-setuid-program program-name setuid? setgid? uid gid))) | ||
| 306 | (lambda args | 323 | (lambda args |
| 307 | ;; If we fail to create a setuid program, better keep going | 324 | ;; If we fail to create a setuid program, better keep going |
| 308 | ;; so that we don't leave %SETUID-DIRECTORY empty or | 325 | ;; so that we don't leave %SETUID-DIRECTORY empty or |
| 309 | ;; half-populated. This can happen if PROGRAMS contains | 326 | ;; half-populated. This can happen if PROGRAMS contains |
| 310 | ;; incorrect file names: <https://bugs.gnu.org/38800>. | 327 | ;; incorrect file names: <https://bugs.gnu.org/38800>. |
| 311 | (format (current-error-port) | 328 | (format (current-error-port) |
| 312 | "warning: failed to make '~a' setuid-root: ~a~%" | 329 | "warning: failed to make ~s setuid/setgid: ~a~%" |
| 313 | program (strerror (system-error-errno args)))))) | 330 | (setuid-program-program program) |
| 331 | (strerror (system-error-errno args)))))) | ||
| 314 | programs)) | 332 | programs)) |
| 315 | 333 | ||
| 316 | (define (activate-special-files special-files) | 334 | (define (activate-special-files special-files) |
diff --git a/gnu/services.scm b/gnu/services.scm index 8d413e198e6..2a8114a2196 100644 --- a/gnu/services.scm +++ b/gnu/services.scm | |||
| @@ -4,6 +4,8 @@ | |||
| 4 | ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> | 4 | ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> |
| 5 | ;;; Copyright © 2020, 2021 Ricardo Wurmus <rekado@elephly.net> | 5 | ;;; Copyright © 2020, 2021 Ricardo Wurmus <rekado@elephly.net> |
| 6 | ;;; Copyright © 2021 raid5atemyhomework <raid5atemyhomework@protonmail.com> | 6 | ;;; Copyright © 2021 raid5atemyhomework <raid5atemyhomework@protonmail.com> |
| 7 | ;;; Copyright © 2020 Christine Lemmer-Webber <cwebber@dustycloud.org> | ||
| 8 | ;;; Copyright © 2020, 2021 Brice Waegeneire <brice@waegenei.re> | ||
| 7 | ;;; | 9 | ;;; |
| 8 | ;;; This file is part of GNU Guix. | 10 | ;;; This file is part of GNU Guix. |
| 9 | ;;; | 11 | ;;; |
| @@ -40,6 +42,7 @@ | |||
| 40 | #:use-module (gnu packages base) | 42 | #:use-module (gnu packages base) |
| 41 | #:use-module (gnu packages bash) | 43 | #:use-module (gnu packages bash) |
| 42 | #:use-module (gnu packages hurd) | 44 | #:use-module (gnu packages hurd) |
| 45 | #:use-module (gnu system setuid) | ||
| 43 | #:use-module (srfi srfi-1) | 46 | #:use-module (srfi srfi-1) |
| 44 | #:use-module (srfi srfi-9) | 47 | #:use-module (srfi srfi-9) |
| 45 | #:use-module (srfi srfi-9 gnu) | 48 | #:use-module (srfi srfi-9 gnu) |
| @@ -801,15 +804,49 @@ directory." | |||
| 801 | FILES must be a list of name/file-like object pairs." | 804 | FILES must be a list of name/file-like object pairs." |
| 802 | (service etc-service-type files)) | 805 | (service etc-service-type files)) |
| 803 | 806 | ||
| 807 | (define (setuid-program->activation-gexp programs) | ||
| 808 | "Return an activation gexp for setuid-program from PROGRAMS." | ||
| 809 | (let ((programs (map (lambda (program) | ||
| 810 | ;; FIXME This is really ugly, I didn't managed to use | ||
| 811 | ;; "inherit" | ||
| 812 | (let ((program-name (setuid-program-program program)) | ||
| 813 | (setuid? (setuid-program-setuid? program)) | ||
| 814 | (setgid? (setuid-program-setgid? program)) | ||
| 815 | (user (setuid-program-user program)) | ||
| 816 | (group (setuid-program-group program)) ) | ||
| 817 | #~(setuid-program | ||
| 818 | (setuid? #$setuid?) | ||
| 819 | (setgid? #$setgid?) | ||
| 820 | (user #$user) | ||
| 821 | (group #$group) | ||
| 822 | (program #$program-name)))) | ||
| 823 | programs))) | ||
| 824 | (with-imported-modules (source-module-closure | ||
| 825 | '((gnu system setuid))) | ||
| 826 | #~(begin | ||
| 827 | (use-modules (gnu system setuid)) | ||
| 828 | |||
| 829 | (activate-setuid-programs (list #$@programs)))))) | ||
| 830 | |||
| 831 | (define (setuid-program-file-like-deprecated file-like) | ||
| 832 | (match file-like | ||
| 833 | ((? file-like? program) | ||
| 834 | (warning | ||
| 835 | (G_ "representing setuid programs with '~a' is \ | ||
| 836 | deprecated; use 'setuid-program' instead~%") program) | ||
| 837 | (setuid-program (program program))) | ||
| 838 | ((? setuid-program? program) | ||
| 839 | program))) | ||
| 840 | |||
| 804 | (define setuid-program-service-type | 841 | (define setuid-program-service-type |
| 805 | (service-type (name 'setuid-program) | 842 | (service-type (name 'setuid-program) |
| 806 | (extensions | 843 | (extensions |
| 807 | (list (service-extension activation-service-type | 844 | (list (service-extension activation-service-type |
| 808 | (lambda (programs) | 845 | setuid-program->activation-gexp))) |
| 809 | #~(activate-setuid-programs | ||
| 810 | (list #$@programs)))))) | ||
| 811 | (compose concatenate) | 846 | (compose concatenate) |
| 812 | (extend append) | 847 | (extend (lambda (config extensions) |
| 848 | (map setuid-program-file-like-deprecated | ||
| 849 | (append config extensions)))) | ||
| 813 | (description | 850 | (description |
| 814 | "Populate @file{/run/setuid-programs} with the specified | 851 | "Populate @file{/run/setuid-programs} with the specified |
| 815 | executables, making them setuid-root."))) | 852 | executables, making them setuid-root."))) |
diff --git a/gnu/system.scm b/gnu/system.scm index a7c2b1bca42..11e7152be1b 100644 --- a/gnu/system.scm +++ b/gnu/system.scm | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | ;;; Copyright © 2019 Meiyo Peng <meiyo.peng@gmail.com> | 7 | ;;; Copyright © 2019 Meiyo Peng <meiyo.peng@gmail.com> |
| 8 | ;;; Copyright © 2019, 2020 Miguel Ángel Arruga Vivas <rosen644835@gmail.com> | 8 | ;;; Copyright © 2019, 2020 Miguel Ángel Arruga Vivas <rosen644835@gmail.com> |
| 9 | ;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org> | 9 | ;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org> |
| 10 | ;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re> | 10 | ;;; Copyright © 2020, 2021 Brice Waegeneire <brice@waegenei.re> |
| 11 | ;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de> | 11 | ;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de> |
| 12 | ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com> | 12 | ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com> |
| 13 | ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <jannek@gnu.org> | 13 | ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <jannek@gnu.org> |
| @@ -74,6 +74,7 @@ | |||
| 74 | #:use-module (gnu system locale) | 74 | #:use-module (gnu system locale) |
| 75 | #:use-module (gnu system pam) | 75 | #:use-module (gnu system pam) |
| 76 | #:use-module (gnu system linux-initrd) | 76 | #:use-module (gnu system linux-initrd) |
| 77 | #:use-module (gnu system setuid) | ||
| 77 | #:use-module (gnu system uuid) | 78 | #:use-module (gnu system uuid) |
| 78 | #:use-module (gnu system file-systems) | 79 | #:use-module (gnu system file-systems) |
| 79 | #:use-module (gnu system mapped-devices) | 80 | #:use-module (gnu system mapped-devices) |
| @@ -267,7 +268,7 @@ | |||
| 267 | 268 | ||
| 268 | (pam-services operating-system-pam-services ; list of PAM services | 269 | (pam-services operating-system-pam-services ; list of PAM services |
| 269 | (default (base-pam-services))) | 270 | (default (base-pam-services))) |
| 270 | (setuid-programs operating-system-setuid-programs | 271 | (setuid-programs %operating-system-setuid-programs |
| 271 | (default %setuid-programs)) ; list of string-valued gexps | 272 | (default %setuid-programs)) ; list of string-valued gexps |
| 272 | 273 | ||
| 273 | (sudoers-file operating-system-sudoers-file ; file-like | 274 | (sudoers-file operating-system-sudoers-file ; file-like |
| @@ -671,7 +672,7 @@ bookkeeping." | |||
| 671 | (operating-system-environment-variables os)) | 672 | (operating-system-environment-variables os)) |
| 672 | host-name procs root-fs | 673 | host-name procs root-fs |
| 673 | (service setuid-program-service-type | 674 | (service setuid-program-service-type |
| 674 | (operating-system-setuid-programs os)) | 675 | (%operating-system-setuid-programs os)) |
| 675 | (service profile-service-type | 676 | (service profile-service-type |
| 676 | (operating-system-packages os)) | 677 | (operating-system-packages os)) |
| 677 | other-fs | 678 | other-fs |
| @@ -701,7 +702,7 @@ bookkeeping." | |||
| 701 | (pam-root-service (operating-system-pam-services os)) | 702 | (pam-root-service (operating-system-pam-services os)) |
| 702 | (operating-system-etc-service os) | 703 | (operating-system-etc-service os) |
| 703 | (service setuid-program-service-type | 704 | (service setuid-program-service-type |
| 704 | (operating-system-setuid-programs os)) | 705 | (%operating-system-setuid-programs os)) |
| 705 | (service profile-service-type (operating-system-packages os))))) | 706 | (service profile-service-type (operating-system-packages os))))) |
| 706 | 707 | ||
| 707 | (define* (operating-system-services os) | 708 | (define* (operating-system-services os) |
| @@ -1065,6 +1066,11 @@ use 'plain-file' instead~%") | |||
| 1065 | ;; TODO: Remove when glibc@2.23 is long gone. | 1066 | ;; TODO: Remove when glibc@2.23 is long gone. |
| 1066 | ("GUIX_LOCPATH" . "/run/current-system/locale"))) | 1067 | ("GUIX_LOCPATH" . "/run/current-system/locale"))) |
| 1067 | 1068 | ||
| 1069 | (define (operating-system-setuid-programs os) | ||
| 1070 | "Return the setuid programs for OS, as a list of setuid-program record." | ||
| 1071 | (map file-like->setuid-program | ||
| 1072 | (%operating-system-setuid-programs os))) | ||
| 1073 | |||
| 1068 | (define %setuid-programs | 1074 | (define %setuid-programs |
| 1069 | ;; Default set of setuid-root programs. | 1075 | ;; Default set of setuid-root programs. |
| 1070 | (let ((shadow (@ (gnu packages admin) shadow))) | 1076 | (let ((shadow (@ (gnu packages admin) shadow))) |
