应用程序按用户生成数据。每个用户都有一个唯一的用户 ID 和关联的唯一文件权限。用户文件存储在各个目录中,每个目录具有关联的用户权限。
要求是通过门户提供对用户文件的安全个人用户访问,假设 PHP。正在考虑的设计是模仿门户网站环境中的目录结构和权限。如果可以以用户身份运行 PHP,则可以使用系统权限访问安全性。(这会将安全实现的范围限制在登录过程而不是应用程序。
问:是否可以以用户身份运行 PHP 并承担用户文件权限?
研究已经发现了一些类似的问题,但不是作为个人用户运行PHP的直接问题。
有一些解决方案,从最好到最差:
- 使用 FPM 之类的内容来配置配置为以每个用户身份运行的单独进程池。
- 只有当你的用户数量很少,固定数量时,才会成为配置/管理员的噩梦。
- 基本上是共享主机。
- 完全停止依赖操作系统级别的用户和权限强制实施,并将其构建到您的应用中。
- 在 PHP 中创建您自己的权限强制抽象层。
- 基本上是#2,但没有第一部分,这实际上使它更加复杂。
- 使用
posix_seteuid()
和posix_setegid()
更改正在运行的进程的有效 UID 和 GID。
"等等!"我听到你说,"最后一个选择似乎正是我所需要的!为什么是最糟糕的?
因为为了更改进程的 UID 或 GID,该进程必须首先以允许执行此类操作的用户身份运行。该用户是根用户。
以根用户身份运行PHP,即使是为了下降到不同的UID/GID,也是一个巨大的安全漏洞。即使是最小的错误或缺陷现在也结束了,如果你正在编写文件管理器,这要成倍增加。
">没关系,"你反驳道,"这只供受信任的用户内部使用,所以我不担心安全性。
不,不好。[用卷起的报纸狠狠地砸你]
从不。信任。用户。
充其量,他们永远不会故意破坏或损害您的应用程序,但是:
- 这种观点充其量是幼稚的。
- 宇宙不断制造新的和创新形式的白痴。
- 聪明、善意的白痴喜欢找到"解决方法",这样他们就不必打扰你。
- 遭到入侵的客户端计算机是一种威胁。
- 假设您的内部网络没有受到损害,也永远不会受到损害是一个错误。[见#4]
- 安全审计员会把你钉在十字架上。
这样的例子不胜枚举。
TL;DR:除非您要设置每用户虚拟主机/站点/应用程序。将文件存储在文档根之外,并使用选项 #2 通过 PHP 进行门控访问。如果有人发现你以root身份运行PHP,你会过得很糟糕。