[PaaS uniquement]{class="badge informative" title="S’applique uniquement aux projets Adobe Commerce on Cloud (infrastructure PaaS gérée par Adobe) et aux projets On-premise."}

Secure cron PHP

Cette rubrique aborde la sécurisation des pub/cron.php afin d’empêcher leur utilisation dans le cadre d’une exploitation malveillante. Si vous ne sécurisez pas cron, n’importe quel utilisateur peut éventuellement exécuter cron pour attaquer votre application Commerce.

La tâche cron exécute plusieurs tâches planifiées et constitue une partie essentielle de votre configuration Commerce. Les tâches planifiées comprennent, sans s’y limiter :

  • Réindexation
  • Générer des emails
  • Génération de newsletters
  • Génération de plans de site
INFO
Pour plus d’informations sur les groupes cron voirConfigurer et exécuter cron.

Vous pouvez exécuter une tâche cron des manières suivantes :

  • Utilisation de la commande magento cron:run à partir de la ligne de commande ou dans un crontab
  • Accès aux pub/cron.php?[group=<name>] dans un navigateur web
INFO
Vous n’avez rien à faire si vous utilisez la commande magento cron:run pour exécuter cron, car elle utilise un autre processus qui est déjà sécurisé.

Sécuriser cron avec Apache

Cette section explique comment sécuriser cron à l’aide de l’authentification HTTP de base avec Apache. Ces instructions sont basées sur Apache 2.2 avec CentOS 6. Pour plus d’informations, consultez l’une des ressources suivantes :

Créer un fichier de mot de passe

Pour des raisons de sécurité, vous pouvez localiser le fichier de mot de passe n’importe où, à l’exception de votre racine de serveur web. Dans cet exemple, nous stockons le fichier de mot de passe dans un nouveau répertoire.

Saisissez les commandes suivantes en tant qu’utilisateur disposant de droits d’root :

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

<username> peut être l’utilisateur du serveur web ou un autre utilisateur. Dans cet exemple, nous utilisons l’utilisateur du serveur web, mais le choix de l’utilisateur ou de l’utilisatrice dépend de vous.

Suivez les invites à l'écran pour créer un mot de passe pour l'utilisateur.

Pour ajouter un autre utilisateur à votre fichier de mots de passe, saisissez la commande suivante en tant qu’utilisateur disposant des privilèges root :

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

Ajoutez des utilisateurs pour créer un groupe cron autorisé (facultatif).

Vous pouvez permettre à plusieurs utilisateurs d’exécuter cron en les ajoutant à votre fichier de mot de passe, y compris un fichier de groupe.

Pour ajouter un autre utilisateur à votre fichier de mots de passe :

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

Pour créer un groupe autorisé, créez un fichier de groupe n’importe où en dehors de la racine du serveur web. Le fichier de groupe spécifie le nom du groupe et les utilisateurs du groupe. Dans cet exemple, le nom du groupe est MagentoCronGroup.

vim /usr/local/apache/password/group

Contenu du fichier :

MagentoCronGroup: <username1> ... <usernameN>

Sécuriser cron dans .htaccess

Pour sécuriser cron dans .htaccess fichier :

  1. Connectez-vous à votre serveur Commerce en tant que propriétaire du système de fichiers ou passez à ce dernier.

  2. Ouvrez <magento_root>/pub/.htaccess dans un éditeur de texte.

    (Étant donné que cron.php se trouve dans le répertoire pub, modifiez uniquement ce .htaccess.)

  3. Accès cron pour un ou plusieurs utilisateurs. Remplacer la directive <Files cron.php> existante par ce qui suit :

    code language-conf
    <Files cron.php>
       AuthType Basic
       AuthName "Cron Authentication"
       AuthUserFile /usr/local/apache/password/passwords
       Require valid-user
    </Files>
    
  4. Accès cron pour un groupe. Remplacer la directive <Files cron.php> existante par ce qui suit :

    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. Enregistrez vos modifications dans .htaccess et quittez l’éditeur de texte.

  6. Continuez avec Vérifiez que cron est sécurisé.

Sécuriser cron avec Nginx

Cette section explique comment sécuriser cron à l’aide du serveur web Nginx. Vous devez effectuer les tâches suivantes :

  1. Configurer un fichier de mot de passe chiffré pour Nginx
  2. Modifiez votre configuration nginx pour référencer le fichier de mots de passe lors de l’accès à pub/cron.php

