Sécurité et Gestion des utilisateurs

En savoir plus : http://istsos.org/en/latest/doc/security.html#use-cases

Securité

IstSOS expose trois points d'accès :

Path Type
/istsos/{service_name} SOS server
/istsos/wa REST API
/istsos/{admin} HTML Files


  • Le «serveur SOS» expose la bibliothèque istSOS. Cet exposition permet d'utiliser les services SOS permettant d'integrer et d'interroger les capteurs.
  • L '«API REST» expose l'interface WAlib REST, permet de faire facilement toutes les demandes d'administration avancées.
  • Les "Fichiers HTML" sont juste le lieu où tous les fichiers HTML, CSS, JavaScript, Images, etc. sont stockés et utilisés par les interfaces d'administration Web et de modules.

Il existe différents niveaux de protection en fonction des besoins des utilisateurs. Dans les paragraphes suivants, nous présenterons 4 cas d'utilisation parmi lesquels vous pouvez choisir pour protéger votre serveur istSOS. Bien sûr, si vous êtes familiarisé avec la fonctionnalité d'authentification Apache, vous pouvez configurer istSOS pour des cas plus spécifiques.

Totalement ouvert

Ce cas est le plus simple et c'est la façon dont istSOS est installé par défaut. Aucune protection n'est appliquée, tout est ouvert.

Attention Soyez prudent! Laisser votre istSOS ouvert sur le web permettra à tout le monde de jouer avec votre base de données, et de plus permettra la création de procédures virtuelles. Cela expose votre serveur à des menaces d'injection de code malveillant. Utilisez donc cette configuration uniquement dans des réseaux vraiment fiables.

security-open

Here an example on how to configure the file (/etc/apache2/sites-enabled/000-default.conf):

<VirtualHost *:80>

    ServerName istsos.org

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIScriptAlias /istsos /usr/local/istsos/application.py
    Alias /istsos/admin /usr/local/istsos/interface/admin
    Alias /istsos/modules /usr/local/istsos/interface/modules

    <LocationMatch /istsos>
        Options +Indexes +FollowSymLinks +MultiViews
        AllowOverride all
        Require all granted
    </LocationMatch>

</VirtualHost>

Fermé

Le mode fermé bloque toutes les demandes non authentifiées à istSOS lib, WAlib et les fichiers HTML.

security-close-full

Here an example on how to configure the file (/etc/apache2/sites-enabled/000-default.conf):*

<VirtualHost *:80>

    ServerName istsos.org

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIScriptAlias /istsos /usr/local/istsos/application.py
    Alias /istsos/admin /usr/local/istsos/interface/admin
    Alias /istsos/modules /usr/local/istsos/interface/modules

    <Location /istsos>
        AuthType Basic
        AuthName "Welcome to istSOS"
        AuthBasicProvider wsgi
        WSGIPassAuthorization On
        WSGIAuthUserScript /usr/local/istsos/auth.py
        Require valid-user

    </Location>

</VirtualHost>

Fermé avec la page d'acceuil ouverte

Le mode fermé bloque toutes les requêtes non authentifiées à istSOS lib et WAlib. La partie HTML reste ouverte affichant la page d'accueil avec quelques informations.

security-close

Here an example on how to configure the file (/etc/apache2/sites-enabled/000-default.conf):

note: Un nom d'utilisateur (= admin) et un mot de passe (= istsos) par défaut seront créés. N'oubliez pas de modifier le mot de passe de votre utilisateur administrateur (voir la section "Gérer les utilisateurs").

<VirtualHost *:80>

    ServerName istsos.org

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIScriptAlias /istsos /usr/local/istsos/application.py
    Alias /istsos/admin /usr/local/istsos/interface/admin
    Alias /istsos/modules /usr/local/istsos/interface/modules

    <Location /istsos>

        SetEnvIf Request_URI "/istsos/admin" noauth=1

        AuthType Basic
        AuthName "Welcome to istSOS"
        AuthBasicProvider wsgi
        WSGIPassAuthorization On
        WSGIAuthUserScript /usr/local/istsos/auth.py

        <RequireAny>
            Require env noauth
            Require valid-user
        </RequireAny>

    </Location>

</VirtualHost>

Hybrid

