我试图了解什么逻辑决定了用户是否可以使用特定的 MLS 敏感级别登录。起初我怀疑 pam_selinux.so 会读取 /etc/selinux/.../seusers 文件以了解哪个用户绑定到哪个 seuser,然后将用户限制为等于或低于 MLS 范围的高分量的灵敏度。
但是,在浏览其源代码后,我发现,在询问用户是否愿意从默认上下文更改其安全上下文后,pam_selinux 通过调用内核策略来检查新的 MLS 标签是否合适。
以下代码位于 Ubuntu libpam-modules 1.1.1-4ubuntu2 包中的 modules/pam_selinux/pam_selinux.c 中。
static int mls_range_allowed(pam_handle_t *pamh, security_context_t src, security_context_t dst, int debug)
{
struct av_decision avd;
int retval;
unsigned int bit = CONTEXT__CONTAINS;
context_t src_context = context_new (src);
context_t dst_context = context_new (dst);
context_range_set(dst_context, context_range_get(src_context));
if (debug)
pam_syslog(pamh, LOG_NOTICE, "Checking if %s mls range valid for %s", dst, context_str(dst_context));
retval = security_compute_av(context_str(dst_context), dst, SECCLASS_CONTEXT, bit, &avd);
context_free(src_context);
context_free(dst_context);
if (retval || ((bit & avd.allowed) != bit))
return 0;
return 1;
}
在我看来,这个检查实际上是在内核策略中检查的,在 security_compute_av() 调用中可以看到。这颠覆了我对 SELinux 登录的理解。
所以,有人可以解释一下:
用户选择的登录安全级别的有效性如何确定?
该逻辑在策略、pam_selinux 和内核中究竟是如何实现的?
目前,我对类型强制多重、类别安全或基于角色的访问控制不太感兴趣,因此无需解释如果这些组件不影响 MLS 敏感性,它们是如何验证的。