Cron PHP sicuro

In questo argomento viene illustrata la protezione pub/cron.php per evitare che venga utilizzato in un exploit dannoso. Se non proteggi cron, qualsiasi utente potrebbe potenzialmente eseguire cron per attaccare l’applicazione Commerce.

Il processo cron esegue diverse attività pianificate ed è una parte fondamentale della configurazione Commerce. Le attività pianificate includono, tra l'altro:

  • Reindicizzazione
  • Generazione di messaggi di posta elettronica
  • Generazione di newsletter
  • Generazione di sitemap
INFO
Fai riferimento a Configurare ed eseguire cron per ulteriori informazioni sui gruppi cron.

È possibile eseguire un processo cron nei modi seguenti:

  • Utilizzo di magento cron:run comando dalla riga di comando o in una scheda cronologica
  • Accesso pub/cron.php?[group=<name>] in un browser web
INFO
Non è necessario eseguire alcuna operazione se si utilizza magento cron:run comando per eseguire cron perché utilizza un processo diverso già protetto.

Cron sicuro con Apache

Questa sezione illustra come proteggere il cron utilizzando l’autenticazione HTTP Basic con Apache. Queste istruzioni sono basate su Apache 2.2 con CentOS 6. Per ulteriori informazioni, consulta una delle risorse seguenti:

Creare un file di password

Per motivi di sicurezza, è possibile individuare il file della password in qualsiasi punto, ad eccezione della directory principale dei documenti del server Web. In questo esempio, il file della password viene archiviato in una nuova directory.

Immetti i seguenti comandi come utente con root privilegi:

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

Dove <username> può essere l’utente del server web o un altro utente. In questo esempio, utilizziamo l’utente del server web, ma la scelta dell’utente dipende da te.

Seguire le istruzioni visualizzate per creare una password per l'utente.

Per aggiungere un altro utente al file della password, immettere il comando seguente come utente con root privilegi:

htpasswd /usr/local/apache/password/passwords <username>

Aggiungere utenti per creare un gruppo cron autorizzato (facoltativo)

Per consentire l'esecuzione di cron da parte di più utenti, aggiungerli al file della password, incluso un file di gruppo.

Per aggiungere un altro utente al file della password:

htpasswd /usr/local/apache/password/passwords <username>

Per creare un gruppo autorizzato, creare un file di gruppo all'esterno della directory principale dei documenti del server Web. Il file di gruppo specifica il nome del gruppo e gli utenti del gruppo. In questo esempio, il nome del gruppo è MagentoCronGroup.

vim /usr/local/apache/password/group

Contenuto del file:

MagentoCronGroup: <username1> ... <usernameN>

Cron sicuro in .htaccess

Per proteggere il cron in .htaccess file:

  1. Accedi al server Commerce come proprietario del file system o passa a tale proprietario.

  2. Apri <magento_root>/pub/.htaccess in un editor di testo.

    (perché cron.php si trova in pub directory, modifica questo .htaccess solo.)

  3. Accesso al Cron per uno o più utenti. Sostituisci il <Files cron.php> direttiva con le seguenti caratteristiche:

    code language-conf
    <Files cron.php>
       AuthType Basic
       AuthName "Cron Authentication"
       AuthUserFile /usr/local/apache/password/passwords
       Require valid-user
    </Files>
    
  4. Accesso al controllo per un gruppo. Sostituisci il <Files cron.php> direttiva con le seguenti caratteristiche:

    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. Salva le modifiche apportate a .htaccess ed esci dall’editor di testo.

  6. Continua con Verificare che il cron sia sicuro.

Cron sicuro con Nginx

Questa sezione descrive come proteggere cron utilizzando il server web Nginx. È necessario eseguire le seguenti attività:

  1. Imposta un file di password crittografato per Nginx
  2. Modifica la configurazione nginx per fare riferimento al file della password durante l'accesso pub/cron.php

Creare un file di password

Consulta una delle seguenti risorse per creare un file di password prima di continuare:

Cron sicuro in nginx.conf.sample

