publik-infra/architecture.md

25 KiB
Raw Blame History

Architecture

Ce document présente larchitecture technique dun système Publik nécessaire pour garantir un fonctionnement sécurisé et permanent. Il se concentre sur les briques logiciels « actives » et ne détaille pas les modules nécessaires classiques à tout système dinformation : supervision, logs, sauvegarde, technique de virtualisation, orchestration des configuration, architecture des machines, etc.

Présentation générale

Publik est un ensemble de composants : on parle des « briques » de la solution. Elles sont représentées ci-dessous sous la forme de petits carrés. Elles sont accessibles par les humains via le web (HTTPS) au travers dinterfaces « frontoffice » ou « backoffice ».

Le composant « passerelle » est particulier, il assure la connexion avec des systèmes tiers en traduisant les webservices internes de Publik en protocoles et formats des logiciels cibles.

Logo Publik

Liste des briques disponibles :

  • Authentic : gestion des identités, IdP (identity provider)
  • Combo : CMS pour portails usager et agent (porte dentrée de Publik)
  • w.c.s. : formulaires et workflows
  • Passerelle : connecteurs vers systèmes tiers
  • Fargo : porte-documents
  • Corbo : diffusion de messages
  • Chrono : prise de rendez-vous
  • Welco : interface de saisie (multi-canal)
  • Hobo : système de déploiement et de provisioning

Un système Publik installé ne comporte pas obligatoirement toutes les briques.

Structure dune brique

Une brique Entrouvert est un paquet Debian standard issu dun module Python standard. Cest un logiciel libres dont vous pouvez obtenir et modifier les sources selon vos besoins. Les fichiers dinstallation sont posés dans /var/lib/mabrique, et les fichiers de configuration sont placés dans /etc/mabrique. Les services et les journaux des briques sont pilotés par systemd.

Pour certaines briques nous créons un lien symbolique depuis /var/lib/mabrique/documents vers un montage NFS.

Infrastructure de base requise

Machines nécessaires

Idéalement, pour une meilleure isolation et une meilleure sécurité, chaque brique dispose de son propre serveur. Cependant il est possible de varier les installations, jusquà tout installer sur une seule machine (par exemple lors de tests, de PoC, de développements).

Machine recommandée pour opérer une brique :

  • processeur architecture x86-64 double cœur
  • mémoire vivre 4Go
  • volume disque fonction de lusage prévu, typiquement 10Go (minimum 1Go pour un test)

Les briques w.c.s. (formulaires) et fargo (porte-documents) doivent disposer dun volume plus important pour gérer les documents des usagers. Ceux-ci sont stockés sur le système de fichier, son volume est donc à évaluer en fonction de lusage prévu.

Il est fortement conseillé de disposer dun pool de machines virtuelles dont la puissance et les volumes disques peuvent être modifiés à chaud. La technologie de containers apporte cette souplesse avec un minimum de perte de puissance.

Chemin d'une requête

Une requête Publik chemine par les services suivants :

