Projet

Général

Profil

config.py

Vincent MERMET, 19/05/2016 14:51

Télécharger (12,3 ko)

 
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')