大型安装环境中使用rpm和yum进行应用程序安装

大型安装环境中使用rpm和yum进行应用程序安装

我们非常庞大的组织已经制定了应用程序托管标准,该标准规定应用程序及其所依赖的所有组件必须驻留在与操作系统本身不同的专用应用程序卷中。例如,如果应用程序是用 Perl 编写的,我们要求在应用程序卷中维护一个单独的 Perl 实例。

这样做的原因是,操作系统和应用程序所依赖的组件可能存在版本冲突,而且经常存在版本冲突,而强制应用程序维护自己的资源可以更轻松地修补操作系统。此外,它还可以确保应用程序数据和日志不会被塞入基于操作系统的工具所在的位置(例如,这对于 httpd 来说尤其重要)。

此外,除非存在有效且有据可查的技术原因,否则应用程序进程必须以非特权用户身份运行,而不是以 root 身份运行。我们在 Linux 中提供了解决方法,以便 Web 服务器等进程可以以非特权用户身份运行,并接受从特权端口(80 和 443)转发到它们正在监听的非特权端口的连接。

从角度来看,我是公司 Unix/Linux SA 组织的安全专家,我与平台技术支持专家密切合作,以维护和执行我上面列出的标准。我的大部分职责是审查通过 sudo 进行特权访问的请求,这些请求是集中管理的。我们的标准 Linux 是 Red Hat,但 Ubuntu 和 CentOS 也在考虑用于云环境。

问题是,我们目前收到大量来自应用程序团队的请求,要求允许他们(通过 sudo)使用 rpm 和 yum 安装 Linux 应用程序,因为供应商需要这样做,并且无法提供任何其他方法来安装应用程序。这在多个方面与我们的标准相冲突:

  • rpm 和 yum 工具必须以 root 权限运行。这意味着它们所做的一切都以 root 权限运行,因此通常必须在事后调整最终安装,以允许其以非特权用户身份运行。

  • 软件包通常指定组件必须安装在根卷中,而不是安装在指定卷下。在可以指定软件包树的根的情况下,供应商通常坚持保持不变,因为他们只在软件包中指定的精确环境中对其进行了测试。

  • 最后,rpm 和 yum 从系统可用的任何存储库中提取依赖项,尽管我们要求应用程序使用我们的 Satellite 存储库来获取 Red Hat 提供的任何内容,但供应商通常会提供他们自己的存储库,必须将这些存储库包含在内才能使软件正常运行。

我的问题是,在这样的环境中,如何指定或限制 rpm 和 yum 的使用,以确保不会发生软件包冲突并且可以安全地应用系统安全补丁,同时又不完全禁止应用软件使用这些工具(我们到目前为止一直在这样做,但发现这是徒劳的)?

答案1

在我们讨论解决方案之前,先简单介绍一下贵公司的安全标准。简而言之,这些标准很难实施,而且过时得几乎毫无意义。

很明显他们很难合作,所以我就不再多说了。

至于过时,很明显他们没有考虑到虚拟化、Linux 功能、容器、SELinux 等现代技术,所有这些技术都有助于以更优雅的方式解决相同的安全问题并且可用方法。

举例来说,将 httpd 绑定到高端口,然后使用 iptables 将流量重定向到该端口,而不是像默认情况下那样简单地让其绑定然后放弃权限,这近乎偏执,而且几乎没有任何好处。它还使 SELinux 与 httpd 一起使用变得复杂,因为这种设置不是在 httpd SELinux 策略的设计中设想的。

同样,只是盲目地要求软件包自行塞入/opt/usr/local安装不会给您带来任何好处,因为无论软件包安装在何处,RPM 已经保持了您所需的分离(除非软件包损坏,第三方供应商软件包可能就是这种情况,但这种软件包会拒绝安装)并且失去了标准遵从性,可能使相关的 SELinux 策略无法使用,并造成维护噩梦。Red Hat 软件合集是按照这样的思路设计的,虽然存在一些可用性问题,按照此设计构建你自己的包可以作为你在处理实际问题时的权宜之计。

不过,我认为最大的问题是维护一台或多台“大型”服务器,每个人的应用程序都并行运行在这些服务器上。仅这一点就带来了自身的安全问题,这可能是这些“安全做法”的起源。虚拟化目前已经相当成熟,只需将应用程序分离到自己的虚拟机中,例如RHEL 6 或 RHEL 7 上的 KVM, 将要消除需要对于大多数这些“安全措施”

按照这个思路,由于你几乎肯定有大量的申请,使用 OpenStack 创建私有云可能是短期至中期的最佳选择。这些将使用 RHEL 7 主机并运行 RHEL 7、6 甚至 5 个客户机,因为您可能有许多客户机仍在运行。它还将为您提供一个平台,让您可以安全地试验新的应用程序和操作系统,以及更轻松地按业务单位、部门等分配资源。

如果虚拟化对于某些事情来说太过沉重,那么就转向容器(例如RHEL 7 上的 LXC/Docker)。这些容器的重量要轻得多,可以剥离到几乎只剩下应用程序包本身,然后使用它们自己的文件系统、网络和 uid/gid 命名空间进行隔离,从而有效地将它们与任何其他容器隔离开来,除非您恰好在相应的防火墙中打开了任何内容。将 SELinux 添加到 KVM 虚拟机或 Linux 容器中可提供第二层保护,只需单击一下即可打开。

此外,如果您开始向公司提供 OpenStack 和/或 Docker,您的公司将充满开发人员,他们会永远爱您。

简而言之,现在是时候评估现代 Linux 发行版及其提供的功能,并根据这些功能重新评估所有安全实践。

至于许可,Red Hat 现在提供无限虚拟化许可,允许您运行无限的 RHEL VM/容器,当然还有 CentOS,它将在 99.9% 的时间里取代 RHEL。所以这没什么可说的。

答案2

对你的问题最普遍的回答是“否”。在安装过程中,yum/rpm 需要写入根特权文件夹位置

通常,所有二进制包都被编译为在系统级别使用。您可以使用模拟/伪 shell 来创建 chroot 类型的环境并在其主空间内安装软件。

正如马克所提到的,推出自己的 RPM 将是解决当前情况的恰当方法。

有几个参考可以看看

https://unix.stackexchange.com/questions/134181/building-rtmpdump-on-rhel-x86-without-yum-and-no-root-rights http://www.linuxquestions.org/questions/linux-software-2/can-i-run-yum-without-root-privileges-592939/ http://yum.baseurl.org/wiki/RunningWithoutRoot

相关内容