Blob Blame History Raw
diff -up shadow-4.15.0/lib/audit_help.c.audit-update shadow-4.15.0/lib/audit_help.c
--- shadow-4.15.0/lib/audit_help.c.audit-update	2024-02-01 23:59:36.000000000 +0100
+++ shadow-4.15.0/lib/audit_help.c	2024-02-09 10:49:57.106840590 +0100
@@ -48,7 +48,7 @@ void audit_help_open (void)
  * This function will log a message to the audit system using a predefined
  * message format. Parameter usage is as follows:
  *
- * type - type of message: AUDIT_USER_CHAUTHTOK for changing any account
+ * type - type of message: AUDIT_USER_MGMT for changing any account
  *	  attributes.
  * pgname - program's name
  * op  -  operation. "adding user", "changing finger info", "deleting group"
@@ -68,6 +68,39 @@ void audit_logger (int type, MAYBE_UNUSE
 	}
 }
 
+/*
+ * This function will log a message to the audit system using a predefined
+ * message format. Parameter usage is as follows:
+ *
+ * type - type of message: AUDIT_USER_MGMT for changing any account 
+ *	  attributes.
+ * pgname - program's name
+ * op  -  operation. "adding user", "changing finger info", "deleting group"
+ * name - user's account or group name. If not available use NULL.
+ * id  -  uid or gid that the operation is being performed on. This is used
+ *	  only when user is NULL.
+ * grp - group name associated with event
+ */
+void audit_logger_with_group (int type, MAYBE_UNUSED const char *pgname,
+		const char *op, const char *name, unsigned int id,
+		const char *grp, shadow_audit_result result)
+{
+	int len;
+	char enc_group[(GROUP_NAME_MAX_LENGTH*2)+1], buf[1024];
+	if (audit_fd < 0) {
+		return;
+	}
+	len = strnlen(grp, sizeof(enc_group)/2);
+	if (audit_value_needs_encoding(grp, len)) {
+		snprintf(buf, sizeof(buf), "%s grp=%s", op,
+			audit_encode_value(enc_group, grp, len));
+	} else {
+		snprintf(buf, sizeof(buf), "%s grp=\"%s\"", op, grp);
+	}
+	audit_log_acct_message (audit_fd, type, NULL, buf, name, id,
+		                        NULL, NULL, NULL, (int) result);
+}
+
 void audit_logger_message (const char *message, shadow_audit_result result)
 {
 	if (audit_fd < 0) {
diff -up shadow-4.15.0/lib/cleanup_group.c.audit-update shadow-4.15.0/lib/cleanup_group.c
--- shadow-4.15.0/lib/cleanup_group.c.audit-update	2024-02-01 23:59:36.000000000 +0100
+++ shadow-4.15.0/lib/cleanup_group.c	2024-02-09 10:49:57.106840590 +0100
@@ -62,7 +62,7 @@ void cleanup_report_mod_group (void *cle
 	         gr_dbname (),
 	         info->action));
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_USER_ACCT, log_get_progname(),
+	audit_logger (AUDIT_GRP_MGMT, log_get_progname(),
 	              info->audit_msg,
 	              info->name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
@@ -80,7 +80,7 @@ void cleanup_report_mod_gshadow (void *c
 	         sgr_dbname (),
 	         info->action));
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_USER_ACCT, log_get_progname(),
+	audit_logger (AUDIT_GRP_MGMT, log_get_progname(),
 	              info->audit_msg,
 	              info->name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
@@ -101,7 +101,7 @@ void cleanup_report_add_group_group (voi
 	SYSLOG ((LOG_ERR, "failed to add group %s to %s", name, gr_dbname ()));
 #ifdef WITH_AUDIT
 	audit_logger (AUDIT_ADD_GROUP, log_get_progname(),
-	              "adding group to /etc/group",
+	              "adding-group",
 	              name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
 #endif
@@ -120,8 +120,8 @@ void cleanup_report_add_group_gshadow (v
 
 	SYSLOG ((LOG_ERR, "failed to add group %s to %s", name, sgr_dbname ()));
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_ADD_GROUP, log_get_progname(),
-	              "adding group to /etc/gshadow",
+	audit_logger (AUDIT_GRP_MGMT, log_get_progname(),
+	              "adding-shadow-group",
 	              name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
 #endif
@@ -143,8 +143,8 @@ void cleanup_report_del_group_group (voi
 	         "failed to remove group %s from %s",
 	         name, gr_dbname ()));
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_ADD_GROUP, log_get_progname(),
-	              "removing group from /etc/group",
+	audit_logger (AUDIT_DEL_GROUP, log_get_progname(),
+	              "removing-group",
 	              name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
 #endif
@@ -166,8 +166,8 @@ void cleanup_report_del_group_gshadow (v
 	         "failed to remove group %s from %s",
 	         name, sgr_dbname ()));
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_ADD_GROUP, log_get_progname(),
-	              "removing group from /etc/gshadow",
+	audit_logger (AUDIT_GRP_MGMT, log_get_progname(),
+	              "removing-shadow-group",
 	              name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
 #endif
@@ -187,7 +187,7 @@ void cleanup_unlock_group (MAYBE_UNUSED
 		         log_get_progname(), gr_dbname ());
 		SYSLOG ((LOG_ERR, "failed to unlock %s", gr_dbname ()));
 #ifdef WITH_AUDIT
-		audit_logger_message ("unlocking group file",
+		audit_logger_message ("unlocking-group",
 		                      SHADOW_AUDIT_FAILURE);
 #endif
 	}
@@ -207,7 +207,7 @@ void cleanup_unlock_gshadow (MAYBE_UNUSE
 		         log_get_progname(), sgr_dbname ());
 		SYSLOG ((LOG_ERR, "failed to unlock %s", sgr_dbname ()));
 #ifdef WITH_AUDIT
-		audit_logger_message ("unlocking gshadow file",
+		audit_logger_message ("unlocking-gshadow",
 		                      SHADOW_AUDIT_FAILURE);
 #endif
 	}
diff -up shadow-4.15.0/lib/cleanup_user.c.audit-update shadow-4.15.0/lib/cleanup_user.c
--- shadow-4.15.0/lib/cleanup_user.c.audit-update	2024-02-01 23:59:36.000000000 +0100
+++ shadow-4.15.0/lib/cleanup_user.c	2024-02-09 10:49:57.106840590 +0100
@@ -44,7 +44,7 @@ void cleanup_report_mod_passwd (void *cl
 	         pw_dbname (),
 	         info->action));
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_USER_ACCT, log_get_progname(),
+	audit_logger (AUDIT_USER_MGMT, log_get_progname(),
 	              info->audit_msg,
 	              info->name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
@@ -65,7 +65,7 @@ void cleanup_report_add_user_passwd (voi
 	SYSLOG ((LOG_ERR, "failed to add user %s to %s", name, pw_dbname ()));
 #ifdef WITH_AUDIT
 	audit_logger (AUDIT_ADD_USER, log_get_progname(),
-	              "adding user to /etc/passwd",
+	              "adding-user",
 	              name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
 #endif
@@ -84,8 +84,8 @@ void cleanup_report_add_user_shadow (voi
 
 	SYSLOG ((LOG_ERR, "failed to add user %s to %s", name, spw_dbname ()));
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_ADD_USER, log_get_progname(),
-	              "adding user to /etc/shadow",
+	audit_logger (AUDIT_USER_MGMT, log_get_progname(),
+	              "adding-shadow-user",
 	              name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_FAILURE);
 #endif
@@ -104,7 +104,7 @@ void cleanup_unlock_passwd (MAYBE_UNUSED
 		         log_get_progname(), pw_dbname ());
 		SYSLOG ((LOG_ERR, "failed to unlock %s", pw_dbname ()));
 #ifdef WITH_AUDIT
-		audit_logger_message ("unlocking passwd file",
+		audit_logger_message ("unlocking-passwd",
 		                      SHADOW_AUDIT_FAILURE);
 #endif
 	}
@@ -123,7 +123,7 @@ void cleanup_unlock_shadow (MAYBE_UNUSED
 		         log_get_progname(), spw_dbname ());
 		SYSLOG ((LOG_ERR, "failed to unlock %s", spw_dbname ()));
 #ifdef WITH_AUDIT
-		audit_logger_message ("unlocking shadow file",
+		audit_logger_message ("unlocking-shadow",
 		                      SHADOW_AUDIT_FAILURE);
 #endif
 	}
diff -up shadow-4.15.0/lib/prototypes.h.audit-update shadow-4.15.0/lib/prototypes.h
--- shadow-4.15.0/lib/prototypes.h.audit-update	2024-02-01 23:59:36.000000000 +0100
+++ shadow-4.15.0/lib/prototypes.h	2024-02-09 10:49:57.106840590 +0100
@@ -198,12 +198,21 @@ extern int audit_fd;
 extern void audit_help_open (void);
 /* Use AUDIT_NO_ID when a name is provided to audit_logger instead of an ID */
 #define AUDIT_NO_ID	((unsigned int) -1)
+#ifndef AUDIT_GRP_MGMT
+#define AUDIT_GRP_MGMT          1132    /* Group account was modified */
+#endif
+#ifndef AUDIT_GRP_CHAUTHTOK
+#define AUDIT_GRP_CHAUTHTOK     1133    /* Group account password was changed */
+#endif
 typedef enum {
 	SHADOW_AUDIT_FAILURE = 0,
 	SHADOW_AUDIT_SUCCESS = 1} shadow_audit_result;
 extern void audit_logger (int type, const char *pgname, const char *op,
                           const char *name, unsigned int id,
                           shadow_audit_result result);
+void audit_logger_with_group (int type, MAYBE_UNUSED const char *pgname,
+                const char *op, const char *name, unsigned int id, 
+                const char *grp, shadow_audit_result result);
 void audit_logger_message (const char *message, shadow_audit_result result);
 #endif
 
diff -up shadow-4.15.0/src/chage.c.audit-update shadow-4.15.0/src/chage.c
--- shadow-4.15.0/src/chage.c.audit-update	2024-01-22 22:36:43.000000000 +0100
+++ shadow-4.15.0/src/chage.c	2024-02-09 10:49:57.106840590 +0100
@@ -110,8 +110,8 @@ fail_exit (int code)
 
 #ifdef WITH_AUDIT
 	if (E_SUCCESS != code) {
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "change age", user_name, user_uid, 0);
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "change-age", user_name, user_uid, SHADOW_AUDIT_FAILURE);
 	}
 #endif
 
@@ -845,10 +845,7 @@ int main (int argc, char **argv)
 			fprintf (stderr, _("%s: Permission denied.\n"), Prog);
 			fail_exit (E_NOPERM);
 		}
-#ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "display aging info", user_name, user_uid, 1);
-#endif
+		/* Displaying fields is not of interest to audit */
 		list_fields ();
 		fail_exit (E_SUCCESS);
 	}
@@ -867,39 +864,39 @@ int main (int argc, char **argv)
 		}
 #ifdef WITH_AUDIT
 		else {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "change all aging information",
-			              user_name, user_uid, 1);
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "change-all-aging-information",
+			              user_name, user_uid, SHADOW_AUDIT_SUCCESS);
 		}
 #endif
 	} else {
 #ifdef WITH_AUDIT
 		if (Mflg) {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "change max age", user_name, user_uid, 1);
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "change-max-age", user_name, user_uid, SHADOW_AUDIT_SUCCESS);
 		}
 		if (mflg) {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "change min age", user_name, user_uid, 1);
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "change-min-age", user_name, user_uid, 1);
 		}
 		if (dflg) {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "change last change date",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "change-last-change-date",
 			              user_name, user_uid, 1);
 		}
 		if (Wflg) {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "change passwd warning",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "change-passwd-warning",
 			              user_name, user_uid, 1);
 		}
 		if (Iflg) {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "change inactive days",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "change-inactive-days",
 			              user_name, user_uid, 1);
 		}
 		if (Eflg) {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "change passwd expiration",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "change-passwd-expiration",
 			              user_name, user_uid, 1);
 		}
 #endif
