Adaptation to Authentic 2.x for the Pr@tic platform
This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
Go to file
Jérôme Schneider 8b489e61c4 New version 1.0.0b2 2014-11-27 11:04:50 +01:00
old-doc Premier commit 2014-10-29 16:59:17 +01:00
src/authentic2_pratic New version 1.0.0b2 2014-11-27 11:04:50 +01:00
COPYING Premier commit 2014-10-29 16:59:17 +01:00
MANIFEST.in Premier commit 2014-10-29 16:59:17 +01:00
README Description des modèles, des vues et de l'authentification X509 2014-11-20 09:58:56 +01:00
setup.py Ajoute les traductions compilées au fichier de distribution 2014-11-20 11:46:39 +01:00

README

Authentic2 Pr@tic
=================

Remplacement pour les pages de gestion d'Authentic2:
- gestion des collectivités
- gestion des utilisateurs
- gestion des services
- gestion des droits d'accès

Modèles
=======

authentic2_pratic.models.Collectivity
-------------------------------------

Le champ booléen `is_superuser` indique si les utilisateurs de cette
collectivité sont des super-administrateurs. Quand ce champ a la valeur `True`
tous les utilisateurs de cette collectivité reçoivent la valeur `True` dans
leur champs `is_superuser`.

authentic2_pratic.models.User
-----------------------------

Il hérite du modèle `django.contrib.auth.models.User` il contient les
données utilisateur spécifiques au CDG59. Il est lié à l'objet `Collectivity`
via le champs de clé étrangère `collectivity`.

authentic2_pratic.models.Service
--------------------------------

Il décrit un service proposé par le CDG59. Ce service peut
éventuellement utiliser l'authentification d'authentic soit via le protocole
SAML 2.0 soit via le protocole OAuth 2.0.

Les champs `name`, `slug` et `service_url` sont obgligatoires. Le champs
`service_url` indique l'URL de base pour accéder au service, c'est l'URL qui
sera affichée aux utilisateurs.

Dans le cas SAML 2.0 le champ `metadata_url` contiendra l'URL des métadonnées
du service. Dans le cas OAuth 2.0 les champs oauth2_url et oauth2_key
contiendront respecitive l'URL de retour et la clé secrète pour les échanges
OAuth 2.0.

Le champ booléen `is_global` indique si un service est global, dans ce cas les
champs `service_url`, 'metadata_url`, `oauth2_url` et `oauth2_key` des
instances de ce service seront ignorés et ceux de la définition du service
seront utilisés.

authentic2_pratic.models.ServiceInstance
----------------------------------------

Il permet de déclarer un service au niveau d'une collectivité, les
champs sont les mêmes que pour une service à l'exception du champ `is_global`
qui est absent. Pour pouvoir donner accès à un service à un utilisateur il est
impératif d'en créer une instance lié à sa collectivité, créer un service n'est
pas suffisant.

authentic2_pratic.models.Access
-------------------------------

Il indique l'autorisation pour un utilisateur d'accèder à une instance de
service ou simplement de voir ce service dans sa page d'accueil dans le cas
d'un service sans authentification lié à authentic.

Il est lié à un utilisateur via le champ `user` et à une instance de service
via le champ `service_instance`. La simple existence de cet objet indique
l'ouverture de ce service à cet utilisateur.

URLs
====

/manage/
--------

Pour un super-administrateur, elle contient un lien vers la gestion des
collectivités et vers la gestion des services.

Pour un administrateur de collectivité elle contient trois liens profond vers
la gestion des utilisateurs, des instances de service et des accréditations
pour cette collectivité.

/manage/collectivities/
----------------------

Cette vue affiche la liste des collectivités, elle n'est accessible qu'à un
super-administrateur.

/manage/collectivitiss/<id>/
---------------------------

