/* * Currently AppArmor auditing is fed straight into the audit framework. * * TODO: * netlink interface for complain mode * user auditing, - send user auditing to netlink interface * system control of whether user audit messages go to system log
*/
/** * audit_pre() - core AppArmor function. * @ab: audit buffer to fill (NOT NULL) * @va: audit structure containing data to audit (NOT NULL) * * Record common AppArmor audit data from @va
*/ staticvoid audit_pre(struct audit_buffer *ab, void *va)
{ struct apparmor_audit_data *ad = aad_of_va(va);
if (aa_g_audit_header) {
audit_log_format(ab, "apparmor=\"%s\"",
aa_audit_type[ad->type]);
}
if (ad->op)
audit_log_format(ab, " operation=\"%s\"", ad->op);
if (ad->name) {
audit_log_format(ab, " name=");
audit_log_untrustedstring(ab, ad->name);
}
}
/** * aa_audit_msg - Log a message to the audit subsystem * @type: audit type for the message * @ad: audit event structure (NOT NULL) * @cb: optional callback fn for type specific fields (MAYBE NULL)
*/ void aa_audit_msg(int type, struct apparmor_audit_data *ad, void (*cb) (struct audit_buffer *, void *))
{
ad->type = type;
common_lsm_audit(&ad->common, audit_pre, cb);
}
/** * aa_audit - Log a profile based audit event to the audit subsystem * @type: audit type for the message * @profile: profile to check against (NOT NULL) * @ad: audit event (NOT NULL) * @cb: optional callback fn for type specific fields (MAYBE NULL) * * Handle default message switching based off of audit mode flags * * Returns: error on failure
*/ int aa_audit(int type, struct aa_profile *profile, struct apparmor_audit_data *ad, void (*cb) (struct audit_buffer *, void *))
{
AA_BUG(!profile);
if (type == AUDIT_APPARMOR_AUTO) { if (likely(!ad->error)) { if (AUDIT_MODE(profile) != AUDIT_ALL) return 0;
type = AUDIT_APPARMOR_AUDIT;
} elseif (COMPLAIN_MODE(profile))
type = AUDIT_APPARMOR_ALLOWED; else
type = AUDIT_APPARMOR_DENIED;
} if (AUDIT_MODE(profile) == AUDIT_QUIET ||
(type == AUDIT_APPARMOR_DENIED &&
AUDIT_MODE(profile) == AUDIT_QUIET_DENIED)) return ad->error;
if (KILL_MODE(profile) && type == AUDIT_APPARMOR_DENIED)
type = AUDIT_APPARMOR_KILL;
/* Currently rules are treated as coming from the root ns */
rule->label = aa_label_parse(&root_ns->unconfined->label, rulestr,
gfp, true, false); if (IS_ERR(rule->label)) { int err = PTR_ERR(rule->label);
aa_audit_rule_free(rule); return err;
}
*vrule = rule; return 0;
}
int aa_audit_rule_known(struct audit_krule *rule)
{ int i;
for (i = 0; i < rule->field_count; i++) { struct audit_field *f = &rule->fields[i];
switch (f->type) { case AUDIT_SUBJ_ROLE: return 1;
}
}
return 0;
}
int aa_audit_rule_match(struct lsm_prop *prop, u32 field, u32 op, void *vrule)
{ struct aa_audit_rule *rule = vrule; struct aa_label *label; int found = 0;
label = prop->apparmor.label;
if (!label) return -ENOENT;
if (aa_label_is_subset(label, rule->label))
found = 1;
switch (field) { case AUDIT_SUBJ_ROLE: switch (op) { case Audit_equal: return found; case Audit_not_equal: return !found;
}
} return 0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.