diff -up shadow-4.15.0/src/gpasswd.c.audit-update shadow-4.15.0/src/gpasswd.c
--- shadow-4.15.0/src/gpasswd.c.audit-update	2024-02-01 23:59:36.000000000 +0100
+++ shadow-4.15.0/src/gpasswd.c	2024-02-09 10:55:42.642444103 +0100
@@ -125,7 +125,7 @@ static void usage (int status)
 	(void) fputs (_("  -d, --delete USER             remove USER from GROUP\n"), usageout);
 	(void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
 	(void) fputs (_("  -Q, --root CHROOT_DIR         directory to chroot into\n"), usageout);
-	(void) fputs (_("  -r, --remove-password         remove the GROUP's password\n"), usageout);
+	(void) fputs (_("  -r, --delete-password         remove the GROUP's password\n"), usageout);
 	(void) fputs (_("  -R, --restrict                restrict access to GROUP to its members\n"), usageout);
 	(void) fputs (_("  -M, --members USER,...        set the list of members of GROUP\n"), usageout);
 #ifdef SHADOWGRP
@@ -384,20 +384,14 @@ static void open_files (void)
 
 static void log_gpasswd_failure (const char *suffix)
 {
-#ifdef WITH_AUDIT
-	char  buf[1024];
-#endif
-
 	if (aflg) {
 		SYSLOG ((LOG_ERR,
 		         "%s failed to add user %s to group %s%s",
 		         myname, user, group, suffix));
 #ifdef WITH_AUDIT
-		SNPRINTF(buf, "%s failed to add user %s to group %s%s",
-		         myname, user, group, suffix);
-		audit_logger (AUDIT_USER_ACCT, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+		              "add-user-to-group",
+		              user, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_FAILURE);
 #endif
 	} else if (dflg) {
@@ -405,11 +399,9 @@ static void log_gpasswd_failure (const c
 		         "%s failed to remove user %s from group %s%s",
 		         myname, user, group, suffix));
 #ifdef WITH_AUDIT
-		SNPRINTF(buf, "%s failed to remove user %s from group %s%s",
-		         myname, user, group, suffix);
-		audit_logger (AUDIT_USER_ACCT, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+		              "delete-user-from-group",
+		              user, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_FAILURE);
 #endif
 	} else if (rflg) {
@@ -417,11 +409,9 @@ static void log_gpasswd_failure (const c
 		         "%s failed to remove password of group %s%s",
 		         myname, group, suffix));
 #ifdef WITH_AUDIT
-		SNPRINTF(buf, "%s failed to remove password of group %s%s",
-		         myname, group, suffix);
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_GRP_CHAUTHTOK, Prog,
+		              "delete-group-password",
+		              myname, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_FAILURE);
 #endif
 	} else if (Rflg) {
@@ -429,11 +429,9 @@ static void log_gpasswd_failure (const c
 		         "%s failed to restrict access to group %s%s",
 		         myname, group, suffix));
 #ifdef WITH_AUDIT
-		SNPRINTF(buf, "%s failed to restrict access to group %s%s",
-		         myname, group, suffix);
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_GRP_MGMT, Prog,
+		              "restrict-group",
+		              myname, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_FAILURE);
 #endif
 	} else if (Aflg || Mflg) {
@@ -443,11 +433,9 @@ static void log_gpasswd_failure (const c
 			         "%s failed to set the administrators of group %s to %s%s",
 			         myname, group, admins, suffix));
 #ifdef WITH_AUDIT
-			SNPRINTF(buf, "%s failed to set the administrators of group %s to %s%s",
-			         myname, group, admins, suffix);
-			audit_logger (AUDIT_USER_ACCT, Prog,
-			              buf,
-			              group, AUDIT_NO_ID,
+			audit_logger_with_group (AUDIT_GRP_MGMT, Prog,
+			              "set-admins-of-group",
+			              admins, AUDIT_NO_ID, group,
 			              SHADOW_AUDIT_FAILURE);
 #endif
 		}
@@ -457,11 +457,9 @@ static void log_gpasswd_failure (const c
 			         "%s failed to set the members of group %s to %s%s",
 			         myname, group, members, suffix));
 #ifdef WITH_AUDIT
-			SNPRINTF(buf, "%s failed to set the members of group %s to %s%s",
-			         myname, group, members, suffix);
-			audit_logger (AUDIT_USER_ACCT, Prog,
-			              buf,
-			              group, AUDIT_NO_ID,
+			audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+			              "add-users-to-group",
+			              members, AUDIT_NO_ID, group,
 			              SHADOW_AUDIT_FAILURE);
 #endif
 		}
@@ -470,11 +468,9 @@ static void log_gpasswd_failure (const c
 		         "%s failed to change password of group %s%s",
 		         myname, group, suffix));
 #ifdef WITH_AUDIT
-		SNPRINTF(buf, "%s failed to change password of group %s%s",
-		         myname, group, suffix);
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_GRP_CHAUTHTOK, Prog,
+		              "change-password",
+		              myname, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_FAILURE);
 #endif
 	}
@@ -514,11 +502,9 @@ static void log_gpasswd_success (const c
 		         "user %s added by %s to group %s%s",
 		         user, myname, group, suffix));
 #ifdef WITH_AUDIT
-		SNPRINTF(buf, "user %s added by %s to group %s%s",
-		         user, myname, group, suffix);
-		audit_logger (AUDIT_USER_ACCT, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+		              "add-user-to-group",
+		              user, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_SUCCESS);
 #endif
 	} else if (dflg) {
@@ -526,11 +512,9 @@ static void log_gpasswd_success (const c
 		         "user %s removed by %s from group %s%s",
 		         user, myname, group, suffix));
 #ifdef WITH_AUDIT
-		SNPRINTF(buf, "user %s removed by %s from group %s%s",
-		         user, myname, group, suffix);
-		audit_logger (AUDIT_USER_ACCT, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+		              "delete-user-from-group",
+		              user, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_SUCCESS);
 #endif
 	} else if (rflg) {
@@ -540,9 +524,9 @@ static void log_gpasswd_success (const c
 #ifdef WITH_AUDIT
 		SNPRINTF(buf, "password of group %s removed by %s%s",
 		         group, myname, suffix);
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_GRP_CHAUTHTOK, Prog,
+		              "delete-group-password",
+		              myname, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_SUCCESS);
 #endif
 	} else if (Rflg) {
@@ -552,9 +536,9 @@ static void log_gpasswd_success (const c
 #ifdef WITH_AUDIT
 		SNPRINTF(buf, "access to group %s restricted by %s%s",
 		         group, myname, suffix);
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_GRP_MGMT, Prog,
+		              "restrict-group",
+		              myname, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_SUCCESS);
 #endif
 	} else if (Aflg || Mflg) {
@@ -564,11 +548,9 @@ static void log_gpasswd_success (const c
 			         "administrators of group %s set by %s to %s%s",
 			         group, myname, admins, suffix));
 #ifdef WITH_AUDIT
-			SNPRINTF(buf, "administrators of group %s set by %s to %s%s",
-			         group, myname, admins, suffix);
-			audit_logger (AUDIT_USER_ACCT, Prog,
-			              buf,
-			              group, AUDIT_NO_ID,
+			audit_logger_with_group (AUDIT_GRP_MGMT, Prog,
+			              "set-admins-of-group",
+			              admins, AUDIT_NO_ID, group,
 			              SHADOW_AUDIT_SUCCESS);
 #endif
 		}
@@ -578,11 +560,9 @@ static void log_gpasswd_success (const c
 			         "members of group %s set by %s to %s%s",
 			         group, myname, members, suffix));
 #ifdef WITH_AUDIT
-			SNPRINTF(buf, "members of group %s set by %s to %s%s",
-			         group, myname, members, suffix);
-			audit_logger (AUDIT_USER_ACCT, Prog,
-			              buf,
-			              group, AUDIT_NO_ID,
+			audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+			              "add-users-to-group",
+			              members, AUDIT_NO_ID, group,
 			              SHADOW_AUDIT_SUCCESS);
 #endif
 		}
@@ -591,11 +571,9 @@ static void log_gpasswd_success (const c
 		         "password of group %s changed by %s%s",
 		         group, myname, suffix));
 #ifdef WITH_AUDIT
-		SNPRINTF(buf, "password of group %s changed by %s%s",
-		         group, myname, suffix);
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              buf,
-		              group, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_GRP_CHAUTHTOK, Prog,
+		              "change-password",
+		              myname, AUDIT_NO_ID, group,
 		              SHADOW_AUDIT_SUCCESS);
 #endif
 	}
diff -up shadow-4.15.0/src/groupadd.c.audit-update shadow-4.15.0/src/groupadd.c
--- shadow-4.15.0/src/groupadd.c.audit-update	2024-01-22 22:36:43.000000000 +0100
+++ shadow-4.15.0/src/groupadd.c	2024-02-09 10:58:18.325715738 +0100
@@ -115,6 +115,15 @@ usage (int status)
 	exit (status);
 }
 
+static void fail_exit(int status)
+{
+#ifdef WITH_AUDIT
+	audit_logger(AUDIT_ADD_GROUP, Prog, "add-group", group_name,
+			AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
+#endif
+	exit (status);
+}
+
 /*
  * new_grent - initialize the values in a group file entry
  *
@@ -211,7 +220,7 @@ static void grp_update (void)
 		fprintf (stderr,
 		         _("%s: failed to prepare the new %s entry '%s'\n"),
 		         Prog, gr_dbname (), grp.gr_name);
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 #ifdef	SHADOWGRP
 	/*
@@ -221,7 +230,7 @@ static void grp_update (void)
 		fprintf (stderr,
 		         _("%s: failed to prepare the new %s entry '%s'\n"),
 		         Prog, sgr_dbname (), sgrp.sg_name);
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 #endif				/* SHADOWGRP */
 }
@@ -245,7 +254,7 @@ static void check_new_name (void)
 	fprintf (stderr, _("%s: '%s' is not a valid group name\n"),
 	         Prog, group_name);
 
-	exit (E_BAD_ARG);
+	fail_exit (E_BAD_ARG);
 }
 
 /*
@@ -261,11 +270,11 @@ static void close_files (void)
 		fprintf (stderr,
 		         _("%s: failure while writing changes to %s\n"),
 		         Prog, gr_dbname ());
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 #ifdef WITH_AUDIT
 	audit_logger (AUDIT_ADD_GROUP, Prog,
-	              "adding group to /etc/group",
+	              "add-group",
 	              group_name, group_id, SHADOW_AUDIT_SUCCESS);
 #endif
 	SYSLOG ((LOG_INFO, "group added to %s: name=%s, GID=%u",
@@ -282,11 +291,11 @@ static void close_files (void)
 			fprintf (stderr,
 			         _("%s: failure while writing changes to %s\n"),
 			         Prog, sgr_dbname ());
-			exit (E_GRP_UPDATE);
+			fail_exit (E_GRP_UPDATE);
 		}
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_ADD_GROUP, Prog,
-		              "adding group to /etc/gshadow",
+		audit_logger (AUDIT_GRP_MGMT, Prog,
+		              "add-shadow-group",
 		              group_name, group_id, SHADOW_AUDIT_SUCCESS);
 #endif
 		SYSLOG ((LOG_INFO, "group added to %s: name=%s",
@@ -299,10 +308,6 @@ static void close_files (void)
 #endif				/* SHADOWGRP */
 
 	/* Report success at the system level */
-#ifdef WITH_AUDIT
-	audit_logger (AUDIT_ADD_GROUP, Prog,
-	              "", group_name, group_id, SHADOW_AUDIT_SUCCESS);
-#endif
 	SYSLOG ((LOG_INFO, "new group: name=%s, GID=%u",
 	         group_name, (unsigned int) group_id));
 	del_cleanup (cleanup_report_add_group);
@@ -320,7 +325,7 @@ static void open_files (void)
 		fprintf (stderr,
 		         _("%s: cannot lock %s; try again later.\n"),
 		         Prog, gr_dbname ());
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 	add_cleanup (cleanup_unlock_group, NULL);
 
@@ -330,7 +335,7 @@ static void open_files (void)
 			fprintf (stderr,
 			         _("%s: cannot lock %s; try again later.\n"),
 			         Prog, sgr_dbname ());
-			exit (E_GRP_UPDATE);
+			fail_exit (E_GRP_UPDATE);
 		}
 		add_cleanup (cleanup_unlock_gshadow, NULL);
 	}
@@ -346,7 +351,7 @@ static void open_files (void)
 	if (gr_open (O_CREAT | O_RDWR) == 0) {
 		fprintf (stderr, _("%s: cannot open %s: %s\n"), Prog, gr_dbname (), strerror(errno));
 		SYSLOG ((LOG_WARN, "cannot open %s: %s", gr_dbname (), strerror(errno)));
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 
 #ifdef	SHADOWGRP
@@ -356,7 +361,7 @@ static void open_files (void)
 			         _("%s: cannot open %s: %s\n"),
 			         Prog, sgr_dbname (), strerror(errno));
 			SYSLOG ((LOG_WARN, "cannot open %s: %s", sgr_dbname (), strerror(errno)));
-			exit (E_GRP_UPDATE);
+			fail_exit (E_GRP_UPDATE);
 		}
 	}
 #endif				/* SHADOWGRP */
@@ -493,7 +498,7 @@ static void check_flags (void)
 		fprintf (stderr,
 		         _("%s: group '%s' already exists\n"),
 		         Prog, group_name);
-		exit (E_NAME_IN_USE);
+		fail_exit (E_NAME_IN_USE);
 	}
 
 	if (gflg && (prefix_getgrgid (group_id) != NULL)) {
@@ -512,7 +517,7 @@ static void check_flags (void)
 			fprintf (stderr,
 			         _("%s: GID '%lu' already exists\n"),
 			         Prog, (unsigned long) group_id);
-			exit (E_GID_IN_USE);
+			fail_exit (E_GID_IN_USE);
 		}
 	}
 }
@@ -540,7 +545,7 @@ static void check_perms (void)
 		fprintf (stderr,
 		         _("%s: Cannot determine your user name.\n"),
 		         Prog);
-		exit (1);
+		fail_exit (1);
 	}
 
 	retval = pam_start ("groupadd", pampw->pw_name, &conv, &pamh);
@@ -560,7 +565,7 @@ static void check_perms (void)
 		if (NULL != pamh) {
 			(void) pam_end (pamh, retval);
 		}
-		exit (1);
+		fail_exit (1);
 	}
 	(void) pam_end (pamh, retval);
 #endif				/* USE_PAM */
@@ -595,7 +600,7 @@ int main (int argc, char **argv)
 		fprintf (stderr,
 		         _("%s: Cannot setup cleanup service.\n"),
 		         Prog);
-		exit (1);
+		fail_exit (1);
 	}
 
 	/*
@@ -622,7 +627,7 @@ int main (int argc, char **argv)
 
 	if (!gflg) {
 		if (find_new_gid (rflg, &group_id, NULL) < 0) {
-			exit (E_GID_IN_USE);
+			fail_exit (E_GID_IN_USE);
 		}
 	}
 
diff -up shadow-4.15.0/src/groupdel.c.audit-update shadow-4.15.0/src/groupdel.c
--- shadow-4.15.0/src/groupdel.c.audit-update	2023-05-26 04:56:11.000000000 +0200
+++ shadow-4.15.0/src/groupdel.c	2024-02-09 10:49:57.107840592 +0100
@@ -87,6 +87,15 @@ usage (int status)
 	exit (status);
 }
 
+static void fail_exit(int status)
+{
+#ifdef WITH_AUDIT
+	audit_logger(AUDIT_GRP_MGMT, Prog, "delete-group", group_name,
+                        AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
+#endif
+	exit (status);
+}
+
 /*
  * grp_update - update group file entries
  *
@@ -113,7 +122,7 @@ static void grp_update (void)
 		fprintf (stderr,
 		         _("%s: cannot remove entry '%s' from %s\n"),
 		         Prog, group_name, gr_dbname ());
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 
 #ifdef	SHADOWGRP
@@ -125,7 +134,7 @@ static void grp_update (void)
 			fprintf (stderr,
 			         _("%s: cannot remove entry '%s' from %s\n"),
 			         Prog, group_name, sgr_dbname ());
-			exit (E_GRP_UPDATE);
+			fail_exit (E_GRP_UPDATE);
 		}
 	}
 #endif				/* SHADOWGRP */
@@ -144,12 +153,12 @@ static void close_files (void)
 		fprintf (stderr,
 		         _("%s: failure while writing changes to %s\n"),
 		         Prog, gr_dbname ());
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 
 #ifdef WITH_AUDIT
 	audit_logger (AUDIT_DEL_GROUP, Prog,
-	              "removing group from /etc/group",
+	              "delete-group",
 	              group_name, group_id, SHADOW_AUDIT_SUCCESS);
 #endif
 	SYSLOG ((LOG_INFO,
@@ -168,12 +177,12 @@ static void close_files (void)
 			fprintf (stderr,
 			         _("%s: failure while writing changes to %s\n"),
 			         Prog, sgr_dbname ());
-			exit (E_GRP_UPDATE);
+			fail_exit (E_GRP_UPDATE);
 		}
 
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_DEL_GROUP, Prog,
-		              "removing group from /etc/gshadow",
+		audit_logger (AUDIT_GRP_MGMT, Prog,
+		              "delete-shadow-group",
 		              group_name, group_id, SHADOW_AUDIT_SUCCESS);
 #endif
 		SYSLOG ((LOG_INFO,
@@ -186,11 +195,6 @@ static void close_files (void)
 	}
 #endif				/* SHADOWGRP */
 
-	/* Report success at the system level */
-#ifdef WITH_AUDIT
-	audit_logger (AUDIT_DEL_GROUP, Prog,
-	              "", group_name, group_id, SHADOW_AUDIT_SUCCESS);
-#endif
 	SYSLOG ((LOG_INFO, "group '%s' removed\n", group_name));
 	del_cleanup (cleanup_report_del_group);
 }
@@ -207,7 +211,7 @@ static void open_files (void)
 		fprintf (stderr,
 		         _("%s: cannot lock %s; try again later.\n"),
 		         Prog, gr_dbname ());
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 	add_cleanup (cleanup_unlock_group, NULL);
 #ifdef	SHADOWGRP
@@ -216,7 +220,7 @@ static void open_files (void)
 			fprintf (stderr,
 			         _("%s: cannot lock %s; try again later.\n"),
 			         Prog, sgr_dbname ());
-			exit (E_GRP_UPDATE);
+			fail_exit (E_GRP_UPDATE);
 		}
 		add_cleanup (cleanup_unlock_gshadow, NULL);
 	}
