Sicheres Cron PHP
In diesem Thema wird beschrieben, wie Sie pub/cron.php
sichern, um zu verhindern, dass sie bei einem böswilligen Exploit verwendet wird. Wenn Sie Cron nicht schützen, kann jeder Benutzer Cron ausführen, um Ihre Commerce-Anwendung anzugreifen.
Der Cron-Auftrag führt mehrere geplante Aufgaben aus und ist ein wichtiger Teil Ihrer Commerce-Konfiguration. Geplante Aufgaben umfassen unter anderem:
- Neuindizierung
- E-Mails generieren
- Generieren von Newslettern
- Erstellen von Sitemaps
Sie können einen Cron-Auftrag wie folgt ausführen:
- Verwenden des
magento cron:run
-Befehls entweder über die Befehlszeile oder in einer crontab - Zugreifen auf
pub/cron.php?[group=<name>]
in einem Webbrowser
magento cron:run
-Befehl zum Ausführen von cron verwenden, da ein anderer Prozess verwendet wird, der bereits sicher ist.Cron mit Apache sichern
In diesem Abschnitt wird beschrieben, wie Sie Cron mithilfe der HTTP-Standardauthentifizierung mit Apache schützen. Diese Anweisungen basieren auf Apache 2.2 mit CentOS 6. Weitere Informationen finden Sie in einer der folgenden Ressourcen:
Erstellen einer Kennwortdatei
Aus Sicherheitsgründen können Sie die Kennwortdatei an einer beliebigen Stelle außer dem Stammordner des Webservers finden. In diesem Beispiel speichern wir die Kennwortdatei in einem neuen Verzeichnis.
Geben Sie die folgenden Befehle als Benutzer mit root
Berechtigungen ein:
mkdir -p /usr/local/apache/password
htpasswd -c /usr/local/apache/password/passwords <username>
Dabei kann <username>
der Webserver-Benutzer oder ein anderer Benutzer sein. In diesem Beispiel verwenden wir den Webserver-Benutzer, aber die Auswahl des Benutzers liegt bei Ihnen.
Befolgen Sie die Anweisungen auf Ihrem Bildschirm, um ein Kennwort für den Benutzer zu erstellen.
Um einen weiteren Benutzer zu Ihrer Kennwortdatei hinzuzufügen, geben Sie den folgenden Befehl als Benutzer mit root
Berechtigungen ein:
htpasswd /usr/local/apache/password/passwords <username>
Benutzer hinzufügen, um eine autorisierte Cron-Gruppe zu erstellen (optional)
Sie können die Ausführung von Cron durch mehr als einen Benutzer ermöglichen, indem Sie diese Benutzer zu Ihrer Kennwortdatei hinzufügen, einschließlich einer Gruppendatei.
So fügen Sie einen weiteren Benutzer zu Ihrer Kennwortdatei hinzu:
htpasswd /usr/local/apache/password/passwords <username>
Um eine autorisierte Gruppe zu erstellen, erstellen Sie eine Gruppendatei an einer beliebigen Stelle außerhalb des Stammverzeichnisses des Webservers. Die Gruppendatei gibt den Namen der Gruppe und der Benutzenden in der Gruppe an. In diesem Beispiel lautet der Gruppenname MagentoCronGroup
.
vim /usr/local/apache/password/group
Inhalt der Datei:
MagentoCronGroup: <username1> ... <usernameN>
Cron in .htaccess
sichern
So sichern Sie Cron in .htaccess
Datei:
-
Melden Sie sich bei Ihrem Commerce-Server als Dateisystembesitzer an oder wechseln Sie zu diesem.
-
Öffnen Sie
<magento_root>/pub/.htaccess
in einem Texteditor.(Da sich
cron.php
impub
-Verzeichnis befindet, bearbeiten Sie nur diesen.htaccess
.) -
Cron-Zugriff für einen oder mehrere Benutzer. Ersetzen Sie die bestehende
<Files cron.php>
durch Folgendes:code language-conf <Files cron.php> AuthType Basic AuthName "Cron Authentication" AuthUserFile /usr/local/apache/password/passwords Require valid-user </Files>
-
Cron-Zugriff für eine Gruppe. Ersetzen Sie die bestehende
<Files cron.php>
durch Folgendes:code language-conf <Files cron.php> AuthType Basic AuthName "Cron Authentication" AuthUserFile /usr/local/apache/password/passwords AuthGroupFile <path to optional group file> Require group <name> </Files>
-
Speichern Sie Ihre Änderungen in
.htaccess
und beenden Sie den Texteditor. -
Fahren Sie fort mit Überprüfen Sie, ob Cron sicher ist.
Cron mit Nginx sichern
In diesem Abschnitt wird beschrieben, wie Sie Cron mit dem Nginx-Webserver sichern. Sie müssen die folgenden Aufgaben ausführen:
- Einrichten einer verschlüsselten Kennwortdatei für Nginx
- Ändern Sie Ihre Nginx-Konfiguration, um auf die Kennwortdatei beim Zugriff auf
pub/cron.php
zu verweisen.
Erstellen einer Kennwortdatei
Konsultieren Sie eine der folgenden Ressourcen, um eine Kennwortdatei zu erstellen, bevor Sie fortfahren:
Cron in nginx.conf.sample
sichern
Commerce bietet standardmäßig eine optimierte Beispiel-Nginx-Konfigurationsdatei. Es wird empfohlen, sie zu ändern, um Cron zu schützen.
-
Fügen Sie der
nginx.conf.sample
-Datei Folgendes hinzu:code language-conf #Securing cron location ~ cron\.php$ { auth_basic "Cron Authentication"; auth_basic_user_file /etc/nginx/.htpasswd; try_files $uri =404; fastcgi_pass fastcgi_backend; fastcgi_buffers 1024 4k; fastcgi_read_timeout 600s; fastcgi_connect_timeout 600s; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
1.nginx neu starten:
systemctl restart nginx
- Fahren Sie fort mit Überprüfen Sie, ob Cron sicher ist.
Überprüfen, ob Cron sicher ist
Die einfachste Möglichkeit, sicherzustellen, dass pub/cron.php
sicher ist, besteht darin, sicherzustellen, dass nach der Einrichtung der Kennwortauthentifizierung Zeilen in der cron_schedule
Datenbanktabelle erstellt werden. In diesem Beispiel werden SQL-Befehle verwendet, um die Datenbank zu überprüfen. Sie können jedoch jedes beliebige Tool verwenden.
default
Cron, das Sie in diesem Beispiel ausführen, wird gemäß dem in crontab.xml
definierten Zeitplan ausgeführt. Ein Cron-Job läuft nur einmal am Tag. Wenn Sie cron zum ersten Mal über den Browser ausführen, wird die cron_schedule
aktualisiert, nachfolgende pub/cron.php
-Anfragen werden jedoch nach dem konfigurierten Zeitplan ausgeführt.So überprüfen Sie, ob Cron sicher ist:
-
Melden Sie sich bei der -Datenbank als Commerce-Datenbankbenutzer oder als
root
an.Beispiel:
code language-bash mysql -u magento -p
-
Verwenden der Commerce-Datenbank:
code language-shell use <database-name>;
Beispiel:
code language-shell use magento;
-
Löschen Sie alle Zeilen aus der
cron_schedule
Datenbanktabelle:code language-shell TRUNCATE TABLE cron_schedule;
-
Cron von einem Browser aus ausführen:
code language-shell http[s]://<Commerce hostname or ip>/cron.php?group=default
Beispiel:
code language-shell http://magento.example.com/cron.php?group=default
-
Geben Sie bei Aufforderung den Namen und das Kennwort eines autorisierten Benutzers ein. Die folgende Abbildung zeigt ein Beispiel.
-
Stellen Sie sicher, dass der Tabelle Zeilen hinzugefügt wurden:
code language-shell SELECT * from cron_schedule; mysql> SELECT * from cron_schedule; +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ | schedule_id | job_code | status | messages | created_at | scheduled_at | executed_at | finished_at | +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ | 1 | catalog_product_outdated_price_values_cleanup | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 2 | sales_grid_order_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 3 | sales_grid_order_invoice_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 4 | sales_grid_order_shipment_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 5 | sales_grid_order_creditmemo_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 6 | sales_send_order_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 7 | sales_send_order_invoice_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 8 | sales_send_order_shipment_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 9 | sales_send_order_creditmemo_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 10 | newsletter_send_all | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:25:00 | NULL | NULL | | 11 | captcha_delete_old_attempts | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:30:00 | NULL | NULL | | 12 | captcha_delete_expired_images | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:30:00 | NULL | NULL | | 13 | outdated_authentication_failures_cleanup | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 14 | magento_newrelicreporting_cron | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ 14 rows in set (0.00 sec)
Cron von einem Webbrowser aus ausführen
Sie können Cron jederzeit ausführen, z. B. während der Entwicklung, mithilfe eines Webbrowsers.
Wenn Sie einen Apache-Webserver verwenden, müssen Sie die Einschränkung aus der .htaccess
-Datei entfernen, bevor Sie Cron in einem Browser ausführen können:
-
Melden Sie sich bei Ihrem Commerce-Server als Benutzer an, der über die Berechtigung zum Schreiben in das Commerce-Dateisystem verfügt.
-
Öffnen Sie eine der folgenden Aktionen in einem Texteditor (je nach Einstiegspunkt zum Magento):
code language-text <magento_root>/pub/.htaccess <magento_root>/.htaccess
-
Folgendes löschen oder auskommentieren:
code language-conf ## Deny access to cron.php <Files cron.php> order allow,deny deny from all </Files>
Beispiel:
code language-conf ## Deny access to cron.php #<Files cron.php> # order allow,deny # deny from all #</Files>
-
Speichern Sie Ihre Änderungen und beenden Sie den Texteditor.
Sie können dann cron in einem Webbrowser wie folgt ausführen:
code language-text <your hostname or IP>/<Commerce root>/pub/cron.php[?group=<group name>]
Dabei gilt:
-
<your hostname or IP>
ist der Hostname oder die IP-Adresse Ihrer Commerce-Installation -
<Commerce root>
ist der Webserver-Basisordner, in dem Sie die Commerce-Software installiert habenDie genaue URL, die Sie zum Ausführen der Commerce-Anwendung verwenden, hängt davon ab, wie Sie Ihren Webserver und virtuellen Host konfiguriert haben.
-
<group name>
ist ein beliebiger gültiger Cron-Gruppenname (optional)
Beispiel:
https://magento.example.com/magento2/pub/cron.php?group=index