From owner-p4-projects@FreeBSD.ORG Tue Jun 16 20:01:53 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7BAB4106568C; Tue, 16 Jun 2009 20:01:52 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 350371065686 for ; Tue, 16 Jun 2009 20:01:52 +0000 (UTC) (envelope-from marinosi@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 2230B8FC1F for ; Tue, 16 Jun 2009 20:01:52 +0000 (UTC) (envelope-from marinosi@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5GK1qB1029452 for ; Tue, 16 Jun 2009 20:01:52 GMT (envelope-from marinosi@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5GK1p4H029445 for perforce@freebsd.org; Tue, 16 Jun 2009 20:01:52 GMT (envelope-from marinosi@FreeBSD.org) Date: Tue, 16 Jun 2009 20:01:52 GMT Message-Id: <200906162001.n5GK1p4H029445@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marinosi@FreeBSD.org using -f From: Ilias Marinos To: Perforce Change Reviews Cc: Subject: PERFORCE change 164530 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Jun 2009 20:01:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=164530 Change 164530 by marinosi@marinosi_redrum on 2009/06/16 20:01:39 Dynamic slice creation upon request implemented. Initialization system implemented too. The whole thing builds but remains untested and incomplete. Affected files ... .. //depot/projects/soc2009/marinosi_appaudit/src/sys/bsm/audit.h#3 edit .. //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit.c#4 edit .. //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_private.h#4 edit .. //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_slice.h#2 edit .. //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_syscalls.c#3 edit .. //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_worker.c#3 edit Differences ... ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/bsm/audit.h#3 (text) ==== @@ -128,7 +128,8 @@ #define A_SETCOND 38 #define A_CREATESLICE 39 #define A_UPDATESLICE 40 -#define A_REMOVESLICE 41 +#define A_GETSLICE 41 +#define A_REMOVESLICE 42 /* * Audit policy controls. ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit.c#4 (text) ==== @@ -84,8 +84,14 @@ SYSCTL_NODE(_security, OID_AUTO, audit, CTLFLAG_RW, 0, "TrustedBSD audit controls"); +/* + * The base audit slice statically declared. + */ struct audit_slice *audit_base_slice = NULL; +/* Audit slices queue */ +struct audit_slice_queue audit_slice_q; + /* * Kernel audit information. This will store the current audit address * or host information that the kernel will use when it's generating @@ -189,17 +195,35 @@ * synchronization primitives, worker thread, and trigger device node. Also * call into the BSM assembly code to initialize it. */ -static void +void audit_init(void *arg) { - if ( audit_base_slice == NULL ) + struct audit_slice *as; + + /* + * Initialize the slice queue and add every slice in it except the + * base(no reason to be in the queue). + */ + TAILQ_INIT(&audit_slice_q); + if ( audit_base_slice == NULL && arg == NULL ) { audit_base_slice = malloc(sizeof(*audit_base_slice), M_AUDITSLICE, M_WAITOK | M_ZERO); + /* + * If base slice is null allocate and then initialize the base + * slice first of all. + */ + as = audit_base_slice; + } else { + //as = (struct audit_slice *) arg; + as = malloc(sizeof(*as), M_AUDITSLICE, M_WAITOK | M_ZERO); + TAILQ_INSERT_TAIL(&audit_slice_q, as, as_q); + } - struct audit_slice *as = (struct audit_slice *) arg; - as = audit_base_slice; - + /* + * XXX: As M_ZERO flag is used during allocation, we may remove some + * of the following initialization is useless. + */ as->audit_enabled = 0; as->audit_suspended = 0; as->audit_panic_on_write_fail = 0; @@ -634,3 +658,16 @@ ret = 1; audit_commit(ar, errcode, ret); } + +/* + * audit_slice_destroy() is called through A_REMOVESLICE command of auditon() + * syscall to remove an existing slice ( except the base one!) + */ +void +audit_slice_destroy(struct audit_slice *as) +{ + if (as != NULL) { + TAILQ_REMOVE(&audit_slice_q, as, as_q); + free(as, M_AUDITSLICE); + } +} ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_private.h#4 (text) ==== @@ -132,6 +132,46 @@ }; typedef struct au_qctrl64 au_qctrl64_t; +#define AUDIT_SLICE_NAME_LEN 20 +#define AUDIT_DEV_NAME_LEN 20 +/* + * Helper data structure that keeps the data that are needed for new audit + * slice creation/modification/removal.This structure will be used with the + * auditon() syscall for all the audit slices except the base. + */ +struct au_slice_data { + char as_name[AUDIT_SLICE_NAME_LEN]; + int audit_enabled; + int audit_suspended; + int audit_q_len; + int audit_pre_q_len; + int audit_panic_on_write_fail; + int audit_fail_stop; + int audit_argv; + int audit_arge; + int audit_in_failure; + struct audit_fstat audit_fstat; + struct au_mask audit_nae_mask; + struct au_qctrl audit_qctrl; + + int audit_file_rotate_wait; + struct ucred *audit_cred; + struct vnode *audit_vp; + + + + /* + * Applications need their slice device to submit their audit records. + * Device specific variables here. + */ + char as_dev_name[AUDIT_DEV_NAME_LEN]; + int as_dev_isopen; + uid_t uid; + gid_t gid; + int perms; +}; +typedef struct au_slice_data au_slice_data_t; + union auditon_udata { char *au_path; int au_cond; @@ -150,6 +190,7 @@ au_stat_t au_stat; au_fstat_t au_fstat; auditinfo_addr_t au_kau_info; + au_slice_data_t au_slice; /* Data used for audit slices, except the base*/ }; struct posix_ipc_perm { @@ -229,6 +270,7 @@ struct sockaddr_storage ar_arg_sockaddr; }; + /* * Arguments in the audit record are initially not defined; flags are set to * indicate if they are present so they can be included in the audit log ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_slice.h#2 (text+ko) ==== @@ -152,18 +152,29 @@ uid_t uid; gid_t gid; int perms; + + /* + * Keep the several audit slices in a list + */ + TAILQ_ENTRY(audit_slice) as_q; }; +typedef struct audit_slice audit_slice_t; -typedef struct audit_slice audit_slice_t; +TAILQ_HEAD(audit_slice_queue, audit_slice); /* Static allocation of the base slice */ extern struct audit_slice *audit_base_slice; +/* Audit slices queue */ +extern struct audit_slice_queue audit_slice_q; + /* * Audit related functions prototypes */ -void audit_rotate_vnode(struct ucred *cred, - struct vnode *vp); -void audit_worker_init(void *arg); +void audit_init(void *arg); +void audit_rotate_vnode(struct ucred *cred, + struct vnode *vp); +void audit_worker_init(void *arg); +void audit_slice_destroy(struct audit_slice *as); ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_syscalls.c#3 (text) ==== @@ -541,19 +541,31 @@ return (audit_send_trigger(udata.au_trigger)); case A_CREATESLICE: - //if (uap->length != sizeof(udata.au_slice)) - // return (EINVAL); + if (uap->length != sizeof(udata.au_slice)) + return (EINVAL); + /* Check if slice exists? */ + if ((udata.au_slice.as_name == NULL)) + return (EINVAL); + /* Passing null for testing purposes. TO be changed */ + audit_init(NULL); + break; + + case A_UPDATESLICE: + if (uap->length != sizeof(udata.au_slice)) + return (EINVAL); return (0); - case A_UPDATESLICE: - //if (uap->length != sizeof(udata.au_slice)) - // return (EINVAL); + case A_GETSLICE: + if (uap->length != sizeof(udata.au_slice)) + return (EINVAL); return (0); case A_REMOVESLICE: - //if (uap->length != sizeof(udata.au_slice)) - // return (EINVAL); - return (0); + if (uap->length != sizeof(udata.au_slice)) + return (EINVAL); + /* Passing null for testing purposes. TO be changed */ + audit_slice_destroy(NULL); + break; default: return (EINVAL); ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_worker.c#3 (text) ==== @@ -384,9 +384,9 @@ struct kaudit_queue ar_worklist; struct kaudit_record *ar; int lowater_signal; - - struct audit_slice *as = (struct audit_slice * ) arg; - + struct audit_slice *as; + + as = (struct audit_slice * ) arg; TAILQ_INIT(&ar_worklist); mtx_lock(&(as->audit_mtx)); while (1) {