@@ -234,7 +238,7 @@ static void open_files (void)
 		         _("%s: cannot open %s\n"),
 		         Prog, gr_dbname ());
 		SYSLOG ((LOG_WARN, "cannot open %s", gr_dbname ()));
-		exit (E_GRP_UPDATE);
+		fail_exit (E_GRP_UPDATE);
 	}
 #ifdef	SHADOWGRP
 	if (is_shadow_grp) {
@@ -243,7 +247,7 @@ static void open_files (void)
 			         _("%s: cannot open %s\n"),
 			         Prog, sgr_dbname ());
 			SYSLOG ((LOG_WARN, "cannot open %s", sgr_dbname ()));
-			exit (E_GRP_UPDATE);
+			fail_exit (E_GRP_UPDATE);
 		}
 	}
 #endif				/* SHADOWGRP */
@@ -284,7 +288,7 @@ static void group_busy (gid_t gid)
 	fprintf (stderr,
 	         _("%s: cannot remove the primary group of user '%s'\n"),
 	         Prog, pwd->pw_name);
-	exit (E_GROUP_BUSY);
+	fail_exit (E_GROUP_BUSY);
 }
 
 /*
@@ -372,7 +376,7 @@ int main (int argc, char **argv)
 		fprintf (stderr,
 		         _("%s: Cannot setup cleanup service.\n"),
 		         Prog);
-		exit (1);
+		fail_exit (1);
 	}
 
 	process_flags (argc, argv);
@@ -386,7 +390,7 @@ int main (int argc, char **argv)
 			fprintf (stderr,
 			         _("%s: Cannot determine your user name.\n"),
 			         Prog);
-			exit (1);
+			fail_exit (1);
 		}
 
 		retval = pam_start ("groupdel", pampw->pw_name, &conv, &pamh);
@@ -407,7 +411,7 @@ int main (int argc, char **argv)
 		if (NULL != pamh) {
 			(void) pam_end (pamh, retval);
 		}
-		exit (1);
+		fail_exit (1);
 	}
 	(void) pam_end (pamh, retval);
 #endif				/* USE_PAM */
@@ -427,7 +431,7 @@ int main (int argc, char **argv)
 			fprintf (stderr,
 			         _("%s: group '%s' does not exist\n"),
 			         Prog, group_name);
-			exit (E_NOTFOUND);
+			fail_exit (E_NOTFOUND);
 		}
 
 		group_id = grp->gr_gid;
@@ -451,7 +455,7 @@ int main (int argc, char **argv)
 			         _("%s: %s is the NIS master\n"),
 			         Prog, nis_master);
 		}
-		exit (E_NOTFOUND);
+		fail_exit (E_NOTFOUND);
 	}
 #endif
 
diff -up shadow-4.15.0/src/groupmod.c.audit-update shadow-4.15.0/src/groupmod.c
--- shadow-4.15.0/src/groupmod.c.audit-update	2024-01-22 22:36:43.000000000 +0100
+++ shadow-4.15.0/src/groupmod.c	2024-02-09 10:49:57.107840592 +0100
@@ -474,7 +474,7 @@ static void close_files (void)
 		exit (E_GRP_UPDATE);
 	}
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_USER_ACCT, Prog,
+	audit_logger (AUDIT_GRP_MGMT, Prog,
 	              info_group.audit_msg,
 	              group_name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_SUCCESS);
@@ -497,7 +497,14 @@ static void close_files (void)
 			exit (E_GRP_UPDATE);
 		}
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_ACCT, Prog,
+		/* If both happened, log password change as its more important */
+		if (pflg)
+			audit_logger (AUDIT_GRP_CHAUTHTOK, Prog,
+		              info_gshadow.audit_msg,
+		              group_name, AUDIT_NO_ID,
+		              SHADOW_AUDIT_SUCCESS);
+		else
+			audit_logger (AUDIT_GRP_MGMT, Prog,
 		              info_gshadow.audit_msg,
 		              group_name, AUDIT_NO_ID,
 		              SHADOW_AUDIT_SUCCESS);
@@ -520,7 +527,7 @@ static void close_files (void)
 			exit (E_GRP_UPDATE);
 		}
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_ACCT, Prog,
+		audit_logger (AUDIT_GRP_MGMT, Prog,
 		              info_passwd.audit_msg,
 		              group_name, AUDIT_NO_ID,
 		              SHADOW_AUDIT_SUCCESS);
@@ -535,8 +542,8 @@ static void close_files (void)
 	}
 
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_USER_ACCT, Prog,
-	              "modifying group",
+	audit_logger (AUDIT_GRP_MGMT, Prog,
+	              "modify-group",
 	              group_name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_SUCCESS);
 #endif
diff -up shadow-4.15.0/src/newgrp.c.audit-update shadow-4.15.0/src/newgrp.c
--- shadow-4.15.0/src/newgrp.c.audit-update	2023-12-27 16:58:48.000000000 +0100
+++ shadow-4.15.0/src/newgrp.c	2024-02-09 11:02:30.575155871 +0100
@@ -188,10 +188,10 @@ static void check_perms (const struct gr
 		if (grp->gr_passwd[0] == '\0' ||
 		    strcmp (cpasswd, grp->gr_passwd) != 0) {
 #ifdef WITH_AUDIT
-			SNPRINTF(audit_buf, "authentication new-gid=%lu",
+			SNPRINTF(audit_buf, "authentication new_gid=%lu",
 			         (unsigned long) grp->gr_gid);
 			audit_logger (AUDIT_GRP_AUTH, Prog,
-			              audit_buf, NULL, getuid (), 0);
+			              audit_buf, NULL, getuid (), SHADOW_AUDIT_FAILURE);
 #endif
 			SYSLOG ((LOG_INFO,
 				 "Invalid password for group '%s' from '%s'",
@@ -201,10 +201,10 @@ static void check_perms (const struct gr
 			goto failure;
 		}
 #ifdef WITH_AUDIT
-		SNPRINTF(audit_buf, "authentication new-gid=%lu",
+		SNPRINTF(audit_buf, "authentication new_gid=%lu",
 		         (unsigned long) grp->gr_gid);
 		audit_logger (AUDIT_GRP_AUTH, Prog,
-		              audit_buf, NULL, getuid (), 1);
+		              audit_buf, NULL, getuid (), SHADOW_AUDIT_SUCCESS);
 #endif
 	}
 
@@ -215,16 +215,6 @@ failure:
 	 * harm.  -- JWP
 	 */
 	closelog ();
-#ifdef WITH_AUDIT
-	if (groupname) {
-		SNPRINTF(audit_buf, "changing new-group=%s", groupname);
-		audit_logger (AUDIT_CHGRP_ID, Prog,
-		              audit_buf, NULL, getuid (), 0);
-	} else {
-		audit_logger (AUDIT_CHGRP_ID, Prog,
-		              "changing", NULL, getuid (), 0);
-	}
-#endif
 	exit (EXIT_FAILURE);
 }
 
@@ -298,13 +288,23 @@ static void syslog_sg (const char *name,
 				 is_newgrp ? "newgrp" : "sg", strerror (errno));
 #ifdef WITH_AUDIT
 			if (group) {
-				SNPRINTF(audit_buf,
-				         "changing new-group=%s", group);
+				char enc_group[(GROUP_NAME_MAX_LENGTH*2)+1];
+				int len = strnlen(group, sizeof(enc_group)/2);
+				if (audit_value_needs_encoding(group, len)) {
+					snprintf (audit_buf, sizeof(audit_buf),
+					          "changing new_group=%s",
+					          audit_encode_value(enc_group,
+					          group, len));
+				} else {
+					snprintf (audit_buf, sizeof(audit_buf),
+					          "changing new_group=\"%s\"",
+					          group);
+				}
 				audit_logger (AUDIT_CHGRP_ID, Prog,
-				              audit_buf, NULL, getuid (), 0);
+				              audit_buf, NULL, getuid (), SHADOW_AUDIT_FAILURE);
 			} else {
 				audit_logger (AUDIT_CHGRP_ID, Prog,
-				              "changing", NULL, getuid (), 0);
+				              "changing", NULL, getuid (), SHADOW_AUDIT_FAILURE);
 			}
 #endif
 			exit (EXIT_FAILURE);
@@ -440,7 +440,7 @@ int main (int argc, char **argv)
 		         Prog);
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_CHGRP_ID, Prog,
-		              "changing", NULL, getuid (), 0);
+		              "changing", NULL, getuid (), SHADOW_AUDIT_FAILURE);
 #endif
 		SYSLOG ((LOG_WARN, "Cannot determine the user name of the caller (UID %lu)",
 		         (unsigned long) getuid ()));
@@ -556,12 +556,22 @@ int main (int argc, char **argv)
 		perror ("getgroups");
 #ifdef WITH_AUDIT
 		if (group) {
-			SNPRINTF(audit_buf, "changing new-group=%s", group);
+			char enc_group[(GROUP_NAME_MAX_LENGTH*2)+1];
+			int len = strnlen(group, sizeof(enc_group)/2);
+			if (audit_value_needs_encoding(group, len)) {
+				snprintf (audit_buf, sizeof(audit_buf),
+				          "changing new_group=%s",
+				          audit_encode_value(enc_group,
+				          group, len));
+			} else {
+				snprintf (audit_buf, sizeof(audit_buf),
+				          "changing new_group=\"%s\"", group);
+			}
 			audit_logger (AUDIT_CHGRP_ID, Prog,
-			              audit_buf, NULL, getuid (), 0);
+			              audit_buf, NULL, getuid (), SHADOW_AUDIT_FAILURE);
 		} else {
 			audit_logger (AUDIT_CHGRP_ID, Prog,
-			              "changing", NULL, getuid (), 0);
+			              "changing", NULL, getuid (), SHADOW_AUDIT_FAILURE);
 		}
 #endif
 		exit (EXIT_FAILURE);
