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 La brique Internet est tout à fait intéressant pour installer facilement un ensemble d'outils et disposer d'un accès à Internet neutre en s'acoquinant avec un fournisseur d'accès idéalement issu de la fédération FFDN
Sommaire
- 1 Installation d'un serveur sous Debian
- 2 Installer et configurer nginx
- 3 Installer Flask sous apache
- 4 Installer un certificat via letsencrypt pour disposer du https
- 5 Installer Yunohost pour déployer rapidement un ensemble d'applications web
- 6 Installer un serveur cache pour les paquets debian et ubuntu
- 7 Virtualiser le serveur
- 8 Sécuriser le serveur
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 et configurer nginx
apt-get install nginx
Créer des virtual hosts ou Server Blocks
- suivi du tuto là : https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-14-04-lts
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/
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 /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 http://localhost:3142
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://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 <youruser> kvm # adduser <youruser> 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://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!