Hello,

This patch adds new audit events defined in libaudit 1.7.9. The events defined
are SYSTEM_STARTUP, RUNLEVEL_CHANGE, SYSTEM_SHUTDOWN. These events are
required to aid audit session analysis by programs like aulast and a session
exploration tool that is under development. I need these events to be
generated from a place that is hard to bypass so that the audit logs are
accurate.

This patch is against the 0.5.0 release and requires adding --with-libaudit to
the configure line. This patch has been tested on Fedora 9 and 10 with the
aulast program in audit-1.7.9 package.

Thanks,
-Steve


diff -urp upstart-0.5.0.orig/config.h.in upstart-0.5.0/config.h.in
--- upstart-0.5.0.orig/config.h.in      2008-11-05 14:08:00.000000000 -0500
+++ upstart-0.5.0/config.h.in   2008-11-05 14:18:54.000000000 -0500
@@ -254,6 +254,9 @@
 /* Define to 1 if your C compiler doesn't accept -c and -o together. */
 #undef NO_MINUS_C_MINUS_O
 
+/* Define to 1 if you want audit support */
+#undef HAVE_LIBAUDIT
+
 /* Name of package */
 #undef PACKAGE
 
diff -urp upstart-0.5.0.orig/configure.ac upstart-0.5.0/configure.ac
--- upstart-0.5.0.orig/configure.ac     2008-11-05 14:08:00.000000000 -0500
+++ upstart-0.5.0/configure.ac  2008-11-05 14:18:54.000000000 -0500
@@ -41,6 +41,25 @@ case $upstart_sbindir in
        ;;
 esac
 
