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
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
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>
Où <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 :
-
Connectez-vous à votre serveur Commerce en tant que propriétaire du système de fichiers ou passez à ce dernier.
-
Ouvrez
<magento_root>/pub/.htaccess
dans un éditeur de texte.(Étant donné que
cron.php
se trouve dans le répertoirepub
, modifiez uniquement ce.htaccess
.) -
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>
-
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>
-
Enregistrez vos modifications dans
.htaccess
et quittez l’éditeur de texte. -
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 :
- Configurer un fichier de mot de passe chiffré pour Nginx
- 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.
-
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
- Continuez avec Vérifiez que cron est sécurisé.
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.
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é :
-
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
-
Utilisez la base de données Commerce :
code language-shell use <database-name>;
Par exemple,
code language-shell use magento;
-
Supprimez toutes les lignes de la table de base de données
cron_schedule
:code language-shell TRUNCATE TABLE cron_schedule;
-
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
-
Lorsque vous y êtes invité, saisissez le nom et le mot de passe d’un utilisateur autorisé. La figure suivante en est un exemple.
-
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.
Si vous utilisez un serveur web Apache, vous devez supprimer la restriction du fichier .htaccess
avant de pouvoir exécuter cron dans un navigateur :
-
Connectez-vous à votre serveur Commerce en tant qu’utilisateur disposant des autorisations d’écriture sur le système de fichiers Commerce.
-
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
-
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>
-
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 CommerceL’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