保护对系统文件(/ etc / aliases)的写入权限

我正在编写一个程序(用Python),在这种情况下需要修改系统文件/ etc / aliases。 该软件是通常将在专用networking用户下运行的networking应用程序,即“www”,“www-data”,“apache”或类似的。

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

简单的方法是让Web用户拥有的/etc/aliases 。 有几种方法可以使这个更安全; 这是您所关注的威胁以及您准备添加哪些威胁以减轻威胁的问题。

如果应用程序只能修改一些别名,您可能可以将MTA设置为读取多个别名文件,并且只允许其中一个文件被应用程序写入。 我不认为这会给你带来很高的安全性,如果攻击者从webmaster[email protected]添加一个redirect,那么添加到哪个文件并不重要。 但是这可能与审查机制相结合。

如果您想查看或审核应用程序正在执行的操作,请不要写入/etc/aliases写入权限。 而是让它在某个地方写一个临时文件,然后调用一个特权程序来validation这个文件,并将数据合并到/etc/aliases (或上面build议的专用文件)中。 我们称之为merge-myapp-aliases的特权程序应该可以由网页用户执行,并将其设置为专用组。 也就是说, merge-myapp-aliases应该由root:myapp-aliases和mode 2755( rwxr-sr-x )所有。 使用组而不是用户的原因是即使可执行文件中存在安全漏洞,攻击者也无法修改可执行文件来注入木马。 merge-myapp-aliases是validation其input内容(例如,检查它是否为系统用户设置别名),logging其操作,并用新版本replace别名文件。

对于robustnes,专用别名文件应该位于具有组写入权限的专用目录中。 使程序写入新文件( /etc/aliases.myapp/new ),然后原位移动它( mv /etc/aliases.myapp/new /etc/aliases.myapp/current )。 这样,如果程序因为某种原因中途死亡,你将不会得到一个不完整的文件。

一个替代的方法是将CGI提交给一个版本控制系统,然后为另一个程序提供一个触发器来检查最新版本。 大多数版本控制系统都有validation提交的方法。

如果你想限制别名文件到这个特定的应用程序,你将不得不以某种方式用提升的特权运行应用程序。 如上所述,您可以将其设置为专用组。

你不会说你正在使用什么MTS。 但是这个信息是相当重要的。 /etc/aliases被几个MTS软件视为一个Sendmail兼容性机制 ,其原生别名机制更加强大,并解决了您在这里遇到的非常安全问题。 举些例子:

  • 在qmail中, fastforward插件通过将插件插入到qmail的本地别名系统来处理/etc/aliases 。 本地别名系统.qmail文件允许任何本地用户[email protected]拥有每个用户的一[email protected] ,这些别名由.qmail- something定义的fred- something @example.com定义在该用户的主目录中。 用户不需要访问全局根拥有的文件,并且fred的别名文件无法改变jim- something @example.comsheila- something @example.com映射的sheila- something @example.com
  • 在Postfix中,可以打开recipient_delimiter选项来获得类似的机制,通过.forward+ something在该用户主目录中的.forward+ something文件定义的fred+ something @example.com别名。
  • 在exim中,可以打开local_part_suffix选项 ,并且$local_part_suffix将被设置为- something对于发往fred- something @example.com邮件运行fred- something @example.com ~fred/.forwardfilter。

所有这一切的结果是,如果你的MTS是qmail,Postfix,或者进入你的WWW应用程序,只需要一个非特权的本地用户帐户,以获得对整组邮箱的控制权,而不需要访问系统范围别名数据库或任何set-UID / set-GID shenanighans。 对于许多任务(例如运行邮件列表),需要名为list -subscribelist -owner list -handle-bounce-from-mandy-example.net-of-message-437 list -unsubscribelist -handle-bounce-from-mandy-example.net-of-message-437list -handle-bounce-from-mandy-example.net-of-message-437邮箱等等- 这就够了。

取决于你的应用程序,对你来说也许已经足够了。