[Somente PaaS]{class="badge informative" title="Aplica-se somente a projetos do Adobe Commerce na nuvem (infraestrutura do PaaS gerenciada pela Adobe) e a projetos locais."}

PHP cron seguro

Este tópico discute a proteção do pub/cron.php para evitar que ele seja usado em uma exploração mal-intencionada. Se você não proteger o cron, qualquer usuário poderá executar o cron para atacar seu aplicativo do Commerce.

O trabalho cron executa várias tarefas agendadas e é uma parte essencial da configuração do Commerce. As tarefas agendadas incluem, mas não estão limitadas a:

  • Reindexação
  • Geração de emails
  • Gerar informativos
  • Gerar mapas de site
INFO
Consulte Configurar e executar o cron para obter mais informações sobre grupos cron.

Você pode executar um trabalho cron das seguintes maneiras:

  • Usando o comando magento cron:run na linha de comando ou em um crontab
  • Acessando pub/cron.php?[group=<name>] em um navegador da Web
INFO
Você não precisa fazer nada se usar o comando magento cron:run para executar o cron porque ele usa um processo diferente que já é seguro.

Cron seguro com Apache

Esta seção discute como proteger o CRON usando autenticação básica HTTP com o Apache. Estas instruções são baseadas no Apache 2.2 com CentOS 6. Para obter mais informações, consulte um dos seguintes recursos:

Criar um arquivo de senha

Por motivos de segurança, você pode localizar o arquivo de senha em qualquer lugar, exceto no docroot do servidor Web. Neste exemplo, estamos armazenando o arquivo de senha em um novo diretório.

Digite os seguintes comandos como um usuário com privilégios de root:

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

Onde <username> pode ser o usuário do servidor Web ou outro usuário. Neste exemplo, usamos o usuário do servidor Web, mas a escolha do usuário depende de você.

Siga as instruções na tela para criar uma senha para o usuário.

Para adicionar outro usuário ao seu arquivo de senhas, digite o seguinte comando como um usuário com privilégios root:

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

Adicionar usuários para criar um grupo cron autorizado (opcional)

Você pode permitir que mais de um usuário execute o cron adicionando esses usuários ao seu arquivo de senhas, incluindo um arquivo de grupo.

Para adicionar outro usuário ao seu arquivo de senha:

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

Para criar um grupo autorizado, crie um arquivo de grupo em qualquer lugar fora do docroot do servidor Web. O arquivo de grupo especifica o nome do grupo e os usuários no grupo. Neste exemplo, o nome do grupo é MagentoCronGroup.

vim /usr/local/apache/password/group

Conteúdo do arquivo:

MagentoCronGroup: <username1> ... <usernameN>

Cron seguro em .htaccess

Para proteger o cron no arquivo .htaccess:

  1. Faça logon no servidor do Commerce como ou alterne para o proprietário do sistema de arquivos.

  2. Abra <magento_root>/pub/.htaccess em um editor de texto.

    (Como cron.php está localizado no diretório pub, edite somente este .htaccess.)

  3. Acesso de cron para um ou mais usuários. Substitua a diretiva <Files cron.php> existente pela seguinte:

    code language-conf
    <Files cron.php>
       AuthType Basic
       AuthName "Cron Authentication"
       AuthUserFile /usr/local/apache/password/passwords
       Require valid-user
    </Files>
    
  4. Acesso ao Cron para um grupo. Substitua a diretiva <Files cron.php> existente pela seguinte:

    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. Salve as alterações em .htaccess e saia do editor de texto.

  6. Continue com Verifique se o cron está seguro.

Cron seguro com Nginx

Esta seção discute como proteger o CRON usando o servidor Web Nginx. Você deve executar as seguintes tarefas:

  1. Configurar um arquivo de senha criptografado para o Nginx
  2. Modifique sua configuração nginx para fazer referência ao arquivo de senhas ao acessar pub/cron.php

Criar um arquivo de senha

Consulte um dos seguintes recursos para criar um arquivo de senha antes de continuar:

Cron seguro em nginx.conf.sample

O Commerce fornece uma amostra otimizada do arquivo de configuração nginx pronto para uso. Recomendamos modificá-lo para proteger o cron.

  1. Adicione o seguinte ao arquivo nginx.conf.sample:

    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.Reinicie o nginx:

systemctl restart nginx

Verificar se o cron está seguro

A maneira mais fácil de verificar se pub/cron.php é seguro é verificar se ele está criando linhas na tabela de banco de dados cron_schedule após você configurar a autenticação de senha. Este exemplo usa comandos SQL para verificar o banco de dados, mas você pode usar qualquer ferramenta que desejar.

INFO
O cron default que você está executando neste exemplo é executado de acordo com o agendamento definido em crontab.xml. Alguns trabalhos cron são executados apenas uma vez por dia. Na primeira vez que você executar o cron no navegador, a tabela cron_schedule será atualizada, mas as solicitações pub/cron.php subsequentes serão executadas de acordo com o agendamento configurado.

Para verificar se o cron está seguro:

  1. Faça logon no banco de dados como o usuário do banco de dados Commerce ou como root.

    Por exemplo,

    code language-bash
    mysql -u magento -p
    
  2. Usar o banco de dados do Commerce:

    code language-shell
    use <database-name>;
    

    Por exemplo,

    code language-shell
    use magento;
    
  3. Excluir todas as linhas da tabela de banco de dados cron_schedule:

    code language-shell
    TRUNCATE TABLE cron_schedule;
    
  4. Executar cron de um navegador:

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

    Por exemplo:

    code language-shell
    http://magento.example.com/cron.php?group=default
    
  5. Quando solicitado, digite o nome e a senha de um usuário autorizado. A figura a seguir mostra um exemplo.

    Autorizando o CRON usando o HTTP Básico

  6. Verifique se as linhas foram adicionadas à tabela:

    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)
    

Executar cron de um navegador da Web

Você pode executar o cron a qualquer momento, como durante o desenvolvimento, usando um navegador da Web.

WARNING
não execute o cron em um navegador sem protegê-lo primeiro.

Se você estiver usando um servidor Web Apache, remova a restrição do arquivo .htaccess antes de executar o cron em um navegador:

  1. Faça logon no servidor do Commerce como um usuário com permissões para gravar no sistema de arquivos do Commerce.

  2. Abra qualquer um dos seguintes em um editor de texto (dependendo do seu ponto de entrada para o Magento):

    code language-text
    <magento_root>/pub/.htaccess
    <magento_root>/.htaccess
    
  3. Exclua ou comente o seguinte:

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

    Por exemplo,

    code language-conf
    ## Deny access to cron.php
       #<Files cron.php>
          # order allow,deny
          # deny from all
       #</Files>
    
  4. Salve as alterações e saia do editor de texto.

    Você pode executar o cron em um navegador da Web da seguinte maneira:

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

Onde:

  • <your hostname or IP> é o nome do host ou endereço IP da sua instalação do Commerce

  • <Commerce root> é o diretório relativo ao docroot do servidor Web no qual você instalou o software Commerce

    O URL exato que você usa para executar o aplicativo Commerce depende de como você configurou o servidor Web e o host virtual.

  • <group name> é qualquer nome de grupo cron válido (opcional)

Por exemplo,

https://magento.example.com/magento2/pub/cron.php?group=index
INFO
Você deve executar cron duas vezes: primeiro para descobrir tarefas a serem executadas e novamente para executar as próprias tarefas. Consulte Configurar e executar o cron para obter mais informações sobre grupos cron.
recommendation-more-help
386822bd-e32c-40a8-81c2-ed90ad1e198c