Sicheres cron-PHP
In diesem Thema wird das Schützen von pub/cron.php
beschrieben, um zu verhindern, dass es in einer böswilligen Exploit verwendet wird. Wenn Sie Cron nicht schützen, kann jeder Benutzer möglicherweise Cron ausführen, um Ihre Commerce-Anwendung anzugreifen.
Der Cron-Auftrag führt mehrere geplante Aufgaben aus und ist ein wichtiger Bestandteil Ihrer Commerce-Konfiguration. Geplante Aufgaben umfassen unter anderem:
- Neuindizierung
- E-Mails erstellen
- Newsletter erstellen
- Erstellen von Sitemaps
Sie können einen Cron-Auftrag wie folgt ausführen:
- Verwenden des Befehls
magento cron:run
entweder über die Befehlszeile oder in einer Registerkarte mit der Clientfunktion - Zugriff auf
pub/cron.php?[group=<name>]
in einem Webbrowser
magento cron:run
zum Ausführen von Cron verwenden, da er einen anderen Prozess verwendet, der bereits sicher ist.Sicheres Cron mit Apache
In diesem Abschnitt wird beschrieben, wie Sie Cron mit der HTTP Basic-Authentifizierung mit Apache sichern. Diese Anweisungen basieren auf Apache 2.2 mit CentOS 6. Weitere Informationen finden Sie in einer der folgenden Ressourcen:
Kennwortdatei erstellen
Aus Sicherheitsgründen können Sie die Kennwortdatei an einer beliebigen Stelle außerhalb des Basisverzeichnisses für Ihren Webserver 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 Wahl des Benutzers liegt bei Ihnen.
Befolgen Sie die Anweisungen auf Ihrem Bildschirm, um ein Kennwort für den Benutzer zu erstellen.
Um Ihrer Kennwortdatei einen weiteren Benutzer 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 mehrere Benutzer aktivieren, um cron auszuführen, indem Sie diese Benutzer zu Ihrer Kennwortdatei hinzufügen, einschließlich einer Gruppendatei.
So fügen Sie Ihrer Kennwortdatei einen weiteren Benutzer 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 Dokumentenstamms des Webservers. Die Gruppendatei gibt den Namen der Gruppe und die Benutzer in der Gruppe an. In diesem Beispiel lautet der Gruppenname MagentoCronGroup
.
vim /usr/local/apache/password/group
Inhalt der Datei:
MagentoCronGroup: <username1> ... <usernameN>
Sicherer Cron in .htaccess
Sichern von Cron in der Datei .htaccess
:
-
Melden Sie sich bei Ihrem Commerce-Server als Dateisysteminhaber an oder wechseln Sie zu ihm.
-
Öffnen Sie
<magento_root>/pub/.htaccess
in einem Texteditor.(Da sich
cron.php
im Verzeichnispub
befindet, bearbeiten Sie nur diese.htaccess
.) -
Cron-Zugriff für einen oder mehrere Benutzer. Ersetzen Sie die vorhandene
<Files cron.php>
-Direktive 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 vorhandene
<Files cron.php>
-Direktive 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 mit Überprüfen Sie, ob der Cron sicher ist.
Sicherer Cron mit Nginx
In diesem Abschnitt wird beschrieben, wie Sie Cron mit dem Nginx-Webserver sichern. Sie müssen die folgenden Aufgaben ausführen:
- Verschlüsselte Kennwortdatei für Nginx einrichten
- Ändern Sie Ihre nginx-Konfiguration so, dass beim Zugriff auf
pub/cron.php
auf die Kennwortdatei verwiesen wird.
Kennwortdatei erstellen
Lesen Sie eine der folgenden Ressourcen, um eine Kennwortdatei zu erstellen, bevor Sie fortfahren:
Sicherer Cron in nginx.conf.sample
Commerce bietet standardmäßig eine optimierte Beispielkonfigurationsdatei für nginx. Es wird empfohlen, ihn zu ändern, um Cron zu schützen.
-
Fügen Sie Ihrer Datei
nginx.conf.sample
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; }
-
Nginx neu starten:
systemctl restart nginx
- Fahren Sie mit Überprüfen Sie, ob der Cron sicher ist.
Sicherstellen, dass Cron sicher ist
Die einfachste Methode, um sicherzustellen, dass pub/cron.php
sicher ist, besteht darin, nach der Einrichtung der Kennwortauthentifizierung sicherzustellen, dass Zeilen in der Datenbanktabelle cron_schedule
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, den Sie in diesem Beispiel ausführen, wird gemäß dem in crontab.xml
definierten Zeitplan ausgeführt. Einige Cron-Aufträge werden nur einmal am Tag ausgeführt. Wenn Sie Cron zum ersten Mal über den Browser ausführen, wird die Tabelle cron_schedule
aktualisiert, nachfolgende pub/cron.php
-Anforderungen werden jedoch gemäß dem konfigurierten Zeitplan ausgeführt.Überprüfen, ob der 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 Sie die 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;
-
Führen Sie cron über einen Browser aus:
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)
Ausführen von Cron über einen Webbrowser
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 Beschränkung aus der Datei ".htaccess
"entfernen, bevor Sie Cron in einem Browser ausführen können:
-
Melden Sie sich bei Ihrem Commerce-Server als Benutzer mit Schreibberechtigung für das Commerce-Dateisystem an.
-
Öffnen Sie Folgendes in einem Texteditor (je nach Einstiegspunkt in die Magento):
code language-text <magento_root>/pub/.htaccess <magento_root>/.htaccess
-
Löschen oder kommentieren Sie Folgendes aus:
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.
Anschließend können Sie Cron wie folgt in einem Webbrowser 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 das docroot-relative Verzeichnis des Webservers, in dem Sie die Commerce-Software installiert habenDie genaue URL, die Sie zum Ausführen der Commerce-Anwendung verwenden, hängt von der Konfiguration Ihres Webservers und virtuellen Hosts ab.
-
<group name>
ist ein beliebiger gültiger Cron-Gruppenname (optional)
Beispiel:
https://magento.example.com/magento2/pub/cron.php?group=index