Как создать безопасную и надежную работу cron для запуска PHP-скриптов на моем сайте?

Я создаю сценарий установки PHP для Ubuntu 16.04.3 LTS Server. Сценарий копирует файлы из моего установочного пакета в /var/www/mysite и устанавливает соответствующие разрешения на чтение / запись для учетной записи веб-пользователя Apache по умолчанию, которая является www-data:

setfacl -R -m u:www-data:rX /var/www/mysite
setfacl -R -m u:www-data:rwX /var/www/mysite/storage /var/www/mysite/bootstrap/cache
setfacl -dR -m u:www-data:rwX /var/www/mysite/storage /var/www/mysite/bootstrap/cache

Теперь, как последний шаг моего сценария установки, я должен установить задания cron, которые вызывают команды PHP на моем сайте, например, так:

php /var/www/mysite/artisan notifications:send

Я провел некоторое исследование и нашел несколько вариантов и возможных осложнений, поэтому я не уверен, что было бы наиболее правильным и безошибочным способом создания задания cron в моей ситуации.

Конкретные мысли и вопросы:

  • Похоже, что лучшим местом для установки заданий cron, которые не принадлежат конкретному пользователю, а службам, работающим в фоновом режиме, был бы /etc/cron.d , верно? Это также кажется безопасным выбором для процесса автоматической установки, потому что мне не придется изменять какой-либо существующий файл конфигурации cron из моего сценария установки, а просто добавить новый файл, если он еще не существует.

  • Я не хочу запускать свою работу как root; это может быть не очень хорошая идея для сайтов, верно? Поэтому мне понадобится выделенный пользователь. Сначала я подумал - эй, у меня уже есть пользователь www-data созданный для сервера Apache и со всеми необходимыми разрешениями для моего сайта, так что я мог бы это использовать, верно? Но я читал, что пользователь www-data самом деле не имеет прав на выполнение команд оболочки! Поэтому мне придется изменить права доступа к www-data (что кажется не очень хорошей идеей) или создать новую учетную запись пользователя специально для моих заданий cron, таких как mysite-jobs . Но как мне безопасно проверить существование этого пользователя и, если он не существует, создать пользователя из моего установочного скрипта? И как мне указать его разрешения, чтобы cron мог запускать php /some/command от имени этого пользователя, но сам пользователь не имеет ни /home ни пароля и не может нормально войти?

  • Кроме того, я прочитал, что переменные среды не доступны автоматически для заданий в cron.d , поэтому я должен указать их в моем файле cron. Технически это может выглядеть так, верно?

    SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Я предполагаю, что это может также автоматически решить проблему запуска команд PHP в предыдущем пункте, но я не уверен, что я не даю здесь слишком много разрешений - я не хочу, чтобы пользователь выполнял какую-либо команду оболочки или любая команда из этих каталогов bin и sbin, но только php /some/command . И это также заставляет меня задуматься - если мне нужно будет указать переменные SHELL и PATH для cron, который будет использоваться только для этой работы, то, возможно, все-таки безопасно использовать www-data - эти переменные среды не будут вытекать из задания cron, право? Но я не уверен, будут ли они вообще эффективны для www-data , учитывая, что это "специальный" аккаунт.

  • после того, как я создаю задание cron в /etc/cron.d , будет ли оно немедленно получено cron или мне нужно каким-то образом уведомлять cron о новом (или, возможно, обновленном, когда я обновляю веб-сайте) файле?

Итак, учитывая все вышесказанное, как должно выглядеть окончательное задание cron и как мне указать учетную запись пользователя с минимальными разрешениями для запуска моих команд php?

1 ответ1

2

Не нужно переосмысливать это. Поскольку вы используете Ubuntu, crontab берет идентификатор, под которым запускается задание cron (www-data). На моем сервере (на котором работает форум MyBB) я добавил это в /etc/crontab:

# Run DB backups every morning at 06:00 UTC.
0  6 * * *   www-data /usr/bin/php /var/www/theforum/task.php 4

Не нужно беспокоиться о содержимом PATH если вы указываете полный путь к исполняемому файлу PHP.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .