git: dcb0790bad43 - main - setaudit: Initial import

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Tue, 18 Nov 2025 16:24:40 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=dcb0790bad434ace7cf53259e7a9bcefbef1c69b

commit dcb0790bad434ace7cf53259e7a9bcefbef1c69b
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2025-11-17 16:40:10 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-11-18 16:24:20 +0000

    setaudit: Initial import
    
    Unmodified sources from https://github.com/csjayp/setaudit at commit
    aa4dd9dfa40b6437030d718834236f4eaeb18ccb.
    
    Some follow-up changes will fix a few issues and make it easier to use
    this utility in the rc framework.
    
    Reviewed by:    csjp
    MFC after:      2 weeks
    Sponsored by:   Modirum MDPay
    Sponsored by:   Klara, Inc.
    Differential Revision:  https://reviews.freebsd.org/D53669
---
 usr.sbin/Makefile            |   1 +
 usr.sbin/setaudit/.gitignore |   2 +
 usr.sbin/setaudit/Makefile   |   8 +++
 usr.sbin/setaudit/setaudit.8 |  78 ++++++++++++++++++++++++
 usr.sbin/setaudit/setaudit.c | 140 +++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 229 insertions(+)

diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index 44679ca290a5..0290ed4f1c58 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -117,6 +117,7 @@ SUBDIR.${MK_AUDIT}+=	auditdistd
 .endif
 SUBDIR.${MK_AUDIT}+=	auditreduce
 SUBDIR.${MK_AUDIT}+=	praudit
+SUBDIR.${MK_AUDIT}+=	setaudit
 SUBDIR.${MK_AUTHPF}+=	authpf
 SUBDIR.${MK_AUTOFS}+=	autofs
 SUBDIR.${MK_BLACKLIST}+=	blacklistctl
