Ajout d'un readme

This commit is contained in:
EpicKiwi 2025-01-12 11:02:35 +01:00
parent 3bc7df43f1
commit 7d9922b994
Signed by: epickiwi
GPG Key ID: C4B28FD2729941CE

View File

@ -1,7 +1,81 @@
# Systeme d'archivage de Brochures
Site d'archivage de brochures et de documents PDF.
Les brochures sont uploadés par les utilisateurs et utilisatrices sur le site avec leur titre, l'auteur de la brochure et la date du jour.
Lors de l'upload, une page HTML est générée contenant ces informations et un lien vers la brochure uploadée.
L'URL de la brochure est générée aléatoirement pour que l'utilisateurice puisse retrouver son archive sans qu'il soit possible publiquement de naviger dans les brochures déjà archivées. C'est de sa responsabilité de conserver cet URL (un peu comme un pad publique).
Tout cela est fait en javascript coté client (voir [`index.js`](index.js) et [`data.js`](data.js)) et l'upload s'éfféctue via un script [CGI](https://www.rfc-editor.org/rfc/rfc3875) [deno](https://deno.com/) qui écrit les fichiers uploadés dans le dossier `brochures` du site.
## Sécurité
Cette approche laisse beaucoup de liberté aux utilisateur et utilisatrices du site. Leur laissant uploader la page HTML qu'ils et elle veulent sans vérification de leur contenu.
Pour empecher les clients de déposer du code malicieux, le header `Content-Security-Policy: script-src 'none';` doit etre ajouté a toute donnée qui proviendrait du dossier `brochures` afin d'interdir l'éxécution des scripts.
Il serait possible de faire [une validation du HTML dans le script CGI](https://deno.land/x/ammonia@0.3.1) dans une version futur.
Il serait aussi possible d'autoriser uniquement certaines extensions (car ce sont les extensions qui donnent le type mime de réponse).
Le site ne conserve pas de données des utilisateurs et utilisatrices sur leur navigateur. Ainsi, même si du code malveillant vient à être éxécuté sur le site, il n'aura pas beaucoup de surface d'attaque.
Concernant le script CGI, deno integre de nombreuses fonctionnalités pour restreindre les capacités d'interaction avec l'environnement d'éxécution. Dans le script [`src/sgi-bin/put.ts`](src/cgi-bin/put.ts) par exemple, le script n'a le droit d'écrire que dans le dossier `brochures` et peut uniquement lire les variables d'environnement `PATH_TRANSLATED` et `REQUEST_METHOD`. Cela restrein les capacités d'un attaquant qui exploiterai des failles du script. (Cela ne permet cependant pas d'éviter que des failles dans le système de sandboxing de deno lui-meme soit utilisées, il faut garder deno a jour).
## Serveur de dev
```
```sh
/sbin/apache2 -d "$(pwd)" -f dev.conf -X
```
```
## Installation de production
Voici les étapes d'installation pour un serveur Apache.
Il faut tout d'abord activer les modules [`cgi`](https://httpd.apache.org/docs/current/fr/mod/mod_cgi.html), [`headers`](https://httpd.apache.org/docs/current/fr/mod/mod_headers.html) et [`actions`](https://httpd.apache.org/docs/current/fr/mod/mod_actions.html).
```sh
a2enmod cgi headers actions
```
Copiez le contenu du dossier `src` dans le dossier qui sera servi par apache.
```sh
cp -r src /srv/www/infokiosque-archives
```
Assurez vous que l'utilisateur d'apache dispose bien des droits pour acceder au dossier
```sh
chown -R www-data:www-data /srv/www/infokiosque-archives
```
Vous pouvez ensuite ajouter la configuration apache suivante dans le fichier `/etc/apache2/sites-available/infokiosque-archives.conf`
```
<VirtualHost *:80>
ServerName "infokiosque.example.org"
DocumentRoot "/srv/www/infokiosque-archives/"
ScriptAlias "/cgi-bin/" "/srv/www/infokiosque-archives/cgi-bin/"
<Directory "/srv/www/infokiosque-archives/brochures">
Header set Content-Security-Policy "script-src 'none';"
</Directory>
<Location "/brochures">
Script PUT "/cgi-bin/put.ts"
</Location>
</VirtualHost>
```
> **NOTE** Il est recommandé de mettre en place SSL sur votre serveur afin de chiffrer les communications entre les utilisateurices et le serveur. Voir [Mettre en place un serveur Web: Apache, Let's Encrypt](https://grafikart.fr/tutoriels/apache-ssl-letsencrypt-746) sur le site de Grafikart.
Vous pouvez maintenant activer le site et recharger apache.
```sh
a2ensite infokiosque-archives
systemctl reload apache2
```
Vous avez maintenant un site fonctionnnel sur `infokiosque.example.org`.
> **NOTE** Vous aurez probablement besoin d'ajuster l'emplacement d'où sont servis les fichiers (dans mon cas `/srv/www/infokiosque-archives`) et d'ajuster le nom de domaine dans la directive [`ServerName`](https://httpd.apache.org/docs/current/fr/mod/core.html#servername).