Créer un fichier de mot de passe

Consultez l’une des ressources suivantes pour créer un fichier de mot de passe avant de continuer :

Sécuriser cron dans nginx.conf.sample

Commerce fournit un exemple de fichier de configuration nginx optimisé et prêt à l’emploi. Nous vous recommandons de le modifier pour sécuriser cron.

  1. Ajoutez les éléments suivants à votre fichier 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.Redémarrez nginx :

systemctl restart nginx

Vérifiez que cron est sécurisé.

Le moyen le plus simple de vérifier que pub/cron.php est sécurisé consiste à vérifier qu’il crée des lignes dans la table de base de données cron_schedule après avoir configuré l’authentification par mot de passe. Cet exemple utilise des commandes SQL pour vérifier la base de données, mais vous pouvez utiliser l'outil de votre choix.

INFO
Le cron default que vous exécutez dans cet exemple s’exécute selon le planning défini dans crontab.xml. Certaines tâches cron ne s’exécutent qu’une seule fois par jour. La première fois que vous exécutez cron à partir du navigateur, le tableau cron_schedule est mis à jour, mais les requêtes pub/cron.php suivantes s’exécutent selon le planning configuré.

Pour vérifier que cron est sécurisé :

  1. Connectez-vous à la base de données en tant qu’utilisateur Commerce ou en tant qu’root.

    Par exemple,

    code language-bash
    mysql -u magento -p
    
  2. Utilisez la base de données Commerce :

    code language-shell
    use <database-name>;
    

    Par exemple,

    code language-shell
    use magento;
    
  3. Supprimez toutes les lignes de la table de base de données cron_schedule :

    code language-shell
    TRUNCATE TABLE cron_schedule;
    
  4. Exécutez cron à partir d’un navigateur :

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

    Par exemple :

    code language-shell
    http://magento.example.com/cron.php?group=default
    
  5. Lorsque vous y êtes invité, saisissez le nom et le mot de passe d’un utilisateur autorisé. La figure suivante en est un exemple.

    Autorisation de cron à l’aide de HTTP de base

  6. Vérifiez que des lignes ont été ajoutées au tableau :

    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)
    

Exécutez cron à partir d’un navigateur web

Vous pouvez exécuter cron à tout moment, par exemple au cours du développement, à l’aide d’un navigateur web.

WARNING
N’exécutez cron dans un navigateur sans l’avoir d’abord sécurisé.

Si vous utilisez un serveur web Apache, vous devez supprimer la restriction du fichier .htaccess avant de pouvoir exécuter cron dans un navigateur :

  1. Connectez-vous à votre serveur Commerce en tant qu’utilisateur disposant des autorisations d’écriture sur le système de fichiers Commerce.

  2. Ouvrez l’un des éléments suivants dans un éditeur de texte (selon votre point d’entrée vers Magento) :

    code language-text
    <magento_root>/pub/.htaccess
    <magento_root>/.htaccess
    
  3. Supprimez ou commentez les éléments suivants :

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

    Par exemple,

    code language-conf
    ## Deny access to cron.php
       #<Files cron.php>
          # order allow,deny
          # deny from all
       #</Files>
    
  4. Enregistrez vos modifications et quittez l’éditeur de texte.

    Vous pouvez ensuite exécuter cron dans un navigateur web comme suit :

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

Où :

  • <your hostname or IP> est le nom d’hôte ou l’adresse IP de votre installation Commerce

  • <Commerce root> est le répertoire relatif au serveur web docroot dans lequel vous avez installé le logiciel Commerce

    L’URL exacte que vous utilisez pour exécuter l’application Commerce dépend de la configuration de votre serveur web et de votre hôte virtuel.

  • <group name> est un nom de groupe cron valide (facultatif)

Par exemple,

https://magento.example.com/magento2/pub/cron.php?group=index
INFO
Vous devez exécuter cron deux fois : d’abord pour découvrir les tâches à exécuter, puis à nouveau pour exécuter les tâches elles-mêmes. Pour plus d’informations sur les groupes cron voirConfigurer et exécuter cron.
recommendation-more-help
386822bd-e32c-40a8-81c2-ed90ad1e198c