git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* git-daemon --inetd
@ 2005-09-15  6:04 H. Peter Anvin
  2005-09-15 16:03 ` Linus Torvalds
  0 siblings, 1 reply; 15+ messages in thread
From: H. Peter Anvin @ 2005-09-15  6:04 UTC (permalink / raw)
  To: Git Mailing List

Some people have asked why we haven't enabled git-daemon on kernel.org. 
  The reason is that git-daemon --inetd is broken; there is a patch in 
the current repository which claims to fix it, but there isn't a release 
version yet.

On that note, though, it would be very nice if there was a way to run 
git-daemon in a chroot, or otherwise restrict it to a specific 
subhierarchy of the filesystem.

	-hpa

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15  6:04 git-daemon --inetd H. Peter Anvin
@ 2005-09-15 16:03 ` Linus Torvalds
  2005-09-15 18:30   ` H. Peter Anvin
  2005-09-16  7:51   ` Junio C Hamano
  0 siblings, 2 replies; 15+ messages in thread
From: Linus Torvalds @ 2005-09-15 16:03 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: Git Mailing List



On Wed, 14 Sep 2005, H. Peter Anvin wrote:
> 
> On that note, though, it would be very nice if there was a way to run 
> git-daemon in a chroot, or otherwise restrict it to a specific 
> subhierarchy of the filesystem.

Hmm.. That should work fine. You can already just run it that way by just 
wrapping it in "chroot", but if you don't want that for some reason, how 
about a patch like this?

It compiles. That's just about all I can say about it.

		Linus

---
diff --git a/daemon.c b/daemon.c
--- a/daemon.c
+++ b/daemon.c
@@ -1,11 +1,19 @@
+/* setresuid/setresgid. GNU? Who are you kidding, glibc? */
+#define _GNU_SOURCE
+
 #include "cache.h"
 #include "pkt-line.h"
 #include <signal.h>
 #include <sys/wait.h>
 #include <sys/socket.h>
 #include <sys/time.h>
+#include <sys/types.h>
 #include <netdb.h>
 #include <netinet/in.h>
+#include <unistd.h>
+
+#include <pwd.h>
+#include <grp.h>
 
 static const char daemon_usage[] = "git-daemon [--inetd | --port=n]";
 
@@ -326,10 +334,50 @@ static int serve(int port)
 	}
 }
 
+/*
+ * This will drop our effective uid/gid to the real one,
+ * even if no "--user=" or "--group=" arguments were used.
+ *
+ * So it's not a no-op even without that.
+ */
+static void set_user_group(const char *user, const char *group)
+{
+	uid_t uid = getuid();
+	gid_t gid = getgid();
+	char *end;
+
+	if (user) {
+		struct passwd *pw = getpwnam(user);
+		if (pw) {
+			uid = pw->pw_uid;
+			gid = pw->pw_gid;
+		} else {
+			uid = strtol(user, &end, 10);
+			if (*end || end == user)
+				die("invalid user name '%s'", user);
+		}
+	}
+	if (group) {
+		struct group *grp = getgrnam(group);
+		if (grp) {
+			gid = grp->gr_gid;
+		} else {
+			gid = strtol(group, &end, 10);
+			if (*end || end == group)
+				die("invalid group name '%s'", group);
+		}
+	}
+	if (!uid || !gid)
+		die("I refuse to run as root");
+	if (setresgid(gid, gid, gid) || setresuid(uid, uid, uid))
+		die("I can't run as %d:%d", uid, gid);
+}
+
 int main(int argc, char **argv)
 {
 	int port = DEFAULT_GIT_PORT;
 	int inetd_mode = 0;
+	const char *user = NULL, *group = NULL;
 	int i;
 
 	for (i = 1; i < argc; i++) {
@@ -350,9 +398,32 @@ int main(int argc, char **argv)
 			continue;
 		}
 
+		if (!strncmp(arg, "--chroot=", 9)) {
+			if (chroot(arg+9) < 0)
+				die("unable to chroot to '%s': %s", arg+9, strerror(errno));
+			if (chdir("/") < 0)
+				die("unable to chdir to new root");
+
+			user = user ? user : "nobody";
+			group = group ? group : "nobody";
+			continue;
+		}
+
+		if (!strncmp(arg, "--user=", 7)) {
+			user = arg+7;
+			continue;
+		}
+
+		if (!strncmp(arg, "--group=", 8)) {
+			group = arg + 8;
+			continue;
+		}
+
 		usage(daemon_usage);
 	}
 
