config.py
| 1 |
# -*- coding: utf-8 -*-
|
|---|---|
| 2 |
###########################################################################
|
| 3 |
# Eole NG - 2007
|
| 4 |
# Copyright Pole de Competence Eole (Ministere Education - Academie Dijon)
|
| 5 |
# Licence CeCill cf /root/LicenceEole.txt
|
| 6 |
# eole@ac-dijon.fr
|
| 7 |
#
|
| 8 |
# config.py
|
| 9 |
#
|
| 10 |
# fichier de configuration pour la librairie SSO Eole
|
| 11 |
#
|
| 12 |
###########################################################################
|
| 13 |
|
| 14 |
import locale, os, socket |
| 15 |
|
| 16 |
SSO_PATH = os.path.dirname(__file__) |
| 17 |
|
| 18 |
# REGLAGES DE LOCALE
|
| 19 |
# encoding = locale.getpreferredencoding() -> ne fonctionne pas toujours si le service est démarré au boot
|
| 20 |
encoding = 'UTF-8'
|
| 21 |
LC_ALL = 'fr_FR.UTF-8'
|
| 22 |
|
| 23 |
# VARIABLES A RENSEIGNER SI CREOLE NON DISPONIBLE
|
| 24 |
##################################################
|
| 25 |
|
| 26 |
# adresse réseau du serveur (ne pas utiliser localhost ou 127.0.0.1)
|
| 27 |
SERVER_IP_ADDR = ""
|
| 28 |
AUTH_SERVER_ADDR = ""
|
| 29 |
# adresse/port du serveur ldap utilisé pour l'authentification
|
| 30 |
# si non renseigné, utilisation de SERVER_IP_ADDR
|
| 31 |
LDAP_SERVER = [""]
|
| 32 |
LDAP_PORT = [389]
|
| 33 |
LDAP_BASE = ["o=gouv,c=fr"]
|
| 34 |
LDAP_READER = [""]
|
| 35 |
LDAP_MATCH_ATTRIBUTE = ["uid"]
|
| 36 |
LDAP_LABEL = ["Annuaire SSO"]
|
| 37 |
LDAP_INFOS = [""]
|
| 38 |
LDAP_LOGIN_OTP = ["inactifs"]
|
| 39 |
LDAP_READER_PASSFILE = [""]
|
| 40 |
# port de la page web d'authentification
|
| 41 |
EOLESSO_PORT = '8443'
|
| 42 |
# version du protocole CAS (1 ou 2)
|
| 43 |
CAS_VERSION = 2
|
| 44 |
# URL du serveur parent si déclaré
|
| 45 |
PARENT_URL = ''
|
| 46 |
# Nom d'entité du serveur pour le protocole SAMLv2 (calculé automatiquement si chaine vide)
|
| 47 |
IDP_IDENTITY = ""
|
| 48 |
# CERTIFICAT DU SERVEUR
|
| 49 |
CERTFILE = "/etc/ssl/certs/eole.crt"
|
| 50 |
KEYFILE = "/etc/ssl/certs/eole.key"
|
| 51 |
# certificat de l'autorité de certification (pour validation des clients en mode proxy)
|
| 52 |
# si valeur vide : utilisation de ca.crt dans le même répertoire que CERTFILE
|
| 53 |
CA_LOCATION = ""
|
| 54 |
# CSS de la page de login (fichier utilisé : /usr/share/sso/interface/<nom_css>.css)
|
| 55 |
# Autre possibilité : héritage automatique ajouter theme.css
|
| 56 |
# dans /usr/share/sso/interface/theme/style/
|
| 57 |
DEFAULT_CSS = "main"
|
| 58 |
RESPONSIVE = False
|
| 59 |
# Informations sur l'emplacement du serveur (éducation nationale)
|
| 60 |
RNE = ""
|
| 61 |
ETABLISSEMENT = ""
|
| 62 |
ACADEMIE = ""
|
| 63 |
# Gestion des proxys http pour l'envoi de certaines requêtes
|
| 64 |
# (mode CAS : déconnexion / envoi de PGT)
|
| 65 |
PROXY_SERVER = ""
|
| 66 |
PROXY_PORT = ""
|
| 67 |
|
| 68 |
# Gestion de l'avertissement internet explorer
|
| 69 |
ACTIVER_ENVOLE = False
|
| 70 |
ACTIVER_ENVOLE_INFOS = False
|
| 71 |
POSH_URL = ''
|
| 72 |
|
| 73 |
#CONSTANTES
|
| 74 |
############
|
| 75 |
|
| 76 |
# DUREE de validité d'une assertion SAML
|
| 77 |
STATEMENT_TIMEOUT = 600
|
| 78 |
# décalage autorisé pour la vérification des dates des messages SAML
|
| 79 |
TIME_ADJUST = -300
|
| 80 |
|
| 81 |
# définition du délai de timeout par défaut des connexions (en secondes)
|
| 82 |
SOCK_TIMEOUT = 5.0
|
| 83 |
# durée de vie d'un login ticket : 2 heures
|
| 84 |
SESSION_TIMER = 2 * 60 * 60 |
| 85 |
# durée de vie d'un ticket d'application : 5 minutes (utilisable une seule fois)
|
| 86 |
APP_TIMER = 300
|
| 87 |
# durée de vie d'un nombre magique permettant la communication entre un frontend et un backend
|
| 88 |
# ce timeout est reinitialise a chaque fois qu'une action est lancée
|
| 89 |
MAGIC_NUMBER_TIMEOUT = 60 * 5 |
| 90 |
# durée de vie des sessions expirées. Quand une session expire, on la garde dans un cache pour savoir
|
| 91 |
# si quand une session est non valide, si elle avait expirée ou si elle n'a jamais existée
|
| 92 |
EXPIRED_SESSION_TIMEOUT = 60 * 60 * 2 |
| 93 |
# active ou non l'envoi de requêtes de logout pour les clients CAS
|
| 94 |
SEND_CAS_LOGOUT = False
|
| 95 |
# active ou non la vérfication des urls d'application
|
| 96 |
# (si True, on ne répond pas à une application non référencée dans app_filters)
|
| 97 |
VERIFY_APP = False
|
| 98 |
# indique si un formulaire doit être affiché lors de l'envoi d'une demande de fédération
|
| 99 |
DISPLAY_FEDERATION = True
|
| 100 |
# Taille du pool de thread
|
| 101 |
THREAD_POOL_SIZE = 100
|
| 102 |
# attributs utilisateurs à ne pas conserver
|
| 103 |
IGNORED_ATTRS = ['userPassword', 'sambaLMPassword', 'sambaNTPassword'] |
| 104 |
# correspondance par défaut pour les attributs de détermination
|
| 105 |
# de la branche de recherche
|
| 106 |
SEARCH_BASE_ATTRS = {'rne':'ou','RNE':'ou','UAI':'ou','ENTPersonStructRattach':'ou'}
|
| 107 |
# contexte minimum accepté en mode fournisseur de service SAML
|
| 108 |
DEFAULT_MIN_CONTEXT = "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"
|
| 109 |
# gestion de l'authentification SecurID en mode IDP sur ce serveur
|
| 110 |
# Cette option nécessite l'installation de l'agent PAM linux fourni par RSA
|
| 111 |
# http://www.rsa.com/node.aspx?id=1177 (dernière version testée : 7.0)
|
| 112 |
USE_SECURID = False
|
| 113 |
# définition d'un fournisseur d'identité distant pour SecurID
|
| 114 |
# (laisser vide si USE_SECURID est activé)
|
| 115 |
# FIXME : cette option n'est pas encore fonctionelle. laisser à blanc
|
| 116 |
# Pour l'instant on ne peut s'authentifier en OTP que sur le serveur SSO
|
| 117 |
# ayant accès au serveur RSA (via PAM)
|
| 118 |
SECURID_PROVIDER = ""
|
| 119 |
# Détection des mot de passe OTP (taille longueur minimum/maximum/expression régulière)
|
| 120 |
OTPPASS_MINSIZE = 10
|
| 121 |
OTPPASS_MAXSIZE = 12
|
| 122 |
OTPPASS_REGX = "^[0-9]{10,12}$"
|
| 123 |
# délai maximum (secondes) laissé à l'utilisateur lorsqu'il doit saisir un 2ème passcode
|
| 124 |
OTP_TIMEOUT = 300
|
| 125 |
# indique si on doit rediriger sur une mire externe en cas de
|
| 126 |
# désynchronysation de la clé OTP
|
| 127 |
REDIRECT_DESYNC = True
|
| 128 |
OTP_PORTAL = ""
|
| 129 |
|
| 130 |
# active ou non les log de debug (fonctions utilisant @trace)
|
| 131 |
DEBUG_LOG = True
|
| 132 |
|
| 133 |
# Gestion des adresses ip secondaires dans le cas des conteneurs
|
| 134 |
ALTERNATE_IPS = {}
|
| 135 |
# containers dont l'adresse est considérée comme adresse du conteneur root
|
| 136 |
allowed_container_ips = ['web','mail','fichier'] |
| 137 |
containers_conf = {}
|
| 138 |
|
| 139 |
# RECUPERATION DES VARIABLES DEFINIES DANS CREOLE SI DISPONIBLE
|
| 140 |
################################################################
|
| 141 |
try:
|
| 142 |
from creole.parsedico import parse_dico |
| 143 |
from creole.cert import cert_file, key_file |
| 144 |
from creole.config import containers_file |
| 145 |
except:
|
| 146 |
# pas d'utilisation de la librairie creole pour le paramétrage du serveur
|
| 147 |
# Les valeurs doivent être renseignées dans ce fichier. On affiche un message d'avertissement.
|
| 148 |
print "Configuration Creole non disponible, utilisation des valeurs de %s" % str(__file__) |
| 149 |
else:
|
| 150 |
# lecture de la configuration creole du serveur (config.eol)
|
| 151 |
# Les valeurs trouvées sont prioritaires sur les valeurs
|
| 152 |
# définies manuellement dans ce fichier
|
| 153 |
dico = parse_dico() |
| 154 |
if dico.get('adresse_ip_eth0', ''): |
| 155 |
SERVER_IP_ADDR = dico['adresse_ip_eth0']
|
| 156 |
# paramètres de proxy http
|
| 157 |
if dico.get('activer_proxy_client', 'non') == 'oui': |
| 158 |
PROXY_SERVER = dico['proxy_client_adresse']
|
| 159 |
PROXY_PORT = dico['proxy_client_port']
|
| 160 |
# configuration du serveur ldap
|
| 161 |
if dico.get('eolesso_ldap', ''): |
| 162 |
LDAP_SERVER = dico['eolesso_ldap']
|
| 163 |
# l'annuaire local est dans un conteneur ?
|
| 164 |
if dico.get('adresse_ip_annuaire', '127.0.0.1') != '127.0.0.1' \ |
| 165 |
and 'localhost' in LDAP_SERVER: |
| 166 |
num = LDAP_SERVER.index('localhost')
|
| 167 |
LDAP_SERVER[num] = dico['adresse_ip_annuaire']
|
| 168 |
# FIXME 2.3 (hack Zéphir)
|
| 169 |
#elif dico.get('serveur_ldap', ''):
|
| 170 |
# LDAP_SERVER = dico['serveur_ldap']
|
| 171 |
# identifiant rne du serveur si disponible
|
| 172 |
if dico.get('numero_etab', ''): |
| 173 |
RNE = dico['numero_etab']
|
| 174 |
if dico.get('libelle_etab', ''): |
| 175 |
ETABLISSEMENT = dico['libelle_etab']
|
| 176 |
if dico.get('nom_academie', ''): |
| 177 |
ACADEMIE = dico['nom_academie']
|
| 178 |
if dico.get('eolesso_session_timeout', ''): |
| 179 |
SESSION_TIMER = int(dico['eolesso_session_timeout']) |
| 180 |
if dico.get('eolesso_base_ldap', ''): |
| 181 |
LDAP_BASE = dico['eolesso_base_ldap']
|
| 182 |
if dico.get('eolesso_port_ldap', ''): |
| 183 |
LDAP_PORT = dico['eolesso_port_ldap']
|
| 184 |
if dico.get('eolesso_ldap_label', ''): |
| 185 |
LDAP_LABEL = dico['eolesso_ldap_label']
|
| 186 |
if dico.get('eolesso_ldap_infos', ''): |
| 187 |
LDAP_INFOS = dico['eolesso_ldap_infos']
|
| 188 |
if dico.get('eolesso_ldap_reader', ''): |
| 189 |
LDAP_READER = dico['eolesso_ldap_reader']
|
| 190 |
if dico.get('eolesso_ldap_reader_passfile', ''): |
| 191 |
LDAP_READER_PASSFILE = dico['eolesso_ldap_reader_passfile']
|
| 192 |
if dico.get('eolesso_ldap_match_attribute', ''): |
| 193 |
LDAP_MATCH_ATTRIBUTE = dico['eolesso_ldap_match_attribute']
|
| 194 |
if dico.get('eolesso_ldap_login_otp', ''): |
| 195 |
LDAP_LOGIN_OTP = dico['eolesso_ldap_login_otp']
|
| 196 |
if dico.get('eolesso_adresse', ''): |
| 197 |
# FIXME 2.3 (full_cas)
|
| 198 |
AUTH_SERVER_ADDR = dico['eolesso_adresse']
|
| 199 |
if dico.get('eolesso_port', ''): |
| 200 |
EOLESSO_PORT = dico['eolesso_port']
|
| 201 |
if dico.get('eolesso_adresse_parent', ''): |
| 202 |
PARENT_URL = 'https://%s:%s' % (dico['eolesso_adresse_parent'], |
| 203 |
dico['eolesso_port_parent'] or '8443') |
| 204 |
if dico.get('eolesso_key') and os.path.isfile(dico['eolesso_key']): |
| 205 |
KEYFILE = dico['eolesso_key']
|
| 206 |
else:
|
| 207 |
KEYFILE = ''
|
| 208 |
if dico.get('eolesso_cert', '') and os.path.isfile(dico['eolesso_cert']): |
| 209 |
# si pas de clé définie, eolesso recherchera un fichier .key du même nom
|
| 210 |
CERTFILE = dico['eolesso_cert']
|
| 211 |
else:
|
| 212 |
# utilisation des valeurs par défaut de creole.cert (la clé est forcée)
|
| 213 |
CERTFILE = cert_file |
| 214 |
KEYFILE = key_file |
| 215 |
if dico.get('eolesso_css', ''): |
| 216 |
DEFAULT_CSS = dico['eolesso_css']
|
| 217 |
if dico.get('eolesso_responsive', 'non') == 'oui': |
| 218 |
RESPONSIVE = True
|
| 219 |
if dico.has_key('eolesso_ca_location') and os.path.exists(dico['eolesso_ca_location']): |
| 220 |
CA_LOCATION = dico['eolesso_ca_location']
|
| 221 |
if dico.get('cas_send_logout', 'non') == 'oui': |
| 222 |
# FIXME 2.3 ?
|
| 223 |
SEND_CAS_LOGOUT = True
|
| 224 |
if dico.get('cas_verify_service', 'non') == 'oui': |
| 225 |
VERIFY_APP = True
|
| 226 |
if dico.get('eolesso_pam_securid', 'non') == 'oui': |
| 227 |
USE_SECURID = True
|
| 228 |
if dico.get('federation_transparente', 'non') == 'oui': |
| 229 |
DISPLAY_FEDERATION = False
|
| 230 |
if dico.get('eolesso_entity_name', ''): |
| 231 |
IDP_IDENTITY = dico['eolesso_entity_name']
|
| 232 |
if dico.get('eolesso_otppass_minsize', ''): |
| 233 |
OTPPASS_MINSIZE = int(dico['eolesso_otppass_minsize']) |
| 234 |
if dico.get('eolesso_otppass_maxsize', ''): |
| 235 |
OTPPASS_MAXSIZE = int(dico['eolesso_otppass_maxsize']) |
| 236 |
if dico.get('eolesso_otppass_regx', ''): |
| 237 |
OTPPASS_REGX = dico['eolesso_otppass_regx']
|
| 238 |
if dico.get('eolesso_otp_desync', 'non') == 'oui': |
| 239 |
REDIRECT_DESYNC = False
|
| 240 |
if dico.get('eolesso_otp_portal', ''): |
| 241 |
OTP_PORTAL = dico['eolesso_otp_portal']
|
| 242 |
# avertissement internet explorer
|
| 243 |
if dico.get('activer_envole', 'non') == 'oui': |
| 244 |
ACTIVER_ENVOLE = True
|
| 245 |
if dico.get('activer_envole_infos', 'non') == 'oui': |
| 246 |
ACTIVER_ENVOLE_INFOS = True
|
| 247 |
if dico.get('web_url', ''): |
| 248 |
POSH_URL = dico['web_url']
|
| 249 |
if dico.get('sso_saml_time_adjust', ''): |
| 250 |
try:
|
| 251 |
# délai en secondes, valeur entière (positive ou negative) obligatoire
|
| 252 |
TIME_ADJUST = int(dico['sso_saml_time_adjust']) |
| 253 |
except:
|
| 254 |
pass
|
| 255 |
|
| 256 |
if os.path.isfile(containers_file):
|
| 257 |
execfile(containers_file, {}, containers_conf)
|
| 258 |
for varname, val in containers_conf.items(): |
| 259 |
# pour tous les conteneurs autorisés à utiliser le mode proxy, on utilise
|
| 260 |
# l'adresse du conteneur maître comme adresse alternative (pour validation des certificats)
|
| 261 |
if varname.startswith('container_ip_') and varname.replace('container_ip_','') in allowed_container_ips: |
| 262 |
ALTERNATE_IPS[val] = SERVER_IP_ADDR |
| 263 |
|
| 264 |
# adresse du serveur d'authentification (nom DNS)
|
| 265 |
if AUTH_SERVER_ADDR == "": |
| 266 |
AUTH_SERVER_ADDR = socket.getfqdn(SERVER_IP_ADDR) |
| 267 |
|
| 268 |
# VALEURS CALCULEES
|
| 269 |
####################
|
| 270 |
|
| 271 |
# URL de la page web d'authentification
|
| 272 |
AUTH_FORM_URL = 'https://%s:%s' % (AUTH_SERVER_ADDR, EOLESSO_PORT)
|
| 273 |
# URL du serveur d'authentification
|
| 274 |
AUTH_SERVER='https://%s:%s/xmlrpc' % (AUTH_SERVER_ADDR, EOLESSO_PORT)
|
| 275 |
IDP_IDENTITY = IDP_IDENTITY or "urn:fi:%s:et-%s:1.0" % (ACADEMIE, ETABLISSEMENT or AUTH_SERVER_ADDR) |
| 276 |
CA_LOCATION = CA_LOCATION or os.path.join(os.path.dirname(CERTFILE), 'ca.crt') |
| 277 |
if "".join(LDAP_SERVER) == "": |
| 278 |
# si aucun serveur ldap spécifié, on utilise la même ip que le serveur d'authentification
|
| 279 |
LDAP_SERVER = [SERVER_IP_ADDR] |
| 280 |
|
| 281 |
# REPERTOIRES DES DONNEES
|
| 282 |
##########################
|
| 283 |
|
| 284 |
# répertoire des filtres d'application
|
| 285 |
FILTER_DIR = os.path.join(SSO_PATH, 'app_filters')
|
| 286 |
# répertoire des fichiers metadata pour les entités SAML
|
| 287 |
METADATA_DIR = os.path.join(SSO_PATH, 'metadata')
|
| 288 |
# répertoire des définitions de jeux d'attributs
|
| 289 |
ATTR_SET_DIR = os.path.join(SSO_PATH, 'attribute_sets')
|
| 290 |
# répertoire des correspondances d'utilisateurs securid
|
| 291 |
SECURID_USER_DIR = os.path.join(SSO_PATH, 'securid_users')
|
| 292 |
# répertoire des fichiers d'information pour les homonymes
|
| 293 |
HOMONYMES_DIR = os.path.join(SSO_PATH, 'interface', 'info_homonymes') |