scripts/gestion/config/config.py
Daniel STAN 8539e8c38d config: donne toujours la prochaine période transitoire
On se fiche de celle d'avant, une fois qu'elle est passée, et nous allons
avoir besoin de la suivante pour savoir qui avertir de sa fin de connexion
future.
2015-07-23 13:31:00 +02:00

474 lines
17 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" Définition de variables de configuration et de comportement des scripts Cr@ns """
import time
import datetime
# Fichier généré à partir de bcfg2
from config_srv import adm_only, role
gtfepoch = "19700101000000Z"
##### Gestion des câblages
# Selon la date, on met :
# -ann_scol : Année scolaire en cours
# -periode_transitoire : on accepte ceux qui ont payé l'année dernière
# Ne modifier que les dates !
dat = time.localtime()
if dat[1] < 8 or dat[1] == 8 and dat[2] < 16:
# Si pas encore début août, on est dans l'année précédente
ann_scol = dat[0]-1
periode_transitoire = False
# sinon on change d'année
elif dat[1] < 10:
# Si pas encore octobre, les gens ayant payé l'année précédente sont
# acceptés
ann_scol = dat[0]
periode_transitoire = True
else:
# Seulement ceux qui ont payé cette année sont acceptés
ann_scol = dat[0]
periode_transitoire = False
# Prochaine période transitoire de l'année
debut_periode_transitoire = time.mktime(time.strptime("%s/08/16 00:00:00" % (dat[0],), "%Y/%m/%d %H:%M:%S"))
fin_periode_transitoire = time.mktime(time.strptime("%s/09/30 23:59:59" % (dat[0],), "%Y/%m/%d %H:%M:%S"))
#Sursis pour les inscription après le 1/11 pour fournir la carte étudiant
sursis_carte=8*24*3600
# Gel des cableurs pas a jour de cotisation
# Les droits ne sont pas retires mais il n'y a plus de sudo
bl_vieux_cableurs = False
##Création de comptes
# Gid des comptes créés
gid = 100
club_gid = 120
mailgroup = 8
default_rights = 0755
default_mail_rights = 0700
quota_soft = 8000000
quota_hard = 10000000
fquota_soft = 0
fquota_hard = 0
# Shell
login_shell='/bin/zsh'
club_login_shell='/usr/bin/rssh'
# Longueur maximale d'un login
maxlen_login=25
shells_possibles = [u'/bin/csh',
u'/bin/sh', # tout caca
u'/bin/dash', # un bash light
u'/usr/bin/rc',
u'/usr/bin/ksh', # symlink vers zsh
u'/bin/ksh', # symlink vers zsh
u'/usr/bin/tcsh', # TENEX C Shell (csh++)
u'/bin/tcsh', # TENEX C Shell (csh++)
u'/bin/bash', # the Bourne-Again SHell
u'/bin/zsh', # the Z shell
u'/usr/bin/zsh', # the Z shell
u'/usr/bin/screen',
u'/bin/rbash', # Bash restreint
u'/usr/bin/rssh', # restricted secure shell allowing only scp and/or sftp
u'/usr/local/bin/badPassSh', # demande de changer de mot de passe
u'/usr/bin/passwd', # idem
u'/usr/local/bin/disconnect_shell', # déconnexion crans
u'/usr/scripts/surveillance/disconnect_shell', # idem
u'/usr/sbin/nologin', # This account is currently not available.
u'/bin/false', # vraiement méchant
u'/usr/bin/es', # n'exsite plus
u'/usr/bin/esh', # n'existe plus
u'', # le shell vide pour pouvoir les punis
]
shells_gest_crans_order = ["zsh", "bash", "tcsh", "screen", "rbash", "rssh",
"badPassSh", "disconnect_shell"]
shells_gest_crans = {
"zsh": {"path":"/bin/zsh", "desc":"Le Z SHell, shell par defaut sur zamok"},
"bash": {"path":"/bin/bash", "desc":"Le Boune-Again SHell, shell par defaut de la plupart des linux"},
"tcsh": {"path":"/bin/tcsh", "desc":"C SHell ++"},
"screen":{"path":'/usr/bin/screen', "desc":"Un gestionnaire de fenêtre dans un terminal"},
"rbash": {"path":"/bin/rbash", "desc":"Un bash très restreint, voir man rbash"},
"rssh": {"path":"/usr/bin/rssh", "desc":"Shell ne permetant que les transferts de fichiers via scp ou sftp"},
"badPassSh":{"path":"/usr/local/bin/badPassSh", "desc":"Demande de changer de mot de passe à la connexion"},
"disconnect_shell":{"path":"/usr/local/bin/disconnect_shell", "desc":"Shell pour les suspensions de compte avec message explicatif"},
}
# Quels droits donnent l'appartenance à quel groupe Unix ?
droits_groupes = {'adm' : [u'Nounou'],
'respbats' : [u'Imprimeur', u'Cableur', u'Nounou'],
'apprentis' : [u'Apprenti'],
'moderateurs' : [u'Moderateur'],
'disconnect' : [u'Bureau'],
'imprimeurs' : [u'Imprimeur', u'Nounou', u'Tresorier'],
'bureau' : [u'Bureau'],
'webadm' : [u'Webmaster'],
'webradio' : [u'Webradio'],
}
####### Les modes de paiement accepté par le crans
modePaiement = ['liquide', 'paypal', 'solde', 'cheque', 'carte', 'comnpay', 'arbitraire',]
####### Les ML
# Le + devant un nom de ML indique une synchronisation
# ML <-> fonction partielle : il n'y a pas d'effacement automatique
# des abonnés si le droit est retiré
droits_mailing_listes = {'roots' : [ u'Nounou', u'Apprenti'],
'mailman' : [ u'Nounou'],
'+nounou' : [ u'Nounou', u'Apprenti'],
'respbats' : [ u'Cableur', u'Nounou', u'Bureau'],
'moderateurs' : [ u'Moderateur', u'Bureau'],
'disconnect' : [ u'Nounou', u'Bureau'],
'impression' : [ u'Imprimeur'],
'bureau' : [u'Bureau'],
'tresorier' : [u'Tresorier'],
'apprentis' : [u'Apprenti'],
'+ca' : [u'Bureau', u'Apprenti', u'Nounou', u'Cableur'],
'+federez' : [u'Bureau', u'Apprenti', u'Nounou'],
'+install-party' : [u'Bureau', u'Apprenti', u'Nounou'],
# Correspondance partielle nécessaire... Des adresses non-crans sont inscrites à ces ML.
'+dsi-crans' : [u'Nounou', u'Bureau'],
'+crous-crans' : [u'Nounou', u'Bureau'],
'+wrc' : [u'Webradio'],
}
#: Répertoire de stockage des objets détruits
cimetiere = '/home/cimetiere'
#: Adresses mac utiles
# Mac du routeur est la mac du routeur du crans (actuellement odlyd)
# Utilisé par ra2.py, à changer si le routeur est remplacé
mac_komaz = '00:19:bb:31:3b:80'
mac_du_routeur = 'a0:d3:c1:00:f4:04'
mac_titanic = 'aa:73:65:63:6f:76'
#: Serveur principal de bcfg2
bcfg2_main = "bcfg2.adm.crans.org"
#: Fichier de mapping lun/nom de volume iscsi
ISCSI_MAP_FILE = "/usr/scripts/var/iscsi_names_%s.py"
#: Algorithmes de hashage pour le champ SSHFP
# format : { algorithm : (IANA_id, ssh_algo) }
# où algorithm est tel qu'il apparait dans les fichiers /etc/ssh/ssh_host_%s_key.pub % algorithm
# IANA_id correspond à l'entier attribué par l'IANA pour l'algorithm dans les champs DNS SSHFP
# ssh_algo correspond a la première chaine de caractères donnant le nom de l'algorithme de chiffrement lorsque la clef ssh est dans le format openssh (algo key comment)
sshfp_algo = {
"rsa" : (1, "ssh-rsa"),
"dsa" : (2, "ssh-dss"),
"ecdsa-256" : (3, "ecdsa-sha2-nistp256"),
"ecdsa-384" : (3, "ecdsa-sha2-nistp384"),
"ecdsa-521" : (3, "ecdsa-sha2-nistp521"),
"ecdsa" : (3, "ecdsa-sha2-nistp521"),
}
sshfs_ralgo = {}
for key, value in sshfp_algo.items():
sshfs_ralgo[value[1]] = (value[0], key)
sshfp_hash = {
"sha1" : 1,
"sha256" : 2,
}
sshkey_max_age = int(9.869604401089358 * (365.25 * 24 * 3600))
sshkey_size = {
'rsa':4096,
'dsa':1024,
'ecdsa':521,
}
#: Nombre de jours après le passage en chambre ???? où on supprime les machines
demenagement_delai = 8
#############################
## Paramètres des machines ##
#############################
## >>>>>>>>>>>>>>> La modification des paramètres suivants doit se
## >> ATTENTION >> faire avec précaution, il faut mettre la base à
## >>>>>>>>>>>>>>> jour en parralèle de ces modifs.
# Sous réseaux alloués à chaque type de machine ou bâtiment
# Pour la zone wifi, il faut penser à modifier le /etc/network/interfaces
# de sable, zamok et komaz pour ajouter les zones en plus (et de
# faire en sorte qu'ils prennent effet immédiatement ; c'est important pour
# komaz car c'est la route par défaut mais aussi pour zamok et sable
# à cause de leur firewall et de leur patte wifi.
plage_ens = '138.231.0.0/16'
# NETs_primaires contient une bijection entre des types de machines
# et les plages d'ip qui vont bien. NETs_secondaires contient des
# clefs qui cassent la bijectivité, mais qui peuvent servir.
# NETs est l'union des deux
NETs_primaires = {
'serveurs' : ['138.231.136.0/24'],
'adherents' : ['138.231.137.0/24', '138.231.138.0/23', '138.231.140.0/22'],
'wifi-adh' : ['138.231.144.0/22',
'138.231.148.32/27',
'138.231.148.64/26',
'138.231.148.128/25',
'138.231.149.0/24',
'138.231.150.0/23',
],
'bornes' : [
'138.231.148.0/27',
],
'adm' : ['10.231.136.0/24'],
'personnel-ens' : ['10.2.9.0/24'],
'gratuit' : ['10.42.0.0/16'],
'accueil' : ['10.51.0.0/16'],
'federez' : ['10.53.0.0/16'],
'isolement' : ['10.52.0.0/16'],
'evenementiel' : ['10.231.137.0/24'],
'multicast' : ['239.0.0.0/8'],
'ens' : ['138.231.135.0/24'],
}
NETs_secondaires = {
'all' : ['138.231.136.0/21', '138.231.144.0/21'],
'wifi': ['138.231.144.0/21'],
'fil' : ['138.231.136.0/21'],
}
NETs = {}
NETs.update(NETs_primaires)
NETs.update(NETs_secondaires)
NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' }
# Classes de rid
# Merci d'essayer de les faire correspondre avec les réseaux
# ci-dessus...
# De même que pout NETs, primaires c'est pour la bijectivité, et secondaires
# pour les trucs pratiques
# https://wiki.crans.org/CransTechnique/PlanAdressage#Machines
rid_primaires = {
# Rid pour les serveurs
'serveurs' : [(0, 255),],
# Rid pour les machines fixes
'adherents' : [(256, 2047),],
# Rid pour les machines wifi
'wifi-adh' : [(2048, 3071), (3104, 4095),],
# Rid pour les bornes
'bornes' : [(3072, 3103), (34816, 35071),],
# Rid pour machines spéciales
'special' : [(4096, 6143),],
# Rid pour les serveurs v6-only
'serveurs-v6' : [(8192, 10240),],
# Rid pour les filaires v6-only
'adherents-v6' : [(16384, 24575),],
# Rid pour les wifi v6-only
'wifi-adh-v6' : [(24576, 32767),],
# Bornes-v6
'bornes-v6' : [(34816, 35071),],
# Rid pour les machines du vlan adm
'adm-v6' : [(49152, 51199),],
# Rid pour les machines du vlan adm
'adm' : [(51200, 53247),],
# Mid pour les machines du vlan gratuit
'gratuit' : [(53248, 55295),],
# Rid pour les machines des personnels ens
'personnel-ens' : [(55296, 55551),],
# Un unique rid pour les machines multicast
'multicast' : [(65535, 65535),],
}
rid_secondaires = {
# Rid pour les machines filaire ipv4
'fil' : [(0, 2047),],
'wifi' : [(2048, 4095), (34816, 35071),],
}
rid = {}
rid.update(rid_primaires)
rid.update(rid_secondaires)
# rid pour les machines spéciales (classe 'special' ci-dessus)
rid_machines_speciales = {
# freebox.crans.org
4096: '82.225.39.54',
# ovh.crans.org
4097: '91.121.84.138',
# soyouz.crans.org
4098: '91.121.179.40',
}
ipv6_machines_speciales = {
# freebox
4096: '2a01:e35:2e12:7360:a873:65ff:fe63:6f77',
# ovh
4097: '2001:41d0:1:898a::1',
# soyouz
4098: '2001:41d0:1:f428::1',
}
# Les préfixes ipv6 publics
prefix = { 'subnet' : [ '2a01:240:fe3d::/48' ],
'serveurs' : [ '2a01:240:fe3d:4::/64' ],
'adherents' : [ '2a01:240:fe3d:4::/64' ],
'fil' : [ '2a01:240:fe3d:4::/64' ],
'adm' : [ '2a01:240:fe3d:c804::/64' ],
'adm-v6' : [ '2a01:240:fe3d:c804::/64' ],
'wifi' : [ '2a01:240:fe3d:c04::/64' ],
'serveurs-v6' : [ '2a01:240:fe3d:c04::/64' ],
'adherents-v6' : [ '2a01:240:fe3d:4::/64' ],
'wifi-adh-v6' : [ '2a01:240:fe3d:c04::/64' ],
'personnel-ens' : [ '2a01:240:fe3d:4::/64' ],
'sixxs2' : [ '2a01:240:fe00:68::/64' ],
'evenementiel' : [ '2a01:240:fe3d:d2::/64' ],
'bornes' : [ '2a01:240:fe3d:c04::/64' ],
'bornes-v6' : [ '2a01:240:fe3d:c04::/64' ],
'wifi-adh' : [ '2a01:240:fe3d:c04::/64' ],
'v6only' : [ '2001:470:c8b9:a4::/64' ],
}
# Préfixes ipv6 internes (ula)
int_prefix = {
#: pour les services accessibles aux bornes wifi
'manage_ap': 'fda8:5d34:a228:c04::/64',
}
# Domaines dans lesquels les machines sont placées suivant leur type
domains = { 'machineFixe': 'crans.org',
'machineCrans': 'crans.org',
'machineWifi': 'wifi.crans.org',
'borneWifi': 'wifi.crans.org' }
# VLans
vlans = {
# VLan d'administration
'adm' : 2,
# VLan pour le wifi
'wifi' : 3,
# VLan pour le wifi de l'ens
'hotspot' : 4,
# VLan des gens qui paient
'adherent' : 1,
# VLan des inconnus
'accueil' : 7,
# VLan de la connexion gratuite
'gratuit' : 6,
'radin' : 6,
'v6only': 6,
# Vlan isolement
'isolement' : 9,
# Vlan de tests de chiffrement DSI
'chiffrement': 11,
# VLan des appartements de l'ENS
'appts': 21,
# Vlan federez-wifi
'federez': 22,
# Vlan evenementiel (install-party, etc)
'event': 10,
# Vlan zone routeur ens (zrt)
'zrt': 1132,
# iSCSI (pour exporter la baie de disque sur vo)
'iscsi': 42,
# freebox (pour faire descendre la connexion au 0B)
'freebox': 8,
}
filter_policy = { 'komaz' : { 'policy_input' : 'ACCEPT',
'policy_forward' : 'ACCEPT',
'policy_output' : 'ACCEPT'
},
'zamok' : { 'policy_input' : 'ACCEPT',
'policy_forward' : 'DROP',
'policy_output' : 'ACCEPT'
},
'default' : { 'policy_input' : 'ACCEPT',
'policy_forward' : 'ACCEPT',
'policy_output' : 'ACCEPT'
}
}
# Cf RFC 4890
authorized_icmpv6 = ['echo-request', 'echo-reply', 'destination-unreachable',
'packet-too-big', 'ttl-zero-during-transit', 'parameter-problem']
output_file = { 4 : '/tmp/ipt_rules',
6 : '/tmp/ip6t_rules'
}
file_pickle = { 4 : '/tmp/ipt_pickle',
6 : '/tmp/ip6t_pickle'
}
##################################################################################
#: Items de la blackliste
blacklist_items = {
u'bloq': u'Blocage total de tous les services',
u'paiement': u'Paiement manquant cette année',
u'virus': u'Passage en VLAN isolement',
u'upload': u"Bridage du débit montant vers l'extérieur",
u'autodisc_upload': u'Autodisconnect pour upload',
u'ipv6_ra': u'Isolement pour RA',
u'mail_invalide': u'Blocage pour mail invalide',
u'warez' : u"Présence de contenu violant de droit d'auteur sur zamok",
}
#: Blacklistes entrainant une déconnexion complète
blacklist_sanctions = [
'warez',
'virus',
'bloq',
'paiement',
]
#: Blacklistes redirigeant le port 80 en http vers le portail captif (avec des explications)
blacklist_sanctions_soft = [
'ipv6_ra',
'mail_invalide',
'virus',
'warez',
'bloq',
'chambre_invalide',
]
#: Blacklistes entrainant un bridage de la connexion pour upload
blacklist_bridage_upload = ['autodisc_upload', 'upload']
##################################################################################
adm_users = [ 'root', 'identd', 'daemon', 'postfix', 'freerad', 'amavis',
'nut', 'respbats', 'list', 'sqlgrey', 'ntpd', 'lp' ]
open_ports = { 'tcp' : '22' }
# Debit max sur le vlan de la connexion gratuite
debit_max_radin = 1000000
debit_max_gratuit = 1000000
###############################
## Vlan accueil et isolement ##
###############################
accueil_route = {
'138.231.136.1':{'tcp':['80','443', '22'],'hosts':['intranet.crans.org', 'ssh.crans.org', 'zamok.crans.org']},
'138.231.136.67':{'tcp':['80','443'],'hosts':['www.crans.org', 'wiki.crans.org', 'wifi.crans.org']},
'138.231.136.98':{'tcp':['20','21','80','111','1024:65535'],'udp':['69','1024:65535'], 'hosts':['ftp.crans.org']},
'138.231.136.130':{'tcp':['80','443'],'hosts':['intranet2.crans.org']},
'138.231.136.18':{'tcp':['80','443'],'hosts':['cas.crans.org', 'login.crans.org', 'auth.crans.org']},
'213.154.225.236':{'tcp':['80','443'], 'hosts':['crl.cacert.org']},
'213.154.225.237':{'tcp':['80','443'], 'hosts':['ocsp.cacert.org']},
}
dhcp_servers = ['dhcp.adm.crans.org', 'isc.adm.crans.org']
# Le bâtiment virtuel dans lequel on place des chambres qui n'existent pas, pour faire
# des tests.
bats_virtuels = ['v']
# Liste des batiments
liste_bats = ['a', 'b', 'c', 'h', 'i', 'j', 'm', 'g', 'p', 'k']