我的公司提供网络托管服务,供人们注册。注册过程完成后,我们会手动进入并为该客户创建一个测试/开发环境。一般来说,这个过程如下:
- 创建 Linux 用户,切换到该用户
- 运行脚本将模板化的文件和目录集安装到其主目录中
- 创建一个 Apache .conf 文件
- 重启 Apache
- 发送电子邮件告知他们服务器已设置并可供访问
- 最后,客户可以访问他们的网站
somerandomstring.devserver.com
尽管我们使用脚本来执行此操作,但由于数量众多,现在必须手动登录并运行脚本,这很不方便。因此,我们希望自动化此过程,在客户注册过程完成后立即触发。
我想到了几种方法来解决这个问题。
1) 为用户提供adduser
能力并使用 PHPexec()
函数创建该用户。我必须为用户提供这种能力www-data
,对吧?在安全模式下运行 PHP 时,exec() 的命令仅限于指定目录。因此,如果我将 /usr/sbin/adduser 复制到 /my/custom/dir(其中只有该命令可用),那么会存在哪些挥之不去的安全问题?我仍然不知道如何使用新网站更新 sites-available 文件夹,因为这些文件夹归 root 所有。
2) 让 cron 执行此操作:用户必须注册该服务,因此默认情况下,他们有一个用户名和其他存储在 mysql 中的客户端数据。从具有adduser
功能的帐户,让 cron 运行例行脚本来检查新帐户(可能每 30 到 60 秒一次)。如果找到,则为他们创建一个 Linux 帐户,填充主目录,编写 apache conf 虚拟主机文件,然后重新加载 apache。
选项 2 似乎是最安全的方式,因为一个独立的管理员帐户可以处理这个问题,而不需要 www 数据或网站执行系统脚本和程序。问题在于批处理。最好,我想找到一个选项 1 解决方案,以便客户立即注册,并将其重定向到他们已安装并随时可用的服务器实例。我也不喜欢必须重新加载/重新启动 apache。
公司每天都在这样做,尤其是网络托管公司。例如,Bluehost,一旦您完成注册过程,您就可以立即访问 /home/user/public_html 并与之交互。由于存在商业解决方案,我相信已经有很多想法来考虑如何安全地实现这一点。我试图实现的是相同的,只是规模要小得多。
答案1
⚠
WARNING
⚠
这是一个固有的安全风险,并且具有很多随时都有可能出现问题。我强烈建议不要采用这种设置,但没关系。
我不对您按照本文所述内容所导致的任何事情负责,也不建议您遵循此系统。本文主要是为了教育/研究目的。
Linux 有一个叫做setuid
允许任何给定程序(如sudo
)以高于当前执行用户的权限运行。您可以编写一个 shell 脚本来完成您需要的一切。
从那里开始,因为 shell 脚本不能setuid
,所以你需要将其转换为二进制文件。你可以使用类似shc
为了这。
一旦你的 shell 伪二进制文件(示例名称:)bootstrap_user
包含你需要的一切,你就可以做一些有趣的修改来准备它。即:
将其设置为
root
、 和 组 的所有者www-data
。chown root:www-data ./bootstrap_user
为所有者 (root) 分配 RWX 权限,为组分配读取和执行权限,其他任何人都无权:
chmod 750 ./bootstrap_user
将二进制文件移动到 PHP 可以访问的地方
exec()
。最后,添加
setuid
位,以便它以 root 身份执行:chmod u+s ./bootstrap_user
在 PHP 中,您现在可以将其bootstrap_user
作为可执行文件调用,并传递任何所需的参数。请务必小心转义和清理输入。
答案2
我认为我会对任何允许浏览器用户自动生成 Unix 用户的功能保持警惕。如果您这样做了,它可能应该同时包含排队机制以及日志或数据库,以免发生以下情况:
- 用户按下按钮即可实现
- 您的流程开始了
- 用户按 F5 或单击重新加载按钮
- 用户稍后按下 Backspace 键来备份其历史记录中的页面
- 用户在该页面上创建书签并多次重新访问
那么当用户重新启动已经完成或仍在发生的事情时会发生什么?