我的应用程序创建了一个基本的 ACL 并将其传达给内核模块。ACL 包含一个 UID/GID 列表。对这些 ID 的检查是自定义的,并且基于系统已经提供的内容。
现在,如果 root/用户更改 UID/GID,则需要刷新 ACL。usermod
有没有办法在 UID/GID 更改时(例如通过命令)在应用程序中获取通知?目前平台是 Linux,但我们也可以将其移植到其他平台(AIX/Solaris)
我想说没有办法可靠地检测 UID/用户名映射的变化,尤其是当你跨平台时。用户数据库可能驻留在 NIS、NIS+ 或现在的 LDAP 中。他们可能正在将他们的 UNIX/Linux 系统与运行 Active Directory 的 Windows Server 集成,或者他们可能正在使用像 Hesoid 这样更晦涩的东西。我知道无法从这些不同的数据库中接收任何自动反馈。而且,任何关于 UNIX 管理的好书都会告诉您不要更改这些映射,或者至少,如果必须的话,永远不要重用 UID。不要忘记,无论是使用标准 POSIX 权限还是 POSIX ACL 的文件系统也将存储 UID,如果管理员决定更改用户的 UID,这些 UID 将不会得到更新。内核和文件系统都将特定的 UID 视为特定用户,而不管他们的用户名如何。我真的认为您不需要为管理员更改用户的 UID 的情况而烦恼,这对每个人来说都太容易出错了。
此外,快速查看 Windows 上的 NTFS 会发现它还存储了一个称为 SID 的 UID,它是一个用于表示用户的长数字,Windows 不提供或不希望您更改该 SID 的映射到特定的用户名。SID 是 NT 内核内部使用的,而不是用户名。如果我打开文件上的“安全”选项卡,我可能会在一瞬间看到数字,直到 Windows 能够查询 Active Directory 控制器并为这些数字提供方便的用户名。最终,唯一标识用户的是 SID,而不是用户名。
一种可能的方法(从 Frédéric 的回复中触发)是我可以在 /etc/passwd 上设置一个 inotify/(dnotify gasp! for old kernels) 操作,因为该文件至少会随着本地用户权限的任何更改而更改。问题是如何在 NIS 环境中执行此操作。
在典型的 Unix 安全模型中,您应该只关心 GID/UID 的数值,而不关心人类可读字符串和数值之间的映射。情况似乎如此,您是否仔细考虑过您要完成的工作?也许传递名称或名称/id 元组而不只是传递 id 会更好?