Le mode hybride bloque toute interaction non autorisée avec le HTML et le WaLib (API REST), mais ouvre complètement l'accès à l'api istSOS lib (Sensor Observation Service).

note: Avec le mode hybride, l'utilisateur non autorisé pourra enregistrer de nouveaux capteurs et envoyer des données à l'aide des requêtes POST InsertObservation et RegisterSensor.

security-hybrid

Here an example on how to configure the file (/etc/apache2/sites-enabled/000-default.conf):

<VirtualHost *:80>

    ServerName istsos.org

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIScriptAlias /istsos /usr/local/istsos/application.py
    Alias /istsos/admin /usr/local/istsos/interface/admin
    Alias /istsos/modules /usr/local/istsos/interface/modules

    <Location /istsos>

        # The name of the service to leave open
        SetEnvIf Request_URI "/istsos/demo" noauth=1

        AuthType Basic
        AuthName "Welcome to istSOS"
        AuthBasicProvider wsgi
        WSGIPassAuthorization On
        WSGIAuthUserScript /usr/local/istsos/auth.py

        <RequireAny>
            Require env noauth
            Require valid-user
        </RequireAny>

    </Location>

</VirtualHost>

Hybrid avec la fermeture des resquètes d'écritures SOS

Le mode hybride sans InsertObservation et RegisterSensor empêche les utilisateurs non authentifiés d'enregistrer de nouveaux capteurs et d'envoyer des observations. Toutes les autres demandes de capteur d'observation de capteur restent ouvertes au public.

security-advanced-hybrid

To enable this advanced mode you have to configure your /etc/apache2/sites-enabled/000-default.conf file like in the simple mode, but you have also to change the /usl/local/istsos/config.py.

Recherchez la variable hybrid dans le fichier config.py et définissez-la sur True:

hybrid = True

Here an example on how to configure the file (/etc/apache2/sites-enabled/000-default.conf).

<VirtualHost *:80>

    ServerName istsos.org

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIScriptAlias /istsos /usr/local/istsos/application.py
    Alias /istsos/admin /usr/local/istsos/interface/admin
    Alias /istsos/modules /usr/local/istsos/interface/modules

    <Location /istsos>

        # The name of the service to leave open
        SetEnvIf Request_URI "/istsos/demo" noauth=1

        AuthType Basic
        AuthName "Welcome to istSOS"
        AuthBasicProvider wsgi
        WSGIPassAuthorization On
        WSGIAuthUserScript /usr/local/istsos/auth.py

        <RequireAny>
            Require env noauth
            Require valid-user
        </RequireAny>

    </Location>

</VirtualHost>

Notes générales :

  • le fichier d'apache2 n'est pas accessible par l'utilisateur istsos. Pour réaliser des modifications, vous pouvez soit passer par un editeur dans le terminal (ex: vi/vim) soit en ouvrant le fichier avec l'éditeur graphique "gedit" avec la commande suivante :

    sudo gedit /etc/apache2/sites-enabled/000-default.conf

  • ne pas oublier de bien vérifier les chemins mentionnés dans le fichier de configuration de apache2 afin qu'ils soient conformes avec le dossier d'installation de istsos.

  • Une fois le fichier de configuration modifié, relancer apache2 pour que les modifications soient prise en compte. Pour cela, dans le terminal, tapez la commande suivante :

    sudo service apache2 restart

Exercice 1:

  • Passer le serveur IstSOS en mode hybride
  • Contrôler le passage du mode hybride en se connectant sur le client.
  • Inserer un nouveau capteur via Postman : "RegisterSensor -Capteur_Test_Auth"
  • Observer le message de retour.
  • Inserer les identifiants administrateur (id:admin, mdp:istsos) via les paramètres d'authentification de la requète sur Postman. Il est possible d'ajouter l'authentification basicAuth dans les requetes POST en encodant l'utilisateur et mot de passe en base64 avec la commande suivante : echo -n 'admin:istsos' | openssl base64.
  • Essayer de nouveau l'insertion d'un capteur avec les paramètres d'authentification
  • Contrôler la présence du capteur avec une requète describeSensor "Capteur_Test_Auth"

Gestion des rôles utilisateurs

Description des rôles disponbiles et gestion

