2017-03-23 3 views
1

Fedora 25 et apache sont sur notre serveur.
Je veux faire en sorte que le script php sur notre site web puisse changer les paramètres de crontab.Selinux bloque la commande crontab de php

J'ai créé le script php test suivant:

<?php 
system("echo '*/2 * * * * date > /var/www/logs/testlog.txt' | crontab - 2>&1"); 

Mais cela n'a pas fonctionné. J'ai reçu le message:

/var/spool/cron/#tmp.mh203-95.XXXXG0KrFF: Permission denied

Je regardai à la sortie de sealert -a /var/log/audit/audit.log et trouvé:

SELinux is preventing crontab from write access on the directory /var/spool/cron.

D'accord. Il semble que Apache n'est pas autorisé l'accès en écriture à /var/spool/cron parce que ce répertoire n'a pas le httpd_sys_rw_content_t label. J'ai donc exécuté la commande: chcon -v -R -t httpd_sys_rw_content_t /var/spool/cron

Mon script php a commencé à fonctionner. La commande crontab -l a donné une sortie normale.
Mais le nouveau problème est apparu. :(Les ​​tâches cron n'a pas été exécuté

Dans le répertoire/var/log/Cron j'ai vu l'erreur.

Mar 23 18:05:01 mh203-95 crond[1653]: (apache) Unauthorized SELinux context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 file_context=system_u:object_r:httpd_sys_rw_content_t:s0 (/var/spool/cron/apache) 
Mar 23 18:05:01 mh203-95 crond[1653]: (apache) FAILED (loading cron table) 

Après beaucoup de temps de recherche ... Je trouve que le/var/spool/cron doit avoir l'étiquette user_cron_spool_t J'exécutais:.. chcon -v -R -t user_cron_spool_t /var/spool/cron

les tâches cron commencé à travaux Mais mon script php ne fonctionne pas à nouveau le même problème au début

sealert a suggéré que les commandes comme... :
ausearch -c 'crontab' --raw | audit2allow -M my-crontab
semodule -X 300 -i mon-crontab.pp
Mais cela n'a pas aidé.

Qu'est-ce qui me manque? Comment résoudre le problème? Puis-je combiner deux étiquettes user_cron_spool_t et httpd_sys_rw_content_t pour /var/spool/cron directory?

Répondre

0

J'avais résolu le problème.

La raison en était: sealert génère le même nom politique my-crontab dans toutes les commandes suggérées. La nouvelle politique a écrasé l'ancien.
Il suffit de changer légèrement ce nom.

donc j'exécutés:

ausearch -c 'crontab' --raw | audit2allow -M my-crontab
semodule -X 300 -i my-crontab.pp

ausearch -c 'crontab' --raw | audit2allow -M my-crontab2
semodule -X 300 -i my-crontab2.pp

ausearch -c 'crontab' --raw | audit2allow -M my-crontab3
semodule -X 300 -i mon-crontab3.pp
...

Avant chaque ausearch ... J'exécuté:
echo -n ""> /var/log/audit/audit.log
Mon script php.
sealert -a /var/log/audit/audit.log