⚠WARNING⚠

⚠WARNING⚠

我的公司提供网络托管服务,供人们注册。注册过程完成后,我们会手动进入并为该客户创建一个测试/开发环境。一般来说,这个过程如下:

  1. 创建 Linux 用户,切换到该用户
  2. 运行脚本将模板化的文件和目录集安装到其主目录中
  3. 创建一个 Apache .conf 文件
  4. 重启 Apache
  5. 发送电子邮件告知他们服务器已设置并可供访问
  6. 最后,客户可以访问他们的网站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包含你需要的一切,你就可以做一些有趣的修改来准备它。即:

  1. 将其设置为root、 和 组 的所有者www-data

     chown root:www-data ./bootstrap_user
    
  2. 为所有者 (root) 分配 RWX 权限,为组分配读取和执行权限,其他任何人都无权:

     chmod 750 ./bootstrap_user
    
  3. 将二进制文件移动到 PHP 可以访问的地方exec()

  4. 最后,添加setuid位,以便它以 root 身份执行:

     chmod u+s ./bootstrap_user
    

在 PHP 中,您现在可以将其bootstrap_user作为可执行文件调用,并传递任何所需的参数。请务必小心转义和清理输入。

答案2

我认为我会对任何允许浏览器用户自动生成 Unix 用户的功能保持警惕。如果您这样做了,它可能应该同时包含排队机制以及日志或数据库,以免发生以下情况:

  1. 用户按下按钮即可实现
  2. 您的流程开始了
  3. 用户按 F5 或单击重新加载按钮
  4. 用户稍后按下 Backspace 键来备份其历史记录中的页面
  5. 用户在该页面上创建书签并多次重新访问

那么当用户重新启动已经完成或仍在发生的事情时会发生什么?

相关内容