Как создать безопасную и надежную работу 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?