Skip to content
This repository was archived by the owner on Apr 30, 2021. It is now read-only.

BastLast/Secapps

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

159 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TP Sécurité des applications

Installation & exécution

Installation

Il est nécessaire d'installer au préalable les librairies python suivantes :

  • daiquiri
  • PyYAML
  • crypto

Exécution

Se placer dans le répertoire d'installation. Lancer le serveur depuis le répertoire server

  • cd server
  • python3 server.py

Lancer une ou plusieurs instances du client depuis le répertoire client

  • cd client
  • python3 client.py

Aucun utilisateur n'existe lors du premier lancement. Celui-ci est créé avec le login et le mot de passe fournis au moment de la connexion au client.

Document d’architecture

Contexte

Ce projet a pour objet la réalisation d’un logiciel de transfert. Pour cela, nous suivrons une architecture de type client serveur schématisée ci-après. L’objectif est que les utilisateurs puissent télécharger, charger, supprimer et partager des fichiers entre eux. L’ensemble des fonctionnalités sera utilisable via des commandes dans une CLI.

Architecture

Interface

Nous utiliserons yaml pour faire transiter les commandes sérialisées en tant que string entre client et serveur.

Objets

Dossier

  • id propriétaire
  • liste user autorisés à créer
  • nom

Fichier

  • Nom de fichier (string)
  • Users autorisés (dictionnaire de permissions à true/false pour chaque user)
  • User owner (user)
  • Chemin d’accès (unique)

User

  • Login
  • Mot de passe (Stocké hashé côté client et salé)
  • Id
  • Pseudo
  • Admin (boolean)
  • Clé public

Personae

Admin:

  • Afficher la liste de tous les dossiers utilisateurs
  • Afficher le contenu d’un dossier utilisateur
  • Afficher les permissions sur un dossier/fichier
  • Modifier les permissions sur un dossier/fichier

Utilisateur :

  • Propriétaire :

    • Gérer les permissions des fichiers de son dossier
    • Faire la liste des fichiers dans son dossier
    • Télécharger un fichier
    • Envoyer un fichier
    • Supprimer un fichier
    • Ecraser un fichier
    • Créer un fichier
  • Autre :

    • Télécharger un fichier (s’il en a l’autorisation)
    • Envoyer un fichier (s’il en a l’autorisation)
    • Supprimer un fichier (s’il en a l’autorisation)
    • Écraser un fichier (s’il en a l’autorisation)
    • Créer un fichier (s’il en a l’autorisation)

Gestion des permissions

Gestion des permissions pour un fichier

  • Lister. Les fichiers que l’utilisateur a le droit de lister
  • Télécharger un fichier
  • Envoyer un fichier
  • Supprimer un fichier
  • Ecraser un fichier

Gestion des permissions pour un dossier

  • Créer un fichier. Le créateur détient les droits suivants : lister, télécharger, supprimer et écraser le fichier

Il est impossible de révoquer les droits d’un propriétaire.

Ajout d'utilisateurs

Afin d'ajouter un nouvel utilisateur, il suffit de fournir un login qui n'existe pas lors de la connexion. Le premier utilisateur créé sur le serveur sera par défaut administrateur, les autres seront utilisateurs simples. Il n'est pas possible de donner ou retirer les droits d'administrateur.

Sécurité

Pour accéder au serveur, il faut passer par un système d’authentification par login/mot de passe. Les mots de passe sont stockés par paire avec le login dans un fichier. Les mots de passe sont hashés côté client au préalable.

L’accès à un fichier de clientA par clientB n’est possible que si clientA a ajouté à sa liste d’autorisation clientB. Pour chaque fichier, un tableau de dictionnaires est attribué. Chaque dictionnaire contient le pseudo@id de l’utilisateur et un booléen pour chaque permission.

Chiffrement pour la communication entre client et serveur:

  • ClientA chiffre son fichier avec la clé public du serveur.
  • Le serveur déchiffre et stock le fichier.
  • Le serveur chiffre avec la clé public du destinataire pour envoyer un fichier.

Instaurer des logs. Les fichiers sont chiffrés pour ne pas être modifiés.

Tester la syntaxe des commandes. Autoriser simplement celles dont nous avons besoin.

De plus, les fichiers sont stockés sous un répertoire du serveur et il n'est pas possible d'accéder à l'extérieur de celui-ci.

Multi threads

Dans un premier temps, le serveur ne gérera pas le multi-thread.

Si nous en avons le temps, le but est que chaque commande reçue par le serveur soit gérée dans un thread à part pour permettre le traitement en parallèle des commandes.

