Print this page
NEX-13644 File access audit logging
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
@@ -19,10 +19,11 @@
* CDDL HEADER END
*/
/*
* Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
*/
/*
* This file contains the audit hook support code for auditing.
*/
@@ -59,10 +60,11 @@
#include <sys/model.h> /* for model_t */
#include <sys/disp.h> /* for servicing_interrupt() */
#include <sys/devpolicy.h>
#include <sys/crypto/ioctladmin.h>
#include <sys/cred_impl.h>
+#include <sys/sid.h>
#include <inet/kssl/kssl.h>
#include <net/pfpolicy.h>
static void add_return_token(caddr_t *, unsigned int scid, int err, int rval);
@@ -704,10 +706,55 @@
stp->sd_t_audit_data = (caddr_t)curthread;
mutex_exit(&stp->sd_lock);
}
+/*
+ * ROUTINE: AUDIT_SACL
+ * PURPOSE: audit ACL-based file accesses
+ * CALLBY: SMB, NFS
+ * NOTE:
+ *
+ * IMPORTANT NOTE: Since we generate an audit record here, we may sleep
+ * on the audit queue if it becomes full.
+ * TODO:
+ * QUESTION:
+ */
+void
+audit_sacl(char *path, cred_t *cr, uint32_t desired, boolean_t success,
+ t_audit_sacl_t *tas)
+{
+ token_t *ad = NULL;
+ au_kcontext_t *kctx = GET_KCTX_PZ;
+ const auditinfo_addr_t *ainfo;
+ ksid_t *ks;
+
+ /* if auditing not enabled, then don't generate an audit record */
+ if (((kctx->auk_auditstate) &
+ ~(AUC_AUDITING | AUC_INIT_AUDIT | AUC_NOSPACE)) != 0)
+ return;
+
+ if ((success && (tas->tas_smask & desired) == 0) ||
+ (!success && (tas->tas_fmask & desired) == 0))
+ return;
+
+ ainfo = crgetauinfo(cr);
+ if (ainfo == NULL)
+ return;
+
+ au_write((caddr_t *)&(ad), au_to_path_string(path));
+ au_write((caddr_t *)&(ad), au_to_access_mask(desired));
+
+ /* Include the SID if it has one, in case the id is ephemeral */
+ if ((ks = crgetsid(cr, KSID_USER)) != NULL) {
+ au_write((caddr_t *)&(ad), au_to_wsid(ks));
+ }
+ AUDIT_SETSUBJ((caddr_t *)&(ad), cr, ainfo, kctx);
+ au_close(kctx, (caddr_t *)&(ad), AU_OK, AUE_SACL,
+ success ? 0 : PAD_FAILURE, NULL);
+}
+
/*
* ROUTINE: AUDIT_CLOSEF
* PURPOSE:
* CALLBY: CLOSEF
* NOTE: