Loginuid,是否应该允许更改(可变或不可变)?

Loginuid,是否应该允许更改(可变或不可变)?

我正在尝试配置linux内核。我很困惑Make audit loginuid immutable (AUDIT_LOGINUID_IMMUTABLE) [N/y/?]

帮助说:

+config AUDIT_LOGINUID_IMMUTABLE
+ bool“使审核loginuid不可变”
+取决于AUDIT
+帮助
+如果任务设置其loginuid需要
+ CAP_SYS_AUDITCONTROL,或者该任务不需要特殊权限,则配置选项会切换
+但应该只允许设置其loginuid之前从未
设置过。在使用 systemd 或类似的中央
+进程来重新启动登录服务的系统上,应将其设置为 true。在较旧的
系统上,管理员通常必须直接停止和
启动进程,这应该设置为 false。将其设置为 true 允许
+1 从登录任务中删除潜在危险的功能,
但可能无法向后兼容较旧的 init 系统。

是否与可以更改的内容loginuid相同,以便该特定进程获得更多特权和权限?euid

如果不是的话,你能用更简单的语言解释一下吗?是不是像以更多权限启动进程sudo [process],或者在执行过程中给予进程更多权限,或者只有可以执行的人su(系统管理员或 root)才能使用此设置?

答案1

接受的答案不准确。我的答案可能也不太准确或难以理解,但似乎值得分享。 :) 此内核选项确定在未设置 loginuid 并保持不变时是否任何人都可以“echo 0 > /proc/self/loginuid”,或者无论当前值如何,对该值的修改是否需要特定功能。当这是 true 时(通常意味着您是 root),只有在未设置的情况下才能修改 loginuid。接受的答案不准确的原因是 sudo 和 su 通常都是 suid root。它们是 suid root,以便允许二进制文件切换到不同的有效 UID。在大多数Linux系统中,root用户默认拥有所有能力。因此,如果这是 false,这些程序也有能力切换 loginuid 属性。如果这是真的并且系统配置正确,则应通过 ssh/login/whatever 在登录 shell 中设置 loginuid,并且任何内容都无法更改该值。

loginuid 属性在系统启动时/ init 内未设置。它通常首先由“入口点”服务上的 pam_loginuid 模块设置。因此,您设置 ssh 和登录来设置一个值,因为这些是允许某人“登录”的东西 - 因此是 loginuid。例如,您不会将该模块包含在 sudo pam 堆栈中,因为这不是新登录;即登录后切换UID。loginuid 的目的是从登录时间开始跟踪用户。您可以使用审核守护程序来记录特定用户运行的进程,即使他们使用 su 或 sudo 切换帐户后也是如此。 logname 实用程序在较新的系统上使用此属性来识别“登录用户”,而与有效或实际 uid 值无关(较旧的系统使用控制终端从 utmp 查找登录事件)。

顺便说一句,进程从其父进程继承了 loginuid 属性。

所以,这个参数控制着loginuid属性是否可以修改。它提到 systemd 是因为 init 的工作原理。内核启动init,init没有loginuid。然后 init 启动服务,并且这些服务未设置 loginuid。通过常规的 System V init,管理员可以登录并运行“/etc/init.d/someservice restart”。管理员的loginuid 属性是在他们通过ssh 登录时设置的,并且会切换到root。然后他们运行 init 脚本,该脚本继承他们的 Loginuid。如果设置了“loginuid 不可变”值,则 init 脚本或管理员无法在启动守护程序之前进行系统调用,从而清除或重置 lognuid 属性,并且现在守护程序正在使用管理员的 loginuid 运行,从而搞乱审核日志等。如果该值是可修改的,则可以通过具有适当功能的进程(例如/sbin/service)进行系统调用(audit_setloginuid())来清除或设置loginuid的合理值给定的守护进程。

systemd(和 upstart,也许还有其他一些 init 系统)的工作方式,管理员不直接运行 init 脚本。相反,管理员向 init 进程发送命令,然后 init 进程自行执行重新启动(或其他)操作。由于 init 具有未设置的 loginuid,因此生成的 init 脚本继承value(未设置),然后 init 脚本可以设置自己的 loginuid,即使它可能已作为非 root 用户运行。它可以说更安全,因为没有什么需要特殊的功能;一切都可以作为普通用户完成。

因此,如果您有一个解耦的 init 系统,那么一旦初始设置了 loginuid 属性,任何非 root 的东西通常都没有合法理由更改该属性,因此可以将其设置为本质上不可变的。

要回答“这会给你带来什么”的问题,嗯,不多。可能有一些程序根据 loginuid 而不是 uid 或 euid 授予访问权限,但这些程序很少。一般来说,访问是基于 SELinux 上下文、EUID、UID 或进程功能来控制的。将你的loginuid 更改为0 不会给你带来任何好处,而且可能会触发一个旨在捕获远程root 登录的监控系统。 :) 一些站点使用auditd来跟踪进程执行/系统调用,并且这些站点很可能需要loginuid准确才能有有效的系统审计规则。但是,如果您问这个有关您正在编译的内核的问题,那么您就不是在操作这些站点之一。 :)

答案2

的文档pam_loginuidPAM 模块给出了一个很好的提示:

pam_loginuid 模块为已验证的进程设置loginuid 进程属性。这对于正确审核应用程序是必要的。此 PAM 模块只能用于入口点应用程序,例如:login、sshd、gdm、vsftpd、crond 和 atd。除此之外,可能还有其他入口点应用程序。您不应该将其用于 sudo 或 su 之类的应用程序,因为这会通过将 loginuid 更改为他们刚刚切换到的帐户来达到目的。

正如最后一段提到的,登录用户ID运行时可以更改属性须藤或者AUDIT_LOGINUID_IMMUTABLE内核选项可以防止这种情况发生。

另外,这是相关的源代码(第二个ifLinux 3.15:

static int audit_set_loginuid_perm(kuid_t loginuid)
{
    /* if we are unset, we don't need privs */
    if (!audit_loginuid_set(current))
        return 0;
    /* if AUDIT_FEATURE_LOGINUID_IMMUTABLE means never ever allow a change*/
    if (is_audit_feature_set(AUDIT_FEATURE_LOGINUID_IMMUTABLE))
        return -EPERM;
    /* it is set, you need permission */
    if (!capable(CAP_AUDIT_CONTROL))
        return -EPERM;
    /* reject if this is not an unset and we don't allow that */
    if (is_audit_feature_set(AUDIT_FEATURE_ONLY_UNSET_LOGINUID) && uid_valid(loginuid))
        return -EPERM;
    return 0;
}

(亵渎注:制表符已替换为 4 个空格,以使代码更适合此处。)

相关内容