From mboxrd@z Thu Jan 1 00:00:00 1970 From: "pelzflorian (Florian Pelz)" Subject: bug#38438: Fcgiwrap service has no supplementary groups Date: Wed, 4 Dec 2019 11:22:12 +0100 Message-ID: <20191204102212.ldt6w4whzfz6ceq5@pelzflorian.localdomain> References: <20191130184924.io5qmo6ujyy2xeyy@pelzflorian.localdomain> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="yoqzqu7dmymt7t7k" Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:56264) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1icRoO-0008Az-5m for bug-guix@gnu.org; Wed, 04 Dec 2019 05:23:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1icRoJ-0003VC-Jq for bug-guix@gnu.org; Wed, 04 Dec 2019 05:23:10 -0500 Received: from debbugs.gnu.org ([209.51.188.43]:35496) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1icRoI-0003JG-TF for bug-guix@gnu.org; Wed, 04 Dec 2019 05:23:07 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1icRoD-0002ph-Pr for bug-guix@gnu.org; Wed, 04 Dec 2019 05:23:01 -0500 Sender: "Debbugs-submit" Resent-Message-ID: Content-Disposition: inline In-Reply-To: <20191130184924.io5qmo6ujyy2xeyy@pelzflorian.localdomain> List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: "bug-Guix" To: 38438@debbugs.gnu.org --yoqzqu7dmymt7t7k Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit I had hoped the attached quick hack would fix my issue when testing with the attached vm-image config from . That is, I wanted it to suffice to set Gitolite’s umask to #o0027 as described in the manual instead of #o0022, after I do `usermod -aG git fcgiwrap`. But instead I get “Operation not permitted” error from setgroups. I will try again later with the position of setuid and setgroups call swapped. The hack makes make-forkexec-constructor use the supplementary groups from the user. Systemd uses them by default. However they should be made more configurable. Regards, Florian --yoqzqu7dmymt7t7k Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="quick-hack.patch" Content-Transfer-Encoding: 8bit >From ddf372637089957e8c62d53c7eca07cfa9155a04 Mon Sep 17 00:00:00 2001 From: Florian Pelz Date: Wed, 4 Dec 2019 09:33:08 +0100 Subject: [PATCH] gnu: shepherd: Patch Shepherd to set supplementary groups to those of #:user. Fixes . * gnu/packages/patches/shepherd-set-supplementary-groups.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/admin.scm (shepherd): Use it. --- gnu/local.mk | 1 + gnu/packages/admin.scm | 4 +- .../shepherd-set-supplementary-groups.patch | 43 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/shepherd-set-supplementary-groups.patch diff --git a/gnu/local.mk b/gnu/local.mk index 9ddd1349da..b807e3879c 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1348,6 +1348,7 @@ dist_patch_DATA = \ %D%/packages/patches/seahorse-gkr-use-0-on-empty-flags.patch \ %D%/packages/patches/seq24-rename-mutex.patch \ %D%/packages/patches/sharutils-CVE-2018-1000097.patch \ + %D%/packages/patches/shepherd-set-supplementary-groups.patch \ %D%/packages/patches/shishi-fix-libgcrypt-detection.patch \ %D%/packages/patches/slim-session.patch \ %D%/packages/patches/slim-config.patch \ diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm index 6e5648d159..3f94b45623 100644 --- a/gnu/packages/admin.scm +++ b/gnu/packages/admin.scm @@ -201,7 +201,9 @@ and provides a \"top-like\" mode (monitoring).") version ".tar.gz")) (sha256 (base32 - "1xn6mb5bh8bpfgdrh09ja31jk0ln7bmxbbf0vjcqxkkixs2wl6sk")))) + "1xn6mb5bh8bpfgdrh09ja31jk0ln7bmxbbf0vjcqxkkixs2wl6sk")) + (patches + (search-patches "shepherd-set-supplementary-groups.patch")))) (build-system gnu-build-system) (arguments '(#:configure-flags '("--localstatedir=/var"))) diff --git a/gnu/packages/patches/shepherd-set-supplementary-groups.patch b/gnu/packages/patches/shepherd-set-supplementary-groups.patch new file mode 100644 index 0000000000..8cac24417d --- /dev/null +++ b/gnu/packages/patches/shepherd-set-supplementary-groups.patch @@ -0,0 +1,43 @@ +diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm +index bd7e379..2344915 100644 +--- a/modules/shepherd/service.scm ++++ b/modules/shepherd/service.scm +@@ -758,6 +758,28 @@ daemon writing FILE is running in a separate PID namespace." + (try-again) + (apply throw args))))))) + ++(define (supplementary-gids user) ++ "Return a vector with the gid for each supplementary group USER belongs to. ++USER is the user name as a string." ++ ;; TODO: To find them, we loop through the group database, but maybe using ++ ;; glibc’s getgrouplist would be better. But it is not exported from Guile ++ ;; and it seems it is not part of POSIX (?). ++ (list->vector ++ (delete-duplicates ++ (dynamic-wind ++ (lambda () (setgrent)) ++ (lambda () ++ (let loop ((supgids '())) ++ (let ((group (getgrent))) ++ (define (user-among-group? group) ++ (member user (group:mem group))) ++ (match group ++ (#f supgids) ++ ((? user-among-group?) ++ (loop (cons (group:gid group) supgids))) ++ (else (loop supgids)))))) ++ (lambda () (endgrent)))))) ++ + (define* (exec-command command + #:key + (user #f) +@@ -826,7 +848,8 @@ false." + (when user + (catch #t + (lambda () +- (setuid (passwd:uid (getpw user)))) ++ (setuid (passwd:uid (getpw user))) ++ (setgroups (supplementary-gids user))) + (lambda (key . args) + (format (current-error-port) + "failed to change to user ~s:~%" user) -- 2.24.0 --yoqzqu7dmymt7t7k Content-Type: application/vnd.lotus-screencam Content-Disposition: attachment; filename="test-vm-config.scm" Content-Transfer-Encoding: quoted-printable (use-modules (gnu))=0A;(use-package-modules version-control)=0A(use-service= -modules cgit networking ssh version-control web)=0A=0A(define git-group-pe= rmissions-activation=0A #~(let ((dir "/var/lib/gitolite"))=0A (if (fi= le-exists? dir)=0A (chmod dir #o755)=0A (format #t "WARNI= NG: ~a does not exist yet; reconfigure again!"))))=0A=0A(define git-service= s=0A (list=0A (service gitolite-service-type=0A (gitolite-configurati= on=0A (admin-pubkey (plain-file=0A "pelzflorian.pub"= =0A "\=0Assh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEkSgMQnpb+= 1p6Z+8ZCm3tOjSA4vz2MQ/qX2XfXQly4l pelzflorian@florianmacbook"))=0A (rc-= file=0A (gitolite-rc-file=0A (umask #o0027)))))=0A (service cg= it-service-type=0A (cgit-configuration=0A (repository-directory "/va= r/lib/gitolite/repositories")))=0A (simple-service 'git-group-permissions= activation-service-type=0A git-group-permissions-activat= ion)))=0A=0A(operating-system=0A (host-name "gittestvm")=0A (timezone "Euro= pe/Berlin")=0A (services=0A (append=0A git-services=0A (list (service = dhcp-client-service-type)=0A (service openssh-service-type) ;; THIS= IS NECESSARY FOR GITOLITE=0A (service nginx-service-type))=0A %b= ase-services))=0A (bootloader=0A (bootloader-configuration=0A (bootloade= r grub-bootloader)=0A (target "/dev/sda")))=0A (file-systems=0A (cons* (= file-system=0A (mount-point "/")=0A (device "/dev/sda")= =0A (type "ext4"))=0A %base-file-systems)))=0A --yoqzqu7dmymt7t7k--