@@ -715,9 +725,9 @@ int main (int argc, char **argv)
 	if (setgid (gid) != 0) {
 		perror ("setgid");
 #ifdef WITH_AUDIT
-		SNPRINTF(audit_buf, "changing new-gid=%lu", (unsigned long) gid);
+		SNPRINTF(audit_buf, "changing new_gid=%lu", (unsigned long) gid);
 		audit_logger (AUDIT_CHGRP_ID, Prog,
-		              audit_buf, NULL, getuid (), 0);
+		              audit_buf, NULL, getuid (), SHADOW_AUDIT_FAILURE);
 #endif
 		exit (EXIT_FAILURE);
 	}
@@ -725,9 +735,9 @@ int main (int argc, char **argv)
 	if (setuid (getuid ()) != 0) {
 		perror ("setuid");
 #ifdef WITH_AUDIT
-		SNPRINTF(audit_buf, "changing new-gid=%lu", (unsigned long) gid);
+		SNPRINTF(audit_buf, "changing new_gid=%lu", (unsigned long) gid);
 		audit_logger (AUDIT_CHGRP_ID, Prog,
-		              audit_buf, NULL, getuid (), 0);
+		              audit_buf, NULL, getuid (), SHADOW_AUDIT_FAILURE);
 #endif
 		exit (EXIT_FAILURE);
 	}
@@ -740,9 +750,9 @@ int main (int argc, char **argv)
 		closelog ();
 		execl (SHELL, "sh", "-c", command, (char *) NULL);
 #ifdef WITH_AUDIT
-		SNPRINTF(audit_buf, "changing new-gid=%lu", (unsigned long) gid);
+		SNPRINTF(audit_buf, "changing new_gid=%lu", (unsigned long) gid);
 		audit_logger (AUDIT_CHGRP_ID, Prog,
-		              audit_buf, NULL, getuid (), 0);
+		              audit_buf, NULL, getuid (), SHADOW_AUDIT_FAILURE);
 #endif
 		perror (SHELL);
 		exit ((errno == ENOENT) ? E_CMD_NOTFOUND : E_CMD_NOEXEC);
@@ -806,9 +816,9 @@ int main (int argc, char **argv)
 	}
 
 #ifdef WITH_AUDIT
-	SNPRINTF(audit_buf, "changing new-gid=%lu", (unsigned long) gid);
+	SNPRINTF(audit_buf, "changing new_gid=%lu", (unsigned long) gid);
 	audit_logger (AUDIT_CHGRP_ID, Prog,
-	              audit_buf, NULL, getuid (), 1);
+	              audit_buf, NULL, getuid (), SHADOW_AUDIT_SUCCESS);
 #endif
 	/*
 	 * Exec the login shell and go away. We are trying to get back to
@@ -832,12 +842,22 @@ int main (int argc, char **argv)
 	closelog ();
 #ifdef WITH_AUDIT
 	if (NULL != group) {
-		SNPRINTF(audit_buf, "changing new-group=%s", group);
+		char enc_group[(GROUP_NAME_MAX_LENGTH*2)+1];
+		int len = strnlen(group, sizeof(enc_group)/2);
+		if (audit_value_needs_encoding(group, len)) {
+			snprintf (audit_buf, sizeof(audit_buf),
+			          "changing new_group=%s",
+			          audit_encode_value(enc_group,
+			          group, len));
+		} else {
+			snprintf (audit_buf, sizeof(audit_buf),
+			          "changing new_group=\"%s\"", group);
+		}
 		audit_logger (AUDIT_CHGRP_ID, Prog,
-		              audit_buf, NULL, getuid (), 0);
+		              audit_buf, NULL, getuid (), SHADOW_AUDIT_FAILURE);
 	} else {
 		audit_logger (AUDIT_CHGRP_ID, Prog,
-		              "changing", NULL, getuid (), 0);
+		              "changing", NULL, getuid (), SHADOW_AUDIT_FAILURE);
 	}
 #endif
 	exit (EXIT_FAILURE);
diff -up shadow-4.15.0/src/useradd.c.audit-update shadow-4.15.0/src/useradd.c
--- shadow-4.15.0/src/useradd.c.audit-update	2024-02-01 23:59:36.000000000 +0100
+++ shadow-4.15.0/src/useradd.c	2024-02-09 10:49:57.108840594 +0100
@@ -242,6 +242,8 @@ static void check_uid_range(int rflg, ui
  */
 static void fail_exit (int code)
 {
+	int type;
+
 	if (home_added && rmdir(prefix_user_home) != 0) {
 		fprintf(stderr,
 		        _("%s: %s was created, but could not be removed\n"),
@@ -252,38 +254,22 @@ static void fail_exit (int code)
 	if (spw_locked && spw_unlock() == 0) {
 		fprintf(stderr, _("%s: failed to unlock %s\n"), Prog, spw_dbname());
 		SYSLOG((LOG_ERR, "failed to unlock %s", spw_dbname()));
-#ifdef WITH_AUDIT
-		audit_logger(AUDIT_ADD_USER, Prog, "unlocking shadow file",
-			     user_name, AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
-#endif
 		/* continue */
 	}
 	if (pw_locked && pw_unlock() == 0) {
 		fprintf(stderr, _("%s: failed to unlock %s\n"), Prog, pw_dbname());
 		SYSLOG((LOG_ERR, "failed to unlock %s", pw_dbname()));
-#ifdef WITH_AUDIT
-		audit_logger(AUDIT_ADD_USER, Prog, "unlocking passwd file",
-			     user_name, AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
-#endif
 		/* continue */
 	}
 	if (gr_locked && gr_unlock() == 0) {
 		fprintf(stderr, _("%s: failed to unlock %s\n"), Prog, gr_dbname());
 		SYSLOG((LOG_ERR, "failed to unlock %s", gr_dbname()));
-#ifdef WITH_AUDIT
-		audit_logger(AUDIT_ADD_USER, Prog, "unlocking group file",
-			     user_name, AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
-#endif
 		/* continue */
 	}
 #ifdef SHADOWGRP
 	if (sgr_locked && sgr_unlock() == 0) {
 		fprintf(stderr, _("%s: failed to unlock %s\n"), Prog, sgr_dbname());
 		SYSLOG((LOG_ERR, "failed to unlock %s", sgr_dbname()));
-# ifdef WITH_AUDIT
-		audit_logger(AUDIT_ADD_USER, Prog, "unlocking gshadow file",
-			     user_name, AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
-# endif
 		/* continue */
 	}
 #endif
@@ -291,27 +277,23 @@ static void fail_exit (int code)
 	if (sub_uid_locked && sub_uid_unlock() == 0) {
 		fprintf(stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname());
 		SYSLOG((LOG_ERR, "failed to unlock %s", sub_uid_dbname()));
-# ifdef WITH_AUDIT
-		audit_logger(AUDIT_ADD_USER, Prog,
-		             "unlocking subordinate user file",
-			     user_name, AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
-# endif
 		/* continue */
 	}
 	if (sub_gid_locked && sub_gid_unlock() == 0) {
 		fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname());
 		SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname()));
-# ifdef WITH_AUDIT
-		audit_logger(AUDIT_ADD_USER, Prog,
-			     "unlocking subordinate group file",
-			     user_name, AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
-# endif
 		/* continue */
 	}
 #endif  /* ENABLE_SUBIDS */
 
 #ifdef WITH_AUDIT
-	audit_logger(AUDIT_ADD_USER, Prog, "adding user",
+	if (code == E_PW_UPDATE || code >= E_GRP_UPDATE)
+		type = AUDIT_USER_MGMT;
+	else
+		type = AUDIT_ADD_USER;
+
+	audit_logger (type, Prog,
+	              "add-user",
 	             user_name, AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
 #endif
 	SYSLOG((LOG_INFO, "failed adding user '%s', exit code: %d", user_name, code));
@@ -732,7 +714,7 @@ static int set_defaults (void)
 	}
 #ifdef WITH_AUDIT
 	audit_logger (AUDIT_USYS_CONFIG, Prog,
-	              "changing useradd defaults",
+	              "changing-useradd-defaults",
 	              NULL, AUDIT_NO_ID,
 	              SHADOW_AUDIT_SUCCESS);
 #endif
@@ -1060,12 +1042,6 @@ static void grp_update (void)
 			         _("%s: Out of memory. Cannot update %s.\n"),
 			         Prog, gr_dbname ());
 			SYSLOG ((LOG_ERR, "failed to prepare the new %s entry '%s'", gr_dbname (), user_name));
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_ADD_USER, Prog,
-			              "adding user to group",
-			              user_name, AUDIT_NO_ID,
-			              SHADOW_AUDIT_FAILURE);
-#endif
 			fail_exit (E_GRP_UPDATE);	/* XXX */
 		}
 
@@ -1079,18 +1055,12 @@ static void grp_update (void)
 			         _("%s: failed to prepare the new %s entry '%s'\n"),
 			         Prog, gr_dbname (), ngrp->gr_name);
 			SYSLOG ((LOG_ERR, "failed to prepare the new %s entry '%s'", gr_dbname (), user_name));
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_ADD_USER, Prog,
-			              "adding user to group",
-			              user_name, AUDIT_NO_ID,
-			              SHADOW_AUDIT_FAILURE);
-#endif
 			fail_exit (E_GRP_UPDATE);
 		}
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_ADD_USER, Prog,
-		              "adding user to group",
-		              user_name, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+		              "add-user-to-group",
+		              user_name, AUDIT_NO_ID, ngrp->gr_name,
 		              SHADOW_AUDIT_SUCCESS);
 #endif
 		SYSLOG ((LOG_INFO,
@@ -1135,12 +1105,6 @@ static void grp_update (void)
 			         _("%s: Out of memory. Cannot update %s.\n"),
 			         Prog, sgr_dbname ());
 			SYSLOG ((LOG_ERR, "failed to prepare the new %s entry '%s'", sgr_dbname (), user_name));
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_ADD_USER, Prog,
-			              "adding user to shadow group",
-			              user_name, AUDIT_NO_ID,
-			              SHADOW_AUDIT_FAILURE);
-#endif
 			fail_exit (E_GRP_UPDATE);	/* XXX */
 		}
 
