On Thu, Jul 21, 2011 at 11:16:50PM -0400, Ben Boeckel wrote:
> Nicholas Marriott <nicholas.marri...@gmail.com> wrote:
> > Maybe. Can you give a bit more explanation? What is systemd-logind and
> > why does this option have anything to do with PAM? Why does it need PAM
> > to kill processes on logout?
> 
> If applications do nothing, they will be killed on logout. If, instead,
> the application declares that it holds a session via PAM, it will be
> left alone (my tests with Rawhide so far indicate that something isn't
> quite right and isn't happening as setting it doesn't really do much).
> 

Ok I see, but this really ties into my question below. Why this change?

Unix has always worked in the same way. If you logout then programs are
killed, unless they daemonize (which is pretty standard by now) in which
case they sit around until you kill them.

And sysadmins of course can kill your stuff whenever they like.

So, why is systemd different here?

It seems obvious - if users leave stuff running in the background they
should stay running, unless the admin has prevented it or kills
it. Seems pretty standard? I don't follow why this is different for
systemd.

I'm not wildly happy about adding more OS-specific code to tmux for
something it already does perfectly well everywhere (including Linux
right now).

If it has to be done differently then - glibc has the daemon() function,
and tmux uses it on Linux. Shouldn't this code be part of glibc instead
of tmux?

> > I'm not really clear on the use case either. It seems to me that if the
> > admin wants to kill all processes of a user on logout then tmux
> > shouldn't be an exception
> 
> I'll ask the systemd devs about this case.
> 
> > (or if it is, it should be in the program doing the killing and
> > configured by the admin, not in tmux).
> 
> It tracks PAM sessions. I'd imagine this is cleaner than keeping a list
> of exemptions somewhere.

If it has to be managed by the application then I don't agree. It is
cleaner to have a list managed by the admin than requiring code changes
to every application which is just a disaster.

> 
> > Or if the user wants to kill processes, why can't they do what they do
> > now and tmux will keep running as normal since it is stays as a
> > daemon...?
> 
> systemd-logind puts a user's session into a cgroup and kills the
> heirarchy when the user logs out. Without tmux declaring another
> session, tmux is in the session that gets killed.

That doesn't seem like tmux's problem, it seems like either the user or
the admin or systemd should configure tmux in a group it isn't going to
kill when tmux becomes a daemon? Like setsid?

> 
> > PAM is a bit awful so I'm reluctant to let tmux touch it without a
> > really good reason.
> 
> The patch is attached (doesn't adversely affect things on F15, trying
> out the Rawhide box when I get a chance). I'll ask the systemd devs if
> the patch does what is needed.

The bulk of this at least needs to be in osdep-linux.c.

> 
> --Ben

