我是一名资深的技术专业人士,但我 100% 的工作都是在 Windows 环境中进行的。我对许多技术问题(如用户帐户管理、安全性和软件开发)有相当深入的了解。
在尝试设置 VPS、运行 debian(这是一个个人项目)时,我发现了许多指导文档,它们帮助我设置系统、下载源代码并进行编译。
让我困惑的是,你总是不鼓励以 root 身份运行任何软件。root 似乎只应用于设置用户帐户和权限。但是,如果帐户需要访问系统提供的几乎所有内容,则该帐户将被授予 root 访问权限。
如果某个帐户被授予 root 访问权限,那么该帐户本质上不是 root 吗?如果是这样,为什么我不能保持简单(因为这是一个简单的项目)并从 VPS root 帐户运行所有内容?
我认为这个问题一定有一个很好的答案,但我就是想不出来。永远不要以 root 身份运行软件是一个重要的既定事实,但建议给予重要账户 root 访问权限,这似乎违反直觉。在我看来,这似乎是一个更大的安全问题,因为现在不是只有一个 root 账户,而是有两个(或更多!)账户可能被攻破。
当然,还有另一种可能性——我通过谷歌找到的很多文档都是错误的。如果是这样的话,不幸的是,在非常专业(而且通常表达清晰)的网站上提供的信息量非常大。这很遗憾,也有点令人沮丧。
答案1
我不知道您所说的“授予根访问权限”的真正含义是什么,但授予某人或某物对系统某些方面的管理控制权的通常方法是使用sudo
您可以微调的机制来仅允许用户需要的东西。
对于守护进程/服务,还存在其他方法,例如启动后放弃 root 权限或生成以其他用户身份运行的子进程。
此外,还有其他方法可以实现更好的控制,但它们通常更加复杂且容易出错(例如 SELinux)。这种方法的通用术语是基于角色的访问控制。
答案2
我认为您对以“sudo”身份运行用户和使用 root 运行用户之间的区别感到困惑。程序“sudo”允许计算机上的用户执行超级用户命令。现在,即使在 sudo 中,您也没有以完全 root 访问权限运行用户的帐户,su 或 sudo 中仍然存在限制。此外,我不建议对 Debian 安全实践发表声明,尤其是在提出这样的问题时。
答案3
许多最初需要 root 权限的进程在执行需要提升权限的初始设置任务后,会使用 setuid[1] 来放弃权限[2]。这种方法的优点是允许守护进程/服务在开始时执行需要提升权限的操作,稍后再放弃为非特权用户,这样如果进程发生故障或受到攻击等,暴露的风险就会更小。
例如,Apache 需要绑定到系统上的端口 80。端口 80 是特权端口(小于 1024),需要 root 访问权限。因此,可以通过首先以 root 身份运行 apache、绑定端口和任何其他必要设置,然后使用 setuid 使进程以 webserver 用户身份运行(ubuntu 上的 www-data)来解决此问题。