Serveur LAMPCet article explique de manière succincte la configuration d’un serveur LAMP (Linux + Apache + MariaDB + PHP) sur un serveur dédié sous Rocky Linux 8. 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 le serveur de bases de données MariaDB :

# dnf install -y mariadb-server

Activer et démarrer le service :

# systemctl enable mariadb --now

Lancer la sécurisation initiale de MariaDB :

# 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
...
Remove test database and access to it? [Y/n] y
...
Reload privilege tables now? [Y/n] y
...
All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Ouvrir le moniteur MariaDB 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

Afficher les utilisateurs :

MariaDB [mysql]> select user, host, password from user;
+------+-----------+-------------------------------------------+
| user | host      | password                                  |
+------+-----------+-------------------------------------------+
| root | localhost | *F424CF5D03C9AAE965E86FBF001AAB078229EDEB |
| root | 127.0.0.1 | *F424CF5D03C9AAE965E86FBF001AAB078229EDEB |
| root | ::1       | *F424CF5D03C9AAE965E86FBF001AAB078229EDEB |
+------+-----------+-------------------------------------------+
3 rows in set (0.000 sec)

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.001 sec)

Vérifier le résultat de l’opération :

MariaDB [mysql]> select user, host, password from user;
+------+-----------+-------------------------------------------+
| user | host      | password                                  |
+------+-----------+-------------------------------------------+
| root | localhost | *F424CF5D03C9AAE965E86FBF001AAB078229EDEB |
+------+-----------+-------------------------------------------+
1 row in set (0.000 sec)

Quitter le moniteur MariaDB :

MariaDB [mysql]> quit;
Bye

Ouvrir les ports 80 et 443 dans le pare-feu :

# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https
# firewall-cmd --reload

Installer Apache, le module SSL/TLS et Certbot :

# dnf install -y httpd mod_ssl certbot

Récupérer mon script de génération de certificats Let’s Encrypt :

# cd
# git clone https://gitlab.com/kikinovak/rocky-8-server
# ls rocky-8-server/el8/certbot/
mkcert.sh
# mkdir -v bin
mkdir: created directory 'bin'
# cp -v rocky-8-server/el8/certbot/mkcert.sh bin/
'rocky-8-server/el8/certbot/mkcert.sh' -> 'bin/mkcert.sh'
# cd bin/
# chmod +x mkcert.sh

Éditer le script et renseigner l’adresse mail de notification et les domaines hébergés :

#!/bin/bash
#
# mkcert.sh

# Create certs group
if [ ! $(getent group certs) ] 
then
  echo "Adding group certs with GID 240."
  groupadd -g 240 certs
fi

# Stop Apache
if ps ax | grep -v grep | grep httpd > /dev/null
then
  echo "Stopping Apache server."
  systemctl stop httpd 1 > /dev/null 2>&1
fi

# Generate SSL/TLS certificate
certbot certonly \
  --non-interactive \
  --email info@microlinux.fr \
  --preferred-challenges http \
  --standalone \
  --agree-tos \
  --force-renewal \
  -d sd-155842.dedibox.fr \
  -d slackbox.fr \
  -d mail.slackbox.fr \
  -d www.slackbox.fr \
  -d unixbox.fr \
  -d mail.unixbox.fr \
  -d www.unixbox.fr

# Permissions
echo "Setting file permissions."
chgrp -R certs /etc/letsencrypt
chmod -R g=rx /etc/letsencrypt

# Start Apache
echo "Starting Apache server."
systemctl start httpd

exit 0

Générer le certificat :

# ./mkcert.sh

Mettre en place la page par défaut du serveur :

# cd /var/www
# cp -v /usr/share/testpage/index.html html/
'/usr/share/testpage/index.html' -> 'html/index.html'
# chown -R nobody:nobody html/

Éditer la page par défaut html/index.html pour la différencier de la page de bienvenue du serveur (aux alentours de la ligne 226) :

  </style>
  </head>
  <body>
    <h1>HTTP Server <strong>sd-155842.dedibox.fr</strong></h1>

    <div class='row'>
    ...

Sauvegarder la configuration d’Apache :

# cd /etc/httpd/conf
# mv -v httpd.conf httpd.conf.orig
renamed 'httpd.conf' -> 'httpd.conf.orig'
# cd /etc/httpd/conf.d/
# mv -v ssl.conf ssl.conf.orig
renamed 'ssl.conf' -> 'ssl.conf.orig'

Installer mes templates :

# cd /root/rocky-8-server/el8/httpd/
# cp -v httpd.conf /etc/httpd/conf/
'httpd.conf' -> '/etc/httpd/conf/httpd.conf'
# cp -v ssl.conf /etc/httpd/conf.d/
'ssl.conf' -> '/etc/httpd/conf.d/ssl.conf'
# cp -v 00-sd-155842.dedibox.fr-ssl.conf /etc/httpd/conf.d/
'00-sd-155842.dedibox.fr-ssl.conf' -> '/etc/httpd/conf.d/00-sd-155842.dedibox.fr-ssl.conf'

Éditer /etc/httpd/conf/httpd.conf en adaptant la configuration :

# /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin info@microlinux.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

Vérifier les options globales dans /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
SSLCryptoDevice builtin
# Cipher preferences
SSLHonorCipherOrder on
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM
# 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

Adapter la configuration de l’hôte virtuel pour la page par défaut du serveur :

# /etc/httpd/conf.d/00-sd-155842.dedibox.fr-ssl.conf
#
# http://sd-155842.dedibox.fr -> https://sd-155842.dedibox.fr
<VirtualHost *:80>
  ServerName sd-155842.dedibox.fr
  Redirect / https://sd-155842.dedibox.fr
</VirtualHost>

<VirtualHost _default_:443>
  ServerAdmin info@microlinux.fr
  DocumentRoot "/var/www/html"
  ServerName sd-155842.dedibox.fr
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/sd-155842.dedibox.fr/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/sd-155842.dedibox.fr/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/sd-155842.dedibox.fr/fullchain.pem
  BrowserMatch "MSIE [2-5]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
  ErrorLog logs/sd-155842.dedibox.fr-error_log
  CustomLog logs/sd-155842.dedibox.fr-access_log common
</VirtualHost>

Tester la configuration :

# apachectl configtest
Syntax OK

Activer et lancer Apache :

# 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 HTTPS

Lancer un audit de sécurité pour le chiffrement :

Qualys Labs SSL Test

Activer le module PHP 7.4 qui bénéficie d’un support à long terme jusqu’en 2029 par Red Hat :

# dnf module -y reset php
# dnf module -y enable php:7.4

Installer PHP 7.4 et les modules de base :

# dnf module -y install php:7.4/common
# dnf install -y php-mysqlnd

Créer un fichier /etc/php.d/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 :

# systemctl restart httpd php-fpm

Éditer un fichier /var/www/html/phpinfo.php pour tester PHP :

<?php
  phpinfo();
?>

Afficher la page dans un navigateur web :

Infos PHP

Notre serveur LAMP est prêt. Nous voilà armés jusqu’aux dents pour installer des applications 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.

 


0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *