Depuis la version 7 de php, suphp ne fonctionne plus.
Pour info, suphp permettait de faire tourner php avec l’uid et le gid du propriĂ©taire du fichier php: IdĂ©al pour sĂ©curiser un hĂ©bergement mutualisĂ© avec plusieurs sites et propriĂ©taires diffĂ©rents.
Voici une mĂ©thode pour faire de mĂȘme avec php7 en php-fpm et les paquets rĂ©mi sous Centos 8 ou/et dĂ©rivĂ© de Redhat 8.
Chaque site est associé à un utilisateur qui publie ses fichiers php avec son uid et gid via un serveur sftp.
Pour chaque site, un groupe de process php-fpm est lancĂ© avec l’uid et gid correspondant Ă l’utilisateur.
Ainsi un process php d’un site A ne peut pas accĂ©der au process et rĂ©pertoire disque d’un site B. Il en est de mĂȘme avec la publication sftp chrootĂ©.
Installation Centos 8
- Selinux disabled
- DĂ©pots tiers
dnf install epel-release -y
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf config-manager --set-enabled PowerTools
dnf config-manager --set-enabled remi
- Paquets php installés:
|
|
Conf sftp only et chroot
Les utilisateurs dans le groupe groupchroot ne peuvent faire que du sftp dans leur répertoire (pas de shell, pas de ssh!)
- Modification du fichier /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
PermitRootLogin yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UsePrivilegeSeparation sandbox
PrintMotd no
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp internal-sftp
# -----------------------------
Match Group groupchroot
ChrootDirectory %h
AllowTCPForwarding no
X11Forwarding no
#-------------------------------
HostbasedAuthentication yes
Match Group groupchroot
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /home
CrĂ©ation d’un site monsite.fr associĂ© Ă l’user moi
- CrĂ©ation de lâuser et ajout dans le groupe groupchroot pour le ssh
adduser moi
usermod -G groupchroot moi
passwd moi
- Modification des droits et création lien symbolique
chown root:root -R /home/moi
mkdir /home/moi/public_html
chown moi:root -R /home/moi/public_html
chmod 755 -R /home/moi/public_html
ln -s /home/moi/public_html /var/www/html/monsite.fr
- Création du daemon php cloisonné pour cet user (un fichier par site web)
vi /etc/php-fpm.d/monsite.fr.conf
Exemple:
[monsite.fr]
user = moi
group = moi
## La socket
listen = /var/run/php-fpm/monsite.fr.sock
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1
pm = ondemand
pm.max_children = 50
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 35
## TUNER le log pour le site
slowlog = /var/log/php-fpm/www-slow-monsite.fr.log
php_admin_value[error_log] = /var/log/php-fpm/monsite.fr-error-too.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]= /var/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache
- Reload du daemon php
systemctl reload php-fpm
- Creation du VHOST Dans apache
vi /etc/httpd/conf.d/monsite.fr.conf
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
<VirtualHost *:80>
ServerName monsite.fr
DocumentRoot /var/www/html/monsite.fr
ErrorLog logs/monsite.fr-error_log
CustomLog logs/monsite.fr-access_log common
#### METTRE ICI LA SOCKET ######
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php-fpm/monsite.fr.sock|fcgi://localhost"
</FilesMatch>
#### METTRE ICI LE REPERTOIRE ####
<Directory /var/www/html/monsite.fr>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</directory>
</VirtualHost>
- Reload du daemon apache
systemctl reload httpd
Donc l’idĂ©e de base Ă©tait de cloisonner la publication sftp et l’exĂ©cution du daemon php.
Les conf sont des exemples, cela doit ĂȘtre adaptĂ© au niveau de sĂ©curisation souhaitĂ©, notamment pour Apache (Droit .htaccess, Allow …) et php (disable de commande, max_size …), mais la base est lĂ .
TCHAO