git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC] Secure central repositories by UNIX socket authentication

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jan 27, 2008, 18:51 UTC
Message-ID
<alpine.LSU.1.00.0801271841230.23907@racer.site>
In-Reply-To
<20080127173212.GW24004@spearce.org>
Hi,
On Sun, 27 Jan 2008, Shawn O. Pearce wrote:
Show 34 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> > On Sun, 27 Jan 2008, Shawn O. Pearce wrote:
> > 
> > >     ## Owner (not jdoe)
> > >     ##
> > >   cat >foo.git/hooks/update <<'EOF'
> > >   #!/bin/sh
> > >   test -z "$GIT_REMOTE_USER" || exit
> > >   case "$GIT_REMOTE_USER" in
> > >   jdoe)     exit 0;;
> > >   spearce)  exit 0;;
> > >   *)        exit 1
> > >   esac
> > >   EOF
> > >   chmod u+x foo.git/hooks/update
> > >   chmod 700 foo.git
> > > 
> > >   git daemon \
> > >       --export-all \
> > >       --enable=receive-pack \
> > >       --base=`pwd` \
> > >       --listen=/tmp/shawn-git
> > > 
> > >     ## Other User
> > >     ##
> > >   git push jdoe@server:/tmp/shawn-git/foo.git master
> > 
> > I probably miss something, but if you already go through SSH, the 
> > $USER is set appropriately, no?
> 
> Sure, $USER is set.  For "jdoe".  But due to the "chmod 700 foo.git" 
> above jdoe isn't actually allowed access to the repository directory. So 
> it doesn't matter what $USER is set to, jdoe cannot get to the files of 
> the repository.

Ah, that's what I missed. I thought you already used git-shell, and did not really read the chmod part.

Show 10 quoted lines
> So if you want to give out write access, but have it be limited to what 
> `git receive-pack` will permit (especially when coupled with an update 
> hook like contrib/hooks/update-paranoid) you need to limit what a user 
> can do to *only* executing git-receive-pack, but you also need to allow 
> that receive-pack to actually have write permission on the repository.
> 
> So you come down to four options:
> 
> 1) Make git-receive-pack setuid to the repository owner.
>    This is uh, ugly.
Concur.
> 2) Use the SSH key feature to have remote users login as
>    the repository owner, but use the authorized_keys file
>    to force them to only execute git-shell.
>    This is uh, ugly, especially with 50+ users.

Slight variation: do not permit other users access to your machine, except via git-shell. Then you don't need chmod 0700.

Show 5 quoted lines
> 3) Export git-daemon over TCP and --enable=receive-pack.
>    This doesn't get us any authentication.  Sure the
>    user is limited to what the update hook allows, but
>    the update hook has no way to trust who the remote
>    peer is.  You might as well not bother.

Right. --enable=receive-pack was meant for environments where you have to trust everybody anyway (think "Visual" SourceSafe, or PVCS with repositories on network shares).

Show 5 quoted lines
> 4) Add full user authentication to git-daemon and then do #3.
>    The user authentication can provide data down into the update
>    hook, such as by setting the $GIT_REMOTE_USER environment
>    variable.  That's basically this change, except I'm using bog
>    standard SSH to perform the authentication for me.

AFAIR the plan was to keep git-daemon as simple and stupid as possible; in particular _not_ to add any authentication.

Show 5 quoted lines
> If we don't do something like this then I think we need to teach 
> git-daemon how to accept SSL connections, and then once you give it SSL 
> you need to implement peer authentication by certificates, and then have 
> git_connect() in connect.c also implement setting up SSL connections, 
> and doing peer authentication with certificates.  Ick.

I never tried anything like this, but it should not be _that_ difficult, should it? Of course, I should read up on it before I say something about it first ;-)

Ciao, Dscho

Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 4 of 16 in “[RFC] Secure central repositories by UNIX socket authentication”
  1. Shawn O. PearceJan 27, 2008
  2. Johannes SchindelinJan 27, 2008
  3. Shawn O. PearceJan 27, 2008
  4. Johannes SchindelinJan 27, 2008
  5. Shawn O. PearceJan 28, 2008
  6. Dmitry PotapovJan 28, 2008
  7. Junio C HamanoJan 27, 2008
  8. git-daemon is insecure? (was: [RFC] Secure central repositories)Shawn O. Pearce, Jan 28, 2008
  9. Junio C HamanoJan 28, 2008
  10. Shawn O. PearceJan 28, 2008
  11. Shawn O. PearceJan 28, 2008
  12. Junio C HamanoJan 28, 2008
  13. Shawn O. PearceJan 28, 2008
  14. Asheesh LaroiaJan 28, 2008
  15. Shawn O. PearceJan 29, 2008
  16. Shawn O. PearceJan 28, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.