Installer plusieurs versions de PHP avec les Software Collection sous CentOS 7

Les Software Collection (SCL) permettent d’installer plusieurs versions d’un programme sur un même système, c’est le choix parfait pour avoir plusieurs versions de PHP installées sur un même serveur web.


Ajouter PHP 7.3 à mon serveur

Sur mon serveur web Nginx, je possède plusieurs versions de PHP, notamment un vieux PHP 5.4 pour de vieux projets et PHP 7.0. Je veux mettre à jour mes sites en PHP 7.3 avec les SCL.

Installation de PHP 7.3

yum install php73

L’installation est maintenant faite dans le répertoire /opt/remi/php73, la configuration quant à elle est dans /etc/opt/remi/php73.

Pour installer d’autres modules PHP 7.3, il faut le faire en préfixant les paquets par php73-, comme ceci :

yum install php73-php-json php73-php-pecl-memcached php73-php-xml php73-php-fpm php73-php-mcrypt php73-php-mbstring php73-php-pecl-mysql php73-php-pdo php73-php-pecl-igbinary php73-php-mysqlnd php73-php-gd php73-php-tidy

Configuration du pool de PHP FPM

La configuration du pool se fait dans le fichier /etc/opt/remi/php73/php-fpm.d/www.conf. Par défaut FPM écoute sur un socket TCP, moi j’utilise un socket UNIX, voici le contenu des parties éditées du fichier www.conf, le reste ne change pas :

user = nginx
group = nginx
listen = /var/opt/remi/php73/run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666

Je démarre le service PHP FPM pour PHP 7.3 et je l’active au démarrage du serveur :

systemctl start php73-php-fpm
systemctl enable php73-php-fpm

Pour rappel, voici la partie relative à PHP FPM de la configuration d’un server Nginx :

location ~ \.php$ {
        include                         fastcgi_params;
        fastcgi_intercept_errors        on;
        fastcgi_read_timeout            240s;
        fastcgi_pass                    unix:/var/opt/remi/php73/run/php-fpm/www.sock;
        fastcgi_index                   index.php;
        fastcgi_param                   SCRIPT_FILENAME  $document_root	$fastcgi_script_name;
}

Tout site avec cette configuration fastCGI devrait désormais fonctionner avec PHP 7.3.

MySQL/MariaDB : Déterminer la taille recommandée de innodb_buffer_pool_size

Rapide mémo pour déterminer la taille recommandée du buffer pour les tables utilisant le moteur de stockage InnoDB de MySQL. Par défaut après installation cette valeur est en général à 128 Mo, ce qui peut être bien bas pour de grosses bases de données.


La requête ci-dessous retourne la taille à renseigner pour la valeur de la variable innodb_buffer_pool_size :

SELECT 
	CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS 
FROM (
	SELECT 
		SUM(data_length+index_length) Total_InnoDB_Bytes
	FROM information_schema.tables 
	WHERE engine='InnoDB'
) A;

Il suffit alors de renseigner cette valeur dans le fichier de configuration /etc/my.cnf :

[mysqld]
innodb_buffer_pool_size=8G

Redémarrer MySQL/MariaDB :

$ sudo systemctl restart mariadb

Sécuriser Memcached pour éviter des attaques par amplification

J’utilisais Memcached depuis des années sans soucis. Jusqu’à ce début de semaine.

Il aura fallu une méchante attaque sur un serveur de production pour mettre celui-ci à genoux (et le site d’e-commerce sous Magento qu’il hébergeait) à cause d’un Memcached mal configuré.


Pour les détails techniques de ce type d’attaque par amplification visant Memcached, se reporter à cet article sur le blog de CloudFlare : Memcrashed – Major amplification attacks from UDP port 11211.

Sécuriser Memcached

Par défaut Memcached écoute sur toute les interfaces et sur le protocole UDP. Il faut donc désactiver UDP et le faire écouter seulement en localhost :

$ sudo vim /etc/sysconfig/memcached

Ajouter (ou adapter) ceci dans le champ OPTIONS :

OPTIONS="-l 127.0.0.1 -U 0"

Redémarrage de Memcached :

$ sudo systemctl restart memcached

Vérification que Memcached écoute bien seulement 127.0.0.1 en TCP :

$ sudo netstat -plunt
(...)
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 31938/memcached

Mettre en place un accès SFTP en jail chroot pour un groupe spécifique

Lorsque cela est possible, il est préférable d’utiliser le protocole SFTP pour effectuer des transferts de fichiers sur un serveur plutôt que du FTP classique. Je vous propose aujourd’hui un petit mémo pour mettre en place un accès SFTP avec utilisateurs chrootés.

L’exemple de base est de donner un accès au fichiers d’un serveur web qui seront situé sous /var/www, dans mon cas sous CentOS 7.


Configuration du SFTP

  • Créer un groupe pour le SFTP :
    $ sudo groupadd sftp_users
  • Ajouter un utilisateur (ici web) pour le SFTP :
    $ sudo useradd web
  • Ajouter un mot de passe à l’utilisateur web :
    $ sudo passwd web
  • Ajouter l’utilisateur web au groupe pour le SFTP et lui attribuer le répertoire par défaut :
    $ sudo usermod -g sftp_users web
    $ sudo usermod -d /var/www web
  • Éditer le fichier de configuration du daemon SSH sous /etc/ssh/sshd_config.
    • Commenter la ligne suivante :
      #Subsystem sftp /usr/libexec/openssh/sftp-server
    • Ajouter ce qui suit :
      Subsystem sftp internal-sftp
      
      Match Group sftp_users
      	X11Forwarding no
      	AllowTcpForwarding no
      	ChrootDirectory %h
      	ForceCommand internal-sftp
  • Redémarrer le service SSH :
    $ sudo systemctl restart sshd
  • S’assurer que les permissions sont correctes pour le chroot, le répertoire /var/www doit appartenir à root et uniquement éditable par le propriétaire.

Test de l’accès SFTP

On teste l’accès en SFTP :

$ sftp web@mon-serveur
web@mon-serveur's password:
Connected to mon-serveur.
sftp> ls -l
drwxrwxr-x 2 0 48 4096 Oct 19 20:39 cgi-bin
drwxrwxr-x 2 0 48 4096 Mar 29 06:12 html
sftp> pwd
Remote working directory: /
sftp>

Test de l’accès SSH

L’accès ssh quant à lui est bien refusé :

$ ssh web@mon-serveur
web@mon-serveur's password:
This service allows sftp connections only.
Connection to mon-serveur closed.