YesWiki


YesWiki est une solution logicielle libre permettant de déployer simplement un wiki sur un serveur Web. YesWiki est caractérisé par son aspect collaboratif et son accesibilité, chacun pouvant, si il y est autorisé, modifier le contenu d'une page par un simple double clic.
YesWiki peut également prendre la forme d'un CMS (système de gesiton de contenu) à l'instar de Wordpress. Un comparatif de ces deux solutions est d'ailleurs disponible via ce lien.

Pour cette instalation, nous utiliseront la distribution Linux Debian 10. Un guide d'installation de cette dernière est disponible à ce lien.

Installation et configuration serveur

Un serveur Web est un service permettant de répondre à des interractions sur un réseau internet ou externe, généralement internet.Pour ce faire, les serveurs Web utilisent principalement le protocole HTTP, permettant le transfert de fichiers entre un serveu et les utilisateurs dudit serveurs, généralement appelés clients.

Si vous n'avez pas de logiciel serveur installé sur votre machine, il vous faudra, pour ce tutoriel, choisir entre Apache et Nginx, et non pas d'installer les deux. Un comparatif entre ces deux solutions logicielles est disponible ici.
Installation du serveur Web :
- Apache
apt install apache2
curl localhost
Cacher les en-têtes liées au serveur
/etc/apache2/conf-available/security.conf
ServerSignature Off
ServerTokens Prod
Activer un virtualhost :

Les Headers de sécurité
- Nginx
apt install nginx
curl localhost

Régler le pare-feu (écoute uniquement sur les ports 80 et 443)

Cacher les en-têtes liées au serveur
Infos serveurs
sed -i 's/\# server_tokens/server_tokens/' /etc/nginx/nginx.conf

Headers (https://scotthelme.co.uk/hardening-your-http-response-headers/#server, observatory.mozilla.org)
Apache : Header always set Header_name 'Header_value'
Nginx : add_header Header_name 'Header_value' always;
- Content Security Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"
- Strict-Transport-Security "max-age=31536000; includeSubdomains" (à définir dans backend)
- X-Frame-Options "SAMEORIGIN"
- X-Xss-Protection "1; mode=block"
- X-Content-Type-Options "nosniff"




Lorsque vous hébergez vous même votre propre serveur, il est vivement recommandé de mettre en place un pare-eu. En effet, ce sytème de sécurité permet de rendre votre service accessible qu'aux utilisateurs agrées, tout en vous protégeant de l'execution de commandes indésirables.
Nous utiliserons ici ufw, un outil de configuration simplifié du pare-feu Netfliter :

sudo apt-get install ufw

Afin de rendre votre service accesible depuis l'exterieur de votre structure, nous allons procéder à une ouverture de ports. Un port est comparable à une porte permettant au monde exterieur d'accèder à votre serveur via votre routeur ou box internet. Par sécurité, ces ports sont fermés par défaut, il faut donc les ouvrir vair l'interface d'aministration de votre box ou routeur. Malheureusement, la méthode d'ouverture de ces ports diffère en fonction de chaques forunisseur d'accès internet (SFR, Orange, Free...)...
Cependant, une recherche internet du type "ouverture ports box" suvit du nom de votre fournisseur internet devrait vous permettre de trouver la marche à suivre 😉.

Il vous faudra donc préalablement ouvrir le port 80 sur votre box ou routeur via les protocole TCP et UDP, pour rediriger les utilisateurs externes vers l'adesse IP de votre serveur, adresse qui est en quelque sorte son numéro d'identification internet. Cette adresse IP peut-être récupérée en lançant la commande suivante :

sudo ip a

Ce qui nous donne quelque chose ressemblant à ceci:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if152:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 8e:fb:71:1f:fa:61 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.228/24 brd 192.168.1.255 scope global dynamic eth0
       valid_lft 72407sec preferred_lft 72407sec
    inet6 fe80::8cfb:71ff:fe1f:fa61/64 scope link 
       valid_lft forever preferred_lft forever            

L'adresse IP est ci dessus surlignée en jaune. Nous pouvons faire en sorte que le parre feux accepte les requètes des utilisateurs passant par le port 80 ainsi que les requètes provenant du protocole HTTP :

sudo apt install ufw
sudo ufw allow 80/tcp
sudo ufw allow 80/udp
sudo ufw allow 'Nginx HTTP'


On active ufw au démarage du serveur :

sudo systemctl enable ufw
sudo ufw enable


Vous pouvez vérifier les changements en exécutant :

sudo ufw status

Le résultat de cette commande vous montrera via ces quelques lignes lignes que les trafics exterieurs passant par le port 80 et via le protocole de communication HTTP est désormais autorisé :

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere                  
80/udp                     ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
80/tcp (v6)                ALLOW       Anywhere (v6)             
80/udp (v6)                ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)             

Vous pouvez maintenant vérifier que votre serveur est opérationnel en tapant dans la bare d'URL de votre moteur de recherche l'adresse IP que vous avez précédement récupéré, ce qui devrait nous donner :

image WikiInstall_Capture_du_Nginx.png (53.1kB)

Si c'est le cas, félicitation ! Votre serveur Ngnix est désormais opérationnel 😁.
Nous commençons par réaliser une mise à jour du système à l'aide du terminal via la commande apt update, suivi d'un apt install pour installer Apache ainsi que son module PHP, dont nopus verrons l'utilité plus tard:

sudo apt update
apt install apache2 libapache2-mod-php


L'on peux s'assurer qu'apache s'active au démarage grâce à la commande suivante

systemctl enable apache2

On peut au passage activer quelques fonctionalités d'Apache qui ous seront sans doute utiles plus tard :

a2enmod headers
a2enmod rewrite
a2enmod deflate


Puis l'on redémare le serveur pour prendre en compte les changements :

systemctl reload apache2

Lorsque vous hébergez vous même votre propre serveur, il est vivement recommandé de mettre en place un pare-eu. En effet, ce sytème de sécurité permet de rendre votre service accessible qu'aux utilisateurs agrées, tout en vous protégeant de l'execution de commandes indésirables.
Nous utiliserons ici ufw, un outil de configuration simplifié du pare-feu Netfliter :

sudo apt-get install ufw

Afin de rendre votre service accesible depuis l'exterieur de votre structure, nous allons procéder à une ouverture de ports. Un port est comparable à une porte permettant au monde exterieur d'accèder à votre serveur via votre routeur ou box internet. Par sécurité, ces ports sont fermés par défaut, il faut donc les ouvrir vair l'interface d'aministration de votre box ou routeur. Malheureusement, la méthode d'ouverture de ces ports diffère en fonction de chaques forunisseur d'accès internet (SFR, Orange, Free...)...
Cependant, une recherche internet du type "ouverture ports box" suvit du nom de votre fournisseur internet devrait vous permettre de trouver la marche à suivre 😉.

Il vous faudra donc préalablement ouvrir le port 80 sur votre box ou routeur via les protocole TCP et UDP, pour rediriger les utilisateurs externes vers l'adesse IP de votre serveur, adresse qui est en quelque sorte son numéro d'identification internet. Cette adresse IP peut-être récupérer en lançant la commande suivante :

sudo ip a

Ce qui nous donne quelque chose ressemblant à ceci:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if152:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 8e:fb:71:1f:fa:61 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.228/24 brd 192.168.1.255 scope global dynamic eth0
       valid_lft 72407sec preferred_lft 72407sec
    inet6 fe80::8cfb:71ff:fe1f:fa61/64 scope link 
       valid_lft forever preferred_lft forever            

L'adresse IP est ci dessus surlignée en jaune. Nous pouvons faire en sorte que le parre feux accepte les requètes des utilisateurs passant par le port 80 ainsi que les requètes provenant du protocole HTTP :

sudo apt install ufw
sudo ufw allow 80/tcp
sudo ufw allow 80/udp
sudo ufw allow "Apache Full"


Il est possible que la comande "Apache Full" retourne l'erreur Could not find a profile matching 'Apache Full'. Dans ce cas, il nous faut créer un script permettant l'authorisation du trafic provenant du port 80 vers le serveur Apache, ce grâce à la commande suivante :

nano /etc/ufw/applications.d/Apache_Full

Ensuite, il vous suffit de copier les quelques lignes suivantes dans le fichier :

[Apache Full]
title=<Web Server(HTTP,HTTPS)>
description=<Apache v2 is the next generation of the omnipresent Apache web server.>
ports=80/tcp|80/udp

Il vous suffira alors d'effectuer les deux commandes suivantes pour qu'ufw prenne en compte et active le script nouvellement créé :

ufw app update "Apache Full"
sudo ufw allow "Apache Full"

On active ufw au démarage du serveur :

sudo systemctl enable ufw
sudo ufw enable


Vous pouvez vérifier les changements en exécutant :

sudo ufw status

Le résultat de cette commande vous montrera via ces quelques lignes lignes que les trafics exterieurs passant par le port 80 et via le protocole de communication HTTP est désormais autorisé :

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere                  
80/udp                     ALLOW       Anywhere                  
Apache Full                ALLOW       Anywhere                  
80/tcp (v6)                ALLOW       Anywhere (v6)             
80/udp (v6)                ALLOW       Anywhere (v6)             
Apache Full (v6)           ALLOW       Anywhere (v6)             

Vous pouvez maintenant vérifier que votre serveur est opérationnel en tapant dans la bare d'URL de votre moteur de recherche l'adresse IP que vous avez précédement récupéré, ce qui devrait nous donner :

image WikiInstall_Capture_du_20200701_103618.png (78.8kB)

Si c'est le cas, félicitation ! Votre serveur Apache est désormais opérationnel 😁.

Installation d'un système de gestion base de données

Une base de données est un ensemble d'informations ou données organisées en tableaux afin d'être facilement accessibles, gérées et mises à jour. Un système de gestion de base de données (SGBD) est un logiciel permettant de stocker, manipuler et accéder à ces données.

Deux modèles de bases de données se détachent :
  • les bases de données relationnelles. Elles sont constituées d’un ensemble de tableaux reliés entre eux par des relations. Au sein de ces tableaux, les données sont classés par catégories (ou attributs). Le langage standard pour manipuler ce genre de données est le Structured Query Langage (SQL). Parmi les plus connues, citons SQLite, Oracle, MySQL, MariaDB (fork de MySQL), PostgreSQL et Microsoft SQL Server.
  • les bases de données NoSQL. Plus récentes, elles présentent une architecture distribuée et permettent la manipulation de volumes de données importants. Elles sont en plein essor dans le contexte du Big Data. On retiendra comme logiciels Cassandra, MongoDB, Voldemort, CouchDB et SimpleDB.
Nous détaillons ci-dessous l'installation et l'utilisation des serveurs de base de données MariaDB et PostgreSQL compte tenu de la vaste documentation disponible.

Installation du serveur de base de données MariaDB

MariaDB s'installe via le paquet mariadb-server
apt install mariadb-server


Par défaut, le seul compte utilisateur disponible dans MariaDB est le compte root, non protégé par mot de passe. Ce comportement n’étant pas sécurisé, nous allons lancer un script de configuration: mysql_secure_installation qui permet de :
  • changer le mot de passe au compte root de MariaDB ;
  • empêcher les connexions anonymes ;
  • désactiver les connexions distantes réalisées avec le compte root ;
  • supprimer la base de test.

Pour pouvoir se connecter et administer la base de données du serveur MariaDB (resp. PostgreSQL) depuis un terminal, on installe le client correspondant apt install mariadb-client (resp. apt install postgresql-client)

La connexion à MariaDB (resp. PostgreSQL) s'effectue à l'aide de la commande mariadb -u db_user -D db_name -p (resp. psql -U db_user -d db_name -W)
db_name désigne le nom de la base de données et db_user le nom de l'utilisateur à utiliser.
Il est aussi possible d'utiliser mariadb (resp. psql) en mode non interactif, avec l'option -e : mariadb -u db_user -D db_name -p -e "SQL_expression" (resp. psql -U db_user -d db_name -W -c "SQL_expression"`)

Il est aussi possible d'utiliser l'application web Adminer (anciennement PhpMyAdmin) pour manipuler les bases de données SQL gérées par SQLite, MariaDB et PostgreSQL. Il suffit pour cela de télécharger le fichier adminer.php sur un serveur Web (HTTP+PHP) et d'y faire pointer son navigateur Web.

En général, une application web requiert la création d'un compte utilisateur et d'une base de données dédiée. Ceci peut se faire depuis le client avec les requêtes SQL suivantes
CREATE DATABASE db_name;
CREATE USER 'db_user' IDENFIED BY PASSWORD 'password';
GRANT ALL PRIVILEGES ON db_name.* TO 'db_user'@localhost IDENTIFIED BY 'password'
FLUSH PRIVILEGES;

db_name désigne le nom de la base de données, db_user le nom de l'utilisateur et password le mot de passe utilisateur.

Installation PHP

Un language de programation orienté serveur permet de générer des pages web dynamiquement en réponse aux actions du client. PHP est actuellement le langage le plus utilisé en production. A contrario d'une page statique dont le contenu est identique à chaque consultation, une page dynamique verra son contenu varier en fonction de différents paramètres (heure, nom de l'utilisateur, champs remplis, etc).

On peut commencer par installer le langage PHP
apt install php
pour l'utiliser comme un langage de programmation traditionnel
apt install php-cli
php -r 'echo "Hello World!";'
ou pour exécuter des scripts
echo '' > example.php
php -f example.php

Installation de PHP

Le serveur HTTP Apache interprète nativement le langage PHP en ajoutant le module libapache2-mod-php
apt install libapache2-mod-php

Pour les autres serveurs HTTP comme Nginx ou pour les sites à fort trafic, on utilise une interface appelée FPM (FastCGI Process Manager) permettant la communication entre un serveur Web et PHP, basée sur le protocole FastCGI
apt install php-fpm
Il faut alors configurer le serveur Web pour lui spécifier le socket Unix ou TCP ou l'adresse IP avec lesquels communiquer pour utiliser PHP. Dans le cas d'un serveur Nginx, on rajoutera par exemple dans la directive server du fichier de Virtual Host les lignes suivantes

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


Infos FastCGI (PHP)
X-Powered-By fpm/php.ini -> expose_php = Off

Afin de vérifier que PHP fonctionne correctement avec notre serveur HTTP, on peut créer le fichier info.php à la racine Web de notre serveur (/var/www/html) avec le contenu
<?php
phpinfo();

En consultant l'url <IP_adress>/info.php, on obtient alors la page suivante
image Capture_du_20200721_092040.png (48.1kB)

Modules de PHP


Il est souvent nécessaire d'ajouter des fonctionnalités au langage PHP en ajoutant des modules. La liste des modules installés est disponible via la commande
php -m

Les documentations officielles des différents services Web indique en général la liste des modules requis ou recommandé pour leur fonctionnement. Si celles-ci sont incomplètes, il peut-être parfois nécessaire de parcourir les logs d'erreur du serveur Web pour détecter les modules en défaut.
Parmi les modules courants, nous pouvons citer la liste suivante, issue de la documentation francophone d'Ubuntu :
- php-apcu : fournit des fonctionnalités supplémentaires au système de cache implémenté nativement dans PHP (OPcache)
- php-curl : support de cURL, qui permet de se connecter et de communiquer avec d'autres serveurs en HTTP, HTTPS, FTP, gopher, telnet, DICT, file ou LDAP,
- php-gd : outil de traitement d'images,
- php-imagick : outil de traitement d'images,
- php-imap : implémentations des protocoles IMAP, NNTP, et POP3 pour les courriels,
- php-intl : fonctions d'internationalisation,
- php-json : implémente le format d'échange de données JavaScript Object Notation,
- php-ldap : permet la connexion et l'envoi de requêtes sur un annuaire LDAP,
- php-mbstring : implémente des jeux de caractères très grands pour certaines langues,
- php-mysql : support de MySQL et MariaDB
- php-xml : analyseur syntaxique XML (permet à PHP de "comprendre" du XML ou du HTML),
- php-zip :offre la possibilité de lire et d'écrire des archives compressées ZIP, et d'accéder aux fichiers et dossiers s'y trouvant.

Les modules s'activent par défaut lors de leur installation. Il est possible de forcer leur activation ou désactivation à l'aide des commandes phpenmod et phpdismod

Installation de YesWiki

Afin de pouvoir stocker et gérer gérer les données relatives aux utilisateurs, YesWiki a besoin d'une base de donnée dédiée. Nous allons créer cette dernière en entrant dans l'interface de MariaDB.

mysql

Nous pouvons désormais créer une base de donnée vierge, que nous appelerons ici "wiki" :

create database wiki;

Maintenant que notre base de donnée est créée, nous allons créer un utilisateur pour cette base, en lui donnant tous les droits d'accès à celle-ci. N'oubliez pas de remplacer "nom_utilisateur" et "mot_de_passe" par le nom et le mot mot de passe que vous souhaitez accorder à ce futur utilisateur 😌.

grant all privileges on wiki.* TO 'nom_utilisateur'@'localhost' identified by 'mot_de_passe';

Sous Linux, les logiciels serveurs utilisent un groupe d'utilisateur nommé "www-data". Afin que le Wiki puisse être correctement créé, il est nécessaire d'accorder les droits d'accès à ce groupe au dossier contenant votre wiki, commme ceci :

sudo chown -R www-data:www-data /var/www/html/doryphore

Votre base de donnée est désomais créée et prête à être utilisée par votre Wiki !
Afin de télécharger la dernière version de YesWiki, prenez connaissance de la dernière version sortie en vous rendant sur ce lien.

Une fois que vous connaissez la dernière version, accèdez au dépot des différentes versions de Yeswiki ici.

Vous devriez arriver sur une page ressemblant à ceci :

image Capture_du_20200702_102600.png (12.1kB)

Cliquez sur le dossier dont le nom correspond à la version que vous shouaitez installer. Nous utiliseront ici la version doryphore, le contennu du dossier étant :

image Capture_du_20200702_102913.png (0.2MB)

Les fichiers qui nous intéressent sont les fichiers répondant au nom de "yeswiki-doryphore-date.zip".Il vous faudra le fichier ayant la date la plus récente.

Ouvrez maintenant un terminal sur votre machine qui hébergera le wiki, et placez vous dans le fichier qui sera la racine de votre wiki :

sudo cd /var/www/html

Vous allez maintenant pouvoir télécharger les fichiers d'installation de YesWiki. Pour ce faire, nous allons utiliser la commande wget, suivie de l'url menant vers le dépot de la version qui vous intéresse, complétée par le fichier "yeswiki-doryphore-date.zip" le plus récent, ce qui nous donne dans le cas présent :

sudo wget https://repository.yeswiki.net/doryphore/yeswiki-doryphore-2020-05-27-1.zip

Ce fichier étant une archive, nous devont extraire son contenu. Pour ce faire, nous allons installer et utiliser un logiciel nommé unzip :

sudo apt install unzip
sudo unzip yeswiki-doryphore-2020-05-27-1.zip


Nous n'avons désormais plus besoin de l'archive, vous pouvez supprimer cette dernière :

sudo rm -r yeswiki-doryphore-2020-05-27-1.zip

Vous pouvez dors et déjà accèder à votre Wiki en entrant l'adresse IP dans la bare d'Urlde votre navigateur, suivi d'un "/" suivi du nom de la version du wiki, en l'occurence doryphore:

adresse_ip_du_serveur/doryphore

Votre wiki vous acceuillera avec une page de configuration :

image Capture_du_20200702_120445.png (90.9kB)

Une fois sur cette page, il vous suffit de remplir les champs, les boutons "Aide" vous expliqueront comment 😁 .
Il faut juste savoir que le champ "Base de donnée MySQL" correspond au nom de la base de donnée que vous avez précédement créé, "Nom d'utilisateur MySQL" au au nom d'utilisateur que vous avez créé pour utiliser la base, et "Mot de passe MySQL" au mot de passe dudit utilisateur.

Après le remplissage de ces champs, cliquez sur "Continuer" et vous devrez normalement arriver sur cette page :

image Capture_du_20200702_121933.png (0.2MB)

Tadam ! votre Wiki fraichement installé est prêt à être utilisé !

Et ensuite ?

Pour le moment, votre Wiki n'est acessible que par l'adresse IP de la machine sur lequel il est implémenté. Au dela du fait que cette solution est loin d'être ergonomique, laisser apparaitre son adresse IP au yeux de tous est assz risqué...

La solution est de lier son adresse IP à ce que l'on appellle un nom de domaine, qui est un nom redirigeant les requètes des utilisateurs sur l'adresse IP.
A titre d'exemple, lorsque vous voulez aller sur Wikipededia, vous ne tapez pas son adresse IP dans la barre d'URL ou de recherche, vous tapez tout simplement... Wikipedia 🤷.

Vous pouvez obtenir un nom de domaine pour votre Wiki par différents prestataires, notament OVH.
Lorsque vous accèdez à certains sites, vous remarquerez que leur URL commence parfois (souvent) par HTTPS.l'HTTPS reprend le protocole HTTP tout en rajoutant une couche de sécurité nommé SSL. Cette couche permet nottament de chiffrer toutes les données échangées entre le client et le serveur, ce qui est préférable.
Afin d'ajouter cette couche, vous pouvez utiliser le service Certbot., proposant un certificat permttant l'activation du SSL sur votre site.
Il faut bien avouer que l'accès aux fichier du serveur et leur édition via le terminal est loin d'être ergonomique... de plus qe l'on ne peux pas y accèder à distance 😕.

Afin d'accèder au terminal de votre serveur depuis une autre machine, vous pouvez utiliser le protocole SSH, un tutoriel pour Debian est disponible ici.

Pour pouvoir accèder aux fichiers depuis une interface graphique et transférer des fichiers d'un d'ordinateur distant sur votre serveur, vous pouvez installer ce que l'on appelle un serveur FTP. Un tutoriel pour debian est disponible ici.
L'utilisation de ce protocole vous facilitera grandement la vie, notament pour les mises à jour de votre Wiki 😁.

Pour pouvoir accèder à vos fichiers depuis un réseau exterieur à celui sur lequel est connecté votre serveur, vous devrez procéder à une ouverture de ports de votre box ou routeurs internets. Par exemple, pour le SSH, le port utilisé par défaut est le port 22, et 21 pour le FTP.