diff --git a/usr.sbin/setaudit/.gitignore b/usr.sbin/setaudit/.gitignore
new file mode 100644
index 000000000000..459fdebd0a30
--- /dev/null
+++ b/usr.sbin/setaudit/.gitignore
@@ -0,0 +1,2 @@
+setaudit
+setaudit.o
diff --git a/usr.sbin/setaudit/Makefile b/usr.sbin/setaudit/Makefile
new file mode 100644
index 000000000000..a2e8b37c5c30
--- /dev/null
+++ b/usr.sbin/setaudit/Makefile
@@ -0,0 +1,8 @@
+PROG=	setaudit
+MAN=	setaudit.8
+
+WARNS?=	3
+
+LIBADD+= bsm
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/setaudit/setaudit.8 b/usr.sbin/setaudit/setaudit.8
new file mode 100644
index 000000000000..8d0c8716ff73
--- /dev/null
+++ b/usr.sbin/setaudit/setaudit.8
@@ -0,0 +1,78 @@
+.\" Copyright (c) 2018-2022 Mateusz Piotrowski <0mp@FreeBSD.org>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.Dd March 21, 2018
+.Dt SETAUDIT 8
+.Os
+.Sh NAME
+.Nm setaudit
+.Nd "specify audit configurations on a process"
+.Sh SYNOPSIS
+.Nm
+.Op Fl 46
+.Op Fl a Ar auid
+.Op Fl m Ar mask
+.Op Fl s Ar source
+.Op Fl p Ar port
+.Ar command ...
+.Sh DESCRIPTION
+.Nm
+is a tool to specify audit configurations on a process.
+.Pp
+The following options are available:
+.Bl -tag -width ".Fl d Ar argument"
+.It Fl 4
+Use IPv4.
+.It Fl 6
+Use IPv6.
+.It Fl a Ar auid
+Audit user ID.
+.It Fl m Ar mask
+String representation of an audit mask.
+.It Fl s Ar source
+IPv4 or IPv6 address of a Terminal ID.
+.It Fl p Ar port
+Port of a Terminal ID.
+.Xr
+.El
+.Sh EXAMPLES
+Enable all exe related audit events performed by
+.Ar command
+and its child processes:
+.Pp
+.Dl # setaudit -m ex command
+.Sh SEE ALSO
+.Xr getaudit 2 ,
+.Xr setaudit 2 ,
+.Xr au_mask 3 ,
+.Xr libbsm 3 ,
+.Xr audit_user 5 ,
+.Xr audit 8
+.Sh HISTORY
+The
+.Nm
+utility was written by
+.An Christian S.J. Peron Aq Mt csjp@FreeBSD.org .
+.Sh AUTHORS
+This
+manual page was written by
+.An Mateusz Piotrowski Aq Mt 0mp@FreeBSD.org .
diff --git a/usr.sbin/setaudit/setaudit.c b/usr.sbin/setaudit/setaudit.c
new file mode 100644
index 000000000000..cfe8f2bc7155
--- /dev/null
+++ b/usr.sbin/setaudit/setaudit.c
@@ -0,0 +1,140 @@
+/*-
+ * Copyright (c) 2018 Christian S.J. Peron
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <bsm/audit.h>
+#include <bsm/libbsm.h>
+
+#include <netinet/in.h>
+
+#include <stdio.h>
+#include <pwd.h>
+#include <string.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <err.h>
+
+static char	*aflag;
+static char	*mflag;
+static char	*sflag;
+
+static void
+usage(char *prog)
+{
+
+	(void) fprintf(stderr,
+	    "usage: %s [-46] [-a auid] [-m mask] [-s source] [-p port] command ...\n",
+	    prog);
+	exit(1);
+}
+
+int
+main(int argc, char *argv [])
+{
+	struct sockaddr_in6 *sin6;
+	struct sockaddr_in *sin;
+	struct addrinfo hints;
+	auditinfo_addr_t aia;
+	struct addrinfo *res;
+	struct passwd *pwd;
+	char *r, *prog;
+	int ch, error;
+
+	prog = argv[0];
+	bzero(&aia, sizeof(aia));
+	bzero(&hints, sizeof(hints));
+	aia.ai_termid.at_type = AU_IPv4;
+	hints.ai_family = PF_UNSPEC;
+	while ((ch = getopt(argc, argv, "46a:m:s:p:")) != -1)
+		switch (ch) {
+		case '4':
+			hints.ai_family = PF_INET;
+			break;
+		case '6':
+			hints.ai_family = PF_INET6;
+			break;
+		case 'a':
+			aflag = optarg;
+			break;
+		case 'm':
+			mflag = optarg;
+			break;
+		case 's':
+			sflag = optarg;
+			break;
+		case 'p':
+			aia.ai_termid.at_port = htons(atoi(optarg));
+			break;
+		default:
+			usage(prog);
+			/* NOT REACHED */
+		}
+	argc -= optind;
+	argv += optind;
+	if (argc == 0)
+		usage(prog);
+	if (aflag) {
+		pwd = getpwnam(aflag);
+		if (pwd == NULL) {
+			aia.ai_auid = strtoul(aflag, &r, 10);
+			if (r != NULL)
+				errx(1, "%s: invalid user", aflag);
+		} else
+			aia.ai_auid = pwd->pw_uid;
+	}
+	if (mflag) {
+		if (getauditflagsbin(mflag, &aia.ai_mask) < 0)
+			err(1, "getauditflagsbin");
+	}
+	if (sflag) {
+		error = getaddrinfo(sflag, NULL, &hints, &res);
+		if (error)
+			errx(1, "%s", gai_strerror(error));
+		switch (res->ai_family) {
+		case PF_INET6:
+			sin6 = (struct sockaddr_in6 *) res->ai_addr;
+			bcopy(&sin6->sin6_addr.s6_addr,
+			    &aia.ai_termid.at_addr[0],
+			    sizeof(struct in6_addr));
+			aia.ai_termid.at_type = AU_IPv6;
+			break;
+		case PF_INET:
+			sin = (struct sockaddr_in *) res->ai_addr;
+			bcopy(&sin->sin_addr.s_addr,
+			    &aia.ai_termid.at_addr[0],
+			    sizeof(struct in_addr));
+			aia.ai_termid.at_type = AU_IPv4;
+			break;
+		}
+	}
+	if (setaudit_addr(&aia, sizeof(aia)) < 0) {
+		err(1, "setaudit_addr");
+	}
+	(void) execvp(*argv, argv);
+	err(1, "%s", *argv);
+}