+	set_user_group(user, group);
+
 	if (inetd_mode) {
 		fclose(stderr); //FIXME: workaround
 		return execute();

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 16:03 ` Linus Torvalds
@ 2005-09-15 18:30   ` H. Peter Anvin
  2005-09-15 18:47     ` Linus Torvalds
  2005-09-16  6:23     ` Junio C Hamano
  2005-09-16  7:51   ` Junio C Hamano
  1 sibling, 2 replies; 15+ messages in thread
From: H. Peter Anvin @ 2005-09-15 18:30 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Git Mailing List

Linus Torvalds wrote:
> 
> Hmm.. That should work fine. You can already just run it that way by just 
> wrapping it in "chroot", but if you don't want that for some reason, how 
> about a patch like this?
> 
> It compiles. That's just about all I can say about it.
> 

Wrapping it in chroot() would mean having enough things in the chroot 
environment to support starting up programs, which is ugly.  I'll test 
the patch when I get a chance.

	-hpa

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 18:30   ` H. Peter Anvin
@ 2005-09-15 18:47     ` Linus Torvalds
  2005-09-15 19:19       ` H. Peter Anvin
  2005-09-16  6:23     ` Junio C Hamano
  1 sibling, 1 reply; 15+ messages in thread
From: Linus Torvalds @ 2005-09-15 18:47 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: Git Mailing List



On Thu, 15 Sep 2005, H. Peter Anvin wrote:
> 
> Wrapping it in chroot() would mean having enough things in the chroot 
> environment to support starting up programs, which is ugly.  I'll test 
> the patch when I get a chance.

Fair enough. This still requires "git-upload-pack" and any libraries that
requires, of course. You might want to do a statically linked version or
something.

Hmm. A quick check seems to say that git-upload-pack only does libz and 
libc. And the SHA1 stuff, of course, but that you can always get static by 
using the git built-in mozilla versions.

			Linus

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 18:47     ` Linus Torvalds
@ 2005-09-15 19:19       ` H. Peter Anvin
  2005-09-15 19:40         ` Linus Torvalds
  2005-09-15 19:57         ` Junio C Hamano
  0 siblings, 2 replies; 15+ messages in thread
From: H. Peter Anvin @ 2005-09-15 19:19 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Git Mailing List

Linus Torvalds wrote:
> 
> On Thu, 15 Sep 2005, H. Peter Anvin wrote:
> 
>>Wrapping it in chroot() would mean having enough things in the chroot 
>>environment to support starting up programs, which is ugly.  I'll test 
>>the patch when I get a chance.
> 
> 
> Fair enough. This still requires "git-upload-pack" and any libraries that
> requires, of course. You might want to do a statically linked version or
> something.
> 
> Hmm. A quick check seems to say that git-upload-pack only does libz and 
> libc. And the SHA1 stuff, of course, but that you can always get static by 
> using the git built-in mozilla versions.
> 

Could git-upload-pack be integrated into the git-daemon binary, so that 
the exec isn't needed?

	-hpa

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 19:19       ` H. Peter Anvin
@ 2005-09-15 19:40         ` Linus Torvalds
  2005-09-15 21:44           ` Martin Langhoff
  2005-09-15 19:57         ` Junio C Hamano
  1 sibling, 1 reply; 15+ messages in thread
From: Linus Torvalds @ 2005-09-15 19:40 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: Git Mailing List, Martin Langhoff, Jon Seymour



On Thu, 15 Sep 2005, H. Peter Anvin wrote:
> 
> Could git-upload-pack be integrated into the git-daemon binary, so that 
> the exec isn't needed?

Hmm.. Looking a bit closer, that's not really very helpful. 

git-upload-pack ends up fork/exec'ing git-rev-list too, to generate the 
list of commits. And then it ends up finishing off with 
"git-pack-objects". 

Yes, we could make it all be one huge thing, and try to have lots of 
functional interfaces. But that would be really quite ugly and big changes 
(they'd have to be asynchronous and give incremental results etc etc).

Maybe a post-1.0 effort. For now, I think you need to have a minimal
execution environment inside the chroot. Not a lot: git-upload-pack,
git-rev-list and git-pack-objects.

Now, it turns out that git-rev-list really is the most complex of them 
all, largely due to --merge-order. If you define NO_OPENSSL, you'll get a 
much simpler execution environment.

Btw, I think --merge-order was cool, but its weaker cousin --topo-order is
what is actually _used_. Maybe we should deprecate --merge-order? Right
now the only real user is git-archimport, and I think that one too really
only wants topo-order too. For example, right now I think git-archimport 
won't actually work if you build without openssl.

Jon? Martin?

		Linus

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 19:19       ` H. Peter Anvin
  2005-09-15 19:40         ` Linus Torvalds
@ 2005-09-15 19:57         ` Junio C Hamano
  1 sibling, 0 replies; 15+ messages in thread
From: Junio C Hamano @ 2005-09-15 19:57 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: Git Mailing List, Linus Torvalds

"H. Peter Anvin" <hpa@zytor.com> writes:

> Could git-upload-pack be integrated into the git-daemon binary, so that 
> the exec isn't needed?

In the longer term, I'd like to extend git-daemon-export-ok to
mean:

    - the presense of empty file means any supported operation
      not just git-upload-pack is allowed for backward
      compatibility.

    - otherwise list of allowed git-* server side program.

and be able to extend daemon.c:execute() function to check
and execute server side programs other than git-upload-pack.  So
the answer from me is a mild no.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 19:40         ` Linus Torvalds
@ 2005-09-15 21:44           ` Martin Langhoff
  2005-10-22 13:45             ` Jon Seymour
  0 siblings, 1 reply; 15+ messages in thread
From: Martin Langhoff @ 2005-09-15 21:44 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: H. Peter Anvin, Git Mailing List, Martin Langhoff, Jon Seymour

On 9/16/05, Linus Torvalds <torvalds@osdl.org> wrote:
> Btw, I think --merge-order was cool, but its weaker cousin --topo-order is
> what is actually _used_. Maybe we should deprecate --merge-order? Right
> now the only real user is git-archimport, and I think that one too really
> only wants topo-order too. For example, right now I think git-archimport
> won't actually work if you build without openssl.
> 
> Jon? Martin?

I've used merge-order because it made sense... in that it gave me the
same history and order that walking the arch history would. Most of
the time, anyway, and decided that I'd rather trust GIT over Arch on
merging strategies...

If topo-order is sane, then I'll just change that. Let me run a couple
of tests with it first ;)

WRT SSL... archimport doesn't care a bit about SSL, and if it does,
it's a bug. It calls tla to perform all the "fetch stuff from the Arch
repo operations", because I was too lazy to implement native support
for reading the (trivial) repo format over all the transports. And
with Arch, access to the remote repos is _fast_ (unlike cvs).

cheers,



martin

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 18:30   ` H. Peter Anvin
  2005-09-15 18:47     ` Linus Torvalds
@ 2005-09-16  6:23     ` Junio C Hamano
  1 sibling, 0 replies; 15+ messages in thread
From: Junio C Hamano @ 2005-09-16  6:23 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: Git Mailing List

"H. Peter Anvin" <hpa@zytor.com> writes:

> Wrapping it in chroot() would mean having enough things in the chroot 
> environment to support starting up programs, which is ugly.  I'll test 
> the patch when I get a chance.

I'd appreciate a forward of the patch with your acked by if you
find it acceptable for kernel.org use.

I'd apply Linus' patch myself and push it out in the proposed
updates branch, if you prefer.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 16:03 ` Linus Torvalds
  2005-09-15 18:30   ` H. Peter Anvin
@ 2005-09-16  7:51   ` Junio C Hamano
  2005-09-16 16:54     ` H. Peter Anvin
  2005-09-16 17:30     ` Linus Torvalds
  1 sibling, 2 replies; 15+ messages in thread
From: Junio C Hamano @ 2005-09-16  7:51 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Git Mailing List

Linus Torvalds <torvalds@osdl.org> writes:

> Hmm.. That should work fine. You can already just run it that way by just 
> wrapping it in "chroot", but if you don't want that for some reason, how 
> about a patch like this?

Later exchanges between you and HPA appeared to me that we would
need a chroot environment which has "enough stuff" and that this
patch may not help him very much.  Am I mistaken?

If not, then...

> +		if (!strncmp(arg, "--chroot=", 9)) {
> +			if (chroot(arg+9) < 0)
> +				die("unable to chroot to '%s': %s", arg+9, strerror(errno));
> +			if (chdir("/") < 0)
> +				die("unable to chdir to new root");
> +
> +			user = user ? user : "nobody";
> +			group = group ? group : "nobody";
> +			continue;
> +		}
> +
> +		if (!strncmp(arg, "--user=", 7)) {
> +			user = arg+7;
> +			continue;
> +		}

I think resolving user and group to numeric before you do
chroot() might make the setting up of chrooted environment a
little simpler; no need for supporting getpwnam and getgrnam
there.  On the other hand it may not matter -- you can always
give numeric uid/gid to begin with.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-16  7:51   ` Junio C Hamano
@ 2005-09-16 16:54     ` H. Peter Anvin
  2005-09-16 17:30     ` Linus Torvalds
  1 sibling, 0 replies; 15+ messages in thread
From: H. Peter Anvin @ 2005-09-16 16:54 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Linus Torvalds, Git Mailing List

Junio C Hamano wrote:
> 
> Later exchanges between you and HPA appeared to me that we would
> need a chroot environment which has "enough stuff" and that this
> patch may not help him very much.  Am I mistaken?
> 

Well, building a chroot environment which supports execing is a bit of a 
pain, but it's fully doable.  mount --bind especially makes that quite 
feasible.  It's just more work.

> I think resolving user and group to numeric before you do
> chroot() might make the setting up of chrooted environment a
> little simpler; no need for supporting getpwnam and getgrnam
> there.  On the other hand it may not matter -- you can always
> give numeric uid/gid to begin with.

Yes, resolve the username first.

	-hpa

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-16  7:51   ` Junio C Hamano
  2005-09-16 16:54     ` H. Peter Anvin
@ 2005-09-16 17:30     ` Linus Torvalds
  2005-09-16 18:23       ` H. Peter Anvin
  1 sibling, 1 reply; 15+ messages in thread
From: Linus Torvalds @ 2005-09-16 17:30 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Git Mailing List



On Fri, 16 Sep 2005, Junio C Hamano wrote:
> 
> Later exchanges between you and HPA appeared to me that we would
> need a chroot environment which has "enough stuff" and that this
> patch may not help him very much.  Am I mistaken?

No, I think that's correct.

> I think resolving user and group to numeric before you do
> chroot() might make the setting up of chrooted environment a
> little simpler; no need for supporting getpwnam and getgrnam
> there.

Right you are. Much better.

>  On the other hand it may not matter -- you can always
> give numeric uid/gid to begin with.

Well, the symbolic names are much nicer and more readable. So it would be 
better to do the uid/gid translation early, and change the "chroot" thing 
to be done after all that.

It gets a bit messy.. Easy enough to just save a "const char *new_root",
but then you have to split up the "set_user_group()" to be two functions,
around the actual chroot(), since the chroot needs to be done while we're
still root.

I think we can drop the patch for now. It doesn't buy much.

		Linus

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-16 17:30     ` Linus Torvalds
@ 2005-09-16 18:23       ` H. Peter Anvin
  0 siblings, 0 replies; 15+ messages in thread
From: H. Peter Anvin @ 2005-09-16 18:23 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, Git Mailing List

Linus Torvalds wrote:
> 
> Well, the symbolic names are much nicer and more readable. So it would be 
> better to do the uid/gid translation early, and change the "chroot" thing 
> to be done after all that.
> 
> It gets a bit messy.. Easy enough to just save a "const char *new_root",
> but then you have to split up the "set_user_group()" to be two functions,
> around the actual chroot(), since the chroot needs to be done while we're
> still root.
> 

Actually, initgroups() and setgroups(), and setgid() for that matter, 
can be done before the chroot().  The only thing that needs to remain 
until the end is setuid().

At one time I played around in tftp-hpa with trying to get Linux to keep 
only CAP_SYS_CHROOT around, but I think I gave up on it.  The way Linux 
capabilities play with the rest of the permission system isn't very 
useful :(

	-hpa

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-09-15 21:44           ` Martin Langhoff
@ 2005-10-22 13:45             ` Jon Seymour
  2005-10-22 21:05               ` Linus Torvalds
  0 siblings, 1 reply; 15+ messages in thread
From: Jon Seymour @ 2005-10-22 13:45 UTC (permalink / raw)
  To: martin.langhoff, Linus Torvalds
  Cc: H. Peter Anvin, Git Mailing List, Martin Langhoff, Junio C Hamano

On 9/16/05, Martin Langhoff <martin.langhoff@gmail.com> wrote:
> On 9/16/05, Linus Torvalds <torvalds@osdl.org> wrote:
> > Btw, I think --merge-order was cool, but its weaker cousin --topo-order is
> > what is actually _used_. Maybe we should deprecate --merge-order? Right
> > now the only real user is git-archimport, and I think that one too really
> > only wants topo-order too. For example, right now I think git-archimport
> > won't actually work if you build without openssl.
> >
> > Jon? Martin?

Sorry for the long delay in replying - I need to fix my mail filter so
that I do see GIT mail that is actually directed to me!

Is the concern with --merge-order the complexity of the logic (and
hence size of object), the intrusiveness into rev-list.c or the fact
that it uses the OPEN_SSL?

I believe I can rework the merge-order algorithm to avoid the need for
bignum support for OPEN_SSL, though I am not going to get a chance to
do that until December at the earliest.

Much as I hate to see my baby being orphaned, how about we deprecate
--merge-order for now and arrange things so that users have to
explicitly enable it if they want it. If enough people complain about
that, then I can produce a bignum-free version in the December
timeframe?

Regards,

jon.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: git-daemon --inetd
  2005-10-22 13:45             ` Jon Seymour
@ 2005-10-22 21:05               ` Linus Torvalds
  0 siblings, 0 replies; 15+ messages in thread
From: Linus Torvalds @ 2005-10-22 21:05 UTC (permalink / raw)
  To: Jon Seymour
  Cc: martin.langhoff, H. Peter Anvin, Git Mailing List,
	Martin Langhoff, Junio C Hamano



On Sat, 22 Oct 2005, Jon Seymour wrote:
> 
> Is the concern with --merge-order the complexity of the logic (and
> hence size of object), the intrusiveness into rev-list.c or the fact
> that it uses the OPEN_SSL?

Some of all. But mostly just the basic fact being that right now, nobody 
can really use --merge-order anyway, because if somebody compiles without 
OPEN_SSL, it just won't be there. So it's _practically_ useless.

		Linus

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2005-10-22 21:06 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-15  6:04 git-daemon --inetd H. Peter Anvin
2005-09-15 16:03 ` Linus Torvalds
2005-09-15 18:30   ` H. Peter Anvin
2005-09-15 18:47     ` Linus Torvalds
2005-09-15 19:19       ` H. Peter Anvin
2005-09-15 19:40         ` Linus Torvalds
2005-09-15 21:44           ` Martin Langhoff
2005-10-22 13:45             ` Jon Seymour
2005-10-22 21:05               ` Linus Torvalds
2005-09-15 19:57         ` Junio C Hamano
2005-09-16  6:23     ` Junio C Hamano
2005-09-16  7:51   ` Junio C Hamano
2005-09-16 16:54     ` H. Peter Anvin
2005-09-16 17:30     ` Linus Torvalds
2005-09-16 18:23       ` H. Peter Anvin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).