2 votes

SELinux restreint l'accès à Apache/PHP

J'ai installé un système CentOS minimal avec Apache, PHP et SELinux dans une configuration par défaut :

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      29

Si je veux changer le répertoire racine d'Apache, je dois renommer ce nouveau répertoire sinon SELinux bloque l'accès. Mais j'ai découvert, avec les scripts de PHP, qu'il est possible de faire beaucoup plus que ce que je pensais. Par exemple, je peux faire les actions suivantes sans aucune alerte :

  • lire /etc/passwd ,
  • liste /var/tmp ,
  • afficher la version du noyau,
  • établir une connexion avec des hôtes externes

Cependant, je reçois des alertes AVC lorsque j'essaie de lire les attributs de l'article. /etc/shadow ou lorsque j'essaie d'accéder au répertoire personnel.

Tout d'abord, est-ce normal ? Et comment puis-je modifier SELinux pour restreindre davantage les actions de PHP ?

J'utilise CentOS 7 et ma version de selinux-policy est 3.13.1-23.el7_1.7. (J'ai également essayé la même chose avec Fedora et j'obtiens les mêmes résultats)

2voto

Michael Hampton Points 232226

Tout le monde doit être capable de lire /etc/passwd et écrire à /var/tmp . Ce n'est donc pas un problème.

La version du noyau n'est pas vraiment un problème non plus, à condition que vous installiez réellement les mises à jour, que vous utilisiez Ksplice, etc.

Quant à l'établissement de connexions réseau sortantes, vous pouvez le limiter, car certains sites Web n'ont pas besoin d'établir de telles connexions. Mais parfois, ils en ont besoin, par exemple, la plupart des sites Web devront se connecter à une base de données. Vous pouvez gérer cela avec des booléens SELinux, tels que :

# semanage boolean -l | grep httpd_can_network
httpd_can_network_relay        (off  ,  off)  Allow httpd to can network relay
httpd_can_network_connect_db   (off  ,  off)  Allow httpd to can network connect db
httpd_can_network_connect      (off  ,  off)  Allow httpd to can network connect
httpd_can_network_memcache     (off  ,  off)  Allow httpd to can network memcache
httpd_can_network_connect_cobbler (off  ,  off)  Allow httpd to can network connect cobbler

Réglage de httpd_can_network_connect permet toutes les connexions réseau sortantes vers n'importe quel endroit ; les autres sont plus restrictives et n'autorisent que la connexion à chaque service spécifique.


Rappelez-vous également que si vous utilisez nginx et php-fpm, que php n'est pas restreint par SELinux jusqu'à CentOS 6.6 et 7.

0 votes

Très bonne réponse. Une chose que je voudrais ajouter est que SELinux ne peut pas faire certaines des choses que le PO demande, mais pour y parvenir, le PO pourrait vouloir utiliser SElinux en combinaison avec les conteneurs Linux (sous quelque forme que ce soit).

0 votes

Même avec le booléen [httpd_can_network_connect] défini comme faux (comme tous les autres httpd_can_network*), PHP est toujours capable de se connecter à l'extérieur.

0 votes

@jbrsn Vous avez oublié d'indiquer votre version de CentOS, et vous devriez regarder votre version de selinux-policy également.

0voto

AntonMZ Points 26

Vous avez besoin de la commande block system en php ? Vérifiez la directive php

disable_functions =

Ça ?

0voto

c4f4t0r Points 5014

De mon point de vue /etc/passwd doivent être lisibles par tous les utilisateurs du système.

Votre script php s'exécute avec l'utilisateur apache, donc il est normal que le script puisse lire /etc/passwd

Dans le virtualhost apache, j'utilise "php_admin_value open_basedir /var/www/example.com" vous pouvez faire la même chose pour upload_tmp_dir y session.save_path

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X