proxy :

  • reçoit la requête et la transmet vers un serveur dapplication,
  • est en charge de la terminaison SSL (et dispose de certificat qui couvre l'ensemble des systèmes),
  • est en charge de la répartition de la charge et la la tolérance aux pannes.

web1 et web2 :

  • ont des installations identiques au niveau logiciel,
  • disposent des composants Publik,
  • interrogent la base de donnée et transfèrent les fichiers en fonction des niveaux daccès des utilisateurs.

Postgres :

  • enregistre et restitue les données des applications,
  • il est courant dutiliser une installation à deux machines identiques avec une réplication de type master/slave.

NFS :

  • fournit linterface de stockage pour les fichiers partagés.

Machine PostgreSQL

Chaque brique utilise une ou plusieurs bases de données PostgreSQL, il faut donc disposer dune machine pour cela. Il est courant dutiliser une installation à deux machines identiques en master/slave, avec les mêmes recommandations que ci-dessus.

Publik peut utiliser un système PostgreSQL existant, le cas échéant.

Composants logiciels sous-jacents

Publik est un logiciel développé en Python 2.7, sur le cadriciel (framework) Django 1.8. Il est prévu pour fonctionner sur un système dexploitation GNU/Linux et sa distribution officielle (par paquets) cible Debian GNU/Linux en version stable ou oldstable.

Le frontal web recommandé est nginx, bien que Publik puisse fonctionner avec Apache et dautres serveurs HTTP. La liaison entre les applicatifs Python et le frontal web est assurée par gunicorn (évolution en cours vers uwgsi).

Les différents composants (briques) de Publik échangent des messages AMQP via RabbitMQ.

Publik nécessite PostgreSQL en version 9 (>9.4 recommandée) sur lequel chaque brique disposera de sa base de données propre.

Source des logiciels (dépôts APT)

Les différents composants logiciels utilisés par Publik proviennent, par ordre de préférence :

  • de la distribution Debian GNU/Linux stable (ou oldstable)
  • des backports officiels Debian, disposant du suivi de sécurité par léquipe Debian
  • des paquets Debian fournis et maintenus par les projets upstream
  • de paquets Debian maintenus par Entrouvert qui en assure le suivi de sécurité

Flux réseau à ouvrir

Publik est un système web : ses composants doivent être accessibles en HTTPS (443/tcp). Le S final est important : Publik nest pas prévu pour fonctionner en HTTP.

Les différentes briques de Publik communiquent entre elles également en HTTPS, elles doivent donc disposer dun accès DNS (53/udp et 53/tcp) et HTTPS.

Le système de provisonning (déploiement, configuration et diffusion des utilisateurs et des rôles) utilise AMQP (5671/tcp).

La connexion avec PostgreSQL utilise 5432/tcp.

La plupart des accès à des logiciels tiers se fait via webservice, généralement en HTTPS (443/tcp). Il peut également y avoir connexion à des annuaires LDAP (389/tcp).

La solution Publik na pas encore été validée sur IPv6.

Pour le support et la maintenance du systèmes, des accès SSH (22/tcp) sont nécessaires, voir ci-dessous.

Certificats X509

La diffusion HTTPS étant obligatoire, il est nécessaire de disposer de certificats valides pour chaque brique déployée ; chacune des briques utilisant un nom de serveur distinct. En général un certificat étoile (wildcard *.example.net) couvre toutes les briques.

MCO par Entr'ouvert

Pour qu'ils puissent assurer le maintien en conditions opérationnelles (MCO) de la partie logicielle Publik, les travailleurs d'Entr'ouvert doivent :

  • avoir un accès SSH aux machines le plus direct possible (sans nécessité de passer par un VPN, qui plus est s'il est propriétaire ou exotique). Entrouvert peut indiquer une liste dadresses IPv4 source ;
  • disposer d'un accès administrateur (root) sur les machines, via su ou sudo.

Cet accès nest pas demandé sur les machines dinfrastructure « non logicielle » telle que le serveur de base de données PostgreSQL, le serveur de log, les backups, etc. La maintenance de ces systèmes est laissée aux opérateurs habituels du site ; sauf contrat spécifique avec Entrouvert.

Si l'accès web à la solution est fermé, par exemple dans le cas d'un PoC ou d'une utilisation interne, alors cet accès doit être possible pour Entr'ouvert (là encore, accès direct sans VPN si possible).

Si les permissions root sont impossibles, il est au moins nécessaire, pour des raisons de support, qu'Entr'ouvert accéde facilement aux logs des machines voire à son système de supervision, et ce en temps réel. Il doit par ailleurs exister une procédure de passage root en cas d'urgence. Enfin, si Entr'ouvert n'a pas d'accès root à la machine, cela signifie que la supervision et les mises à jour régulières (au moins quotidiennes) sont opérées par l'hébergeur ; condition sans laquelle Entr'ouvert ne peut pas garantir une sécurité maximale du système.

Enfin, Entrouvert ne peut assurer un MCO efficace que sur des machines Debian GNU/Linux maintenues à jour cette maintenance peut même être assurée par Entrouvert. Pour tout autre système dexploitation, un contrat spécifique doit être prévu.

Architecture dune brique logicielle

Utilisation de cadriciels (frameworks)

Chaque brique logicielle est une application Python/Django  à lexception de la brique w.c.s. qui utilise le cadriciel Quixote.

Lutilisation dun framework permet de disposer dun ensemble de composants afin de développer plus rapidement, mais aussi de manière plus homogène, et surtout en assurant à tout moment une excellente sécurité de lapplication. Cest en effet le framework qui :

  • reçoit les données, les interprète et les valide avant de les envoyer à lapplication ;
  • permet de contrôler lenvoi des données aux bases de données par lapplication (pas de requêtes SQL directes) ;
  • sécurise les sorties de lapplication (HTML) en imposant un contrôle fort sur les données affichable.

Dans Publik, en plus de lutilisation de toutes les possibilités de Django dautres protections sont mises en place :

  • isolation des composants (chaque composant est une brique logicielle indépendante) ;
  • chaque brique dispose de sa propre base de données, complètement isolée des autres (chaque base peut même être hébergée sur un serveur propre) ;
  • chaque brique peut gérer plusieurs sites (mode multi-tenants), dans ce cas chaque site dispose dun « tenant » dans la base de données sous forme dun schéma PostgreSQL : chaque site est donc indépendant et isolé ;
  • utilisation du front-end nginx pour diffuser tous les éléments statiques des applications ;
  • connexion de lapplication via le protocole wsgi pour un premier filtrage des requêtes (les requêtes invalides sont rapidement éliminées).

Dune façon générale, Publik utilise au maximum des composants éprouvés : le code des applications se concentre uniquement sur la logique de celles-ci. Il sagit de suivre les principes DRY (Dont Repeat Yourself) et KISS (Keep It Simple Stupid) afin de mieux sécuriser lapplication : la sobriété recherchée par Publik est aussi présente dans le code du logiciel.

Schéma

Logo Publik

Le schéma ci-dessus montre que lapplication nest pas en contact « direct » avec lextérieur. Elle utilise toujours des composants logiciels soit éprouvés (celery, requests, tenant-schemas), soit communs à toutes les briques (hobo, mellon).

Dialogues entre briques

Les briques de Publik dialoguent via deux canaux :

  • webservices (HTTPS JSON) pour ce qui concerne léchange de données
  • messages (AMQP) pour ce qui concerne la gestion des utilisateurs et des rôles, i.e. le provisioning au travers des différents composants

Par ailleurs SAML est utilisé pour ce qui concerne le WebSSO (le dialogue se déroule via le navigateur de lusager).

Logo Publik

API Publik

Description générale

LAPI des webservices Publik permet aux briques déchanger des données. La plupart ont trait à léchange de données autour dun usager.

Fournisseurs dAPI :

  • w.c.s. est la brique qui propose le plus de webservices autour des demandes dun usager (http://doc.entrouvert.org/wcs/dev/#api) ;
  • Passerelle met en place des connecteurs donc la plupart ont pour objectif de remonter les informations dun système tiers concernant un usager ;
  • Passerelle est aussi utilisé pour remonter des informations de type « référentiels » depuis des systèmes tiers ;
  • Authentic propose des API permettant la gestion des rôles, des usagers (attributs et rôles).

Consommateurs dAPI :

  • Combo est un consommateur de ces API afin de présenter à lusager lensemble des données que Publik connaît le concernant ;
  • w.c.s. utilise les API de passerelle pour présenter des référentiels dans les formulaires ;
  • w.c.s. utilise les API dAuthentic dans ses actions de workflow afin de pouvoir gérer les rôles dun usager qui a fait une certaine demande ;
  • w.c.s. peut également faire appel à tout webservice de Passerelle afin dintervenir sur un système tiers, toujours lors daction de workflow (typiquement pour injecter des données dans un système tiers).

Logo Publik

Exemple dun dialogue Combo / w.c.s.

Objectif : lorsque lusager se connecte sur son portail usager, une cellule de la page affiche la liste de ses demandes en cours. Pour cela, combo va faire appel à différents webservices de w.c.s. qui lui retourneront les informations nécessaires à afficher dans les cellules de la page.

Logo Publik

Messagerie pour provisioning

Le système de provisioning des utilisateurs et des rôles opère via un diffuseur de message AMQP (RabbitMQ). Lorsquune modification est effectuée sur la brique authentic, celle-ci diffuse un message à lattention de toutes les instances des autres briques concernées. Le message est reçu par tous les agents de toutes les machines de linfrastructure, et est diffusé aux briques concernées, qui se chargent de modifier les utilisateurs des instances cibles.

Logo Publik

Infrastructure dhébergement SaaS

Linfrastructure dhébergement proposée par Entrouvert utilise les techniques suivantes :

  • des machines physiques au matériel redondant (alimentation double, disques durs RAID 1) avec de très importantes capacités CPU (au moins 16 coeurs) et mémoire vive (au moins 128Go) : ces machines sont capables de supporter sans délai des montées en charges brusques ;
  • ces machines disposent de disques ultra-rapides (SSD) pour fournir des espaces disques locaux véloces si nécessaire (espace système, espaces temporaires) ; ainsi que de disques rapides (SAS ou SATA) pour des espaces de stockages locaux importants (backups locaux, fichiers transitoires) ;
  • des machines virtuelles basées sur un système de container (OpenVZ, en migration vers lxc) permettant de dimensionner la puissance CPU ou la mémoire vive de chaque machine à chaud ;
  • des espaces disques obtenus par NFSv3 depuis un SAN, permettant un redimensionnement à chaud des volumes disque ; par ailleurs le SAN utilise la technologie ZFS avec des snapshots horaire, quotidien et hebdomadaires ;
  • les machines virtuelles utilisent des IP virtuelles (« failover ») qui peuvent être déplacées en quelques minutes vers une autre machine physique, et ainsi ne pas nécessiter de modification DNS en cas de déplacement des VM.

En terme de sécurité de données :

  • En plus des snapshots ZFS, des backups incrémentaux (quotidiens) et complets (hebdomadaires) sont effectués sur une machine isolée hors site ;
  • Le système de restauration est régulièrement vérifié ;
  • La duplication dune machine ou son transport vers un autre hôte physique peut être effectuée en quelques minutes (modulo propagation des IP fail-over) ;
  • Le serveur PostgreSQL est une machine à disque RAID-5, sauvegardée quotidiennement. Elle est secondée dune machine « slave » capable de prendre le relais en cas de défaillance.

En terme de sécurité réseau :

  • Un pare-feu est présent sur chaque machine physique, en entrée comme en sortie. En dehors des accès HTTPS aux briques applicatives, tous les flux sont filtrés par défaut et ouvert uniquement au cas par cas ;
  • Une surveillance « fail-to-ban » coupe les IP qui tentent des connexions non autorisées ;
  • Lhébergeur des machines physiques assure par ailleurs une protection anti-DDOS.

Un serveur de log externe regroupe tous les événements de toutes les installations.

Une supervision générale est assurée par des agents SNMP et NRPE qui remontent les informations sur une plateforme Nagios et alertent les travailleurs dEntrouvert en temps réel.

Logo Publik

Autres infrastructures possibles

Infrastructure PoC / test

Dans le cadre dune installation de test ou PoC (preuve de concept) il est habituel dinstaller Publik sur une seule machine. Dans ce cas, toutes les briques partagent :

  • un seul frontal ngnix
  • un seul serveur de base de donnée
  • des espaces disques locaux (/var/lib/brique)
  • un système de log (en général le syslog système)

Dans ce cadre, Publik peut être installé sur une machine aujourdhui habituelle :

  • processeur x86-64 double cœur
  • mémoire vive 2Go
  • espace disque 10Go, voire moins

Cependant et pour rappel, Publik nécessitant un fonctionnement HTTPS, il reste nécessaire de disposer :

  • dun enregistrement DNS par brique instanciée ;
  • dun certificat x509 valable pour chaque brique, généralement un wildcard sur le domaine choisi.

Infrastructure légère et « élastique »

Entre une infrastructure SaaS telle que celle gérée par Entrouvert capable de répondre à des dizaines dinstallations, et une infrastructure minimale telle que celle décrite pour un PoC, toutes les combinaisons sont possibles.

La partie la plus délicate à gérer est souvent la partie x509, et parfois la partie DNS quand il est question de pouvoir créer de nouvelles instances automatiquement dans le cadre dun ensemble de communes (syndicat, organisme, métropole ou agglomération désirant diffuser la solution Publik à ses « membres »).

Pour rendre linstallation « élastique », cest-à-dire capable de sadapter au futur, il est conseillé :

  • de virtualiser toutes les machines ;
  • dutiliser une technique de virtualisation permettant des modifications CPU, RAM et disque faciles, idéalement à chaud ;
  • de disposer dun serveur PostgreSQL central ;
  • davoir accès à un SAN pour le stockage des données ;
  • davoir toute liberté sur la partie DNS, éventuellement via des CNAME ou une délégation de zone ;
  • de disposer dun certificat x509 wildcard pour chaque domaine à gérer.

Une fois linstallation effectuée, il est souvent assez simple de permettre le déplacement dune brique vers une autre machine : copie des configurations et des données, modification DNS, lopération correctement préparée est sans risque et ne provoque pas de coupure de plus de 10 minutes.

Infrastructure pour hébergement sur site

Un hébergement sur site est de type « élastique » (cf supra), voici les recommandations dusage pour linitialisation :

  • machine « IdP » pour authentic (utilisable par d'autres systèmes que Publik)
  • machine « applications » : hobo + combo + w.c.s. + fargo + passerelle
  • machine PostgreSQL
  • autres briques sur une autre machine ou sur la machine « applications »
  • backups et redondance (fail-over) assurés par ailleurs

Pour une collectivité avec plusieurs déploiements prévus à linitialisation, la machine « applications » peut être scindée :

  • machine hobo + combo + passerelle
  • machine w.c.s. + fargo (porte-documents)
  • autres briques sur une machine tierce

Toutes les machines sont virtuelles et modifiables rapidement (CPU et RAM) avec une marge importante. Les répertoires de données proviennent d'un SAN et sont extensibles, principalement pour w.c.s. et fargo (porte-documents).

Caractéristiques dune machine virtuelle à linitialisation :

  • processeur x86-64 4 cœurs
  • mémoire vive 4Go
  • espace disque 16Go ; et plus (via SAN) sur les applications stockant des documents w.c.s. et fargo.

Le serveur PostgreSQL est sécurisé, cest-à-dire quil dispose au moins d'un slave pour fail-over. Si besoin il peut être installé par Entrouvert.

Accès à un S.I. tiers

Lorsque Publik doit accéder à un système dinformation tiers, il doit y avoir ouverture des flux nécessaires :

  • accès webservices : passerelle consomme ou fourni des webservices au S.I. tiers ;
  • accès LDAP pour les annuaires : accès par lIdP pour authentification et synchonisation.

Pour les webservices, la connexion sera effectuée par Passerelle, via un connecteur.

Si le connecteur nexiste pas encore et doit donc être programmé, les webservices tiers doivent utiliser des protocoles ouverts et reconnus, tels que REST/JSON ou SOAP. Ils doivent être documentés et validés.

Protection des accès webservices

Logo Publik

Les webservices, en entrée comme en sortie, doivent utiliser HTTPS. Lauthentification peut être :

  • en login/mot de passe (HTTP Basic authentication)
  • par certificat X509 client et serveur
  • … tout autre mode dauthentification peut être étudié par Entrouvert.

Note : les API internes à Publik utilisent un système dauthentification spécifique similaire à JWT, décrit dans http://doc.entrouvert.org/wcs/dev/#api

Note 2 : En cas de proxy sur la chaîne, il faut vérifier labsence de cache.

Protection de laccès LDAP : X509

La connexion LDAP doit se faire en TLS, avec des certificats X509 clients et serveurs validés de chaque côté. Entrouvert peut fournir des certificats depuis son AC privée.

Sil sagit dun accès LDAP à un système Active Directory, voici deux documentation concernant la mise en place de TLS sur ce système :

Ajout de protections sur webservices existants

Au cas où les logiciels tiers ne mettent pas en place de protection suffisante sur leurs webservices, plusieurs solutions de sécurisation peuvent être envisagées, dont les plus classiques sont : ajout dun reverse-proxy, ajout dune instance « locale » de Passerelle, mise en place dun VPN.

Ajout dun reverse-proxy

Un reverse-proxy est placé en frontal devant les webservices, ajoutant la couche HTTPS et/ou une authentification (par HTTP Basic ou X509). Cest généralement la solution la plus efficace, simple à mettre en place et ne nécessitant quune maintenance classique, qui peut être intégrée à la maintenance générale du SI. Cest donc la solution conseillée.

Logo Publik

Le reverse-proxy est une solution de type Apache ou Nginx. Il est connecté dune part au webservice à diffuser, et dautre part à un réseau accessible par Publik. Il ajoute :

  • le chiffrage du flux (HTTPS) ;
  • une authentification : soit basique, soit basée sur un certificat X509 client ;
  • un filtrage des URLs accessibles ou non depuis telle ou telle IP (typiquement pour lIP de la passerelle Publik).

Un filtrage IP général peut également être ajouté au niveau dun firewall placé en amont du reverse-proxy, par exemple le firewall darrivée générale du site client. Ce filtrage nautorisera que lIP de Passerelle à accéder aux webservices.

Ajout dune instance Passerelle « locale »

Dans cette configuration, une instance de Passerelle est ajoutée, au même niveau quun reverse-proxy (cf supra). Les connecteurs de Passerelle assurent alors localement la traduction des webservices tiers en webservices Publik, ces derniers ajoutant la sécurisation de laccès entre le SI et Publik.

Cette solution présente lavantage dassurer un contrôle de sécurité fort des webservices diffusés à destination de Publik, contrôle assuré par Publik. Cependant, la maintenance est plus complexe que linstallation dun reverse-proxy. Aussi ne doit-elle être mise en place que si les webservices de lapplication sont très difficiles à sécuriser.

Logo Publik

Accès via VPN

Si la seule solution est un VPN, cela demande étude préalable par les équipes techniques dEntrouvert (OpenVPN est le seul VPN déjà utilisé par Entrouvert en production).