Commerce fornisce un esempio ottimizzato di file di configurazione nginx pronto all’uso. È consigliabile modificarlo per proteggere il cron.

  1. Aggiungi quanto segue al tuo nginx.conf.sample file:

    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.Inginx di riavvio:

systemctl restart nginx

Verificare che il cron sia sicuro

Il modo più semplice per verificare che pub/cron.php è sicuro è verificare che stia creando righe in cron_schedule tabella di database dopo aver impostato l'autenticazione tramite password. In questo esempio vengono utilizzati i comandi SQL per controllare il database, ma è possibile utilizzare qualsiasi strumento desiderato.

INFO
Il default cron in esecuzione in questo esempio viene eseguito in base alla pianificazione definita in crontab.xml. Alcuni processi cron vengono eseguiti solo una volta al giorno. La prima volta che esegui cron dal browser, il cron_schedule la tabella è aggiornata, ma è successiva pub/cron.php Le richieste vengono eseguite alla pianificazione configurata.

Verificare che il cron sia protetto:

  1. Accedi al database come utente del database Commerce o come root.

    Ad esempio:

    code language-bash
    mysql -u magento -p
    
  2. Utilizza il database Commerce:

    code language-shell
    use <database-name>;
    

    Ad esempio:

    code language-shell
    use magento;
    
  3. Elimina tutte le righe dal cron_schedule tabella di database:

    code language-shell
    TRUNCATE TABLE cron_schedule;
    
  4. Esegui cron da un browser:

    code language-shell
    http[s]://<Commerce hostname or ip>/cron.php?group=default
    

    Ad esempio:

    code language-shell
    http://magento.example.com/cron.php?group=default
    
  5. Quando richiesto, immettere il nome e la password di un utente autorizzato. Nella figura seguente viene illustrato un esempio.

    Autorizzazione di cron tramite HTTP Basic

  6. Verifica che le righe siano state aggiunte alla tabella:

    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)
    

Eseguire cron da un browser Web

Puoi eseguire cron in qualsiasi momento, ad esempio durante lo sviluppo, utilizzando un browser web.

WARNING
Esegui non esegui cron in un browser senza prima proteggerlo.

Se utilizzi un server web Apache, devi rimuovere la restrizione dal .htaccess prima di eseguire cron in un browser:

  1. Accedi al server Commerce come utente con autorizzazioni di scrittura nel file system di Commerce.

  2. Apri uno dei seguenti elementi in un editor di testo (a seconda del punto di ingresso al Magento):

    code language-text
    <magento_root>/pub/.htaccess
    <magento_root>/.htaccess
    
  3. Elimina o commenta quanto segue:

    code language-conf
    ## Deny access to cron.php
      <Files cron.php>
         order allow,deny
         deny from all
      </Files>
    

    Ad esempio:

    code language-conf
    ## Deny access to cron.php
       #<Files cron.php>
          # order allow,deny
          # deny from all
       #</Files>
    
  4. Salva le modifiche e esci dall’editor di testo.

    È quindi possibile eseguire cron in un browser Web nel modo seguente:

    code language-text
    <your hostname or IP>/<Commerce root>/pub/cron.php[?group=<group name>]
    

Dove:

  • <your hostname or IP> è il nome host o l’indirizzo IP dell’installazione di Commerce

  • <Commerce root> è la directory relativa alla directory principale dei documenti del server web in cui è stato installato il software Commerce

    L’URL esatto utilizzato per eseguire l’applicazione Commerce dipende da come hai configurato il server web e l’host virtuale.

  • <group name> è un nome di gruppo cron valido (facoltativo)

Ad esempio:

https://magento.example.com/magento2/pub/cron.php?group=index
INFO
È necessario eseguire cron due volte: prima per individuare le attività da eseguire e di nuovo per eseguire le attività stesse. Fai riferimento a Configurare ed eseguire cron per ulteriori informazioni sui gruppi cron.
recommendation-more-help
386822bd-e32c-40a8-81c2-ed90ad1e198c