technique:lemp_phpmyadmin

Installer serveur Web complet : Linux / Nginx / MariaDB / PHP (+ phpmyadmin)

Cas où on veut installer un serveur web complet à partir de Debian, avec PHP (plusieurs versions possibles), MySQL (mariaDB) et Phpmyadmin pour une administration simplifiée

Cette installation pourrait se faire dans un conteneur de Proxmox par exemple et héberger un ou des sites web comme Booked.

Doc : https://linuxhint.com/install_phpmyadmin_debian_10 (mais ici apache)

Conseils de RomainR : Installer Debian + Nginx + PHP-FPM pour pouvoir personnaliser plusieurs version de PHP

Cas de http://web.cemea.lan

Installer Debian 10 à partir d'un template fourni.

- Créer un CT, template Debain-10-standard avec un compte root, 1Go de Ram, 512 Mo de swap, 10 Go de disque, firewall désactivé.

- Se connecter en mode console en root via Proxmox (xterm.js), editer le fichier /etc/ssh/sshd_config et changer le mode d'autorisation de connexion de root :

PermitRootLogin Yes

Quitter l'édition du fichier sshd_config et relancer le service ssh

systemctl restart sshd.service

- Identifier son IP (ip a) et se connecter en SSH dessus depuis un client externe. La connexion avec root devrait fonctionner.

ssh root@ip_CT

Mettre à jour le CT

apt-get update && apt-get dist-upgrade

Installation du paquet mariadb et vérification du service :

apt install mariadb-server mariadb-client

systemctl status mariadb

doit renvoyer “enabled” (lancé au démarrage) et “active (running)”

mysql_secure_installation

Par défaut le mot de passe root de mysql est vide, donc

Enter current password for root (enter for none): Enter

Puis définir le mot de passe “root” de Mysql (y) et entrer le mot de passe.

- On supprime le compte anonyme par défaut

Remove anonymous user (Y/n) : y

- On désactive les connexions distantes et donc on restreint les connexions root aux connexions locales

Disallow root login remotely (Y/n) :  y

- Suppression de la base “test” :

Remove Test database an access (Y/n) : y

- Prise en compte immédiate des changements (Y/n) : y

Et c'est tout bon.

On peut tester l'accès à mysql avec

mysql -u root -p

+ mot de passe

Et on arrive sur la console mysql>

quit; ou \q pour quitter MySQL.

apt install nginx

Le serveur doit déjà être fonctionnel sur http://ip_CT (“Welcome to nginx” , page présente dans /var/www/html/ )

apt install php php-fpm php-mysql

Le service doit être actif :

systemctl status php7.3-fpm

Service Loaded : “enabled” et “active (running)”

On peut aussi rajouter des modules complémentaires utiles comme : php-gd, php-json, php-zip (à compléter…).

Création d'un virtualhost (pour héberger un site-espace web) (un fichier “default” existe pour modèle).

nano /etc/nginx/sites-available/monsite

On définir le port d'écoute, les fichiers lus, son nom, son emplacement (root) et le socket associé (.sock)

server {
   listen 80;
        root /var/www/dossiersite;
        index index.php index.html index.htm;
        server_name monsite.cemea.lan; # entree DNS du site

        location / {
            try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.3-fpm.sock;
        }
}

On active le virtualhost avec un lien symbolique vers sites-enabled

ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/monsite