@@ -1154,18 +1118,13 @@ static void grp_update (void)
 			         _("%s: failed to prepare the new %s entry '%s'\n"),
 			         Prog, sgr_dbname (), nsgrp->sg_name);
 			SYSLOG ((LOG_ERR, "failed to prepare the new %s entry '%s'", sgr_dbname (), user_name));
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_ADD_USER, Prog,
-			              "adding user to shadow group",
-			              user_name, AUDIT_NO_ID,
-			              SHADOW_AUDIT_FAILURE);
-#endif
+
 			fail_exit (E_GRP_UPDATE);
 		}
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_ADD_USER, Prog,
-		              "adding user to shadow group",
-		              user_name, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+		              "add-to-shadow-group",
+		              user_name, AUDIT_NO_ID, nsgrp->sg_name,
 		              SHADOW_AUDIT_SUCCESS);
 #endif
 		SYSLOG ((LOG_INFO,
@@ -1560,7 +1519,7 @@ static void process_flags (int argc, cha
 			         Prog, user_name);
 #ifdef WITH_AUDIT
 			audit_logger (AUDIT_ADD_USER, Prog,
-			              "adding user",
+			              "add-user",
 			              user_name, AUDIT_NO_ID,
 			              SHADOW_AUDIT_FAILURE);
 #endif
@@ -1660,7 +1619,7 @@ static void close_files (void)
 			SYSLOG ((LOG_ERR, "failed to unlock %s", spw_dbname ()));
 #ifdef WITH_AUDIT
 			audit_logger (AUDIT_ADD_USER, Prog,
-			              "unlocking shadow file",
+			              "unlocking-shadow-file",
 			              user_name, AUDIT_NO_ID,
 			              SHADOW_AUDIT_FAILURE);
 #endif
@@ -1673,7 +1632,7 @@ static void close_files (void)
 		SYSLOG ((LOG_ERR, "failed to unlock %s", pw_dbname ()));
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_ADD_USER, Prog,
-		              "unlocking passwd file",
+		              "unlocking-passwd-file",
 		              user_name, AUDIT_NO_ID,
 		              SHADOW_AUDIT_FAILURE);
 #endif
@@ -1690,7 +1649,7 @@ static void close_files (void)
 			SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
 #ifdef WITH_AUDIT
 			audit_logger (AUDIT_ADD_USER, Prog,
-				"unlocking subordinate user file",
+				"unlocking-subordinate-user-file",
 				user_name, AUDIT_NO_ID,
 				SHADOW_AUDIT_FAILURE);
 #endif
@@ -1704,7 +1663,7 @@ static void close_files (void)
 			SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
 #ifdef WITH_AUDIT
 			audit_logger (AUDIT_ADD_USER, Prog,
-				"unlocking subordinate group file",
+				"unlocking-subordinate-group-file",
 				user_name, AUDIT_NO_ID,
 				SHADOW_AUDIT_FAILURE);
 #endif
@@ -1967,7 +1926,7 @@ static void grp_add (void)
 		         Prog, gr_dbname (), grp.gr_name);
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_ADD_GROUP, Prog,
-		              "adding group",
+		              "add-group",
 		              grp.gr_name, AUDIT_NO_ID,
 		              SHADOW_AUDIT_FAILURE);
 #endif
@@ -1983,7 +1942,7 @@ static void grp_add (void)
 		         Prog, sgr_dbname (), sgrp.sg_name);
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_ADD_GROUP, Prog,
-		              "adding group",
+		              "add-group",
 		              grp.gr_name, AUDIT_NO_ID,
 		              SHADOW_AUDIT_FAILURE);
 #endif
@@ -1993,7 +1952,7 @@ static void grp_add (void)
 	SYSLOG ((LOG_INFO, "new group: name=%s, GID=%u", user_name, user_gid));
 #ifdef WITH_AUDIT
 	audit_logger (AUDIT_ADD_GROUP, Prog,
-	              "adding group",
+	              "add-group",
 	              grp.gr_name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_SUCCESS);
 #endif
@@ -2195,11 +2154,6 @@ static void usr_update (unsigned long su
 		fprintf (stderr,
 		         _("%s: failed to prepare the new %s entry '%s'\n"),
 		         Prog, spw_dbname (), spent.sp_namp);
-#ifdef WITH_AUDIT
-		audit_logger (AUDIT_ADD_USER, Prog,
-		              "adding shadow password",
-		              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif
 		fail_exit (E_PW_UPDATE);
 	}
 #ifdef ENABLE_SUBIDS
@@ -2226,7 +2180,7 @@ static void usr_update (unsigned long su
 	 * and we can use the real ID thereafter.
 	 */
 	audit_logger (AUDIT_ADD_USER, Prog,
-	              "adding user",
+	              "add-user",
 	              user_name, AUDIT_NO_ID,
 	              SHADOW_AUDIT_SUCCESS);
 #endif
@@ -2321,10 +2275,6 @@ static void create_home (void)
 		if (mkdir(path, 0) != 0) {
 			fprintf(stderr, _("%s: cannot create directory %s\n"),
 				Prog, path);
-#ifdef WITH_AUDIT
-			audit_logger(AUDIT_ADD_USER, Prog, "adding home directory",
-				     user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif
 			fail_exit(E_HOMEDIR);
 		}
 		if (chown(path, 0, 0) < 0) {
@@ -2349,7 +2299,7 @@ static void create_home (void)
 	}
 	home_added = true;
 #ifdef WITH_AUDIT
-	audit_logger(AUDIT_ADD_USER, Prog, "adding home directory",
+	audit_logger(AUDIT_USER_MGMT, Prog, "add-home-dir",
 		     user_name, user_id, SHADOW_AUDIT_SUCCESS);
 #endif
 #ifdef WITH_SELINUX
@@ -2594,12 +2544,6 @@ int main (int argc, char **argv)
 	 */
 	if (prefix_getpwnam (user_name) != NULL) { /* local, no need for xgetpwnam */
 		fprintf (stderr, _("%s: user '%s' already exists\n"), Prog, user_name);
-#ifdef WITH_AUDIT
-		audit_logger (AUDIT_ADD_USER, Prog,
-		              "adding user",
-		              user_name, AUDIT_NO_ID,
-		              SHADOW_AUDIT_FAILURE);
-#endif
 		fail_exit (E_NAME_IN_USE);
 	}
 
@@ -2615,12 +2559,6 @@ int main (int argc, char **argv)
 			fprintf (stderr,
 			         _("%s: group %s exists - if you want to add this user to that group, use -g.\n"),
 			         Prog, user_name);
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_ADD_USER, Prog,
-			              "adding group",
-			              user_name, AUDIT_NO_ID,
-			              SHADOW_AUDIT_FAILURE);
-#endif
 			fail_exit (E_NAME_IN_USE);
 		}
 	}
@@ -2650,12 +2588,6 @@ int main (int argc, char **argv)
 				fprintf (stderr,
 				         _("%s: UID %lu is not unique\n"),
 				         Prog, (unsigned long) user_id);
-#ifdef WITH_AUDIT
-				audit_logger (AUDIT_ADD_USER, Prog,
-				              "adding user",
-				              user_name, user_id,
-				              SHADOW_AUDIT_FAILURE);
-#endif
 				fail_exit (E_UID_IN_USE);
 			}
 		}
@@ -2730,9 +2662,9 @@ int main (int argc, char **argv)
 			         _("%s: warning: the user name %s to %s SELinux user mapping failed.\n"),
 			         Prog, user_name, user_selinux);
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_ADD_USER, Prog,
-			              "adding SELinux user mapping",
-			              user_name, user_id, 0);
+			audit_logger (AUDIT_ROLE_ASSIGN, Prog,
+			              "add-selinux-user-mapping",
+			              user_name, user_id, SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
 			fail_exit (E_SE_UPDATE);
 		}
diff -up shadow-4.15.0/src/userdel.c.audit-update shadow-4.15.0/src/userdel.c
--- shadow-4.15.0/src/userdel.c.audit-update	2023-12-27 16:58:48.000000000 +0100
+++ shadow-4.15.0/src/userdel.c	2024-02-09 10:49:57.108840594 +0100
@@ -206,9 +206,9 @@ static void update_groups (void)
 		 * Update the DBM group file with the new entry as well.
 		 */
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_DEL_USER, Prog,
-		              "deleting user from group",
-		              user_name, user_id, SHADOW_AUDIT_SUCCESS);
+		audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+		              "deleting-user-from-group",
+		              user_name, user_id, ngrp->gr_name, SHADOW_AUDIT_SUCCESS);
 #endif				/* WITH_AUDIT */
 		SYSLOG ((LOG_INFO, "delete '%s' from group '%s'\n",
 			 user_name, ngrp->gr_name));
@@ -267,9 +267,9 @@ static void update_groups (void)
 			exit (E_GRP_UPDATE);
 		}
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_DEL_USER, Prog,
-		              "deleting user from shadow group",
-		              user_name, user_id, SHADOW_AUDIT_SUCCESS);
+		audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+		              "deleting-user-from-shadow-group",
+		              user_name, user_id, nsgrp->sg_name, SHADOW_AUDIT_SUCCESS);
 #endif				/* WITH_AUDIT */
 		SYSLOG ((LOG_INFO, "delete '%s' from shadow group '%s'\n",
 		         user_name, nsgrp->sg_name));
