【问题标题】:Right way to implement schedule / cron实施 schedule / cron 的正确方法
【发布时间】:2016-02-02 01:23:43
【问题描述】:

我需要在 Pimcore 中添加批量对象创建。首先我尝试使用 web,但由于 set 的大小,Request 花费了很长时间,并且实际上丢弃了方法。

然后我选择了 cron 来安排以后的工作,但我遇到了其他问题。与其他一些 RAD 应用程序一样,pimcore 会在 /website/var/versions 等文件夹中自动生成一些代码。所以这些文件夹会自动获得网络用户的权限(在我的例子中是 apache 用户)。

但我的 cron 脚本由普通用户运行,该脚本执行 Pimcore API 调用以创建对象/数据,但由于权限不足而无法写入文件夹。现在我可以选择两种选择之一。

  1. 通过 apache 用户运行 cron,出于安全原因,这是绝对不行的。
  2. 授予可写权限( chmod 777 喜欢或使用 chown 将我的用户添加到 apache 组)。但是 pimcore 在从浏览器管理时会不时创建新文件夹。所以这些新文件夹没有 cron 脚本写入的权限(权限最大 755,我得到的新文件夹不足以进行组写入)。

我之前在 google 上搜索过,发现命令 setfacl 用于设置文件夹的默认用户/权限。我就是这样用的。

    `sudo setfacl -Rm u:apache:rwx,d:u:apache:rwx website/var/versions/object` 

但它经常失败,我需要一次又一次地手动授予权限。

现在是否有解决此问题的实用方法?

注意:我目前正在使用 Amazon Linux AMI。但是以后可以改成redhat或者ubuntu,所以最好有通用的linux解决方案。

【问题讨论】:

  • "通过 apache 用户运行 cron,出于安全原因,这是非常不可行的。" - 我很好奇,你认为这是为什么?
  • @chluehr,我们之前已经在一个繁忙的站点上看到了通过 apache cron 进行系统破解的实际示例。这足以让系统管理员禁用 apache cron。
  • 好吧,我明白了,当然——尽管在我看来,这归结为保护要通过 cron 脚本运行的 php 脚本。这样做没有固有的/不可避免的危险。您的里程可能会有所不同:-)
  • @chluehr 实际上运行 cron 作为 apache 本身存在巨大的安全漏洞,因为黑客可以很容易地将他的脚本添加到 apache 用户 cron 中,这在当时只有 web 用户可用。保护 php 脚本不会阻止这一点。只有其他方法可以防止这种情况更新服务器以在服务器安装的软件包(包括 apache/php/mysql)中保留任何新问题
  • 所以问题是漏洞利用,而不是 cron。禁用 cron 只是减轻了使用/效果。我明白了。

标签: php apache cron user-permissions pimcore


【解决方案1】:

Pimcore 已经要求其维护作业 (cron) 在 apache 用户下运行,因此不在 apache 用户下运行您的作业可能不会有太大改善。

但您可能希望采用用于集成时事通讯发送的方法。

参见/pimcore/modules/reports/controllers/NewsletterController.php:194

$cmd = Tool\Console::getPhpCli() . " " . realpath(PIMCORE_PATH . DIRECTORY_SEPARATOR . "cli" . DIRECTORY_SEPARATOR . "send-newsletter.php"). " " . escapeshellarg($letter->getName()) . " " . escapeshellarg(Tool::getHostUrl());
            Tool\Console::execInBackground($cmd, PIMCORE_LOG_DIRECTORY . "/newsletter--" . $letter->getName() . ".log");

以上代码运行 CLI 脚本 /pimcore/cli/send-newsletter.php

使用这种方法不需要 cron,因为作业是作为 CLI 运行的,所以它不会超时(如果您没有为 PHP CLI 明确设置超时)。

【讨论】:

  • 如果这个脚本由 CLI 运行,它仍然应该需要用户,它没有权限在只有 apache 用户权限的版本文件夹上写入,对吗?
  • 不,它将在 Apache 用户下运行,因此它应该具有您需要的所有权限。 PHP 的 shell_exec 命令在当前用户下运行 CLI 脚本 - 因此,如果您从控制器操作运行它,它将由您的 Apache 用户运行。
  • 还是安全问题,Shell功能也被禁用了。
  • Pimcore 在多个地方使用了 shell_exec。 Pimcore\Tool\Console::execInBackground() 实际上是在使用 shell_exec。但是如果你把它关掉了,而你的系统仍然运行良好,那么我只能想到另一种方法,那就是使用类似于 Pimcore 如何在网格视图中执行批处理作业的方法。因此,通过将作业拆分为多个批次,然后使用 AJAX 调用来处理这些批次。 (例如在网格视图中选择几个对象,右键单击并选择删除对象)。
  • 那么使用像 beanstalk 这样的队列系统(开启队列持久性)是你最好的选择:github.com/pda/pheanstalk
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 2012-08-22
  • 2021-11-02
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多