> diff --git a/trunk/configure.ac b/trunk/configure.ac
> index ba00a79..fce018b 100644
> --- a/trunk/configure.ac
> +++ b/trunk/configure.ac
> @@ -56,6 +56,13 @@ AC_ARG_ENABLE(
>  )
>  AM_CONDITIONAL(IS_STATIC, test "x" = xyes)
>  
> +# PAM support?
> +AC_ARG_ENABLE(
> +     pam,
> +     AC_HELP_STRING(--enable-pam, create a PAM session on server startup),
> +     found_pam=$enable_pam
> +)
> +
>  # Is this gcc?
>  AM_CONDITIONAL(IS_GCC, test "x$GCC" = xyes)
>  AC_MSG_CHECKING(for gcc that whines about -I)
> @@ -121,6 +128,18 @@ if test "x$found_curses" = xno; then
>      AC_MSG_ERROR("curses not found")
>  fi
>  
> +if test "x$enable_pam" = xyes; then
> +    # Look for libpam.
> +    AC_SEARCH_LIBS(pam_start, [pam], found_pam=yes, found_pam=no)
> +    # Look for libpam_misc.
> +    AC_SEARCH_LIBS(misc_conv, [pam_misc], found_pam_misc=yes, 
> found_pam_misc=no)
> +    if test "x$found_pam" = xno || test "x$found_pam_misc" = xno; then
> +     AC_MSG_ERROR("PAM not found")
> +    else
> +     AC_DEFINE(ENABLE_PAM)
> +    fi
> +fi
> +
>  # Look for networking libraries.
>  AC_SEARCH_LIBS(b64_ntop, resolv)
>  AC_SEARCH_LIBS(__b64_ntop, resolv)
> diff --git a/trunk/server.c b/trunk/server.c
> index c442c66..4fc3b9d 100644
> --- a/trunk/server.c
> +++ b/trunk/server.c
> @@ -16,6 +16,11 @@
>   * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
>   */
>  
> +#ifdef ENABLE_PAM
> +#include <security/pam_appl.h>
> +#include <security/pam_misc.h>
> +#endif
> +
>  #include <sys/types.h>
>  #include <sys/ioctl.h>
>  #include <sys/socket.h>
> @@ -26,6 +31,9 @@
>  #include <errno.h>
>  #include <event.h>
>  #include <fcntl.h>
> +#ifdef ENABLE_PAM
> +#include <pwd.h>
> +#endif
>  #include <signal.h>
>  #include <stdio.h>
>  #include <stdlib.h>
> @@ -52,6 +60,11 @@ struct event        server_ev_second;
>  
>  struct paste_stack global_buffers;
>  
> +#ifdef ENABLE_PAM
> +pam_handle_t *pam_handle;
> +int           pam_last_status;
> +#endif
> +
>  int           server_create_socket(void);
>  void          server_loop(void);
>  int           server_should_shutdown(void);
> @@ -65,6 +78,10 @@ void                server_child_stopped(pid_t, int);
>  void          server_second_callback(int, short, void *);
>  void          server_lock_server(void);
>  void          server_lock_sessions(void);
> +#ifdef ENABLE_PAM
> +void          server_pam_init(void);
> +void          server_pam_teardown(void);
> +#endif
>  
>  /* Create server socket. */
>  int
> @@ -152,6 +169,9 @@ server_start(void)
>       mode_key_init_trees();
>       key_bindings_init();
>       utf8_build();
> +#ifdef ENABLE_PAM
> +     server_pam_init();
> +#endif
>  
>       start_time = time(NULL);
>       log_debug("socket path %s", socket_path);
> @@ -199,6 +219,9 @@ server_start(void)
>  
>       set_signals(server_signal_callback);
>       server_loop();
> +#ifdef ENABLE_PAM
> +     server_pam_teardown();
> +#endif
>       exit(0);
>  }
>  
> @@ -522,3 +545,63 @@ server_lock_sessions(void)
>               }
>       }
>  }
> +
> +#ifdef ENABLE_PAM
> +/* Start a PAM session */
> +void
> +server_pam_init(void)
> +{
> +     struct passwd   *passwd_struct;
> +     struct pam_conv  conv;
> +
> +     pam_handle = NULL;
> +
> +     passwd_struct = getpwuid(geteuid());
> +
> +     if (!passwd_struct) {
> +             log_warnx("getpwuid error: %s", strerror(errno));
> +             return;
> +     }
> +
> +     conv.conv = misc_conv;
> +     conv.appdata_ptr = NULL;
> +
> +     pam_last_status = pam_start("tmux", passwd_struct->pw_name, &conv, 
> &pam_handle);
> +
> +     if (pam_last_status != PAM_SUCCESS) {
> +             pam_handle = NULL;
> +             log_warnx("pam_start error: %s", pam_strerror(pam_handle, 
> pam_last_status));
> +             return;
> +     }
> +
> +     pam_last_status = pam_open_session(pam_handle, 0);
> +
> +     if (pam_last_status != PAM_SUCCESS) {
> +             pam_handle = NULL;
> +             log_warnx("pam_open_session error: %s", 
> pam_strerror(pam_handle, pam_last_status));
> +             return;
> +     }
> +}
> +
> +/* Teardown a PAM session */
> +void
> +server_pam_teardown(void)
> +{
> +     if (!pam_handle) {
> +             return;
> +     }
> +
> +     pam_last_status = pam_close_session(pam_handle, 0);
> +
> +     if (pam_last_status != PAM_SUCCESS) {
> +             pam_handle = NULL;
> +             log_warnx("pam_close_session error: %s", 
> pam_strerror(pam_handle, pam_last_status));
> +             return;
> +     }
> +     pam_last_status = pam_end(pam_handle, pam_last_status);
> +
> +     if (pam_last_status != PAM_SUCCESS) {
> +             log_warnx("pam_end error: %s", pam_strerror(pam_handle, 
> pam_last_status));
> +     }
> +}
> +#endif


------------------------------------------------------------------------------
10 Tips for Better Web Security
Learn 10 ways to better secure your business today. Topics covered include:
Web security, SSL, hacker attacks & Denial of Service (DoS), private keys,
security Microsoft Exchange, secure Instant Messaging, and much more.
http://www.accelacomm.com/jaw/sfnl/114/51426210/
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to