对系统文件 (/etc/aliases) 的安全写访问

对系统文件 (/etc/aliases) 的安全写访问

我正在编写一个程序(使用 Python),需要修改系统文件,在本例中为 /etc/aliases。该软件是一个 Web 应用程序,通常在专用 Web 用户(即“www”、“www-data”、“apache”或类似用户)下运行。

我应该如何设置访问控制(文件权限、文件所有权和组)以使程序能够修改 /etc/aliases 而不会过多地打开权限?

答案1

最简单的方法是让/etc/aliases网络用户拥有所有权。有几种方法可以使其更安全;这取决于您担心什么威胁以及您准备增加多少复杂性来缓解这些威胁。

如果应用程序仅应修改某些别名,您可能能够设置 MTA 以读取多个别名文件,并仅使其中一个文件可由应用程序写入。我认为这不会为您提供太多安全性来防止应用程序中的安全漏洞:如果攻击者添加了从webmaster到 的重定向[email protected],则将其添加到哪个文件并不重要。但这与审查机制结合使用可能会很有用。

如果您想要检查或审计应用程序正在做什么,请不要授予它对 的写权限/etc/aliases。而是让它在某处写入一个临时文件,然后调用一个特权程序来验证此文件并将数据合并到其中/etc/aliases(或如上所述的专用文件)。特权程序(我们称之为merge-myapp-aliases)应该可由 Web 用户执行,并将 gid 设置为专用组。也就是说,merge-myapp-aliases应该由 拥有root:myapp-aliases并且模式为 2755(rwxr-sr-x)。使用组而不是用户的原因是,即使可执行文件中存在安全漏洞,攻击者也无法修改可执行文件来注入木马。 的工作merge-myapp-aliases是验证其输入的内容(例如检查它没有为系统用户设置别名)、记录其操作并用新版本替换别名文件。

为了提高稳定性,专用别名文件应位于具有组写入权限的专用目录中。让程序写入新文件 ( /etc/aliases.myapp/new),然后自动将其移动到位 ( mv /etc/aliases.myapp/new /etc/aliases.myapp/current)。这样,如果程序因某种原因中途终止,您就不会得到不完整的文件。

另一种将更改落实到位的方法,其优点是自动留下完整的审计线索,即让 CGI 将文件提交到修订控制系统,并触发另一个程序检查最新修订。大多数修订控制系统都有验证提交的方法。

如果要将别名文件限制到此特定应用程序,则必须以某种方式以提升的权限运行该应用程序。如上所述,您可以将其设置为专用组的 gid。

答案2

你没有说你使用的是什么 MTS。但这些信息非常重要。 /etc/aliases被认为是Sendmail 兼容机制一些 MTS 软件已经实现了此功能,这些软件的原生别名机制更强大,并解决了您在此处遇到的安全问题。例如:

  • 在 qmail 中fastforward附加组件通过将其插入 qmail 的本地别名系统来处理/etc/aliases。本地别名系统,.qmail文件,允许任何本地用户[email protected]拥有每个用户该用户主目录中的文件定义的一组别名。用户不需要访问全局 root 拥有的文件,并且的别名文件无法更改和的映射。fred-something@example.com.qmail-somethingfredjim-something@example.comsheila-something@example.com
  • 在 Postfix 中可以打开选项recipient_delimiter获得类似的机制,其别名由该用户主目录中的文件 定义。fred+something@example.com.forward+something
  • 在进出口方面,选项local_part_suffix可以打开,并且每当对发往 的邮件运行过滤器时$local_part_suffix都会设置为。-something~fred/.forwardfred-something@example.com

所有这些的结果是,如果你的 MTS 是 qmail、Postfix 或 exim,你的 WWW 应用程序只需要一个没有特权的人本地用户帐户即可控制整个邮箱集,无需访问系统范围的别名数据库或任何 set-UID/set-GID 恶作剧。对于许多任务(例如,运行需要名为list-subscribelist-ownerlist-unsubscribelist-handle-bounce-from-mandy-example.net-of-message-437等的邮箱的邮件列表)来说,这已经足够了。

根据您的应用程序,它也可能对您足够了。

相关内容