[apparmor] [RFC, PATCH 3/3] apparmor: Make the audit cap cache timeout a sysctl
Ryan Lee
ryan.lee at canonical.com
Fri Sep 13 23:21:00 UTC 2024
Instead of hardcoding the Apparmor capability audit cache timeout, expose
it as a sysctl. This uses the helper introduced in the previous patch of
this series.
Signed-off-by: Ryan Lee <ryan.lee at canonical.com>
---
security/apparmor/capability.c | 6 ++++--
security/apparmor/include/capability.h | 2 ++
security/apparmor/lsm.c | 7 +++++++
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/security/apparmor/capability.c b/security/apparmor/capability.c
index 64005b3d0fcc..764b5dd93366 100644
--- a/security/apparmor/capability.c
+++ b/security/apparmor/capability.c
@@ -25,6 +25,8 @@
*/
#include "capability_names.h"
+unsigned int audit_cap_cache_timeout_us = 100;
+
struct aa_sfs_entry aa_sfs_entry_caps[] = {
AA_SFS_FILE_STRING("mask", AA_SFS_CAPS_MASK),
AA_SFS_FILE_BOOLEAN("extended", 1),
@@ -68,12 +70,12 @@ static void audit_cb(struct audit_buffer *ab, void *va)
static int audit_caps(struct apparmor_audit_data *ad, struct aa_profile *profile,
int cap, int error)
{
- const u64 AUDIT_CACHE_TIMEOUT_NS = 100*1000; /* 100 us */
u64 audit_cache_expiration;
struct aa_ruleset *rules = list_first_entry(&profile->rules,
typeof(*rules), list);
struct audit_cache *ent;
int type = AUDIT_APPARMOR_AUTO;
+ u64 audit_cap_cache_timeout_ns = 1000*(u64) audit_cap_cache_timeout_us;
ad->error = error;
@@ -95,7 +97,7 @@ static int audit_caps(struct apparmor_audit_data *ad, struct aa_profile *profile
/* Do simple duplicate message elimination */
ent = &get_cpu_var(audit_cache);
- audit_cache_expiration = ent->ktime_ns_last_audited[cap] + AUDIT_CACHE_TIMEOUT_NS;
+ audit_cache_expiration = ent->ktime_ns_last_audited[cap] + audit_cap_cache_timeout_ns;
if (profile == ent->profile && cap_raised(ent->caps, cap)
&& ktime_get_ns() <= audit_cache_expiration) {
put_cpu_var(audit_cache);
diff --git a/security/apparmor/include/capability.h b/security/apparmor/include/capability.h
index 1ddcec2d1160..c38488b3fe00 100644
--- a/security/apparmor/include/capability.h
+++ b/security/apparmor/include/capability.h
@@ -34,6 +34,8 @@ struct aa_caps {
kernel_cap_t extended;
};
+extern unsigned int audit_cap_cache_timeout_us;
+
extern struct aa_sfs_entry aa_sfs_entry_caps[];
kernel_cap_t aa_profile_capget(struct aa_profile *profile);
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index b9a92e500242..4af50bd3628a 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -2480,6 +2480,13 @@ static struct ctl_table apparmor_sysctl_table[] = {
.mode = 0600,
.proc_handler = apparmor_dointvec,
},
+ {
+ .procname = "apparmor_audit_capability_dedup_timeout_us",
+ .data = &audit_cap_cache_timeout_us,
+ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+ .proc_handler = apparmor_can_read_douintvec,
+ },
{ }
};
--
Major items I'm seeking input on (reason for RFC designation):
- Whether to hardcode the expiration offset or whether to expose it as a sysctl
Items to bikeshed before merging:
- Name for the sysctl
- Name for the static variable that the sysctl writes to
- Type for the sysctl variable
(I used unsigned int to match the int type for the other sysctls, but semantically this should be a u64)
More information about the AppArmor
mailing list