Debian 软件包应该如何创建用户帐户?

Vi.*_*Vi. 43 debian package-management

该软件包qqq.deb安装qqq应从uqqq用户帐户运行的程序。该包由qqq程序、qqq.conf配置文件和/etc/init.d/qqqinitscript 组成。

包应该如何管理用户的创建uqqq?是否有任何最佳实践或官方指南?

  1. 只需uqqq在 postinst 中自动创建用户;
  2. 首次从/etc/init.d/qqq脚本启动时自动创建用户;
  3. qqq程序第一次启动时自动创建用户(不带参数)
  4. 不要创建任何用户帐户,除非管理员明确创建了用户(例如,使用qqq --create-user),否则拒绝启动;
  5. 不要创建任何用户帐户,默认从 root 运行不安全;
  6. 在 postinst、init.d 脚本或qqq自身中交互询问是否创建用户。

卸载时,软件包是否应该删除用户帐户?

小智 29

Debian wiki 有一些比已经提到的 Debian Policy Manual 更全面和更具体的指南。请参阅AccountHandlingInMaintainerScripts

如果使用 --system 选项调用 adduser 程序会做正确的事情。因此通常只需要调用

adduser --system $USERNAME

在您的 postinst 中创建一个禁用登录的帐户,一个主要组 nogroup 和一个 /home 下的主目录。如果您需要其他选项,请根据需要添加它们。

通常不需要与 getent 交叉检查帐户是否已经存在,因为 adduser --system 通常会做正确的事情。如果没有,请报告针对 adduser 的错误,以保持您的维护者脚本简单。

它提供的关于删除帐户的建议是不确定的。但是,我会注意到,对于 Fedora相应建议并不含糊。

不要删除用户或组 我们从不删除由包创建的用户或组。没有理智的方法来检查这些用户/组拥有的文件是否被遗留下来(即使有,我们会用它们做什么?)并且留下那些指向现在不存在的用户/组的所有权可能会导致安全问题当稍后创建语义无关的用户/组并重用 UID/GID 时。此外,在某些设置中,删除用户/组可能是不可能的或/或不可取的(例如,当使用共享的远程用户/组数据库时)。未使用的用户/组的清理留给系统管理员处理,如果他们愿意的话。


Der*_*rfK 15

作为安装软件包的管理员,我希望我的软件包能够在 pre 或 postinst 中自动创建他们需要的用户,以便在程序运行之前创建用户所需的任何文件。

您的程序应该只在需要时以 root 身份运行(例如绑定到特权端口),并且理想情况下应该在完成需要 root 用户的操作后放弃其特权。

您可以通过使用查看其他(已安装的)软件包如何处理此问题

grep -l adduser /var/lib/dpkg/info/*postinst /var/lib/dpkg/info/*preinst
Run Code Online (Sandbox Code Playgroud)

并阅读列出的文件(大多数需要多于一行的选项)。

奇怪的是,除了我安装的用于创建用户的软件包之一之外,所有其他软件包都adduser用于添加用户,但 adduser 软件包不是必需的软件包,因此您的软件包必须构建为依赖于它。该useradd程序由 libuuid1 包使用,并且是passwd必需包的包的一部分。

  • 这太糟糕了,检查生成 preinst 脚本的正确方法,而不是手动修改脚本。 (2认同)

小智 9

10.9Debian 政策手册中的权限和所有者具有您正在寻找的内容(来自“版本 3.9.5.0,2013-10-28”):

如果您需要为您的包创建新用户或组,有两种可能性。首先,您可能需要使二进制包中的某些文件归该用户或组所有,或者您可能需要将用户或组 ID(而不仅仅是名称)编译到二进制文件中(尽管后者应该避免,如果可能,因为在这种情况下,您需要一个静态分配的 ID)。

如果您需要静态分配的 id,您必须从base-passwd' maintainer, and must not release the package until you have been allocated one. Once you have been allocated one you must either make the package depend on a version of thebase-passwd' 包中请求一个用户或组 id ,该 id 存在于/etc/passwd' or /etc/group' 中,或者安排您的包使用正确的用户或组创建用户或组本身id(如果可能,最好使用adduser') in itspreinst' 或 postinst'. (Doing it in thepostinst',否则`adduser' 包将需要预先依赖。)

注:在debian-devel的名单是相当活跃和答案这样的问题(虽然这例子是2003年)。

  • 因此,简短的简化答案是“在 `postinst` 中使用 `adduser`”。 (3认同)