Il y a quatre rôles possibles sur IstSOS donnant droit à des privilèges différents:

  • admin : les utilisateurs avec le rôle d'administrateur peurvent avoir accès à toutes les fonctionnalités de IstSOS.
  • datamanager : le datamanager peut modifier des mesures, les mettre à jour ainsi que changer les métadonnées des procédures.
  • viewer : il s'agit du niveau le plus bas, l'utilisateur avec ce type de profile peut simplement consulter les mesures.

L'authentification est désactivée par default, elle nécéssite de modifier les paramètres de securité du serveur basé sur apache2 et son mode WSGI.

Lors de l'activation de l'authentification et des sécurités précisées après, l'utilisateur "admin" est automatiquement créé avec le mode de passe "istsos".

La création d'un utilisateur assigné à un rôle est effectuée par le biais d'un script python3.

Le script est accessible dans le dossier d'installation de istsos :
python3 scripts/user.py

notes:
- avec l'installation par defaut en .deb, le dossier d'installation se situe sur le chemin /usr/share/istsos
- ce script ne fonctionnera pas avant la création du fichier d'authentification situé ici :
/services/istsos.passwd. Il se créé automatiquement lors de la sécurisation de l'accès au serveur istsos avec l'un des modes entrevus plus haut.
- l'ensemble des dossiers et fichiers sont uniquement executables avec l'utilisateur root. Pour executer un script en python vous ne pouvez pas utiliser la commande "sudo". Il est vous est nécéssaire de passer par l'utilisateur root afin d'executer le script avec le commande suivante : sudo su

Quelques commandes à connaitre

Lister les opérations/paramètres possibles :
python3 scripts/user.py -h

usage: user.py [-h] [-r] [-l] [-user user name] [-password password]
               [-role role name] [-s services name]
               [-p procedures name [procedures name ...]]

Use this script to manage user authentication and authorization

optional arguments:
  -h, --help            show this help message and exit
  -r                    Remove the user
  -l                    List users
  -user user name       The user name to add or remove
  -password password    Password for new user or update existing
  -role role name       Add a role to the given user, options: admin (or a),
                        networkmanager (or n), datamanager (or d), viewer (or
                        v). Mandatory params: -user, -role, -service
                        (optional, default *), -procedure (optional, default
                        *)
  -s services name      Add accessible service to a user role, options:
                        "admin", "datamanager", "viewer", default: "*"
  -p procedures name [procedures name ...]
                        Define which procedure can be accessed, default: "*"

Lister les utilisateurs enregistés :
python3 scripts/user.py -l

Création d'un nouvel utilisateur :
python3 scripts/user.py -user foobar -password 1234 -role datamanager
note: dans cet exemple, l'utilisateur est "foobar" et le mot de passe est "1234", auquel on lui attribut le rôle de datamanager.

Limitier l'accès de la gestion d'un service à un utilisateur avec le paramètre -s lors de la création d'un utilisateur :
python3 scripts/user.py -user foo -password bar -role datamanager -s demo
note: dans cet exemple, l'utilisateur est "foo" et le mot de passe est "bar", auquel on lui attribut le rôle de datamanager sur le service "demo".

Ajouter un accès au service sur un utilisateur existant :
python3 scripts/user.py -user foo -role datamanager -s otherservice

Modifier le mot de passe d'un utilisateur :
python3 scripts/user.py -user admin -password batman
note: dans cet exemple, l'utilisateur "admin" voit son mot de passe modifié par "batman".

Supprimer un utilisateur :
python3 scripts/user.py -r -user foo
note: dans cet exemple, l'utilisateur "foo" est supprimé.

Exercice 2: Création d'un compte avec le rôle viewer

  • Aller dans le dossier d'installation de istSOS : cd /usr/share/istsos
  • Executer la commande pour créer un utilisateur "viewer" avec l'id "porte" et le mot de passe "fenetre".
  • Lister les comptes enregistrés et vérifier que que le compte "porte" existe.
  • Connecter vous sur le client avec le compte viewer. (vider l'historique de votre navigateur afin de pouvoir changer d'utilisateur si cela est nécéssaire)
  • Observer les accès que vous offre le compte viewer sur le client IstSOS.
  • Supprimer le compte que vous venez de créer.