@@ -345,9 +345,9 @@ static void remove_usergroup (void)
 		}
 
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_DEL_GROUP, Prog,
-		              "deleting group",
-		              user_name, AUDIT_NO_ID,
+		audit_logger_with_group (AUDIT_DEL_GROUP, Prog,
+		              "delete-group",
+		              user_name, AUDIT_NO_ID, user_name,
 		              SHADOW_AUDIT_SUCCESS);
 #endif				/* WITH_AUDIT */
 		SYSLOG ((LOG_INFO,
@@ -363,9 +363,9 @@ static void remove_usergroup (void)
 				fail_exit (E_GRP_UPDATE);
 			}
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_GROUP, Prog,
-			              "deleting shadow group",
-			              user_name, AUDIT_NO_ID,
+			audit_logger_with_group (AUDIT_GRP_MGMT, Prog,
+			              "delete-shadow-group",
+			              user_name, AUDIT_NO_ID, user_name,
 			              SHADOW_AUDIT_SUCCESS);
 #endif				/* WITH_AUDIT */
 			SYSLOG ((LOG_INFO,
@@ -527,7 +527,7 @@ static void fail_exit (int code)
 
 #ifdef WITH_AUDIT
 	audit_logger (AUDIT_DEL_USER, Prog,
-	              "deleting user",
+	              "delete-user",
 	              user_name, user_id, SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
 
@@ -546,22 +546,12 @@ static void open_files (void)
 		fprintf (stderr,
 		         _("%s: cannot lock %s; try again later.\n"),
 		         Prog, pw_dbname ());
-#ifdef WITH_AUDIT
-		audit_logger (AUDIT_DEL_USER, Prog,
-		              "locking password file",
-		              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 		fail_exit (E_PW_UPDATE);
 	}
 	pw_locked = true;
 	if (pw_open (O_CREAT | O_RDWR) == 0) {
 		fprintf (stderr,
 		         _("%s: cannot open %s\n"), Prog, pw_dbname ());
-#ifdef WITH_AUDIT
-		audit_logger (AUDIT_DEL_USER, Prog,
-		              "opening password file",
-		              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 		fail_exit (E_PW_UPDATE);
 	}
 	if (is_shadow_pwd) {
@@ -569,11 +559,6 @@ static void open_files (void)
 			fprintf (stderr,
 			         _("%s: cannot lock %s; try again later.\n"),
 			         Prog, spw_dbname ());
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_USER, Prog,
-			              "locking shadow password file",
-			              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 			fail_exit (E_PW_UPDATE);
 		}
 		spw_locked = true;
@@ -581,11 +566,6 @@ static void open_files (void)
 			fprintf (stderr,
 			         _("%s: cannot open %s\n"),
 			         Prog, spw_dbname ());
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_USER, Prog,
-			              "opening shadow password file",
-			              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 			fail_exit (E_PW_UPDATE);
 		}
 	}
@@ -593,21 +573,11 @@ static void open_files (void)
 		fprintf (stderr,
 		         _("%s: cannot lock %s; try again later.\n"),
 		         Prog, gr_dbname ());
-#ifdef WITH_AUDIT
-		audit_logger (AUDIT_DEL_USER, Prog,
-		              "locking group file",
-		              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 		fail_exit (E_GRP_UPDATE);
 	}
 	gr_locked = true;
 	if (gr_open (O_CREAT | O_RDWR) == 0) {
 		fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
-#ifdef WITH_AUDIT
-		audit_logger (AUDIT_DEL_USER, Prog,
-		              "opening group file",
-		              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 		fail_exit (E_GRP_UPDATE);
 	}
 #ifdef	SHADOWGRP
@@ -616,22 +586,12 @@ static void open_files (void)
 			fprintf (stderr,
 			         _("%s: cannot lock %s; try again later.\n"),
 			         Prog, sgr_dbname ());
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_USER, Prog,
-			              "locking shadow group file",
-			              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 			fail_exit (E_GRP_UPDATE);
 		}
 		sgr_locked= true;
 		if (sgr_open (O_CREAT | O_RDWR) == 0) {
 			fprintf (stderr, _("%s: cannot open %s\n"),
 			         Prog, sgr_dbname ());
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_USER, Prog,
-			              "opening shadow group file",
-			              user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 			fail_exit (E_GRP_UPDATE);
 		}
 	}
@@ -642,22 +602,12 @@ static void open_files (void)
 			fprintf (stderr,
 				_("%s: cannot lock %s; try again later.\n"),
 				Prog, sub_uid_dbname ());
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_USER, Prog,
-				"locking subordinate user file",
-				user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 			fail_exit (E_SUB_UID_UPDATE);
 		}
 		sub_uid_locked = true;
 		if (sub_uid_open (O_CREAT | O_RDWR) == 0) {
 			fprintf (stderr,
 				_("%s: cannot open %s\n"), Prog, sub_uid_dbname ());
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_USER, Prog,
-				"opening subordinate user file",
-				user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 			fail_exit (E_SUB_UID_UPDATE);
 		}
 	}
@@ -666,22 +616,12 @@ static void open_files (void)
 			fprintf (stderr,
 				_("%s: cannot lock %s; try again later.\n"),
 				Prog, sub_gid_dbname ());
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_USER, Prog,
-				"locking subordinate group file",
-				user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 			fail_exit (E_SUB_GID_UPDATE);
 		}
 		sub_gid_locked = true;
 		if (sub_gid_open (O_CREAT | O_RDWR) == 0) {
 			fprintf (stderr,
 				_("%s: cannot open %s\n"), Prog, sub_gid_dbname ());
-#ifdef WITH_AUDIT
-			audit_logger (AUDIT_DEL_USER, Prog,
-				"opening subordinate group file",
-				user_name, user_id, SHADOW_AUDIT_FAILURE);
-#endif				/* WITH_AUDIT */
 			fail_exit (E_SUB_GID_UPDATE);
 		}
 	}
@@ -726,7 +666,7 @@ static void update_user (void)
 #endif				/* ENABLE_SUBIDS */
 #ifdef WITH_AUDIT
 	audit_logger (AUDIT_DEL_USER, Prog,
-	              "deleting user entries",
+	              "delete-user",
 	              user_name, user_id, SHADOW_AUDIT_SUCCESS);
 #endif				/* WITH_AUDIT */
 	SYSLOG ((LOG_INFO, "delete user '%s'\n", user_name));
@@ -824,7 +764,7 @@ static int remove_mailbox (void)
 			SYSLOG ((LOG_ERR, "Cannot remove %s: %s", mailfile, strerror (errno)));
 #ifdef WITH_AUDIT
 			audit_logger (AUDIT_DEL_USER, Prog,
-			              "deleting mail file",
+			              "delete-mail-file",
 			              user_name, user_id, SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
 			free(mailfile);
@@ -840,7 +780,7 @@ static int remove_mailbox (void)
 			SYSLOG ((LOG_ERR, "Cannot remove %s: %s", mailfile, strerror (errno)));
 #ifdef WITH_AUDIT
 			audit_logger (AUDIT_DEL_USER, Prog,
-			              "deleting mail file",
+			              "delete-mail-file",
 			              user_name, user_id, SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
 			errors = 1;
@@ -849,8 +789,8 @@ static int remove_mailbox (void)
 #ifdef WITH_AUDIT
 		else
 		{
-			audit_logger (AUDIT_DEL_USER, Prog,
-			              "deleting mail file",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "delete-mail-file",
 			              user_name, user_id, SHADOW_AUDIT_SUCCESS);
 		}
 #endif				/* WITH_AUDIT */
@@ -867,7 +807,7 @@ static int remove_mailbox (void)
 		         mailfile, strerror (errno)));
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_DEL_USER, Prog,
-		              "deleting mail file",
+		              "delete-mail-file",
 		              user_name, user_id, SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
 		free(mailfile);
@@ -883,7 +823,7 @@ static int remove_mailbox (void)
 		SYSLOG ((LOG_ERR, "Cannot remove %s: %s", mailfile, strerror (errno)));
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_DEL_USER, Prog,
-		              "deleting mail file",
+		              "delete-mail-file",
 		              user_name, user_id, SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
 		errors = 1;
@@ -892,8 +832,8 @@ static int remove_mailbox (void)
 #ifdef WITH_AUDIT
 	else
 	{
-		audit_logger (AUDIT_DEL_USER, Prog,
-		              "deleting mail file",
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "delete-mail-file",
 		              user_name, user_id, SHADOW_AUDIT_SUCCESS);
 	}
 #endif				/* WITH_AUDIT */
@@ -1108,7 +1048,7 @@ int main (int argc, char **argv)
 				 Prog, user_name);
 #ifdef WITH_AUDIT
 			audit_logger (AUDIT_DEL_USER, Prog,
-			              "deleting user not found",
+			              "deleting-user-not-found",
 			              user_name, AUDIT_NO_ID,
 			              SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
@@ -1158,7 +1098,7 @@ int main (int argc, char **argv)
 		if (!fflg) {
 #ifdef WITH_AUDIT
 			audit_logger (AUDIT_DEL_USER, Prog,
-			              "deleting user logged in",
+			              "deleting-user-logged-in",
 			              user_name, AUDIT_NO_ID,
 			              SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
@@ -1252,8 +1192,8 @@ int main (int argc, char **argv)
 #ifdef WITH_AUDIT
 		else
 		{
-			audit_logger (AUDIT_DEL_USER, Prog,
-			              "deleting home directory",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "deleting-home-directory",
 			              user_name, user_id, SHADOW_AUDIT_SUCCESS);
 		}
 #endif				/* WITH_AUDIT */
@@ -1261,7 +1201,7 @@ int main (int argc, char **argv)
 #ifdef WITH_AUDIT
 	if (0 != errors) {
 		audit_logger (AUDIT_DEL_USER, Prog,
-		              "deleting home directory",
+		              "deleting-home-directory",
 		              user_name, AUDIT_NO_ID,
 		              SHADOW_AUDIT_FAILURE);
 	}
@@ -1274,8 +1214,8 @@ int main (int argc, char **argv)
 			         _("%s: warning: the user name %s to SELinux user mapping removal failed.\n"),
 			         Prog, user_name);
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_ADD_USER, Prog,
-			              "removing SELinux user mapping",
+			audit_logger (AUDIT_ROLE_REMOVE, Prog,
+			              "delete-selinux-user-mapping",
 			              user_name, user_id, SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
 			fail_exit (E_SE_UPDATE);
diff -up shadow-4.15.0/src/usermod.c.audit-update shadow-4.15.0/src/usermod.c
--- shadow-4.15.0/src/usermod.c.audit-update	2024-02-01 23:59:36.000000000 +0100
+++ shadow-4.15.0/src/usermod.c	2024-02-09 10:49:57.108840594 +0100
@@ -431,7 +431,7 @@ static char *new_pw_passwd (char *pw_pas
 
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "updating passwd", user_newname, user_newid, 0);
+		              "updating-passwd", user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO, "lock user '%s' password", user_newname));
 		strcpy (buf, "!");
@@ -448,14 +448,14 @@ static char *new_pw_passwd (char *pw_pas
 
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "updating password", user_newname, user_newid, 0);
+		              "updating-password", user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO, "unlock user '%s' password", user_newname));
 		memmove(pw_pass, pw_pass + 1, strlen(pw_pass));
 	} else if (pflg) {
 #ifdef WITH_AUDIT
 		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing password", user_newname, user_newid, 1);
+		              "updating-password", user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO, "change user '%s' password", user_newname));
 		pw_pass = xstrdup (user_pass);
