Where to implement user limit settings ?

Damien Miller djm at mindrot.org
Thu Nov 29 19:32:01 AEDT 2018


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