Cet article explique de manière succincte la configuration d’un serveur LAMP (Linux + Apache + MySQL/MariaDB + PHP) sur un serveur dédié sous CentOS 7. Si vous voulez en savoir un peu plus sur les briques logicielles qui constituent cette configuration, je vous invite à lire les articles respectifs dans ce blog.
Installer MySQL/MariaDB.
$ sudo yum install mariadb-server
Activer et démarrer le service.
$ sudo systemctl enable mariadb --now
Lancer la sécurisation de MySQL/MariaDB.
$ sudo mysql_secure_installation ... Enter current password for root (enter for none): [Entrée] ... Set root password? [Y/n] y New password: ********** Re-enter new password: ********** ... Remove anonymous users? [Y/n] y ... Disallow root login remotely? [Y/n] y ... Reload privilege tables now? [Y/n] y
Ouvrir la console MySQL avec le mot de passe que l’on vient de définir.
$ mysql -u root -p
Utiliser la base de données mysql.
MariaDB [(none)]> use mysql; Database changed
Garder la seule entrée pour root@localhost
et supprimer les deux autres.
MariaDB [mysql]> delete from user where host!='localhost'; Query OK, 2 rows affected (0.00 sec)
Vérifier le résultat de l’opération.
MariaDB [mysql]> select user, host, password from user; +------+-----------+-------------------------------------------+ | user | host | password | +------+-----------+-------------------------------------------+ | root | localhost | *6883419C147A759B04D78A2D1E4E0C5BB0CDD1B4 | +------+-----------+-------------------------------------------+ 1 row in set (0.00 sec)
Quitter la console.
MariaDB [mysql]> quit; Bye
Ouvrir les ports 80 et 443 dans le pare-feu.
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --reload
Installer Apache, le module SSL/TLS et Certbot.
$ sudo yum install httpd mod_ssl certbot
Récupérer mon script de génération de certificats si ce n’est pas déjà fait.
$ git clone https://gitlab.com/kikinovak/centos.git $ ls centos/el7/certbot/ letsencrypt.sh README.md
Mettre en place la page par défaut du serveur.
$ cd /var/www/ $ sudo mkdir -pv default/html mkdir: created directory ‘default’ mkdir: created directory ‘default/html’ $ sudo chown -R microlinux:microlinux default/ $ cp -R /usr/share/httpd/noindex/* default/html/
Éditer la page par défaut default/html/index.html
pour la différencier de la page de bienvenue du serveur.
<body> <div class="jumbotron text-center"> <div class="container"> <h1>sd-100246.dedibox.fr</h1> <p class="lead">This page is used to test...
Ranger le script de génération de certificats dans un endroit approprié comme ~/bin
avec les permissions qui vont bien.
$ cd $ cp -v centos/el7/certbot/letsencrypt.sh ~/bin ‘centos/el7/certbot/letsencrypt.sh’ -> ‘/home/microlinux/bin/letsencrypt.sh’ $ chmod 0700 ~/bin/letsencrypt.sh
Éditer le script et renseigner l’adresse mail de notification.
EMAIL='info@microlinux.fr'
Renseigner le nom d’hôte du serveur pour la page par défaut et supprimer les autres entrées.
DOMAIN[1]='sd-100246.dedibox.fr' WEBDIR[1]='default'
Tester la génération du certificat.
$ sudo ./letsencrypt.sh --test
Générer le certificat.
$ sudo ./letsencrypt.sh --cert
Sauvegarder la configuration d’Apache.
$ cd /etc/httpd/conf $ sudo cp -v httpd.conf httpd.conf.orig ‘httpd.conf’ -> ‘httpd.conf.orig’ $ cd /etc/httpd/conf.d/ $ sudo cp -v ssl.conf ssl.conf.orig ‘ssl.conf’ -> ‘ssl.conf.orig’
Éditer /etc/httpd/conf/httpd.conf
en adaptant la configuration.
# /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
KeepAlive on
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin info@microlinux.fr
ServerName sd-100246.dedibox.fr
<Directory />
AllowOverride none
Require all denied
</Directory>
<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" \
combinedio
</IfModule>
CustomLog "logs/access_log" common
</IfModule>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset off
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
Éditer /etc/httpd/conf.d/ssl.conf
.
# /etc/httpd/conf.d/ssl.conf Listen 443 https SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog SSLSessionCache shmcb:/run/httpd/sslcache(512000) SSLSessionCacheTimeout 300 SSLRandomSeed startup file:/dev/urandom 256 SSLRandomSeed connect builtin SSLCryptoDevice builtin # Disable TLS 1.0 & TLS 1.1 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA # Cipher preferences SSLHonorCipherOrder on # HSTS Header always set Strict-Transport-Security \ "max-age=63072000; includeSubDomains" # Clickjacking Header always set X-Frame-Options DENY # MIME sniffing Header always set X-Content-Type-Options nosniff
Configurer l’hôte virtuel pour la page par défaut du serveur.
# /etc/httpd/conf.d/00-sd-100246.dedibox.fr-ssl.conf # # http://sd-100246.dedibox.fr -> https://sd-100246.dedibox.fr <VirtualHost *:80> ServerName sd-100246.dedibox.fr Redirect / https://sd-100246.dedibox.fr </VirtualHost> # https://sd-100246.dedibox.fr <VirtualHost _default_:443> ServerAdmin info@microlinux.fr DocumentRoot "/var/www/default/html" ServerName sd-100246.dedibox.fr:443 SSLEngine on SSLCertificateFile /etc/letsencrypt/live/sd-100246.dedibox.fr/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/sd-100246.dedibox.fr/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/sd-100246.dedibox.fr/fullchain.pem BrowserMatch "MSIE [2-5]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 ErrorLog logs/sd-100246.dedibox.fr-error_log CustomLog logs/sd-100246.dedibox.fr-access_log common </VirtualHost>
Tester la configuration.
$ sudo apachectl configtest Syntax OK
Activer et lancer Apache.
$ sudo systemctl enable httpd --now
Vérifier le bon fonctionnement du serveur.
$ systemctl status httpd
Ouvrir la page par défaut dans un navigateur web.
Lancer un audit de qualité pour le chiffrement.
Activer les dépôts SCL si ce n’est pas déjà fait.
$ sudo yum install centos-release-scl
Installer PHP 7.2.
$ sudo yum install rh-php72 rh-php72-php-fpm rh-php72-php-mysqlnd
Éditer un fichier /etc/httpd/conf.d/php-fpm.conf
.
AddType text/html .php DirectoryIndex index.php <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch>
Créer un lien symbolique /usr/bin/php
.
$ cd /usr/bin/ $ sudo ln -s /opt/rh/rh-php72/root/usr/bin/php .
Créer un fichier /etc/opt/rh/rh-php72/php.d/20-date.ini
pour configurer le fuseau horaire.
[Date]
; Defines the default timezone used by the date functions
; ; http://php.net/date.timezone
date.timezone = Europe/Paris
Prendre en compte les modifications.
$ sudo systemctl enable rh-php72-php-fpm --now $ sudo systemctl restart httpd
Éditer un fichier /var/www/default/html/phpinfo.php
pour tester PHP.
<?php echo phpinfo(); ?>
Afficher la page dans un navigateur web.
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.