![为什么有些包需要自己的用户才能运行?](https://linux22.com/image/1280198/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%89%E4%BA%9B%E5%8C%85%E9%9C%80%E8%A6%81%E8%87%AA%E5%B7%B1%E7%9A%84%E7%94%A8%E6%88%B7%E6%89%8D%E8%83%BD%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
为什么在 SVN、Apache 和许多其他程序中,管理员必须创建一个新用户才能供服务器使用?
答案1
如果我正确理解了您的问题,您是问为什么必须为 svn 创建一个 svn 用户,为 apache 创建一个 www-data 用户等等。对吗?
原因在于安全性。其中的基本概念称为“隔离”,是一种常见做法。主要的基本思想是,如果每个服务都以自己的用户身份运行,那么如果程序中发现安全漏洞或错误,则该漏洞只能在该用户允许的范围内被利用。
例如,假设有人知道如何入侵 SVN 并删除您的所有文件。(这不是真正的安全漏洞,可能永远不会是,但只是为了论证而假设)...如果您以“root”用户身份运行 SVN 服务,那么理论上的黑客可以开始删除全部您的文件。另一方面,如果 SVN 需要其自己的用户,那么理论上黑客只能删除 SVN 用户拥有的文件。
我希望这能回答您的问题...如果没有,请澄清,我会再试一次。
编辑:回答您的评论...
通常/总是可能的以 root 身份运行任何程序。但通常不建议这样做,除非确实需要。处理此类问题的一种非常常见的方法是以最少的必要权限运行每个程序。这也有助于防止程序中的错误无意中导致其他程序出现问题(安全隔离的另一个原因,我之前没有提到)。
然而,有时一个程序必须以 root 身份运行,因为它无法以其他方式完成需要执行的操作。一些常见任务需要 root 权限,因此不以单独用户身份运行是有理由的:
- 访问系统密码数据库
- 绑定到(监听)特权 TCP 端口(即端口 1-1023)
- 在低层与文件系统或某些硬件设备进行交互
即使在这些(和其他)类别中,也经常有方法可以绕过必须以 root 身份运行。例如,许多网络程序(例如 Apache)将以 root 用户身份启动,然后绑定到端口 80,然后在其余执行过程中将用户更改为 www-data。因此,即使在需要 root 访问权限的特定情况下,也经常会采取措施来绕过该要求,以便进程可以以权限较低的用户身份运行。
答案2
因为这些程序的作者选择使用单独的用户数据库而不是使用系统密码数据库。
有时这样做的一个原因是如果程序需要访问密码的纯文本版本,可能是因为它正在实现需要这样做的网络协议,因为无法访问系统用户的纯文本密码,因为它们仅以散列形式保存。
例如对于 apache 来说就是如此,对于 svn 来说也是如此,当它使用 HTTP 基本身份验证时,因为 HTTP 基本身份验证需要访问纯文本密码。