+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,
+                 LIBAUDIT=-laudit, LIBAUDIT="")
+fi
+AC_SUBST(LIBAUDIT)
+AM_CONDITIONAL(HAVE_LIBAUDIT, test x$LIBAUDIT != x)
+if test x$LIBAUDIT != x ; then
+    AC_DEFINE(HAVE_LIBAUDIT,1,[linux audit support])
+fi
 
 AC_CONFIG_FILES([ Makefile m4/Makefile po/Makefile.in intl/Makefile
                  nih/Makefile init/Makefile dbus/Makefile doc/Makefile
diff -urp upstart-0.5.0.orig/util/Makefile.am upstart-0.5.0/util/Makefile.am
--- upstart-0.5.0.orig/util/Makefile.am 2008-11-05 14:08:01.000000000 -0500
+++ upstart-0.5.0/util/Makefile.am      2008-11-05 14:14:04.000000000 -0500
@@ -45,7 +45,8 @@ reboot_SOURCES = \
 reboot_LDFLAGS = -static
 reboot_LDADD = \
        ../nih/libnih.la \
-       $(LTLIBINTL)
+       $(LTLIBINTL) \
+       @LIBAUDIT@
 
 
 runlevel_SOURCES = \
@@ -54,7 +55,8 @@ runlevel_SOURCES = \
 runlevel_LDFLAGS = -static
 runlevel_LDADD = \
        ../nih/libnih.la \
-       $(LTLIBINTL)
+       $(LTLIBINTL) \
+       @LIBAUDIT@
 
 
 shutdown_SOURCES = \
@@ -68,7 +70,8 @@ shutdown_LDADD = \
        ../nih/libnih.la \
        ../nih/libnih-dbus.la \
        $(LTLIBINTL) \
-       $(DBUS_LIBS)
+       $(DBUS_LIBS) \
+       @LIBAUDIT@
 
 
 
diff -urp upstart-0.5.0.orig/util/reboot.c upstart-0.5.0/util/reboot.c
--- upstart-0.5.0.orig/util/reboot.c    2008-11-05 14:08:01.000000000 -0500
+++ upstart-0.5.0/util/reboot.c 2008-11-05 14:15:17.000000000 -0500
@@ -36,6 +36,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#ifdef HAVE_LIBAUDIT
+#include <libaudit.h>
+#endif
 
 #include <linux/if.h>
 #include <linux/hdreg.h>
@@ -97,6 +100,7 @@ enum {
 /* Prototypes for static functions */
 static void down_drives     (void);
 static void down_interfaces (void);
+static void send_audit_event(void);
 
 
 /**
@@ -267,6 +271,7 @@ main (int   argc,
         */
        reboot (RB_ENABLE_CAD);
        kill (1, SIGTSTP);
+       send_audit_event ();
 
        /* Sync the disks */
        chdir ("/");
@@ -305,6 +310,23 @@ main (int   argc,
        return 0;
 }
 
+/**
+ * send_audit_event
+ *
+ * Send system shutdown audit event
+ **/
+static void
+send_audit_event (void)
+{
+#ifdef HAVE_LIBAUDIT
+        int fd = audit_open ();
+        if (fd < 0)
+                return;
+        audit_log_user_message (fd, AUDIT_SYSTEM_SHUTDOWN, "init",
+                NULL, NULL, NULL, 1);
+        close (fd);
+#endif
+}
 
 /**
  * down_drives:
diff -urp upstart-0.5.0.orig/util/runlevel.c upstart-0.5.0/util/runlevel.c
--- upstart-0.5.0.orig/util/runlevel.c  2008-11-05 14:08:01.000000000 -0500
+++ upstart-0.5.0/util/runlevel.c       2008-11-05 14:12:27.000000000 -0500
@@ -33,6 +33,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#ifdef HAVE_LIBAUDIT
+#include <libaudit.h>
+#endif
 
 #include <nih/macros.h>
 #include <nih/alloc.h>
@@ -44,6 +47,7 @@
 
 /* Prototypes for static functions */
 static void store (short type, pid_t pid, const char *user);
+static void send_audit_event (int old, int level);
 
 
 /**
@@ -109,6 +113,7 @@ main (int   argc,
        /* Store the reboot time? */
        if (reboot) {
                store (BOOT_TIME, 0, "reboot");
+               send_audit_event (0, 0);
                exit (0);
        }
 
@@ -143,6 +148,7 @@ main (int   argc,
                prev = cur;
                if (! prev)
                        prev = 'N';
+               send_audit_event (prev, set[0]);
 
                cur = set[0];
        }
@@ -203,3 +209,35 @@ store (short       type,
        /* Write wtmp entry */
        updwtmp (WTMP_FILE, &utmp);
 }
+
+/**
+ * send_audit_event
+ * @old: current run level
+ * @level: new run level
+ *
+ * Send system runlevel change audit event. If level is 0, then 
+ * we consider this to be a reboot event.
+ **/
+static void
+send_audit_event (int old, int level)
+{
+#ifdef HAVE_LIBAUDIT
+        int fd = audit_open ();
+
+        if (fd < 0)
+                return;
+
+       if (level) {
+               char buf[64];
+
+               snprintf (buf, sizeof (buf),
+                       "old-level=%c new-level=%c", old, level);
+               audit_log_user_message (fd, AUDIT_SYSTEM_RUNLEVEL, buf,
+                       NULL, NULL, NULL, 1);
+       } else
+               audit_log_user_message (fd, AUDIT_SYSTEM_BOOT, "init",
+                       NULL, NULL, NULL, 1);
+        close (fd);
+#endif
+}
+
diff -urp upstart-0.5.0.orig/util/shutdown.c upstart-0.5.0/util/shutdown.c
--- upstart-0.5.0.orig/util/shutdown.c  2008-11-05 14:08:01.000000000 -0500
+++ upstart-0.5.0/util/shutdown.c       2008-11-05 14:17:52.000000000 -0500
@@ -38,6 +38,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#ifdef HAVE_LIBAUDIT
+#include <libaudit.h>
+#endif
 
 #include <nih/macros.h>
 #include <nih/alloc.h>
@@ -454,6 +457,23 @@ runlevel_setter (NihOption  *option,
        return 0;
 }
 
+/**
+ * send_audit_event
+ *
+ * Send system shutdown audit event
+ **/
+static void
+send_audit_event (void)
+{
+#ifdef HAVE_LIBAUDIT
+       int fd = audit_open ();
+       if (fd < 0)
+               return;
+       audit_log_user_message (fd, AUDIT_SYSTEM_SHUTDOWN, "init",
+               NULL, NULL, NULL, 1);
+       close (fd);
+#endif
+}
 
 /**
  * shutdown_now:
@@ -501,6 +521,8 @@ shutdown_now (void)
        NIH_MUST (nih_str_array_addp (&env, NULL, NULL, e));
        NIH_MUST (e = nih_sprintf (NULL, "PREVLEVEL=%s", prev_level()));
        NIH_MUST (nih_str_array_addp (&env, NULL, NULL, e));
+
+       send_audit_event ();
        
        /* Send the message */
        if (control_emit_event (proxy, "runlevel", env)) {

-- 
upstart-devel mailing list
upstart-devel@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/upstart-devel

Reply via email to