Where to implement user limit settings ?
Pavel Troller
pavel.troller at gmail.com
Fri Nov 30 07:05:51 AEDT 2018
Hello Damien,
thank you for your advice! Do you think that something is explicitly
wrong with putting all the setup_lmits() call to the place you pointed out ?
I tried it and it seems to be perfectly working. I believe that there is
nothing which requires unmodified limits between this place and the one
where the call has been placed originally. Following your advice exactly
would require a lot of work with reimplementing the libshadow call by
splitting it into two parts, one reading the file and second applying the
limits, including a mechanism for handing the read limits over (so probably
extending struct authctxt with the limit values or so), which seems to me
too expensive for such a simple task. So, I'll do it only if there is
something really wrong with the unsplitted variant (a security problem,
possibility of crash etc).... which I cannot see from my perspective of a
foreigner in the Land of OpenSSH :-).
With regards, Pavel
On Thu, 29 Nov 2018 at 09:32, Damien Miller <djm at mindrot.org> wrote:
> On Thu, 29 Nov 2018, Pavel Troller wrote:
>
> > Hello,
> > I'm trying to implement setting of user limits (ulimit) in sshd. I'm
> > not using PAM so I need it in the sshd itself. The task is very simple -
> > just to put one line calling setup_limits(pw); and link with -lshadow.
> > But the problem is, where to put this line. I did it in session.c,
> > in do_child(), like this:
> >
> > #ifdef HAVE_OSF_SIA
> > session_setup_sia(pw, s->ttyfd == -1 ? NULL : s->tty);
> > if (!check_quietlogin(s, command))
> > do_motd();
> > #else /* HAVE_OSF_SIA */
> > /* When PAM is enabled we rely on it to do the nologin check */
> > if (!options.use_pam) {
> > do_nologin(pw);
> > setup_limits(pw); /* Setting up user limits */
> > }
> > do_setusercontext(pw);
> > /*
> > * PAM session modules in do_setusercontext may have
> > * generated messages, so if this in an interactive
> > * login then display them too.
> > */
> > if (!check_quietlogin(s, command))
> > display_loginmsg();
> >
> > But I found a problem - in this place the code is already running with
> > the user privileges, so the limits file (/etc/limits) is unreadable for
> > it (normaly it's owned by root with privs 600). If I chmod to 644
> > or chown to the user trying to log in, it can be read and the limits are
> > set. To be honest I don't understand, why it's happening before calling
> > do_setusercontext(pw), but it is.
> > I would need a better place, where to put this call, already in the
> child
> > process but still running with root privs.
>
> You should read the file in ssh.c:privsep_postauth() just after
> the /* child */ comment (sshd still has root privs there) but
> actually apply the limits where you have them in do_child().
>
> -d
>
More information about the openssh-unix-dev
mailing list