[patch/cygwin] SSH_PRIVSEP_USER as function (was Re: SSH_PRIVSEP_USER configurable at runtime?)
Corinna Vinschen
vinschen at redhat.com
Wed May 21 18:13:30 EST 2014
Ping? It would be nice if we could discuss this patch further,
if it's not ok for inclusion.
Thanks,
Corinna
On May 15 13:28, Corinna Vinschen wrote:
> On Apr 2 14:44, Corinna Vinschen wrote:
> > On Apr 2 13:37, Peter Stuge wrote:
> > > Corinna Vinschen wrote:
> > > > On non-domain machines the account
> > > > name will be "sshd", not "${machine}+sshd". Except if the admin
> > > > specifies that the domain is always prepended, which makes it
> > > > "${machine}+sshd" again. And if the admin specifies the separator char
> > > > to be not '+' but, for instance '#', the account name will be
> > > > "${machine}#sshd".
> > > >
> > > > All that knowledge would have to go into sshd.c.
> > >
> > > FWIW I think this is the right solution.
> >
> > Hmm. Come to think of it, SSH_PRIVSEP_USER could be defined as a macro
> > calling a function which returns the username. And configure.ac could
> > define SSH_PRIVSEP_USER as, say, cygwin_privsep_user() by default, when
> > built for Cygwin so the ugly details could be hidden in bsd-cygwin_util.c.
> >
> > The Cygwin changes are still in an early stage of testing, but I'll
> > come back to this.
>
> Ok, after some mulling about, I prepared the below patch. What it does
> is this:
>
> - The default replacement string for SSH_PRIVSEP_USER in configure.ac
> is now CYGWIN_SSH_PRIVSEP_USER, if the target is Cygwin. This can
> still be overridden with --with-privsep-user=FOO.
>
> - openbsd-compat/bsd-cygwin_util.h defines CYGWIN_SSH_PRIVSEP_USER
> as a function call cygwin_ssh_privsep_user().
>
> - openbsd-compat/bsd-cygwin_util.c implements cygwin_ssh_privsep_user().
> The function fills a static buffer with a username fetched by calling
> an internal Cygwin function. The function fills the buffer with the
> correct username, for instance "DOMAIN+sshd". If the function fails
> (non-0 return value), the function falls back to the username "sshd".
>
> I just applied the required functionality to Cygwin's repository:
> https://cygwin.com/viewvc/src/winsup/cygwin/external.cc?r1=1.137&r2=1.138
>
> It will show up in the next official release 1.7.30. The below
> patch makes sure that the code also compiles and falls back to the
> username "sshd", if its getting built under an older version of
> Cygwin. Additionally, even if built for 1.7.30 and later it will
> still run under an older Cygwin version.
>
> I hope that patch is ok to support the discussed account mapping
> functionality. I tried to implement it as non-intrusive as possible.
>
>
> Thanks,
> Corinna
>
>
> Index: configure.ac
> ===================================================================
> RCS file: /cvs/openssh/configure.ac,v
> retrieving revision 1.573
> diff -u -p -r1.573 configure.ac
> --- configure.ac 15 May 2014 04:58:08 -0000 1.573
> +++ configure.ac 15 May 2014 11:26:21 -0000
> @@ -2872,7 +2872,14 @@ if test "x$PAM_MSG" = "xyes" ; then
> ])
> fi
>
> -SSH_PRIVSEP_USER=sshd
> +case "$host" in
> +*-*-cygwin*)
> + SSH_PRIVSEP_USER=CYGWIN_SSH_PRIVSEP_USER
> + ;;
> +*)
> + SSH_PRIVSEP_USER=sshd
> + ;;
> +esac
> AC_ARG_WITH([privsep-user],
> [ --with-privsep-user=user Specify non-privileged user for privilege separation],
> [
> @@ -2882,8 +2889,13 @@ AC_ARG_WITH([privsep-user],
> fi
> ]
> )
> -AC_DEFINE_UNQUOTED([SSH_PRIVSEP_USER], ["$SSH_PRIVSEP_USER"],
> - [non-privileged user for privilege separation])
> +if test "x$SSH_PRIVSEP_USER" = "xCYGWIN_SSH_PRIVSEP_USER" ; then
> + AC_DEFINE_UNQUOTED([SSH_PRIVSEP_USER], [CYGWIN_SSH_PRIVSEP_USER],
> + [Cygwin function to fetch non-privileged user for privilege separation])
> +else
> + AC_DEFINE_UNQUOTED([SSH_PRIVSEP_USER], ["$SSH_PRIVSEP_USER"],
> + [non-privileged user for privilege separation])
> +fi
> AC_SUBST([SSH_PRIVSEP_USER])
>
> if test "x$have_linux_no_new_privs" = "x1" ; then
> Index: openbsd-compat/bsd-cygwin_util.c
> ===================================================================
> RCS file: /cvs/openssh/openbsd-compat/bsd-cygwin_util.c,v
> retrieving revision 1.26
> diff -u -p -r1.26 bsd-cygwin_util.c
> --- openbsd-compat/bsd-cygwin_util.c 1 Jun 2013 22:07:32 -0000 1.26
> +++ openbsd-compat/bsd-cygwin_util.c 15 May 2014 11:26:22 -0000
> @@ -57,6 +57,22 @@ check_ntsec(const char *filename)
> return (pathconf(filename, _PC_POSIX_PERMISSIONS));
> }
>
> +const char *
> +cygwin_ssh_privsep_user()
> +{
> + static char cyg_privsep_user[DNLEN + UNLEN + 2];
> +
> + if (!cyg_privsep_user[0])
> + {
> +#ifdef CW_CYGNAME_FROM_WINNAME
> + if (cygwin_internal (CW_CYGNAME_FROM_WINNAME, "sshd", cyg_privsep_user,
> + sizeof cyg_privsep_user) != 0)
> +#endif
> + strcpy (cyg_privsep_user, "sshd");
> + }
> + return cyg_privsep_user;
> +}
> +
> #define NL(x) x, (sizeof (x) - 1)
> #define WENV_SIZ (sizeof (wenv_arr) / sizeof (wenv_arr[0]))
>
> Index: openbsd-compat/bsd-cygwin_util.h
> ===================================================================
> RCS file: /cvs/openssh/openbsd-compat/bsd-cygwin_util.h,v
> retrieving revision 1.17
> diff -u -p -r1.17 bsd-cygwin_util.h
> --- openbsd-compat/bsd-cygwin_util.h 18 Jan 2014 10:04:00 -0000 1.17
> +++ openbsd-compat/bsd-cygwin_util.h 15 May 2014 11:26:22 -0000
> @@ -39,6 +39,8 @@
> /* Avoid including windows headers. */
> typedef void *HANDLE;
> #define INVALID_HANDLE_VALUE ((HANDLE) -1)
> +#define DNLEN 16
> +#define UNLEN 256
>
> /* Cygwin functions for which declarations are only available when including
> windows headers, so we have to define them here explicitely. */
> @@ -48,6 +50,8 @@ extern void cygwin_set_impersonation_tok
> #include <sys/cygwin.h>
> #include <io.h>
>
> +#define CYGWIN_SSH_PRIVSEP_USER (cygwin_ssh_privsep_user())
> +const char *cygwin_ssh_privsep_user();
>
> int binary_open(const char *, int , ...);
> int check_ntsec(const char *);
>
>
> --
> Corinna Vinschen
> Cygwin Maintainer
> Red Hat
> _______________________________________________
> openssh-unix-dev mailing list
> openssh-unix-dev at mindrot.org
> https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev
--
Corinna Vinschen
Cygwin Maintainer
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.mindrot.org/pipermail/openssh-unix-dev/attachments/20140521/f5398451/attachment.bin>
More information about the openssh-unix-dev
mailing list