lsm: improve logging about absence of lsm-bpf

In containers securityfs is typically not mounted. Our lsm-bpf code
so far detected this situation and claimed the kernel was lacking
lsm-bpf support. Which isn't quite true though, it might very well
support it. This made boots of systemd in systemd-nspawn a bit ugly,
because of the misleading log message at boot.

Let's improve things, and make clearer what is going on.
This commit is contained in:
Lennart Poettering
2025-01-14 09:53:56 +00:00
committed by Luca Boccassi
parent 1d77ac19cf
commit 5e35b6a5f7
3 changed files with 20 additions and 2 deletions
+4
View File
@@ -106,6 +106,10 @@ bool bpf_restrict_fs_supported(bool initialize) {
return (supported = false);
r = lsm_supported("bpf");
if (r == -ENOPKG) {
log_info_errno(r, "bpf-restrict-fs: securityfs not mounted, BPF LSM support not available.");
return (supported = false);
}
if (r < 0) {
log_warning_errno(r, "bpf-restrict-fs: Can't determine whether the BPF LSM module is used: %m");
return (supported = false);
+4 -1
View File
@@ -54,8 +54,11 @@ int userns_restrict_install(
int r;
r = lsm_supported("bpf");
if (r == -ENOPKG)
/* We propagate this as EOPNOTSUPP! */
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "bpf-lsm support not available, as securityfs is not mounted.");
if (r < 0)
return r;
return log_error_errno(r, "Failed to check if bpf-lsm support is available: %m");
if (r == 0)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "bpf-lsm not supported, can't lock down user namespace.");
+12 -1
View File
@@ -4,6 +4,7 @@
#include "extract-word.h"
#include "fileio.h"
#include "lsm-util.h"
#include "mountpoint-util.h"
#include "string-util.h"
int lsm_supported(const char *name) {
@@ -13,8 +14,18 @@ int lsm_supported(const char *name) {
assert(name);
r = read_one_line_file("/sys/kernel/security/lsm", &lsm_list);
if (r == -ENOENT) /* LSM support not available at all? */
if (r == -ENOENT) { /* LSM support not available at all? */
/* If securityfs is not mounted, then propagate this as ENOPKG, to indicate that LSM might be
* available we just can't determine it */
r = path_is_mount_point("/sys/kernel/security");
if (r < 0 && r != -ENOENT)
return log_debug_errno(r, "Failed to check if /sys/kernel/security is a mount point: %m");
if (r == 0)
return log_debug_errno(SYNTHETIC_ERRNO(ENOPKG), "/sys/kernel/security is not mounted, can't determine LSM status.");
return false;
}
if (r < 0)
return log_debug_errno(r, "Failed to read /sys/kernel/security/lsm: %m");