@@ -483,8 +483,8 @@ static void new_pwent (struct passwd *pw
 			fail_exit (E_NAME_IN_USE);
 		}
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing name", user_newname, user_newid, 1);
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "changing-name", user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO,
 		         "change user name '%s' to '%s'",
@@ -503,8 +503,8 @@ static void new_pwent (struct passwd *pw
 
 	if (uflg) {
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing uid", user_newname, user_newid, 1);
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "changing-uid", user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO,
 		         "change user '%s' UID from '%d' to '%d'",
@@ -513,8 +513,8 @@ static void new_pwent (struct passwd *pw
 	}
 	if (gflg) {
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing primary group",
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "changing-primary-group",
 		              user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO,
@@ -524,16 +524,16 @@ static void new_pwent (struct passwd *pw
 	}
 	if (cflg) {
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing comment", user_newname, user_newid, 1);
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "changing-comment", user_newname, user_newid, 1);
 #endif
 		pwent->pw_gecos = user_newcomment;
 	}
 
 	if (dflg) {
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing home directory",
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "changing-home-dir",
 		              user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO,
@@ -549,8 +549,8 @@ static void new_pwent (struct passwd *pw
 	}
 	if (sflg) {
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing user shell",
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "changing-shell",
 		              user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO,
@@ -580,8 +580,8 @@ static void new_spent (struct spwd *spen
 
 	if (fflg) {
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing inactive days",
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "changing-inactive-days",
 		              user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO,
@@ -595,8 +595,8 @@ static void new_spent (struct spwd *spen
 		date_to_str (sizeof(new_exp), new_exp, user_newexpire * DAY);
 		date_to_str (sizeof(old_exp), old_exp, user_expire * DAY);
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-		              "changing expiration date",
+		audit_logger (AUDIT_USER_MGMT, Prog,
+		              "changing-expiration-date",
 		              user_newname, user_newid, 1);
 #endif
 		SYSLOG ((LOG_INFO,
@@ -681,9 +681,9 @@ fail_exit (int code)
 #endif				/* ENABLE_SUBIDS */
 
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-	              "modifying account",
-	              user_name, AUDIT_NO_ID, 0);
+	audit_logger (AUDIT_USER_MGMT, Prog,
+	              "modify-account",
+	              user_name, AUDIT_NO_ID, SHADOW_AUDIT_FAILURE);
 #endif
 	exit (code);
 }
@@ -745,9 +745,12 @@ static void update_group (void)
 					                         user_newname);
 					changed = true;
 #ifdef WITH_AUDIT
-					audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-					              "changing group member",
-					              user_newname, AUDIT_NO_ID, 1);
+					audit_logger_with_group (
+					              AUDIT_USER_MGMT, Prog,
+					              "update-member-in-group",
+					              user_newname, AUDIT_NO_ID,
+					              ngrp->gr_name,
+					              SHADOW_AUDIT_SUCCESS);
 #endif
 					SYSLOG ((LOG_INFO,
 					         "change '%s' to '%s' in group '%s'",
@@ -761,9 +764,11 @@ static void update_group (void)
 				ngrp->gr_mem = del_list (ngrp->gr_mem, user_name);
 				changed = true;
 #ifdef WITH_AUDIT
-				audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-				              "removing group member",
-				              user_name, AUDIT_NO_ID, 1);
+				audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+				              "delete-user-from-group",
+				              user_name, AUDIT_NO_ID,
+				              ngrp->gr_name,
+				              SHADOW_AUDIT_SUCCESS);
 #endif
 				SYSLOG ((LOG_INFO,
 				         "delete '%s' from group '%s'",
@@ -776,9 +781,11 @@ static void update_group (void)
 			ngrp->gr_mem = add_list (ngrp->gr_mem, user_newname);
 			changed = true;
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "adding user to group",
-			              user_name, AUDIT_NO_ID, 1);
+			audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+			              "add-user-to-group",
+			              user_name, AUDIT_NO_ID,
+			              ngrp->gr_name,
+			              SHADOW_AUDIT_SUCCESS);
 #endif
 			SYSLOG ((LOG_INFO, "add '%s' to group '%s'",
 			         user_newname, ngrp->gr_name));
@@ -863,9 +870,10 @@ static void update_gshadow (void)
 			nsgrp->sg_adm = add_list (nsgrp->sg_adm, user_newname);
 			changed = true;
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "changing admin name in shadow group",
-			              user_name, AUDIT_NO_ID, 1);
+			audit_logger_with_group (AUDIT_GRP_MGMT, Prog,
+			              "update-admin-name-in-shadow-group",
+			              user_name, AUDIT_NO_ID, nsgrp->sg_name,
+			              SHADOW_AUDIT_SUCCESS);
 #endif
 			SYSLOG ((LOG_INFO,
 			         "change admin '%s' to '%s' in shadow group '%s'",
@@ -885,9 +893,10 @@ static void update_gshadow (void)
 					                          user_newname);
 					changed = true;
 #ifdef WITH_AUDIT
-					audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-					              "changing member in shadow group",
-					              user_name, AUDIT_NO_ID, 1);
+					audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+					              "update-member-in-shadow-group",
+					              user_name, AUDIT_NO_ID,
+					              nsgrp->sg_name, 1);
 #endif
 					SYSLOG ((LOG_INFO,
 					         "change '%s' to '%s' in shadow group '%s'",
@@ -901,9 +910,10 @@ static void update_gshadow (void)
 				nsgrp->sg_mem = del_list (nsgrp->sg_mem, user_name);
 				changed = true;
 #ifdef WITH_AUDIT
-				audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-				              "removing user from shadow group",
-				              user_name, AUDIT_NO_ID, 1);
+				audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+				              "delete-user-from-shadow-group",
+				              user_name, AUDIT_NO_ID,
+				              nsgrp->sg_name, 1);
 #endif
 				SYSLOG ((LOG_INFO,
 				         "delete '%s' from shadow group '%s'",
@@ -916,9 +926,10 @@ static void update_gshadow (void)
 			nsgrp->sg_mem = add_list (nsgrp->sg_mem, user_newname);
 			changed = true;
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "adding user to shadow group",
-			              user_newname, AUDIT_NO_ID, 1);
+			audit_logger_with_group (AUDIT_USER_MGMT, Prog,
+			              "add-user-to-shadow-group",
+			              user_newname, AUDIT_NO_ID,
+			              nsgrp->sg_name, 1);
 #endif
 			SYSLOG ((LOG_INFO, "add '%s' to shadow group '%s'",
 			         user_newname, nsgrp->sg_name));
@@ -1829,8 +1840,8 @@ static void move_home (void)
 
 #ifdef WITH_AUDIT
 		if (uflg || gflg) {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-				      "changing home directory owner",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+				      "updating-home-dir-owner",
 				      user_newname, user_newid, 1);
 		}
 #endif
@@ -1848,8 +1859,8 @@ static void move_home (void)
 				fail_exit (E_HOMEDIR);
 			}
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "moving home directory",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "moving-home-dir",
 			              user_newname, user_newid, 1);
 #endif
 			return;
@@ -1876,9 +1887,9 @@ static void move_home (void)
 						         Prog, prefix_user_home);
 					}
 #ifdef WITH_AUDIT
-					audit_logger (AUDIT_USER_CHAUTHTOK,
+					audit_logger (AUDIT_USER_MGMT,
 					              Prog,
-					              "moving home directory",
+					              "moving-home-dir",
 					              user_newname,
 					              user_newid,
 					              1);
@@ -2102,8 +2113,8 @@ static void move_mailbox (void)
 		}
 #ifdef WITH_AUDIT
 		else {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "changing mail file owner",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "updating-mail-file-owner",
 			              user_newname, user_newid, 1);
 		}
 #endif
@@ -2126,8 +2137,8 @@ static void move_mailbox (void)
 		}
 #ifdef WITH_AUDIT
 		else {
-			audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-			              "changing mail file name",
+			audit_logger (AUDIT_USER_MGMT, Prog,
+			              "updating-mail-file-name",
 			              user_newname, user_newid, 1);
 		}
 
@@ -2328,8 +2339,8 @@ int main (int argc, char **argv)
 				         _("%s: warning: the user name %s to %s SELinux user mapping failed.\n"),
 				         Prog, user_name, user_selinux);
 #ifdef WITH_AUDIT
-				audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-				              "modifying User mapping ",
+				audit_logger (AUDIT_ROLE_ASSIGN, Prog,
+				              "changing-selinux-user-mapping ",
 				              user_name, user_id,
 				              SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
@@ -2341,8 +2352,8 @@ int main (int argc, char **argv)
 				         _("%s: warning: the user name %s to SELinux user mapping removal failed.\n"),
 				         Prog, user_name);
 #ifdef WITH_AUDIT
-				audit_logger (AUDIT_ADD_USER, Prog,
-				              "removing SELinux user mapping",
+				audit_logger (AUDIT_ROLE_REMOVE, Prog,
+				              "delete-selinux-user-mapping",
 				              user_name, user_id,
 				              SHADOW_AUDIT_FAILURE);
 #endif				/* WITH_AUDIT */
@@ -2385,8 +2396,8 @@ int main (int argc, char **argv)
 			 */
 #ifdef WITH_AUDIT
 			if (uflg || gflg) {
-				audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-					      "changing home directory owner",
+				audit_logger (AUDIT_USER_MGMT, Prog,
+					      "updating-home-dir-owner",
 					      user_newname, user_newid, 1);
 			}
 #endif