Wie erstelle ich einen Cron-Job für eine Website richtig?

0

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/mysiteund 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-dataBenutzer 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, dass www-dataBenutzer tatsächlich keine Berechtigungen zum Ausführen von Shell-Befehlen haben! Ich müsste also die Berechtigungen von ändern www-data(was anscheinend keine gute Idee ist) oder ich sollte ein neues Benutzerkonto speziell für meine Cron-Jobs erstellen, wie z mysite-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 cron php /some/commandals dieser Benutzer ausgeführt werden kann, der Benutzer selbst jedoch weder ein /homeKennwort 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.dmuss 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/commandnur. 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-datadiese 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?

JustAMartin
quelle
Müssen Sie dies als einmalige oder von Zeit zu Zeit ausführen?
Geselle Geek
Das Installationsskript wird mehrmals ausgeführt, um Aktualisierungen bereitzustellen. Dies bedeutet, dass in neuen Versionen meiner Website möglicherweise neue Cron-Jobs hinzugefügt werden.
JustAMartin

Antworten:

2

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:

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

Sie müssen sich keine Gedanken über den PATHInhalt machen, wenn Sie einen vollständigen Pfad zur ausführbaren PHP-Datei angeben.

Magnet
quelle
Ich habe gelesen, dass es keine gute Idee ist, Änderungen /etc/crontabdirekt 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 die cron.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/phpTeil - ich denke, bei direkter PHP-Ausführung www-datawerden keine PATH- oder SHELL-Einstellungen benötigt, oder?
JustAMartin