Wie erstelle ich einen sicheren Cron-Job zum Ausführen von PHP-Skripten meiner Website?
Ich erstelle ein PHP-Installationsskript für Ubuntu 16.04.3 LTS Server. Das Skript kopiert Dateien von meinem Installationspaket /var/www/mysite
und setzt entsprechende Lese- / Schreibberechtigungen für Standard - Apache - Web - Benutzerkonto, das ist 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
Jetzt muss ich als letzten Schritt meines Installationsskripts Cron-Jobs installieren, die PHP-Befehle auf meiner Site aufrufen, z. B. wie folgt:
php /var/www/mysite/artisan notifications:send
Ich habe einige Nachforschungen angestellt und dabei mehrere Optionen und mögliche Komplikationen gefunden. Daher bin ich mir nicht sicher, wie ich in meiner Situation einen Cron-Job am besten und fehlerfreiesten erstellen kann.
Spezifische Gedanken und Fragen:
es scheint, der beste Ort, um Cron-Jobs zu installieren, die nicht einem bestimmten Benutzer, sondern im Hintergrund laufenden Diensten gehören
/etc/cron.d
, oder? Es scheint auch eine sichere Wahl für den automatisierten Installationsprozess zu sein, da ich in meinem Installationsskript keine vorhandene Cron-Konfigurationsdatei ändern, sondern nur eine neue Datei hinzufügen muss, falls diese noch nicht vorhanden ist.Ich möchte meine Jobs nicht als root ausführen. das ist vielleicht keine gute idee für websites, oder? Also brauche ich einen dedizierten Benutzer. Zuerst dachte ich - hey, ich habe bereits einen
www-data
Benutzer für den Apache-Server erstellt und mit allen erforderlichen Berechtigungen für meine Site, also könnte ich das verwenden, oder? Aber ich habe gelesen, dasswww-data
Benutzer tatsächlich keine Berechtigungen zum Ausführen von Shell-Befehlen haben! Ich müsste also die Berechtigungen von ändernwww-data
(was anscheinend keine gute Idee ist) oder ich sollte ein neues Benutzerkonto speziell für meine Cron-Jobs erstellen, wie zmysite-jobs
. Aber wie kann ich die Existenz dieses Benutzers sicher überprüfen und den Benutzer aus meinem Installationsskript erstellen, wenn er nicht existiert? Und wie gebe ich die Berechtigungen an, damit cronphp /some/command
als dieser Benutzer ausgeführt werden kann, der Benutzer selbst jedoch weder ein/home
Kennwort noch ein Kennwort hat und sich normalerweise nicht anmelden kann?Außerdem habe ich gelesen, dass Umgebungsvariablen nicht automatisch für Jobs in verfügbar sind. Daher
cron.d
muss ich sie in meiner Cron-Datei angeben. Technisch könnte es so aussehen, oder?SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Ich vermute, dass dies auch automatisch das Problem des Startens von PHP-Befehlen im vorherigen Punkt behebt, aber ich bin nicht sicher, ob ich hier nicht zu viele Berechtigungen gebe - ich möchte nicht, dass der Benutzer einen Shell-Befehl ausführt oder Jeder Befehl aus diesen Verzeichnissen bin und sbin, aber php /some/command
nur. Und auch deshalb frage ich mich: Wenn ich SHELL- und PATH-Variablen für cron angeben muss, um sie nur für diesen Job zu verwenden, ist es vielleicht doch sicher, www-data
diese Umgebungsvariablen werden nicht aus dem cron-Job herauskommen, oder? Aber ich bin mir nicht sicher, ob sie überhaupt wirksam werden www-data
, da es sich um ein "spezielles" Konto handelt.
- Nachdem ich einen Cron-Job in erstellt habe
/etc/cron.d
, wird er sofort von Cron abgeholt oder muss ich Cron irgendwie über neue (oder möglicherweise aktualisierte) Dateien benachrichtigen, wenn ich Websites aktualisiere?
Wie sollte der endgültige Cron-Job aussehen und wie kann ich ein Benutzerkonto mit minimalen Berechtigungen zum Ausführen meiner PHP-Befehle angeben?
Antworten:
Kein Grund, darüber nachzudenken. Da Sie Ubuntu verwenden, verwendet die crontab die ID, unter der der Cron-Job ausgeführt werden soll (
www-data
). Auf meinem Server (der ein MyBB-Forum betreibt) habe ich Folgendes hinzugefügt/etc/crontab
:Sie müssen sich keine Gedanken über den
PATH
Inhalt machen, wenn Sie einen vollständigen Pfad zur ausführbaren PHP-Datei angeben.quelle
/etc/crontab
direkt vorzunehmen, da das Aktualisieren und Zusammenführen mit automatischen Tools möglicherweise nicht sicher ist. Siehe den Kommentar von kasperd unter dieser Antwort: serverfault.com/a/801261/87638, daher habe ich diecron.d
Option ausgewählt, in der ich eine Datei ablegen kann , bei der sicher ist, dass Einträge nur von meinem Installationsskript erstellt werden. Aber danke für den direkten/usr/bin/php
Teil - ich denke, bei direkter PHP-Ausführungwww-data
werden keine PATH- oder SHELL-Einstellungen benötigt, oder?