Table des matières
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 "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 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 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 :
<VirtualHost *:80> ServerAdmin dedibox@labomedia.net ServerName artlabo.org DocumentRoot "/home/artlabo/www" <Directory /home/artlabo/www> Options -Indexes FollowSymLinks MultiViews AllowOverride All </Directory> #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 </VirtualHost> <VirtualHost *:80> ServerName www.artlabo.org Redirect permanent / http://artlabo.org/ </VirtualHost>
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
- 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 :
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
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
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 <html><youruser></html> kvm # adduser <html><youruser></html> libvirt
You should then be able to list your domains:
# virsh list --all
libvirt defaults to qemu:///session for non-root. So from <youruser>
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
Sécuriser le serveur
Quelques howTo / tips :
- 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
Test de l'api
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
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 :
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 : 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