190c37854870f4cf201dbe8c7970eab8b2788cac
[linux-3.10.git] / include / linux / lsm_audit.h
1 /*
2  * Common LSM logging functions
3  * Heavily borrowed from selinux/avc.h
4  *
5  * Author : Etienne BASSET  <etienne.basset@ensta.org>
6  *
7  * All credits to : Stephen Smalley, <sds@epoch.ncsc.mil>
8  * All BUGS to : Etienne BASSET  <etienne.basset@ensta.org>
9  */
10 #ifndef _LSM_COMMON_LOGGING_
11 #define _LSM_COMMON_LOGGING_
12
13 #include <linux/stddef.h>
14 #include <linux/errno.h>
15 #include <linux/kernel.h>
16 #include <linux/kdev_t.h>
17 #include <linux/spinlock.h>
18 #include <linux/init.h>
19 #include <linux/audit.h>
20 #include <linux/in6.h>
21 #include <linux/path.h>
22 #include <linux/key.h>
23 #include <linux/skbuff.h>
24 #include <asm/system.h>
25
26
27 /* Auxiliary data to use in generating the audit record. */
28 struct common_audit_data {
29         char    type;
30 #define LSM_AUDIT_DATA_FS      1
31 #define LSM_AUDIT_DATA_NET     2
32 #define LSM_AUDIT_DATA_CAP     3
33 #define LSM_AUDIT_DATA_IPC     4
34 #define LSM_AUDIT_DATA_TASK    5
35 #define LSM_AUDIT_DATA_KEY     6
36 #define LSM_AUDIT_NO_AUDIT     7
37         struct task_struct *tsk;
38         union   {
39                 struct {
40                         struct path path;
41                         struct inode *inode;
42                 } fs;
43                 struct {
44                         int netif;
45                         struct sock *sk;
46                         u16 family;
47                         __be16 dport;
48                         __be16 sport;
49                         union {
50                                 struct {
51                                         __be32 daddr;
52                                         __be32 saddr;
53                                 } v4;
54                                 struct {
55                                         struct in6_addr daddr;
56                                         struct in6_addr saddr;
57                                 } v6;
58                         } fam;
59                 } net;
60                 int cap;
61                 int ipc_id;
62                 struct task_struct *tsk;
63 #ifdef CONFIG_KEYS
64                 struct {
65                         key_serial_t key;
66                         char *key_desc;
67                 } key_struct;
68 #endif
69         } u;
70         /* this union contains LSM specific data */
71         union {
72 #ifdef CONFIG_SECURITY_SMACK
73                 /* SMACK data */
74                 struct smack_audit_data {
75                         const char *function;
76                         char *subject;
77                         char *object;
78                         char *request;
79                         int result;
80                 } smack_audit_data;
81 #endif
82 #ifdef CONFIG_SECURITY_SELINUX
83                 /* SELinux data */
84                 struct {
85                         u32 ssid;
86                         u32 tsid;
87                         u16 tclass;
88                         u32 requested;
89                         u32 audited;
90                         u32 denied;
91                         struct av_decision *avd;
92                         int result;
93                 } selinux_audit_data;
94 #endif
95         };
96         /* these callback will be implemented by a specific LSM */
97         void (*lsm_pre_audit)(struct audit_buffer *, void *);
98         void (*lsm_post_audit)(struct audit_buffer *, void *);
99 };
100
101 #define v4info fam.v4
102 #define v6info fam.v6
103
104 int ipv4_skb_to_auditdata(struct sk_buff *skb,
105                 struct common_audit_data *ad, u8 *proto);
106
107 int ipv6_skb_to_auditdata(struct sk_buff *skb,
108                 struct common_audit_data *ad, u8 *proto);
109
110 /* Initialize an LSM audit data structure. */
111 #define COMMON_AUDIT_DATA_INIT(_d, _t) \
112         { memset((_d), 0, sizeof(struct common_audit_data)); \
113          (_d)->type = LSM_AUDIT_DATA_##_t; }
114
115 void common_lsm_audit(struct common_audit_data *a);
116
117 #endif