Cette vue permet d'éditer les informations sur une collectivité, elle n'est
accéssible qu'à un super-administrateur. Elle contient trois liens vers la
gestion des utilisateurs, des instances de service et des accréditations pour
cette collectivité. Il est aussi possible via une boite de dialogue de créer
une nouvelle collectivité.

/manage/services/
-----------------

Cette vue liste les services. Chaque service DOIT avoir un nom, un identifiant
et une URL de base. Il peut aussi avoir optionnellement une adresse pour ses
méta-données SAML ou une adresses de retour OAuth 2.0 ainsi qu'un identifiant et
une clé secrète (client_id et client_secret en terminologie OAuth2.0).

/manage/cll<collectivite>/utilisateurs/ - utilisateurs
/manage/<collectivite>/autorisations/ - autorisations

Authentification X509
=====================

Un certificat X509 peut être associé à au maximum une collectivité et
plusieurs utilisateurs. 

Si un utilisateur présente un certificat de
collectivité, il peut se connecter avec son login et son mot de passe avec un
niveau d'authentification supérieur, nommé 'ssl-collectivity' au niveau
d'authentic et ayant le code SAML suivant:;

    urn:cdg59.fr:names:tc:SAML:2.0:ac:classes:X509Collectivity

Si un utilisateur présente un certificat lié à un utilisateur il est
automatiquement connecté avec un niveau d'authentification 'ssl'. Après une
première auto-connexion, l'auto-connexion est désactivé durant 10 minutes,
pendant ce temps l'utilisateur pourra se déconnecter puis se reconnecter en
utilisant une des autres méthodes d'authentification.

L'association d'un certificat se fait en recopiant dans les champs
`certificate_issuer_dn` et `certificate_subject_dn` des objets
`authentic2_pratic.models.Collectivity` ou `authentic2_pratic.models.User` les
nom distingués de l'émetteur et du sujet du certificat tels qu'ils sont
exportés par le serveur web hébergeant authentic

Le nom des clés d'environnement contenant les noms distingués de l'émetteur et
du sujet du certificat sont configurés dans le fichier
`authentic2_pratic/app_settings.py`.  Ils sont adaptés à une utilisant
d'authentic avec mod_wsgi, mod_scgi, mot_python ou mod_fcig sous Apache ou bien
les modules SCGI ou FCGI de NGinx. Si authentic est lancé dans un conteneur
python comme gunicorn, les variables d'environnement SSL devront être recopié
dans des entêtes HTTP et ces entêtes HTTP déclaré dans la configuration
d'authentic. Par exemple avec nginx on pourra utiliser cette configuration au
niveau du virtualhost::

    ssl_verify_client optional;
    ssl_client_certificate autorites_de_certifications_autorises.pem;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header ssl-client-dn $ssl_client_s_dn;
        proxy_set_header ssl-issuer-dn $ssl_client_i_dn;
        proxy_set_header ssl-client-verify $ssl_client_verify;
    }

et la configuration suivante dans le fichier `config.py` d'authentic::

    A2_PRATIC_X509_KEYS = {
            'subject_dn': 'HTTP_SSL_CLIENT_DN',
            'issuer_dn': 'HTTP_SSL_ISSUER_DN',
            'verify': 'HTTP_SSL_CLIENT_VERIFY',
    }

Dans les formulaires d'édition d'un utilisateur ou d'un collectivité il est
possible de configurer les champs concernant les noms distingués en
téléchargeant directement le certificat de cette utilisateur, OpenSSL sera
utilisé pour analyser le certificat et en extraire les valeurs des noms
distingués.

ATTENDION: la simple configuration des noms distingués d'un certificat n'est
pas une sécurité, il faut en plus que la chaîne de confiance du certificat ait
été préalablement validée par la terminaison SSL --- généralement le serveur
Web, pour nginx en utilisant les directives `ssl_verify_client` avec les
valeurs `optional` ou FIXME et en définissant les certificats racines des
autorités de certificats de confiance via la directive
`ssl_client_certificate`.