Et on redémarre nginx par sécurité (on ne redémarre qu'en cas de plantage ou changement de version, sinon on reloade simplement)

systemctl restart nginx.service

On teste avec :

echo "<?php phpinfo(); ?>"> /var/www/dossiersite/info.php

On peut effacer le virtualhostpar défaut (ou le conserver)

rm /etc/nginx/sites-enabled/default

Et relancer nginx

systemctl restart nginx

Et on vérifie sur : https://ip_CT/info.php

on devrait voir un tableau d'infos sur la version de PHP et les modules activés.

https://www.itzgeek.com/how-tos/linux/debian/how-to-install-phpmyadmin-with-nginx-on-debian-10.html

https://kifarunix.com/install-phpmyadmin-with-nginx-on-debian-10-buster/

https://www.digitalocean.com/community/tutorials/how-to-install-phpmyadmin-from-source-debian-10

- Installer les pré-requis :

apt install php-{mbstring,zip,gd,xml,pear,gettext,cgi}

On adapte le PHP-FPM

nano /etc/php/7.3/fpm/php.ini

et on modifie le cgi.fix_pathinfo (FIXME A quoi ça sert ?)

cgi.fix_pathinfo=0

Puis on redémarre le service

systemctl restart php7.3-fpm.service

- Téléchargement de la dernière version depuis le site officiel : https://www.phpmyadmin.net/downloads/ et extraction dans /var/www/phpmyadmin

cd /root/ && wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.zip

unzip phpMyAdmin-5.0.2-all-languages.zip # installer unzip si besoin

mv phpMyAdmin-5.0.2-all-languages /var/www/phpmyadmin

- Copie du fichier de config par défaut

cp -pr /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php

Edition du fichier et modification du secret pour génération de cookies : nano /var/www/phpmyadmin/config.inc.php

$cfg['blowfish_secret'] = 'longuechaineagenererauhasard'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

Création des tables initiales :

mysql </var/www/phpmyadmin/sql/create_tables.sql -u root -p

+ Mot de passe SQL de root

Super-admin de Phpmyadmin

Le compte root n'étant plus autorisé à se connecter à phpmyadmin, il vaut mieux créer un autre compte “admin”

On se connecte ensuite sur mysql et on attribue tous les privilèges à un utilisateur “admin” :

mysql -u root -p

+ Mot de passe SQL de root

Pour créer un utilisateur avec son mot de passe (à personnaliser) et tous les privilèges sur toutes les bases :

TODO : changer le mot de passe d'accès 'motdepasse' !!!

GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'motdepasse';

FLUSH PRIVILEGES;

pour la prise en compte immédiate des changements.

Virtualhost pour Phpmyadmin

On crée un virtualhost pour phpmyadmin

nano /etc/nginx/sites-available/phpmyadmin

et on complète son contenu (en utilisant la valeur du sock pour PHP-FPM trouvé dans /etc/php/7.3/fpm/pool.d/www.conf qui est la pool par défaut). On peut choisir le port (ici 8080) pour garder un vhost spécifique.

server {
   listen 8080;
   server_name pma.cemea.lan;
   root /var/www/phpmyadmin;

   location / {
      index index.php;
   }

## Images and static content is treated different
   location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
      access_log off;
      expires 30d;
   }

   location ~ /\.ht {
      deny all;
   }

   location ~ /(libraries|setup/frames|setup/libs) {
      deny all;
      return 404;
   }

   location ~ \.php$ {
      include /etc/nginx/fastcgi_params;
      fastcgi_pass unix:/run/php/php7.3-fpm.sock;
      # fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /var/www/phpmyadmin$fastcgi_script_name;
   }
}

Puis on active ce virtualhost :

ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enable/

On crée un dossier temporaire avec les droits associés (!!! Bizarre comme méthode ???)

mkdir /var/www/phpmyadmin/tmp

chmod 660 /var/www/phpmyadmin/tmp

On autorise www:data (utilisateur de nginx) à accéder au dossier :

chown -R www-data:www-data /var/www/phpmyadmin

Et on redémarre les services :

systemctl restart php7.3-fpm

systemctl restart nginx

On n'oublie pas d'ouvrir les ports 8080 :

ufw status # pour voir les ports ouverts
apt-get install ufw # si pas installé
ufw allow 8080

et on se connecte sur phpmyadmin sur http://IP_CT:8080

Et on peut se connecter à phpmyadmin avec l'utilisateur pma et le mot de passe choisi.

- Utiliser les dépot Sury de PHP à ajouter

https://packages.sury.org/php/

- Connecter les versions de PHP à différents sockets

- Personnaliser les virtualhosts à partir de ces sockets.

Des certifcats autosignés suffiraient. Let's encrypt (AC) et le client ACME Certbot ne sont utiles que pour des domaines valides (pas des docmaines locaux internes)

Pour la création de certificats autosignés, installer openssl :

apt-get install openssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

Réponses à apporter :

Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CEMEA
Organizational Unit Name (eg, section) []:DSI
Common Name (e.g. server FQDN or YOUR name) []:salles.cemea.lan
Email Address []:informatique@cemea.asso.fr

Création d'un groupe Diffie-Hellman

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Création d'une conf dédiée générique en éditant /etc/nginx/snippets/self-signed.conf

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

Création d'une conf dédiée générique avec chiffrement fort en éditant /etc/nginx/snippets/ssl-params.conf

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 9.9.9.9 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

Edition d'une configuration pour un site dédié en https : /etc/nginc.sites-enable/salles

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 302 https://$server_name$request_uri;
}

server {
    # SSL configuration
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;
}

Vérification de Nginx et redémarrage

nginx -t

systemctl restart nginx

Et le certificat est en place

  • technique/lemp_phpmyadmin.txt
  • Dernière modification: 2020/10/05 01:42
  • de francoisa