* [PATCH] Setting uid / gid is generally useful in nseneter @ 2014-07-26 20:22 bobtfish 2014-07-28 11:56 ` Karel Zak 0 siblings, 1 reply; 4+ messages in thread From: bobtfish @ 2014-07-26 20:22 UTC (permalink / raw) To: util-linux; +Cc: Tomas Doran From: Tomas Doran <bobtfish@bobtfish.net> It's useful to be able to set the UID/GID even when not using user namespaces (for example when creating a non-root shell in a pre-existing docker container) Signed-off-by: Tomas Doran <bobtfish@bobtfish.net> --- sys-utils/nsenter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys-utils/nsenter.c b/sys-utils/nsenter.c index d57edc8..23798f9 100644 --- a/sys-utils/nsenter.c +++ b/sys-utils/nsenter.c @@ -328,7 +328,7 @@ int main(int argc, char *argv[]) if (do_fork == 1) continue_as_child(); - if (namespaces & CLONE_NEWUSER) { + if (uid > 0 || gid > 0) { if (setgroups(0, NULL)) /* drop supplementary groups */ err(EXIT_FAILURE, _("setgroups failed")); if (setgid(gid) < 0) -- 2.0.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] Setting uid / gid is generally useful in nseneter 2014-07-26 20:22 [PATCH] Setting uid / gid is generally useful in nseneter bobtfish @ 2014-07-28 11:56 ` Karel Zak 2014-07-28 19:24 ` Eric W. Biederman 0 siblings, 1 reply; 4+ messages in thread From: Karel Zak @ 2014-07-28 11:56 UTC (permalink / raw) To: bobtfish; +Cc: util-linux, Eric Biederman On Sat, Jul 26, 2014 at 01:22:54PM -0700, bobtfish@bobtfish.net wrote: > It's useful to be able to set the UID/GID even when not using user namespaces > (for example when creating a non-root shell in a pre-existing docker container) > > Signed-off-by: Tomas Doran <bobtfish@bobtfish.net> > --- > sys-utils/nsenter.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/sys-utils/nsenter.c b/sys-utils/nsenter.c > index d57edc8..23798f9 100644 > --- a/sys-utils/nsenter.c > +++ b/sys-utils/nsenter.c > @@ -328,7 +328,7 @@ int main(int argc, char *argv[]) > if (do_fork == 1) > continue_as_child(); > > - if (namespaces & CLONE_NEWUSER) { > + if (uid > 0 || gid > 0) { Well, it breaks the current behavior (the default for CLONE_NEWUSER is UID=0 and GID=0). The question is this is the right direction, because I guess that the next patch for nsenter(1) will be "please, add supplementary groups support" ;-) Maybe the best will be to add to su(1) support for namespaces, something like: su --ns <pid>[:mount,uts,ipc,net,pid,user] to enter namespaces after authenticate (if required) and before identity change. Not sure how huge is this Pandora's box, but it's definitely the final solution for all the requirements, because su(1) already supports all the UID/GID related features. Eric, any note? Karel -- Karel Zak <kzak@redhat.com> http://karelzak.blogspot.com ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Setting uid / gid is generally useful in nseneter 2014-07-28 11:56 ` Karel Zak @ 2014-07-28 19:24 ` Eric W. Biederman 2014-07-29 11:23 ` Karel Zak 0 siblings, 1 reply; 4+ messages in thread From: Eric W. Biederman @ 2014-07-28 19:24 UTC (permalink / raw) To: Karel Zak; +Cc: bobtfish, util-linux, Richard Weinberger Karel Zak <kzak@redhat.com> writes: > On Sat, Jul 26, 2014 at 01:22:54PM -0700, bobtfish@bobtfish.net wrote: >> It's useful to be able to set the UID/GID even when not using user namespaces >> (for example when creating a non-root shell in a pre-existing docker container) >> >> Signed-off-by: Tomas Doran <bobtfish@bobtfish.net> >> --- >> sys-utils/nsenter.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/sys-utils/nsenter.c b/sys-utils/nsenter.c >> index d57edc8..23798f9 100644 >> --- a/sys-utils/nsenter.c >> +++ b/sys-utils/nsenter.c >> @@ -328,7 +328,7 @@ int main(int argc, char *argv[]) >> if (do_fork == 1) >> continue_as_child(); >> >> - if (namespaces & CLONE_NEWUSER) { >> + if (uid > 0 || gid > 0) { > > Well, it breaks the current behavior (the default for CLONE_NEWUSER > is UID=0 and GID=0). > > The question is this is the right direction, because I guess that the next > patch for nsenter(1) will be "please, add supplementary groups > support" ;-) > > Maybe the best will be to add to su(1) support for namespaces, something > like: > > su --ns <pid>[:mount,uts,ipc,net,pid,user] > > to enter namespaces after authenticate (if required) and before > identity change. Not sure how huge is this Pandora's box, but it's > definitely the final solution for all the requirements, because su(1) > already supports all the UID/GID related features. > > Eric, any note? Thinking about it. For my own use I believe I am still using an earlier version of nsenter that does not even call setuid or setgid. Thinking out loud. Calling setuid(0) and setgid(0) in nsenter solves a very practical problem of losing all capabilities on exec (because your uid != 0). Adding --setuid and --setgid is necessary because some user namespaces do not have uid 0 or gid 0 mapped so switching to those uids and gids would fail. At the end of the day nsenter needs to be a simple tool, that is easy to understand, because it is raw tool exposing the what the kernel provides more or less directly without any significant abstractions. Now it is a fact that nsenter must be run by root a process with CAP_SYS_ADMIN or it must enter a user namespace. Otherwise nsenter does not have the privileges to do someting. So assuming we have CAP_SETUID or CAP_SETGID also is reasonable. Hmm. I think su (in general) is a bad fit. There are two reasons. nsenter is not setuid and would not benefit from being so, most containers are primarily managed as a separate system, and so the configuration in /etc would not apply. In general I would not trust the global root to run in a container so there is sense in the direction of this patch. Especially if su does not exist in the destination which makes chaining nsenter and su difficult. .... So the direction I could see this nsenter evolving is reading the default uid and gid from the target process (A pain when in the case of user namespaces because the value uid and gid will need to be mapped into the target user namespace). Likewise we could if it matters read the supplementary groups from from the target process. As a practical matter I don't think supplementary groups are particularly interesting in simple cases and containers tend to be simple cases. So simply clearing the supplementary group ids should be sufficient. What I can see as productive (although possibly too much work) is to allow setting the control groups and the security module identifiers to that of the target process, or specified explicitly as we do with namespaces now. Ultimately nsenter should remain the simple raw tool that is gives you raw access to what the kernel implements (without too much pain) so that you can do things that whatever framework you are in does not implement. ... So my gut feel about this patch it that we should add a uid/gid unset state and generally implement this patch. As the code is simple and it implements a use case that quite hard to implement any other way. Eric ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Setting uid / gid is generally useful in nseneter 2014-07-28 19:24 ` Eric W. Biederman @ 2014-07-29 11:23 ` Karel Zak 0 siblings, 0 replies; 4+ messages in thread From: Karel Zak @ 2014-07-29 11:23 UTC (permalink / raw) To: Eric W. Biederman; +Cc: bobtfish, util-linux, Richard Weinberger On Mon, Jul 28, 2014 at 12:24:58PM -0700, Eric W. Biederman wrote: > Thinking out loud. Calling setuid(0) and setgid(0) in nsenter solves a > very practical problem of losing all capabilities on exec (because your > uid != 0). Adding --setuid and --setgid is necessary because some > user namespaces do not have uid 0 or gid 0 mapped so switching to > those uids and gids would fail. OK, I have improved --setuid and --setguid, so now it's usable for all namespaces (originally it was only for user namespaces). The default is still 0 for user namepaces.. The patch is below. > So the direction I could see this nsenter evolving is reading the > default uid and gid from the target process (A pain when in the case of That's nice idea, added to TODO. > user namespaces because the value uid and gid will need to be mapped > into the target user namespace). yep Karel >From 47f42c1d14901b8bc2eb477fb0082bcbdd5e79af Mon Sep 17 00:00:00 2001 From: Karel Zak <kzak@redhat.com> Date: Tue, 29 Jul 2014 13:07:44 +0200 Subject: [PATCH] nsenter: allow to use --set{uid,gid} for all namespaces Now it's possible to set UID and GID for user namespaces only. This patch removes this restriction and allow to use --set{uid,gid} in all cases. The default for user namespaces is still GID=0, UID=0. Reported-by: Tomas Doran <bobtfish@bobtfish.net> Signed-off-by: Karel Zak <kzak@redhat.com> --- sys-utils/nsenter.1 | 9 +++++++-- sys-utils/nsenter.c | 20 +++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/sys-utils/nsenter.1 b/sys-utils/nsenter.1 index 998fd0c..487f731 100644 --- a/sys-utils/nsenter.1 +++ b/sys-utils/nsenter.1 @@ -126,10 +126,15 @@ the target process. If file is specified, enter the user namespace specified by file. See also the \fB\-\-setuid\fR and \fB\-\-setgid\fR options. .TP \fB\-G\fR, \fB\-\-setgid\fR \fIgid\fR -Set the group ID which will be used in the entered user namespace. +Set the group ID which will be used in the entered namespace and drop +supplementary groups. +.BR nsenter (1) +always sets GID for user namespaces, the default is 0. .TP \fB\-S\fR, \fB\-\-setuid\fR \fIuid\fR -Set the user ID which will be used in the entered user namespace. +Set the user ID which will be used in the entered namespace. +.BR nsenter (1) +always sets UID for user namespaces, the default is 0. .TP \fB\-r\fR, \fB\-\-root\fR[=\fIdirectory\fR] Set the root directory. If no directory is specified, set the root directory to diff --git a/sys-utils/nsenter.c b/sys-utils/nsenter.c index d57edc8..87c6549 100644 --- a/sys-utils/nsenter.c +++ b/sys-utils/nsenter.c @@ -73,8 +73,8 @@ static void usage(int status) fputs(_(" -n, --net [=<file>] enter network namespace\n"), out); fputs(_(" -p, --pid [=<file>] enter pid namespace\n"), out); fputs(_(" -U, --user [=<file>] enter user namespace\n"), out); - fputs(_(" -S, --setuid <uid> set uid in user namespace\n"), out); - fputs(_(" -G, --setgid <gid> set gid in user namespace\n"), out); + fputs(_(" -S, --setuid <uid> set uid in entered namespace\n"), out); + fputs(_(" -G, --setgid <gid> set gid in entered namespace\n"), out); fputs(_(" -r, --root [=<dir>] set the root directory\n"), out); fputs(_(" -w, --wd [=<dir>] set the working directory\n"), out); fputs(_(" -F, --no-fork do not fork before exec'ing <program>\n"), out); @@ -182,7 +182,7 @@ int main(int argc, char *argv[]) struct namespace_file *nsfile; int c, namespaces = 0; - bool do_rd = false, do_wd = false; + bool do_rd = false, do_wd = false, force_uid = false, force_gid = false; int do_fork = -1; /* unknown yet */ uid_t uid = 0; gid_t gid = 0; @@ -243,9 +243,11 @@ int main(int argc, char *argv[]) break; case 'S': uid = strtoul_or_err(optarg, _("failed to parse uid")); + force_uid = true; break; case 'G': gid = strtoul_or_err(optarg, _("failed to parse gid")); + force_gid = true; break; case 'F': do_fork = 0; @@ -328,12 +330,16 @@ int main(int argc, char *argv[]) if (do_fork == 1) continue_as_child(); - if (namespaces & CLONE_NEWUSER) { - if (setgroups(0, NULL)) /* drop supplementary groups */ + /* for user namespaces we always set UID and GID (default is 0) */ + if (namespaces & CLONE_NEWUSER) + force_uid = true, force_gid = true; + + if (force_uid || force_gid) { + if (force_gid && setgroups(0, NULL)) /* drop supplementary groups */ err(EXIT_FAILURE, _("setgroups failed")); - if (setgid(gid) < 0) + if (force_gid && setgid(gid) < 0) /* change GID */ err(EXIT_FAILURE, _("setgid failed")); - if (setuid(uid) < 0) + if (force_uid && setuid(uid) < 0) /* change UID */ err(EXIT_FAILURE, _("setuid failed")); } -- 1.9.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-07-29 11:23 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-07-26 20:22 [PATCH] Setting uid / gid is generally useful in nseneter bobtfish 2014-07-28 11:56 ` Karel Zak 2014-07-28 19:24 ` Eric W. Biederman 2014-07-29 11:23 ` Karel Zak
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox