假设您可以在系统上安装某些内容,因为您有权sudo
这样做,但只有sudo
安装程序的权限。在这种情况下,创建一个包来安装 root 拥有的二进制文件是相当容易的,该二进制文件具有设置用户ID位在安装期间设置,并执行该二进制文件任何命令你以root身份喂它。这使得允许任何给定用户对可以任意更改更改权限的包进行有限的 sudo 访问变得不安全。另一个明显的(IMO)安全漏洞是软件包可以更新文件/etc/sudoers
并授予用户所有类型的附加权限。
据我所知,apt-get
也没有yum
可以设置或检查它们如何调用的选项,这会导致安装在正常的默认位置,但以有限的方式(例如,不覆盖已经可用的文件,或不设置setuid 位)。
我错过了什么吗?是否存在具有此类限制的安装?它在其他安装程序中可用吗?或者是否有其他已知的解决方法会使此类限制无效(并且实施它们会浪费时间)?
答案1
这可能通过 SELinux 策略是可行的(如果没有 SELinux 或其他可以限制 root 的安全模块,这可能是不可能的),但这是没有意义的。
正如您所注意到的,一个包可以声明它安装了/etc/sudoers
.即使您制定临时规则以某种方式阻止这种情况,程序包也可能会在/etc/sudoers.d
.或者它可以在 中放置一个文件/etc/profile.d
,以便下次任何用户登录时读取。或者它可以添加一个在引导时由 root 启动的服务。这样的例子不胜枚举。这是难以管理的,即使您发现了有问题的情况,您也会阻止安装如此多的软件包,以至于您可能不会打扰(例如,该设施不允许大多数安全更新)。该软件包可以做的另一件事是安装一个程序,您稍后会被诱骗使用该程序(例如,如果您完全禁止写入访问/bin
,它可以安装/usr/local/bin/ls
),并且在您下次调用该程序时,该程序会通过您的帐户注入后门程序。为了防止软件包安装注入潜在的安全漏洞,您需要将安装限制为受信任的软件包,或者确保您永远不会使用已安装的软件包。
基本上,如果您不信任用户,则不能让他们在您的系统上安装任意软件包。如果他们需要发行版中没有的东西,让他们在他们的主目录中安装软件。
如果您想让不受信任的用户能够安装更多软件包(来自您批准为安全的预定义源列表)或升级主系统上的现有软件包,这可能是安全的,但您需要采取预防措施,特别是禁用安装过程中的交互。看为我的 ssh 用户提供“apt-get update”和“apt-get update”的无密码 sudo 是否安全?关于 的一些想法apt-get upgrade
。
在最新的Linux版本(内核≥3.8)下,任何用户都可以启动用户命名空间其中他们的用户 ID 为 0。这基本上允许用户在自己的目录中安装自己的发行版。
答案2
如果用户可以创建任何包并将其上传到安装程序信任的存储库,我不知道有什么方法可以按照您正在寻找的方式保护系统(至少不是apt-get
)。包中的维护者脚本运行root
(无论是在系统apt
还是类型系统yum
上dnf
),因此安装包可以有效地让包的作者root
访问该系统。
也许使用 SELinux 之类的东西,您可以制定一项策略,为用户提供足够的访问权限来在某些地方安装软件包,但不会造成任何损害(例如不接触/etc/sudoers
、/sbin
等/usr/sbin
,当然还有包管理器的配置),但我怀疑你能抓住一切。 (我对 SELinux 的了解还不够确定。)
如果您可以控制进入存储库的内容,那么就可以了。如果任何人都可以将任何内容上传到存储库,那么要求签名实际上不会对您有多大帮助,至少是这样:apt-get
不匹配的签名只会导致警告和提示,这些警告和提示可以被覆盖,而且我不认为有一种配置方法apt-get
它不允许覆盖。