Secure cron PHP
Cette rubrique aborde la sécurisation de pub/cron.php
pour empêcher son utilisation dans un exploitation malveillante. Si vous ne sécurisez pas cron, un utilisateur peut 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, entre autres :
- 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 comme suit :
- Utilisation de la commande
magento cron:run
depuis la ligne de commande ou dans un crontab - Accès à
pub/cron.php?[group=<name>]
dans un navigateur web
magento cron:run
pour exécuter cron, car elle utilise un processus différent 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 la docroot de votre 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 des privilèges root
:
mkdir -p /usr/local/apache/password
htpasswd -c /usr/local/apache/password/passwords <username>
Où <username>
peut être un utilisateur du serveur web ou un autre utilisateur. Dans cet exemple, nous utilisons l’utilisateur du serveur web, mais c’est à vous de choisir l’utilisateur.
Suivez les invites de votre écran pour créer un mot de passe pour l’utilisateur.
Pour ajouter un autre utilisateur à votre fichier de mot de passe, saisissez la commande suivante en tant qu’utilisateur disposant des privilèges root
:
htpasswd /usr/local/apache/password/passwords <username>
Ajouter des utilisateurs pour créer un groupe cron autorisé (facultatif)
Vous pouvez permettre à plusieurs utilisateurs d’exécuter cron en ajoutant ces utilisateurs à votre fichier de mot de passe, y compris un fichier de groupe.
Pour ajouter un autre utilisateur à votre fichier de mot 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 docroot du serveur web. Le fichier group 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>
Secure cron dans .htaccess
Pour sécuriser cron dans le fichier .htaccess
:
-
Connectez-vous à votre serveur Commerce en tant que propriétaire du système de fichiers ou passez à .
-
Ouvrez
<magento_root>/pub/.htaccess
dans un éditeur de texte.(Puisque
cron.php
se trouve dans le répertoirepub
, modifiez cet.htaccess
uniquement.) -
Accès Cron pour un ou plusieurs utilisateurs. Remplacez 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. Remplacez 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. -
Passez à Vérifiez que cron est sécurisé.
Secure cron avec Nginx
Cette section explique comment sécuriser cron à l’aide du serveur web Nginx. Vous devez effectuer les tâches suivantes :
- Configuration d’un fichier de mot de passe chiffré pour Nginx
- Modifiez la configuration nginx pour référencer le fichier de mot 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 poursuivre :
Secure cron dans nginx.conf.sample
Commerce fournit un exemple optimisé de fichier de configuration nginx prêt à l’emploi. Nous vous recommandons de le modifier pour sécuriser cron.
-
Ajoutez ce qui suit à 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 le signal :
systemctl restart nginx
- Passez à Vérifiez que cron est sécurisé.
Vérifier que cron est sécurisé
La méthode la plus simple pour 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 n'importe quel outil de votre choix.
default
que vous exécutez dans cet exemple s'exécute selon le planning défini dans crontab.xml
. Une tâche cron ne s’exécute qu’une seule fois par jour. La première fois que vous exécutez cron à partir du navigateur, la table cron_schedule
est mise à jour, mais les requêtes pub/cron.php
suivantes s’exécutent selon la planification configurée.Pour vérifier que cron est sécurisé :
-
Connectez-vous à la base de données en tant qu’utilisateur de base de données Commerce ou en tant que
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 illustre 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écution de cron à partir d’un navigateur web
Vous pouvez exécuter cron à tout moment, par exemple pendant le 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 autorisé à écrire 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 mettez en commentaire 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 docroot du serveur web sur lequel vous avez installé le logiciel Commerce.L’URL exacte que vous utilisez pour exécuter l’application Commerce dépend de la manière dont vous avez configuré votre serveur web et 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