Sicheres cron-PHP

Dieses Thema behandelt die Sicherung von pub/cron.php um zu verhindern, dass es in einer böswilligen Exploit verwendet wird. Wenn Sie Cron nicht schützen, könnte 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
INFO
Siehe Abschnitt Cron konfigurieren und ausführen für weitere Informationen zu Cron-Gruppen.

Sie können einen Cron-Auftrag wie folgt ausführen:

  • Verwenden der magento cron:run -Befehl entweder über die Befehlszeile oder in einer Crontab
  • Zugriff pub/cron.php?[group=<name>] in einem Webbrowser
INFO
Wenn Sie die Variable magento cron:run -Befehl, um cron auszuführen, da es 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:

mkdir -p /usr/local/apache/password
htpasswd -c /usr/local/apache/password/passwords <username>

Wo <username> kann 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 ein: root -Berechtigungen:

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>

Sicheres Cron in .htaccess

Sichern von Cron in .htaccess Datei:

  1. Melden Sie sich bei Ihrem Commerce-Server als Dateisysteminhaber an oder wechseln Sie zu ihm.

  2. Öffnen <magento_root>/pub/.htaccess in einem Texteditor.

    (weil cron.php befindet sich im pub Verzeichnis, bearbeiten Sie diese .htaccess nur.)

  3. Cron-Zugriff für einen oder mehrere Benutzer. Vorhandene ersetzen <Files cron.php> -Anweisung mit folgendem Wortlaut:

    code language-conf
    <Files cron.php>
       AuthType Basic
       AuthName "Cron Authentication"
       AuthUserFile /usr/local/apache/password/passwords
       Require valid-user
    </Files>
    
  4. Cron-Zugriff für eine Gruppe. Vorhandene ersetzen <Files cron.php> -Anweisung mit folgendem Wortlaut:

    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>
    
  5. Speichern Sie Ihre Änderungen in .htaccess und beenden Sie den Texteditor.

  6. Fahren Sie mit Sicherstellen, dass 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:

  1. Verschlüsselte Kennwortdatei für Nginx einrichten
  2. Ändern Sie Ihre nginx-Konfiguration so, dass beim Zugriff auf die Kennwortdatei auf sie verwiesen wird. pub/cron.php

Kennwortdatei erstellen

Lesen Sie eine der folgenden Ressourcen, um eine Kennwortdatei zu erstellen, bevor Sie fortfahren:

Sicheres 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.

  1. Fügen Sie Folgendes zu Ihrer nginx.conf.sample Datei:

    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;
    }
    
  2. Nginx neu starten:

systemctl restart nginx

Sicherstellen, dass Cron sicher ist

Die einfachste Methode, um zu überprüfen, ob pub/cron.php ist sicher zu überprüfen, ob Zeilen im cron_schedule Datenbanktabelle, nachdem Sie die Kennwortauthentifizierung eingerichtet haben. In diesem Beispiel werden SQL-Befehle verwendet, um die Datenbank zu überprüfen. Sie können jedoch jedes beliebige Tool verwenden.

INFO
Die default cron, den Sie in diesem Beispiel ausführen, läuft gemäß dem in crontab.xml. Einige Cron-Aufträge werden nur einmal am Tag ausgeführt. Wenn Sie Cron zum ersten Mal über den Browser ausführen, wird die cron_schedule -Tabelle aktualisiert wird, aber nachfolgende pub/cron.php -Anfragen werden nach dem konfigurierten Zeitplan ausgeführt.

Überprüfen, ob der Cron sicher ist:

  1. Melden Sie sich bei der Datenbank als Commerce-Datenbankbenutzer oder als root.

    Beispiel:

    code language-bash
    mysql -u magento -p
    
  2. Verwenden Sie die Commerce-Datenbank:

    code language-shell
    use <database-name>;
    

    Beispiel:

    code language-shell
    use magento;
    
  3. Löschen Sie alle Zeilen aus dem cron_schedule Datenbanktabelle:

    code language-shell
    TRUNCATE TABLE cron_schedule;
    
  4. 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
    
  5. Geben Sie bei Aufforderung den Namen und das Kennwort eines autorisierten Benutzers ein. Die folgende Abbildung zeigt ein Beispiel.

    Autorisieren von Cron mit HTTP Basic

  6. 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.

WARNING
Do not Führen Sie cron in einem Browser aus, ohne es zuerst zu sichern.

Wenn Sie einen Apache-Webserver verwenden, müssen Sie die Einschränkung aus dem .htaccess Datei, bevor Sie cron in einem Browser ausführen können:

  1. Melden Sie sich bei Ihrem Commerce-Server als Benutzer mit Schreibberechtigung für das Commerce-Dateisystem an.

  2. Öffnen Sie Folgendes in einem Texteditor (je nach Einstiegspunkt in die Magento):

    code language-text
    <magento_root>/pub/.htaccess
    <magento_root>/.htaccess
    
  3. 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>
    
  4. 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 haben

    Die 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
INFO
Sie müssen Cron zweimal ausführen: zuerst entdecken Sie Aufgaben, die ausgeführt werden sollen, und wieder, um die Aufgaben selbst auszuführen. Siehe Abschnitt Cron konfigurieren und ausführen für weitere Informationen zu Cron-Gruppen.
recommendation-more-help
386822bd-e32c-40a8-81c2-ed90ad1e198c