GLEP 81: 通过专用软件包进行用户和组管理
作者 | Michał Górny <[email protected]>,Michael Orlitzky <[email protected]> |
---|---|
类型 | 标准轨道 |
状态 | 最终 |
版本 | 1.1 |
创建时间 | 2019-05-29 |
最后修改时间 | 2019-12-21 |
发布历史 | 2019-05-29, 2019-07-08, 2019-12-10 |
替换 | 27 |
GLEP 源代码 | glep-0081.rst |
摘要
提出了一种新的用户/组管理方法。专用类别中的常规软件包用于表示和创建用户和组帐户。依赖项用于在常规软件包中请求用户和组,并跟踪它们的用法。
更改
- v1.1
- 为了使 GLEP 成为树形策略,策略部分已从 GLEP 中删除。GLEP 现在纯粹是技术规范。
动机
目前,Gentoo 中的用户管理是临时性的。用户和组是通过在需要它们的软件包中直接调用系统工具来创建的。没有系统的方法来跟踪哪些软件包需要特定的用户或组,以及确定哪些软件包已过时。开发人员必须手动协调多个软件包使用的用户和组属性。
GLEP 27 最初尝试解决这个问题。它于 2004 年发布,但从未达到参考实现状态,并已过时。 [1]
一个好的系统用户和组管理提案应该解决
- 跟踪用户和组的使用情况,并确定哪些用户和组已过时。
- 在不同的软件包之间可靠地共享用户和组。
- 维护在不同系统之间一致的固定 UID/GID。
- 为用户/组属性提供本地覆盖。
- 确保在构建时不会不必要地创建用户和组。
- 提供对集中式帐户管理的支持(例如 LDAP)。
同时,该提案应避免不必要的复杂性,以避免与 GLEP 27 相同的命运。本提案旨在解决这些问题,而无需新的 EAPI 或任何对包管理器的更改。
规范
逻辑结构
在本提案中,系统用户和组由常规软件包表示。这些软件包在逻辑上表示各自用户和组的所有权,并在技术上实现其创建。
用户软件包位于acct-user类别中。每个用户软件包定义了特定用户的属性,并且必须以它创建的用户的名称命名。它必须在构建时和运行时依赖于用户所属的组。
组软件包位于acct-group类别中。每个组软件包定义了特定组的属性,并且必须以它创建的组的名称命名。
所有用户和组软件包都必须定义首选的固定 UID/GID,并且它们在存储库中必须是唯一的。软件包应指示该值是否需要严格执行,或者在用户已存在或请求的 UID/GID 被占用时,另一个 UID/GID 是否可以接受。
需要特定用户或组的软件包使用依赖项来拉取所需的用户/组软件包。如果构建时需要用户,则必须使用构建时依赖项(DEPEND)。如果安装时和/或运行时需要用户,则必须使用运行时依赖项(RDEPEND)。
维护用户/组
用户和组软件包的主要技术功能是创建用户和组。这通过在pkg_preinst阶段调用相应的系统工具来完成。只有在系统上不存在用户/组时才执行此操作。
如果用户或组已经存在,则软件包会执行必要的修改以满足请求的属性。这包括更新用户的 home 目录路径(但不移动目录本身)、shell 和/或组成员资格。但是,不会修改 UID/GID。
软件包不得删除用户/组。当不再需要帐户时,工具必须确保它被锁定以防止访问。相应地,软件包必须能够在重新安装时重新启用用户。
可以提供额外的工具来帮助用户删除组和用户。但是,此类操作需要由系统管理员明确确认。
主目录所有权
如果所讨论的用户使用常规 home 目录(即不是/dev/null),则用户软件包应通过keepdir命令来维护目录。这允许在不再需要时干净地删除 home 目录。如果目录还不存在,包管理器也会应用正确的权限。
请注意,由于用户要到pkg_preinst才创建,因此 home 目录的权限不应早于此时间应用。
原理
满足的目标
通过依赖项跟踪用户/组的使用情况。只要任何已安装的软件包依赖于特定的用户/组软件包,就假定使用了相应的用户/组。如果没有留下需要特定用户/组的软件包,则包管理器会自动修剪软件包,明确表明它不再使用。
每个用户和组都有一个创建它的相应软件包。如果多个软件包需要它,它们将依赖于同一个软件包。这确保所有属性都保存在一个位置,并且不需要同步。
在一个位置拥有所有预定义的用户/组范围,可以维护固定的 UID/GID 定义。本 GLEP 使分配它们成为强制性的。虽然这对现有用户没有强制执行,但它为新安装提供了一种前进的道路。
可以通过本地存储库(通过覆盖相应用户/组 ebuild)轻松实现本地覆盖。该提案还尊重直接的系统管理员修改。
通过正确的依赖项类型,避免在构建时不必要地创建用户/组。虽然在现状下可以实现这一点,但依赖项模型应该对开发人员来说更自然,并减少错误。
用户/组删除
最初的提案尝试在相应的软件包被取消合并时自动删除用户/组。这需要验证是否有任何文件由用户/组拥有,这在 I/O 方面既昂贵又脆弱。
本 GLEP 遵循将过时的用户/组帐户保留下来,同时确保它们被正确锁定。这保证不会留下任何带有过时所有权的文件(例如,在未挂载的文件系统上),并且不会将相同的 UID/GID 重新用于另一个用户/组。
向后兼容性
本 GLEP 保留了与现有用户/组管理方法的向后兼容性。只要过渡期需要,两种方法都可以共存,并且同一个用户/组可以并行由两种方法管理。
但是,某些优势只有在旧方法被逐步淘汰后才能在新的安装上得到可靠保证。这尤其适用于固定 UID/GID。
参考实现
参考实现已以acct-user.eclass和acct-group.eclass的形式提交到 Gentoo 存储库中。已创建初始用户和组软件包以测试该概念。
参考文献
[1] | GLEP 27: Portage 管理 UID/GID (https://gentoolinux.cn/glep/glep-0027.html) |
版权
此作品根据知识共享署名-相同方式共享 4.0 国际许可协议进行许可。要查看此许可证的副本,请访问 https://creativecommons.org/licenses/by-sa/4.0/。