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