diff -up xdm-1.1.11/config.h.in.add-audit-events xdm-1.1.11/config.h.in --- xdm-1.1.11/config.h.in.add-audit-events 2011-09-25 09:42:16.000000000 +0200 +++ xdm-1.1.11/config.h.in 2011-09-26 17:44:21.796495208 +0200 @@ -193,6 +193,9 @@ /* Use PAM for authentication */ #undef USE_PAM +/* Add linux audit support */ +#undef HAVE_LIBAUDIT + /* Use Security-Enhanced Linux (SELinux) support */ #undef USE_SELINUX diff -up xdm-1.1.11/configure.ac.add-audit-events xdm-1.1.11/configure.ac --- xdm-1.1.11/configure.ac.add-audit-events 2011-09-25 09:41:19.000000000 +0200 +++ xdm-1.1.11/configure.ac 2011-09-26 17:43:30.616557363 +0200 @@ -145,6 +145,29 @@ if test "x$USE_SELINUX" != "xno" ; then ) fi +AC_ARG_WITH(libaudit, + [ --with-libaudit=[auto/yes/no] Add Linux audit support [default=auto]],, + with_libaudit=auto) + +# Check for Linux auditing API +# +# libaudit detection +if test x$with_libaudit = xno ; then + have_libaudit=no; +else + # See if we have audit daemon library + AC_CHECK_LIB(audit, audit_log_user_message, + have_libaudit=yes, have_libaudit=no) +fi + +AM_CONDITIONAL(HAVE_LIBAUDIT, test x$have_libaudit = xyes) + +if test x$have_libaudit = xyes ; then + XDMGREET_LIBS="$XDMGREET_LIBS -laudit" + AC_DEFINE(HAVE_LIBAUDIT,1,[linux audit support]) +fi + + # Check whether to install systemd unit files, as suggested in daemon(7). AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files (default from the System and Service Manager)]),, diff -up xdm-1.1.11/greeter/greet.c.add-audit-events xdm-1.1.11/greeter/greet.c --- xdm-1.1.11/greeter/greet.c.add-audit-events 2011-09-25 09:35:47.000000000 +0200 +++ xdm-1.1.11/greeter/greet.c 2011-09-26 17:46:11.996361376 +0200 @@ -86,6 +86,13 @@ from The Open Group. # endif #endif +#ifdef HAVE_LIBAUDIT +#include +#include +#else +#define log_to_audit_system(l,h,s) do { ; } while (0) +#endif + #include #if defined(SECURE_RPC) && defined(sun) @@ -415,6 +422,29 @@ FailedLogin (struct display *d, const ch DrawFail (login); } +#ifdef USE_PAM +#ifdef HAVE_LIBAUDIT +static void +log_to_audit_system(const pam_handle_t *pamhp, int success) +{ + struct passwd *pw = NULL; + char *hostname = NULL, *tty = NULL, *login=NULL; + int audit_fd; + + audit_fd = audit_open(); + pam_get_item(pamhp, PAM_RHOST, &hostname); + pam_get_item(pamhp, PAM_TTY, &tty); + pam_get_item(pamhp, PAM_USER, &login); + if (login) + pw = getpwnam(login); + audit_log_acct_message(audit_fd, AUDIT_USER_LOGIN, + NULL, "login", login ? login : "(unknown)", + pw ? pw->pw_uid : -1, hostname, NULL, tty, success); + close(audit_fd); +} +#endif +#endif + _X_EXPORT greet_user_rtn GreetUser( struct display *d, @@ -600,6 +630,7 @@ greet_user_rtn GreetUser( if ((pam_error == PAM_SUCCESS) && (Verify (d, greet, verify))) { SetPrompt (login, 1, "Login Successful", LOGIN_TEXT_INFO, False); SetValue (login, 1, NULL); + log_to_audit_system(*pamhp, 1); break; } else { /* Try to fill in username for failed login error log */ @@ -611,6 +642,7 @@ greet_user_rtn GreetUser( (void *) &username)); } FailedLogin (d, username); + log_to_audit_system(*pamhp, 0); RUN_AND_CHECK_PAM_ERROR(pam_end, (*pamhp, pam_error)); }