LAMPCet 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.

Apache SSL CentOS 7

Lancer un audit de qualité pour le chiffrement.

Qualys Labs SSL Test

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.

Infos PHP


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.