======Serveur====== **Pour différentes raisons, il est intéressant de pouvoir installer et administrer son propre serveur et ses propres services internet (mail, partage de fichier, outils de communication et de collaboration) afin d'en garder la maîtrise, les raisons :** * Garder ses données "à la maison" ou les confier à un tiers de confiance plutôt qu'aux supermarchés américains qui en font commerce (les chères GAFAM) * Disposer de services internet autonomes dont on garde la maitrise, ces services étant, pour ceux que l'on va aborder ici, FLOSS * Assurer une forme de [[http://wiki.labomedia.org/images/6/6a/Dossier-st-fr-2014-07-05.pdf|"souveraineté technologique"]] * Apprendre comment fonctionnent ces outils et systèmes informatiques afin de mieux comprendre leurs tenants et aboutissants **A ce titre, le projet de [[http://yunohost.org/|Yunohost]] est tout à fait intéressant pour installer facilement un ensemble d'outils en ligne (voir aussi plus bas)** ===== Installation d'un serveur sous Debian ===== ** //' Voir la page dédiée à L'[[Installation_d'un_serveur_web_sous_Debian_GNU Linux|Installation d'un serveur web sous Debian GNU Linux]] : Installation de base, Utilitaires et paquets utiles, SSH, FTP avec VSFTPD, Firewall avec IPTables ...//'** //note : pour booter sur une clef USB sur les serveurs DELL que l'on a récup, il faut indiquer dans le BIOS : "émulation de disque dur" pour la clef et au menu de choix du boot, choisir le disque dur, l'option clef USB apparait alors (sinon missing image bin iso ...)// ===== Installer Flask sous apache ===== Flask est un module web en python http://flask.pocoo.org/ su apt-get install python-pip python-virtualenv virtualenv venv source venv/bin/activate env pip install flask find venv/ flask run ls mkdir flaskprojet cd flaskprojet/ nano hello.py python hello.py nano /etc/apache2/sites-available/artlabo.org service apache2 reload a2enmod proxy a2enmod proxy_http service apache2 reload python hello.py chown artlabo: flaskprojet/ chown -R artlabo: flaskprojet/ chown -R artlabo: venv/ Le serveur tourne sur le port 5000, un petit proxy dans apache pour rediriger ce port 5000 vers un répertoire, cela donne pour /etc/apache2/sites-available/artlabo.org : ServerAdmin dedibox@labomedia.net ServerName artlabo.org DocumentRoot "/home/artlabo/www" Options -Indexes FollowSymLinks MultiViews AllowOverride All #ErrorLog /var/log/apache2/sites/artlabo.org.error.log LogLevel crit #CustomLog /var/log/apache2/sites/artlabo.org.access.log combined ProxyPass /flask http://localhost:5000 ProxyPassReverse /flask http://localhost:5000 ServerName www.artlabo.org Redirect permanent / http://artlabo.org/ Si on lance une appli flask : source ~/venv/bin/activate pip install XXX (éventuellement) python hello.py Test en mieux sur le nouveau serveur : export FLASK_APP=hello.py flask run * Running on [[http://127.0.0.1:5000/| http://127.0.0.1:5000/]] elle est désormais consultable sur http://libviz.artlabo.org (anciennement http://artlabo.org/flask) ===== Installer un certificat via letsencrypt pour disposer du https ===== **Jusqu'à récemment, il fallait donner des $$$ à des organismes de certification pour pouvoir disposer d'un certificat "valide" qui permet de proposer une connexion au serveur via https sans que les internautes aient besoin de valider un certificat indiqué comme n'étant pas de confiance par le navigateur.** Grâce à l'initiative "letsencrypt", c'est désormais possible de faire cela gratuitement * https://letsencrypt.org/ * Pour installer un certificat sur nginx, un tutoriel : https://memo-linux.com/configurer-le-serveur-web-nginx-en-https-avec-letsencrypt-sous-debian-jessie/ * Le certificat est valable 3 mois, il convient d'automatiser son renouvellement https://vincent.composieux.fr/article/install-configure-and-automatically-renew-let-s-encrypt-ssl-certificate * Voir aussi ce tutoriel https://blog.sebian.fr/letsencrypt/ ==== Pour les parano ==== Il est possible d'utiliser let's encrypt même sans lui confier votre compte root. Dans cet exemple, on va supposer que vous avez le droit d'écrire dans le dossier /srv/www et que ce dossier pointe vers la racine du serveur pour lequel vous souhaitez générer un certificat. D'abord, créer un virtualenv avec ` virtual ~/.le_env activer l'environnement avec source ~/.le_env/bin/activate et installer le module avec pip install letsencrypt Si tout ce passe bien, vous pourrez lancer l'utilitaire en tapant ~/.le_env/bin/letsencrypt même si le virtualenv n'est pas activé. Ensuite, il faut préparer la configuration pour let's encrypt. Par défaut, il écrit ses fichiers de log dans /var/logs et ses fichiers de travail dans /etc/letsencrypt. Cela risque de poser des soucis si on ne veux pas travailler en root. Le but du premier bloc de configuration, plutôt générique, est de régler ce problème. config-dir = /home/user/.config/letsencrypt work-dir = /home/user/.local/share/letsencrypt logs-dir = /home/user/.local/share/letsencrypt/logs rsa-key-size = 4096 text = True agree-tos = True On remarqueras qu'il n'y a pas de guillement. De plus, les valeurs sont utilisé tel quel, un symbole ~ ne sera pas remplacé par le dossier utilisateur. Si les valeurs ne commencent pas par un symbole slash, elle seront prise comme un dossier dans le répertoire de travail. L'option text permet de ne pas avoir besoin de l'utilitaire "dialog" et agree-tos permet d'avoir une question en moins. Ensuite viennent les informations en rapport avec le certificat que vous allez demander. email = user@exemple.com authenticator = webroot webroot-path = /srv/www domains = exemple.com, www.exemple.com authenticator indique que l'on va réutiliser un serveur http existant, webroot-path dans quel dossier le serveur prend ses document et domains indique l'ensemble des domaines pour lesquels le domaine sera valide. Enregistrez les deux bloc dans le même fichier, "exemple.com.ini" par exemple. Finalement, il suffit de lancer let's encrypt. ~/.le_env/bin/letsencrypt certonly -c ~/exemple.com.ini "certonly" permet de préciser qu'on ne veux que récupérer les certificats, on s'occupera nous même de les installer à la bonne place. Vous pouvez aussi enregistrer la configuration sous "~/.config/letsencrypt/cli.ini" et ne pas préciser l'option -c. Voilà, vous avez vos certificats dans le dossier "~/.config/letsencrypt/live". Vous n'avez plus qu'a configurer vos services pour les utiliser. ===== Installer Yunohost pour déployer rapidement un ensemble d'applications web ===== * Le site de référence : https://yunohost.org/#/ * La liste des applications maintenues par yunohost https://yunohost.org/#/apps_fr * Maintenues par la communauté https://yunohost.org/#/apps_in_progress_fr * Pour installer Yunohost sur une Debian Jessie, on passe par un script https://yunohost.org/#/install_on_debian_fr Yunohost utilise plutot nginx, du coup en installant la Debian, il ne faut pas cocher "Serveur web" sinon Apache va manger le port 80 Installez git sudo apt-get install git Clonez le dépôt du script d’installation de YunoHost git clone [[https://github.com/YunoHost/install_script| https://github.com/YunoHost/install_script]]  /tmp/install_script L’utilisateur root doit avoir un mot de passe, si ce n’est pas le cas, créez en un (sinon le script d’installation échoue): sudo passwd root Lancez le script d’installation cd /tmp/install_script && sudo ./install_yunohostv2 Il faut ensuite se connecter au serveur via un navigateur web, une fois l'installation terminée, l'écran du serveur (s'il existe) indique l'adresse IP sur laquelle il faut se connecter * Il faudra définir un mot de passe administrateur * Et un nom de domaine, soit on dispose d'un domaine ou d'un sous-domaine que l'on fait pointer sur le serveur, soit on utilise un dyndns proposé par yunohost de type labomedia.nohost.me * Une fois tout ça réaliser, installer des applications, ça donne : {{media_13:yunohostlabo.png|vignette|centré|640px|Interface listant les applis dans YuNoHost vignette|centré|640px|Interface listant les applis dans YuNoHost}} ===== Installer un serveur cache pour les paquets debian et ubuntu ===== Avec Cacher-ng installé sur un serveur local, tous les ordinateurs de ce réseau local configurés pour l'interroger vont télécharger les paquets une fois sur le serveur de cache, ils seront ensuite disponibles pour les autres ordinateurs locaux ==== Install & config ==== sudo apt-get install apt-cacher-ng Les paquets sont stockés dans ls -al /var/cache/apt-cacher-ng/ Le serveur proxy tourne sur le port 3142 par défaut, possible d'accéder à des pages web d'administration, mot de passe à configurer là sudo nano /etc/apt-cacher-ng/security.conf  [[http://localhost:3142| http://localhost:3142]] * tuto détaillé https://blog.sleeplessbeastie.eu/2013/09/15/how-to-setup-apt-caching-proxy/ ==== Configurer un client pour utiliser le cacher-ng ==== Créer le fichier suivant sudo nano /etc/apt/apt.conf.d/00proxy et y mettre Acquire::[[http::Proxy| http::Proxy]]  "[[http://dev.lobotomie.org:3142| http://dev.lobotomie.org:3142]] "; remplacer dev.lobotomie.org par l'adresse du serveur sudo apt-get update ===== Virtualiser le serveur ===== * https://wiki.debian.org/fr/SystemVirtualization * https://wiki.debian.org/KVM aptitude install qemu-kvm libvirt-bin virtinst In order to be able to manage virtual machines as regular user you should put this user into the kvm and libvirt groups: # adduser   kvm # adduser   libvirt You should then be able to list your domains: # virsh list --all libvirt defaults to qemu:%%//%%/session for non-root. So from you'll need to do: virsh --connect qemu:///system list --all === Config réseau === Installer apt-get install bridge-utils vde2 Configurer le bridge # Interface eth0 is unchanged auto eth0 iface eth0 inet dhcp # Virtual interface auto tap0 iface tap0 inet manual vde2-switch -t tap0 # Bridge for containers auto br0 iface br0 inet static bridge-ports tap0 address 192.168.1.1 netmask 255.255.255.0 === Installation du Linux sur la machine virtuelle === root@dev:/srv/isos# mkdir /srv/kvm root@dev:/srv/isos# virsh pool-create-as srv-kvm dir --target /srv/kvm Pool srv-kvm created Créer et installer la machine virt-install --connect qemu:///system --virt-type kvm --name virtserver1 --ram 1024 --disk /srv/kvm/virtserver1.qcow,format=qcow2,size=10 5 --cdrom /srv/isos/debian-8.3.0-amd64-netinst.iso --network bridge=br0 --vnc --os-type linux --os-variant debianjessie * réf : https://debian-handbook.info/browse/stable/sect.virtualization.html ===== Sécuriser le serveur ===== * https://www.debian.org/doc/manuals/securing-debian-howto/index.en.html Quelques howTo / tips : * https://www.linode.com/docs/security/securing-your-server * http://serverfault.com/questions/11659/what-steps-do-you-take-to-secure-a-debian-server * https://confs.imirhil.fr/20170513_root66_securite-admin-sys/#1 Slides de la conférence de Aéris plus audio ici https://confs.imirhil.fr/20170513_root66_securite-admin-sys.ogg ==== Restreindre l'accès au serveur ssh en ne permettant que le log avec clef ==== #Privilege Separation is turned on for security UsePrivilegeSeparation yes AllowUsers labomedia # mettre les users authorisés PasswordAuthentication no # pas d'authentification par password # Authentication: LoginGraceTime 120 #PermitRootLogin without-password StrictModes yes RSAAuthentication yes PubkeyAuthentication yes # permet le log par clef AuthorizedKeysFile %h/.ssh/authorized_keys ==== Activer des notifications SMS via free.fr lorsque quelqu'un se connecte en ssh sur le serveur ==== Possible d'activer chez Free les notifications par SMS sur son mobile et d'envoyer un SMS via une requête web sur le serveur de free : * Créer un script "smsfree.sh" sur le serveur : #!/bin/sh if [ "$PAM_TYPE" != "open_session" ]; then # echo "pas open session" exit 0 fi NEWLINE_CHAR="%0D%0A" # Valeurs possibles : %0A, %0D et %0D%0A SMSAPI_BASEURL="https://smsapi.free-mobile.fr" SMSAPI_SEND_ACTION="sendmsg" USER_LOGIN="VotreID" API_KEY="LaClefDonnéeParFree" MESSAGE_HEADER="Connexion SSH${NEWLINE_CHAR}--${NEWLINE_CHAR}" MESSAGE_FOOTER="${NEWLINE_CHAR}--${NEWLINE_CHAR}Serveur: `hostname -s`" MESSAGE_TO_SEND="date: `date`${NEWLINE_CHAR}login: $PAM_USER${NEWLINE_CHAR}from: $PAM_RHOST" FINAL_MESSAGE_TO_SEND="$MESSAGE_HEADER$MESSAGE_TO_SEND$MESSAGE_FOOTER" HTTP_STATUS_CODE=$(curl --get "${SMSAPI_BASEURL}/${SMSAPI_SEND_ACTION}" --data "user=${USER_LOGIN}" --data "pass=${API_KEY}" --data "msg=${FINAL_MESSAGE_TO_SEND}") if [ "$HTTP_STATUS_CODE" -eq 200 ]; then # echo "API responded with 200: exiting with 0" exit 0 else echo "Error: API responded with $HTTP_STATUS_CODE" exit 1 fi * Le placer dans /usr/bin par exemple, puis chmod +x smsfree.sh * Modifier le fichier /etc/pam.d/ssh en ajoutant en dernière ligne : session    optional     pam_exec.so    /usr/bin/smsfree.sh * voir https://github.com/C-Duv/freemobile-smsapi-client et (script obsolète) http://www.alain-olivetti.fr/index.php?article28/utilisation-du-service-de-notification-par-sms-de-free Test de l'api [[https://smsapi.free-mobile.fr/sendmsg?user=XXXXXXXX&pass=XXXXXXXXXXXXXX&msg=Hello%20World%20| https://smsapi.free-mobile.fr/sendmsg?user=XXXXXXXX&pass=XXXXXXXXXXXXXX&msg=Hello%20World%20]] ! ===== Optimiser la vitesse d'un serveur web ===== Vaste sujet ... ==== une ligne de commande pour tester la rapidité de la réponse d'un serveur web ==== curl --trace-time -vI https://labomedia.org ==== Inspecter la page avec Chromium > réseau pour identifier les lenteurs ==== * [[https://wp-rocket.me/blog/how-to-reduce-ttfb-wordpress-site/|How to Reduce Time to First Byte and Load Your WordPress Site Faster]] * [[https://hackernoon.com/solving-time-to-first-byte-ttfb-in-wordpress-5e6aeb03a8e|Solving Time to First Byte ( TTFB )]] ==== Optimiser la configuration d'apache ==== Attaque DDOS ? cette commande donne la listes des IP connectées actuellement au serveur web netstat -an | egrep ':80|:443' | grep ESTABLISHED | awk '{print $5}' | grep -o -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort -n | uniq -c | sort -nr Dans la config apache, changer le (à vérifier) ServerName localhost par ServerName 127.0.0.1 Find which Multi-Processing Module (MPM) is currently in use: apache2ctl -V | grep MPM Changer la configuration For MPM Event: nano /etc/apache2/mods-enabled/mpm_event.conf For MPM Prefork: nano /etc/apache2/mods-enabled/mpm_prefork.conf Références : * [[https://www.jeffgeerling.com/blog/3-small-tweaks-make-apache-fly|3 Small Tweaks to make Apache fly]] * [[https://support.plesk.com/hc/en-us/articles/214529205-Apache-keeps-going-down-on-a-Plesk-server-server-reached-MaxRequestWorkers-setting|Apache keeps going down on a Plesk server: server reached MaxRequestWorkers setting]] * [[https://www.tecmint.com/apache-performance-tuning/|5 Tips to Boost the Performance of Your Apache Web Server]] ==== Optimiser la configuration de mysql ==== * Activer les logs pour les slow queries ==== Faire des opérations sur la base de données avec Adminer ==== Un utilitaire pratique équivalent à phpmyadmin qui tient en un seul fichier php : [[https://www.adminer.org/#download|adminer]] éventuellement installer : php7.2-mysql (adapter la version de php) placer le fichier adminer à un endroit accessible du web, idéalement le sécuriser derrière un mot de passe Auth Digest via le serveur web {{tag>bj serveur linux}}