我开发了一个应用程序,它使用 NTP 来更改网络时间,以同步我的两台计算机。它运行为root
,因为只有后者才允许更改 Linux 上的时间和日期(我猜)。
现在,我想以用户身份运行它。但是,我需要获取时间。
- 在非 root 用户帐户下运行守护程序是一个好习惯吗?
- 我可以给我的申请一个能力例如
CAP_SYS_TIME
? - 它不会引入安全漏洞吗?
- 有没有更好的办法?
答案1
在非 root 用户帐户下运行守护程序是一个好习惯吗?
是的,这很常见。例如,Apache 以 root 身份启动,然后派生新进程:www-数据(默认情况下)。
如前所述,如果您的程序被黑客攻击(例如:代码注入),攻击者将无法获得 root 访问权限,但将仅限于您授予该特定用户的权限。
我应该给出一个“能力”,例如“CAP_SYS_TIME”吗?
这是一个好主意,因为您避免使用设置用户标识,并限制对此特定功能的权限。
我应该使用另一种被认为是“良好实践”的方法吗?
您可以提高安全性,例如:
- 以非特权用户身份运行该服务,无需 shell。
- 使用chroot将用户锁定在其主目录中。
答案2
- 我应该使用另一种被认为是“良好实践”的方法吗?
除非您有强有力的、无可辩驳的理由,否则您应该只使用 GNU/Linux 发行版附带的 NTP 软件包。标准 NTP 守护程序经过数年时间才成熟,并具有复杂的功能,例如减慢或加快系统时钟以使其与网络或 GPS 时钟同步。它是专为同步时钟而设计的,所以很可能是为此目的最好的工具。
ntpd
仍然维持着,从最近的更新来看(截至撰写本文时)。如果您需要更多功能,我建议您直接联系开发人员,相信他们对此的说法。
答案3
如果您有一个程序需要能够执行功能X (例如,操纵时钟),您可以赋予它执行功能的特权/权力X没有什么比给它整罐字母汤更好的了。这被称为最小特权原则。考虑一下,如果您的程序存在错误(普通的编程错误或可利用的安全漏洞)怎么办?如果它以“root”身份运行,它可以删除每个人的文件,或者将它们发送给攻击者。如果程序唯一的事情就是能够做是操纵时钟(以及非特权功能,例如操纵锁定目录中的文件),那么如果程序失控,这就是最糟糕的情况。