Créer et configurer un serveur web sous Gnu-Linux à domicile et accessible en ligne

De TravauxIndse
Révision datée du 21 mai 2019 à 12:14 par Xantin.preser@indse.be (discussion | contributions) (Vérifications)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

Obtenir un nom de domaine

Pour cela, rien de plus simple, rendez-vous sur freenom, c'est un service de nom de domaine gratuit donc vous n'aurez pas de .be ou de .com mais à ce moment là vous pouvez vous rendre sur d'autres sites pour les obtenir.

Ensuite allez dans "services", "register a new domain", et puis créer votre nom de domaine (vous pourrez choisir plusieurs ".quelque chose" vous êtes libre d'en prendre 1 ou 10 si ça vous chante mais dans notre cas vous n'en utiliserez qu'un.

Créer un serveur web en localhost

Prérequis

  • Ubuntu 18.04 ou raspbian (si vous disposez d'un raspberry)
  • Permissions "Racines" (root)
  • Un peu de motivation :)
  • Quelques connaissance en code même si je vais essayer d'être clair :)

Installation d'Apache

La première étape est donc d'installer apache, pour cela rendez-vous dans le terminal et écrivez ceci :

Afin de ne pas rencontrer de problèmes de demande de droit de super administrateur dans le terminal,tapez d'abord cette commande et mettez votre mot de passe si demandé : Dans les autres commande, j'ai mis des sudo, mais ils ne sont pas obligé, du moment que vous êtes en super administrateur

 sudo su 

et puis ceci :

 apt-get update && apt-get install apache2 

Pour vérifier qu'apache a bien été installé vous pouvez taper localhost dans votre navigateur web qui est le l’hôte virtuel local d'apache de base.

Normalement si ça fonctionne vous devriez avoir une page comme ceci :

Default apache page.png

Si vous avez d'autres soucis, le lien du tutoriel original est dans les sources.

Il existe une autre façon de faire [ici], mais je n'ai pas fait de la même façon et je vais aller un peu plus loin.

Création d'un nouvel hôte virtuel

Faites bien attention à bien remplacer les "example" par le nom de votre site et les ".localhost" ou "local" par le domaine que vous avez choisi (par exemple: .cf)

Nous allons commencer par créer le dossier où seront stockée les pages de notre site, pour cela faites :

sudo mkdir /var/www/example && echo "Welcome to example!" > /var/www/example/index.html

cela va aussi créer une page html où il sera affiché : "Welcome to example"

Il faut alors configurer notre hôte virtuel, pour cela vous avez le choix  :

Soit l'édition en mode console

 sudo nano /etc/apache2/sites-available/example.conf 

Soit l'édition en mode graphique (bloc-note) :

Mais pour cela, vous devez d'abord installer gedit :

 sudo apt-get install gedit 
 sudo gedit /etc/apache2/sites-available/example.conf 

Collez alors ceci dans le menu l'interface qui s'est ouverte (TODO : expliquer ce fichier):

<VirtualHost *:80>
ServerName example.local
ServerAlias www.example.local

DocumentRoot /var/www/example
</VirtualHost>

Et sauvegarder le document

Pour activer notre site, il faut alors utiliser la commande a2ensite qui va aussi créer un fichier similaire dans le dossier /etc/apache2/sites-enabled :

 sudo a2ensite example.conf 

Nous devons alors relancer la configuration serveur apache :

sudo systemctl reload apache2.service

Pour vérifier si notre configuration fonctionne, il faut associer l'adresse ip de notre machine avec le nom de notre serveur Pour connaitre votre adresse ip sous linux, dans le terminal entrez la commande :

ifconfig

Les chiffres qui sont situés après inet qui est dans la partie lo sont l'adresse ip de votre machine. Copiez le, nous allons le réutiliser.

Entrez alors la commande :

sudo echo "adresse.ip.de.votre.machine www.example.local" >> /etc/hosts

Normalement si votre configuration est ok, si vous essayez d'aller sur www.example.local depuis votre machine vous devriez avoir "Welcome to example" qui s'affiche sur votre site

Rendre le serveur disponible depuis l'extérieur

Ouverture des ports de votre box

Maintenant que vous avez créer votre serveur, il serait plus utile de le rendre disponible depuis l'extérieur. Pour cela il va falloir ouvrir les ports de sa box afin de pouvoir accéder a une partie de votre réseau local depuis l'extérieur et établir une redirection/une actualisation d'IP

Pour l'ouverture des ports cela dépendra de votre box, possédant une bbox Proximus, je vais vous montrer la démarche à faire pour celle-ci. La démarche pour les autres box devrait être assez similaires, mais renseignez-vous.

  • Première étape : Passer en sécurité faible

Avec proximus, les port 80, 443 et 23 sont bloqués, pour notre serveur nous avons besoin du 80 et du 443, il faut alors passer en sécurité faible afin de les utiliser. Rendez-vous sur le site MyProximus et connectez-vous avec le compte qui gère votre internet. Après avoir fait ceci sélectionner la page : "mes produits" puis cliquez sur votre pack internet. De là plusieurs fenêtres s'affichent, allez dans paramètres, sélectionnez sécurité faible et validez (Ne vous inquiétez pas on ne va pas vous pirater plus facilement pour la cause).


  • Deuxième étape : Ouvrir les ports de votre box et établir une redirection vers votre ordinateur

Maintenant que vos ports sont débloqué, il va falloir accéder aux paramètre de votre box pour les "mapper"; pour ça rien de plus simple, sur votre navigateur recherchez 192.168.1.1. Là une page s'affiche et demande de vous connecter, pas besoin de nom d'utilisateur, juste d'un mot de passe, il se trouve derrière votre box Userpasswordproximus.png

Après vous être connecté, nous allons d'abord fixer l'adresse de votre machine (elle pourrait changer, donc on prend des précautions), rendez-vous dans la page "Mon Modem" puis dans "DHCP" cliquez sur "ajouter une adresse statique" et ajoutez-y votre machine (normalement le nom que vous lui avez donnez doit apparaître). TODO Maintenant que vous avez fait cela, allez dans la page "Contrôle d'accès" puis dans "Mappage des ports". Là il faut alors établir 3 redirections de ports :

*Le port 80 : ce que nous appelons Internet (La plupart des pages internet commencent par "http")
*Le port 443 : ce que nous appelons aussi Internet mais c'est sécurisé (Si le pages internet ne commencent pas par "http" elles commencent par "https")
*Le port 22 : Protocole ssh, en ouvrant ce port nous pouvant accéder à notre machine à distance et la modifier en ligne de code (de façon sécurisée)

Ajoutez alors trois redirections de port, choisissez alors les 3 cités au dessus; il faut alors définir vers quelle machine votre modem va les rediriger, collez donc l'adresse Ip de votre machine (adresse que vous aviez déjà copié auparavant) là où on vous demande l'hôte interne.

Service d'Ip dynamique : Cloudflare

Puisque vos ports sont ouverts, il est temps de rendre votre serveur accessible sur Internet, pour cela il existe plusieurs services différents qui permettent d'établir une redirection d'une recherche Internet vers votre Ip, j'ai choisi cloudflare, qui fonctionne un peu différemment car j'avais des problèmes de configuration avec ma box, un désavantage de ce service, c'est qu'il peut collecter les mots de passe, si ceux-ci n'ont pas été cryptés (à vérifier).

Rendez-vous alors sur le site de cloudflare et créez vous un compte. La suite est très step by step : On vous demande d'ajouter un site, écrivez alors le nom de votre site : example.local et allez à l'étape suivante.

- Cliquez sur next

- Choisissez le plan qui vous conviens (dans mon cas : gratuit)

- Vous arrivez alors sur une page où Cloudflare dit scanner les dns existants, ignorez cette page et cliquez juste sur continuer

- Cloudflare vous demande alors de changer les noms de serveurs. Rendez-vous sur freenom (et oui il nous est de nouveau utile) reconnectez vous et allez dans "Services" -> "Domains" -> Sur la ligne de votre domaine : "Manage domain" -> "Management tool" -> "Names servers" Cliquez sur "Use custom nameservers" Puis copiez les 2 noms de serveurs donnés par cloudflare dans les NameServer 1 et NameServer 2 (un dans chaque). Finalement enregistrez.

- Rendez vous de nouveau sur cloudflare et continuez.

- Maintenant vous arrivez sur une nouvelle page, cliquez sur DNS afin d'ouvrir un page qui ressemble à ceci :

Cloudflaredns.png

Bon vous n'avez pas réellement ça, c'est ce que vous devriez avoir après avoir suivi ces quelques consignes :

Si vous avez déjà des choses en dessous de la ligne "Type Name Value ..." Supprimez les, nous allons en créer de nouveaux.

Maintenant, décochez le nuage orange (Le nuage gris fait que vous utilisez cloudflare seulement comme une redirection d'ip)

Dans le A : Dans "Name" entrez votre site (example.local) et Modifiez votre adresse ip pour qu'elle corresponde à la votre (nous automatiserons ceci dans la partie en dessous, mais pour la première fois faites le manuellement. Pour avoir votre adresse ip actuelle, rendez-vous sur mon-ip. Puis ajoutez-le (Add record).

Ajouter CNAME : à coté du bouton add record choisissez CNAME (à la place du A) puis dans name, tapez www et dans le domaine name mettez le nom de votre domaine (example.local), décochez le nuage puis cliquez sur add record.

Puis de la même façon que pour le CNAME, ajoutez en un autre sauf qu'à la place du www, mettez juste le nom de votre site example et ajoutez le aussi.

Voilà, vous avez mis votre site en ligne, mais sans certificat, votre site sera considérer comme dangereux dans la plupart des navigateurs qui empêcheront les visiteurs d'y accéder (on peut toujours y accéder mais il faut chercher un peu et les gens détestent chercher)


Actualisation de votre adresse Ip

Votre site est maintenant accessible depuis le monde et que vous renvoyez bien les requêtes vers votre machine, tout devrait fonctionner YOUPI, sauf que pas vraiment, le seul "petit" problème qu'il nous reste à régler : votre adresse Ip. À l'heure actuelle les fournisseurs d'accès internet utilisent encore l'IpV4 son inconvénient est qu'il n'y en a pas assez pour tout le monde, votre modem change alors d'adresses Ip et ce de manière aléatoire. Pour pallier cela,nous utiliser une api (un logiciel qui tourne pour un autre logiciel) qui va automatiquement actualiser votre Ip. Au départ cloudflare mettait à disposition une Api, mais celle-ci n'est plus mise à jour. Je vous conseille alors d'utiliser celle dont je vais explique l'installation ci-dessous :

  1. Premièrement, si vous êtes toujours en mode SuperAdmin (avec la commande sudo su), il va vous falloir quitter ce mode afin de ne pas créer de fichier à la racine de votre raspberry. pour cela, tapez
     exit 
    ou faites Ctrl + d dans le terminal.
  2. Ensuite, créez un dossier sur votre Raspberry (il s’appellera cf) :
     mkdir cf 
  3. Maintenant entrez dans ce fichier
     cd cf 
    et créer le fichier cloudflaredyndns.sh : soit en nano soit ne gedit (suivant l'interface que vous préférez)
     nano cloudflaredyndns.sh 
    ou
     gedit cloudflaredyndns.sh 

Lorsque ce dernier est créer entrez ceci dedans :

#!/bin/bash
# CloudFlare as Dynamic DNS
# From: https://letswp.io/cloudflare-as-dynamic-dns-raspberry-pi/
# Based on: https://gist.github.com/benkulbertis/fff10759c2391b6618dd/
# Original non-RPi article: https://phillymesh.net/2016/02/23/setting-up-dynamic-dns-for-your-registered-domain-through-cloudflare/

# Update these with real values
auth_email="email@example.com"
auth_key="global_api_key_goes_here" 
zone_name="example.com"
record_name="home.example.com"

# Don't touch these
ip=$(curl -s http://ipv4.icanhazip.com)
ip_file="ip.txt"
id_file="cloudflare.ids"
log_file="cloudflare.log"

# Keep files in the same folder when run from cron
current="$(pwd)"
cd "$(dirname "$(readlink -f "$0")")"

log() {
    if [ "$1" ]; then
        echo -e "[$(date)] - $1" >> $log_file
    fi
}

log "Check Initiated"

if [ -f $ip_file ]; then
    old_ip=$(cat $ip_file)
    if [ $ip == $old_ip ]; then
        log "IP has not changed."
        exit 0
    fi
fi

if [ -f $id_file ] && [ $(wc -l $id_file | cut -d " " -f 1) == 2 ]; then
    zone_identifier=$(head -1 $id_file)
    record_identifier=$(tail -1 $id_file)
else
    zone_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$zone_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1 )
    record_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json"  | grep -Po '(?<="id":")[^"]*')
    echo "$zone_identifier" > $id_file
    echo "$record_identifier" >> $id_file
fi

update=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" --data "{\"id\":\"$zone_identifier\",\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\"}")

if [[ $update == *"\"success\":false"* ]]; then
    message="API UPDATE FAILED. DUMPING RESULTS:\n$update"
    log "$message"
    echo -e "$message"
    exit 1 
else
    message="IP changed to: $ip"
    echo "$ip" > $ip_file
    log "$message"
    echo "$message"
fi

Maintenant il vous faut modifier les 4 lignes suivantes :

auth_email="email@example.com"
auth_key="global_api_key_goes_here" 
zone_name="example.com"
record_name="home.example.com"

À la place de :

  • email@example.com : entrez l'adresse e-mail de votre compte cloudflare
  • global_api_key_goes_here : mettez votre "Global Api key" de cloudflare (pas de panique, je vais expliquer): Allez sur votre profil cloudflare, ensuite descendez jusqu'à ce que vous arriviez dans la rubrique Api keys et cliquez sur view de la global Api. C'est cette suite de lettre et chiffre qui constitue l'Api key.
  • example.com : mettez votre nom de zone, normalement c'est le nom le nom de domaine que vous avez mis sur cloudflare
  • home.example.com : il vous suffit d'entrer le A name que vous avez configuré sur cloudflare pour votre domaine


Maintenant que vous avez changé les différents paramètres, vous pouvez sauvegarder votre fichier et quitter l'édition. Il va maintenant falloir modifier les autorisations du fichier. Pour cela, changez de répertoire afin de revenir afin de revenir au /home de votre raspberry

 cd 

Après avoir changé de répertoire autoriser le fichier que vous avez créer :

 chmod +x /cf/cloudflaredyndns.sh 

Vous pouvez maintenant lancer le script en l'exécutant :

 sudo cf/cloudflaredydns.sh 

Si tout fonctionne bien dans votre fichier cf, il devait y avoir 3 nouveaux fichiers : cloudflare.ids cloudflare.log et ip.txt Et votre ip sur cloudflare devrait être actualisée.

Installation d'un certificat auto signé

Comme je l'ai dit précédemment, pour que les visiteurs puissent accéder à votre site, vous allez devoir utiliser un certificat qui montre que votre site est fiable et que les données sont cryptées. Pour cela, nous allons utilisez Let's Encrypt, une autorité qui permet d'avoir des certificats de manière légale. Vous allez donc installer certbot, leur système qui permet de créer ces certificats. Puisque, normalement, example.localhost redirige toutes les connexions vers votre serveur, vous pouvez utilisez Let's Encrypt.

Faites donc la commande :

sudo apt-get install certbot python-certbot-apache

Après l'avoir installé, lancez le :

sudo certbot --apache

La suite est assez step-by-step :

- Il vous est demandé de donner votre adresse e-mail , entrez-là, elle servira a vous prévenir quand il vous faudra renouveler le certificat (il a une durée de 90 jours)

- Acceptez les termes d'utilisation : A majuscule et Enter

- Il vous est également demandé si vous voulez donner votre adresse e-mail pour recevoir des newsletter, à vous de choisir si vous les acceptez ou non

- Là le programme vous demande "Which names would you like to activate HTTPS for?" : Ne choisissez que l'option où il est écrit example.localhost et non www.example.localhost (Normalement l'option 1 et puis validez)

- Si tout fonctionne, vous devez maintenant choisir si vous vous voulez rediriger toutes les connexion vers la connexion sécurisée (Https) ou non : Je vous conseille l'option 2 afin que toutes les requêtes envoyées à votre site soient redirigées vers l'Https.

- Normalement si tout fonctionne certbot vous dira un message de félicitation du style :

 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://example.localhost

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=example.localhost
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.localhost/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.localhost/privkey.pem
   Your cert will expire on yyyy-mm-dd. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Lancement au démarrage

Votre serveur fonctionne parfaitement, super, votre adresse ip est actualisée automatiquement, mais le script ne le fait que lorsque vous l'exécuter, alors comment faire ? Il suffit de dire au raspberry de lancer le script à intervalle régulier, pour cela, il suffit d'utiliser cron qui est un programme qui permet d'exécuter des scripts.

 sudo crontab -e 

Il vous suffit d'ajouter une ligne pour lancer le script à l'intervalle que vous souhaitez :

Voici un exemple pour 1 fois toutes les 15 minutes :

 */15 * * * * /bin/bash /home/pi/cf/cloudflaredyndns.sh 

Vous pouvez le modifier comme vous voulez

Chaque étoile représente, dans l'ordre : les minutes, les heures, les jours, les mois et les années.

Le fait de mettre une étoile signifie que ça prend tout donc toutes les minutes, heures,...

Et le /15 indique que toutes (*) les 15 minutes (/15) vous exécutez ce qui est mis après.

Vérifications

Votre serveur web est maintenant fonctionnel et actualise son ip automatiquement, vous pouvez donc vous y connecter quand vous le voulez (Il est possible que votre ip change après l'exécution du script, dans le pire des cas il faudra attendre le temps d'intervalle que vous avez déterminé moins 1 seconde. Il ne vous reste plus qu'à vérifier si l'ip s'actualise bien et ce automatiquement, mais puisque l'ip change de manière aléatoire, essayez de redémarrer votre box (ça peut faire changer l'ip) ou attendez (mais ça peut prendre du temps).


Voilà, votre serveur web est maintenant terminé, vous pouvez l'utiliser comme un hébergeur pour un site web en modifiant la page que vous aviez créé pour les tests ou en ajoutant de nouvelles pages.

Sources :

Création serveur web : https://linuxconfig.org/install-apache-on-ubuntu-18-04-bionic-beaver-linux

Certificat auto-signé Let's Encrypt : https://certbot.eff.org/lets-encrypt/debianstretch-apache

Script d'actualisation d'ip : https://letswp.io/cloudflare-as-dynamic-dns-raspberry-pi/

Fonctionnement de crontab : https://www.linuxtricks.fr/wiki/cron-et-crontab-le-planificateur-de-taches