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
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
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
:
-
Faça logon no servidor do Commerce como ou alterne para o proprietário do sistema de arquivos.
-
Abra
<magento_root>/pub/.htaccess
em um editor de texto.(Como
cron.php
está localizado no diretóriopub
, edite somente este.htaccess
.) -
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>
-
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>
-
Salve as alterações em
.htaccess
e saia do editor de texto. -
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:
- Configurar um arquivo de senha criptografado para o Nginx
- 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.
-
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
- Continue com Verifique se o cron está seguro.
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.
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:
-
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
-
Usar o banco de dados do Commerce:
code language-shell use <database-name>;
Por exemplo,
code language-shell use magento;
-
Excluir todas as linhas da tabela de banco de dados
cron_schedule
:code language-shell TRUNCATE TABLE cron_schedule;
-
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
-
Quando solicitado, digite o nome e a senha de um usuário autorizado. A figura a seguir mostra um exemplo.
-
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.
Se você estiver usando um servidor Web Apache, remova a restrição do arquivo .htaccess
antes de executar o cron em um navegador:
-
Faça logon no servidor do Commerce como um usuário com permissões para gravar no sistema de arquivos do Commerce.
-
Abra qualquer um dos itens a seguir em um editor de texto (dependendo do ponto de entrada para Magento):
code language-text <magento_root>/pub/.htaccess <magento_root>/.htaccess
-
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>
-
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 CommerceO 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