Analyse de risques

µ
Menace Impact Probabilité d’occurrence Criticité Remédiation
Intrusion serveur Catastrophique Rare Forte Avoir les autorisation admin sur la machine pour lire les fichiers sensibles
Vol de login/mot de passe côté serveur Catastrophique Hautement improbable Forte Hash
Modifications des droits sur les dossiers d’autrui Catastrophique Hautement improbable Forte Non traité
Exécution d’un fichier malveillant sur le serveur Catastrophique Hautement improbable Forte Vérification des commandes envoyées
Interception communication client - serveur Grave Probable Moyenne Chiffrement communication
L’admin se crée un compte user pour lui donner tous les droits Grave Probable Très forte Créer une double authentification par pièce d’identité ou autre identifiant unique

Légende

Impact :

  • Insignifiant
  • Signifiant
  • Grave
  • Catastrophique

Probabilité d'occurrence

  • Fréquent
  • Probable
  • Occasionnel
  • Rare
  • Improbable
  • Hautement Improbable

Coding rules / red (règles de l’équipe de dev) / tooling

IDE: PyCharm

Versionning: https://gitlab.mines-ales.fr/BastLast/secapps

Langage: Python 3.9.1

Librairie de log utilisée : daiquiri

Librairie de chiffrement et de hachage utilisée : cryptodome

Librairie de sérialisation de fichier utilisée : yaml

Suivre les recommandations PEP 8 : https://www.python.org/dev/peps/pep-0008/

Message de commit : suivre le format “Type de modification - Méthode en question” à raison d’un commit par méthode. Commit sur la branche de la méthode.

Pour chaque méthode : créer un header via commentaire pour indiquer sa fonction et éventuellement ses paramètres.

Arborescence:

  • Serveur implémente le traitement

    • classes
      • log
    • commands
      • get
      • ls
      • perm
      • put
      • rm
      • utils
    • files
      • tous les répertoires et fichiers stockés
    • log
      • tous les fichiers de logs
    • config
    • clé publique du serveur
    • clé privée du serveur
    • main (server.py)
  • Client implémente la CLI

    • commands:
      • get
      • ls
      • perm
      • put
      • rm
    • clé publique du serveur
    • clé privée du serveur
    • main (client.py)

Document d’utilisation

Utiliser les commandes dans le terminal qui contient le client lancé.

Liste des commandes disponibles pour tous les utilisateurs, s’ils disposent des permissions suffisantes :

  • ls : Lister les fichiers dans le dossier de l'utilisateur et les permissions associées pour celui-ci
  • ls <user> : Lister les fichiers du dossier d'un autre utilisateur et le permissions pour l'utilisateur courant
  • ls <filename> : Lister le fichier et les permissions associées pour l'utilisateur courant
  • put <filename> : Envoyer un fichier
    • filename : nom du fichier
  • put <user> <filename> : Envoyer un fichier dans le dossier d’un autre utilisateur
    • filename : nom du fichier
  • get <filename> : Télécharger un fichier depuis son répertoire
    • filename : nom du fichier
  • get <user> <filename> :Télécharger le fichier d’un autre utilisateur
    • user : nom de l’utilisateur propriétaire du fichier
    • filename : nom du fichier
  • rm <filepath> : Supprimer un fichier de son répertoire
    • filename : nom du fichier
  • perm <user> <add|remove> <c|l|d|r|o> <directory|filename> : modifier les permissions sur un fichier ou un dossier pour un utilisateur.
    • user : nom de l’utilisateur à qui modifier les permissions
    • add/remove : Ajouter ou retirer les permissions
    • c|l|d|r|o : Respectivement les permissions de créer un fichier dans un dossier, de lister un fichier/répertoire, de télécharger un fichier, d’effacer un fichier, et d’écraser un fichier. Il est possible d’en utiliser plusieurs à la fois. On ne peut modifier que les permissions dont on dispose.
    • directory|filename : nom du fichier ou du répertoire sur lequel appliquer ces permissions.

Le rôle “Utilisateur propriétaire” possède par défaut l’ensemble des permissions sur ses dossiers et fichiers.

Le rôle “Administrateur” possède par défaut les permissions de lister tous les fichiers et répertoires. De plus, il peut donner ou retirer n’importe quelle permission à n’importe quel utilisateur sur des ficiers ou répertoires dont il n'est pas le propriétaire, sauf aux administrateurs (dont lui-même).

About

Small python cli that operate a permission based and transmission secured distant file storage

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages