Kaspersky est largement utilisé dans les réseaux pédagogiques de l’académie de Lille et quoique gourmand en ressources mémoire il s’avère très efficace en terme de sécurité. Mais attention pourtant, faire une installation par défaut et laisser chaque postes de vos salles pupitres récupérer sa propre version de mise à jour quotidienne des définitions de virus, risque de sérieusement encombrer la bande passante de votre établissement. Heureusement Kasperky offre la possibilité de récupérer ces définitions de virus localement ou depuis un partage réseau …
Et qui d’autre de mieux placé que votre serveur Kwartz pour récupérer cette mise à jour ? humm ?!
Commençons …
Alors soyons clair, je ne vais pas ici vous faire un cour détaillé sur le shell bash, je vais juste vous donner les quelques pistes pour mieux comprendre ce script et le configurer par vous même selon vos préférences et les spécifications de votre établissement.
Il existe plusieurs méthodes pour éditer du script, la plus simple et de loin la moins bonne étant de l’éditer avec le notepad Windows. Le problème est que l’encodage des caractères risque de rendre votre script complétement illisible par un système Linux. La meilleur solutions est donc de télécharger le freeware Notepad++ et de l’installer. Il a le gros avantage d’être beaucoup plus complet que son alter ego avec notamment la colorisation syntaxique de nombreux langages et l’encodage selon les OS . Donc premièrement lancez Notepad++ faites Fichier/Nouveau puis Langage/Shell et enfin Format/Convertir en format Unix. Vous voilà avec une page de script aux normes, on a plus qu’à commençer à taper nos lignes de code.
1.#!/bin/bash2.############################################################3.# SCRIPT DE MISE A JOUR DES DEFINITIONS DE VIRUS KASPERSKY #4.############################################################Explications : La première ligne « prévient » le système que le langage utilisé est en bash et détermine la localisation de son interpréteur.
La suite c’est juste une fioriture, histoire de mettre un titre à votre script
Répertoires de stockage
05.#PARAMETRES DE CONFIGURATION (personnalisables)06.#---------------------------------------------07.# =>CHEMINS ET FICHIERS08.# //Répertoires d'exécution09. path="/home/kwartz/Programmes/KASPERSKY/"; #Repertoire racine ( contient le script )10. cpath=${path}"cache/"; #Repertoire de stockage des archives téléchargés11. dpath=${path}"definitions/"; #Repertoire de stockage des fichiers de dépôt des définitions12. lpath=${path}"logs/"; #Repertoire de stockage des fichiers de journalisation du script13.# //Liste des fichiers à nettoyer dans le repertoire de dépôt des définitions14.# (séparés par des espaces - recommandation : ne pas modifier)15. old_files=" avc cfg dll dt ini klb lst mhk vnd set txt xml ";Explications : Ces éléments de configuration sont personnalisables, j’ai opté pour une installation du script dans le partage Programmes du serveur Kwartz puisque le script sera exécuté par l’utilisateur winadmin. Il est « seul » à posséder les droit en écritures dans ce répertoire, ce qui évite qu’un petit malin vienne vous supprimer vos fichiers.
Miroir mon beau miroir …
16.# =>MIROIRS ET CONFIG DE CHARGEMENT17.miror[0]="http://dnl-eu8.kaspersky-labs.com/zips/"; #Miroir France18.miror[1]="http://dnl-eu9.kaspersky-labs.com/zips/"; #Miroir France19.miror[2]="http://dnl-eu7.kaspersky-labs.com/zips/"; #Miroir Belgique20.miror[3]="http://dnl-eu5.kaspersky-labs.com/zips/"; #Miroir Belgique21.miror[4]="http://dnl-eu6.kaspersky-labs.com/zips/"; #Miroir Belgique22.miror[5]="http://dnl-us9.kaspersky-labs.com/zips/"; #Miroir Etats-Unis23.miror[6]="http://dnl-us5.kaspersky-labs.com/zips/"; #Miroir Etats-Unis24.miror[7]="http://dnl-eu10.kaspersky-labs.com/zips/";#Miroir Estonie25.#miror[8]="http://dnl-pr1.kaspersky-labs.com/zips/";#Miroir Russie26.# //Liste des archives à récupérer sur le site de Kaspersky (recommandation : ne pas modifier)27.archives[0]="av-i386-cumul.zip";28.archives[1]="av-i386-weekly.zip";29.archives[2]="av-i386-daily.zip";30.# //Configuration du téléchargement31.attempt=2; #tentative par miroir (defaut 2)32.waiting=10; #temps d'attente avant d'annuler une tentative sans réponse33. #( defaut 10 secondes / mettre à 30 pour une connexion lente type 56ko/s)Explications : Dans la première partie on renseigne tous les miroirs de téléchargements où le script ira chercher les archives contenant les définitions de virus (miror[n]). Vous pouvez changer l’ordre des priorités en changeant la numérotation, attention cela dit à démarrer de 0, qu’ils se suivent et à ne pas mettre plusieurs fois le même numéro. Pour désactiver un miroir, il suffit de commenter la ligne en ajoutant un « # » (Cf. l.10 : #miror[8] …). Il est également possible d’ajouter vos propres miroirs.
Les variables archives[n] sont les trois archives de définitions récupérés par le script, il est recommandé de ne pas modifier ces paramètres.
attempt correspond au nombre de tentatives effectué par miroir en cas d’échec
waiting est le temps d’attente sans réponses avant de considérer en échec une tentative de connexion au miroir
Numéro de version et temporisation
34.# =>VERSION D'EXECUTION DU SCRIPT (!!ne pas modifier!!)35. version=$(date +%d-%m-%Y);36. time=$(date +%Hh%M);37.# //Jour du mois pour effectuer la mise à jour cumulative38.monthly_day="01";39.# //Jour de la semaine pour effectuer la mise à jour hebdomadaire40.weekly_day="0";Explications : version et time servent à nommer les fichiers et renseigner la journalisation, ne changez pas ces paramètres …
En revanche monthly_day permet de choisir le jour du mois pour faire la mise à jour cumulatives (jour à 2 chiffres => le 01 par defaut).
De même weekly_day permet de définir le jour de la semaine quand faire la Maj hebdomadaire (0:dimanche , 1:lundi, …, 6:samedi => 0 par defaut)
Journalisation des mises à jour
41.# =>FICHIERS DE LOG ( Récupération des infos de mise à jour)42.# //Nom des fichiers43.suffix="upddef.log" #suffixe des fichiers de log44.detail="${version}_${time}_${suffix}"; #nom du fichier inclus l'heure et la date45.log="${version}_${suffix}"; #nom du fichier inclus la date46.# //Texte de séparation des éléments des blocs d'informations47.# (doit toujours commencer par un # ou simplement un retour chariot: \r)48.separator="#---------------------------------#\r";49.# //Entête des fichiers de log50.header="#\tMISE A JOUR DES DEFINITIONS DE KASPERSKY DU ${version}\t#\r\r";51.# //Durée de conservation des logs (en jours)52.cache="3";53. 54.# =>MAIL55.# //Envoie du fichier de log par mail (defaut : `true` mettre à `false` si vous ne souhaitez pas envoyer le fichier de log par mail)56.sendmail=true;57.# //destinataires du mail ( separés par des espaces ex: " winadmin gates.bill steve.jobs tovald.linus@tux.fr " les mails vers les comptes exterieurs ne fonctionneront que si votre smtp kwartz est configuré )58.to=" winadmin ";59.<pre>Explications : Cette fonctionnalité va vous permettre de journaliser les mises à jour dans un fichier texte et le cas échéant d’identifier les problèmes
Le gros morceau qui va bien
060.#################################################################################################################################061. 062.#ETAPE 1 : ENVOIE PAR MAIL DU LOG DE LA VEILLE (facultatif)063.#-----------------------------------------------------------------------------064.yesterday=$(date -d "-1 day" +%d-%m-%Y);065.if ${sendmail} && [ -e ${lpath}${yesterday}_${suffix} ] && ! [ -e ${cpath}${version}_mail.cache ]066.then cat ${lpath}${yesterday}_${suffix} | mail -s "mise à jour de kaspersky ${yesterday}" ${to}067.touch ${cpath}${version}_mail.cache;068.fi069. 070.#ETAPE 2 : TEST D'ECRITURE ET CREATION DE L'ARBORESCENCE DES REPERTOIRES071.#--------------------------------------------------------------------------------------------------------072.if ! [ -e ${path} ]; then echo "ATTENTION - Le dossier ${path} n'existe pas - FIN D'EXECUTION DU SCRIPT"; exit; fi #Test d'existance du dossier racine (echec=> arrêt du script)073.if ! [ -w ${path} ]; then echo "ATTENTION - Le dossier ${path} n'est pas inscriptible - FIN D'EXECUTION DU SCRIPT "; exit; fi #Test d'écriture du dossier racine (echec=> arrêt du script)074.[ -e ${cpath} ] || mkdir ${cpath}; #Création du répertoire de stockage des archives téléchargés075.if ! [ -w ${cpath} ]; then echo "ATTENTION - Le dossier ${cpath} n'est pas inscriptible - FIN D'EXECUTION DU SCRIPT"; exit; fi #Test d'écriture du dossier de cache (echec=> arrêt du script)076.[ -e ${dpath} ] || mkdir ${dpath}; #Création du répertoire des fichiers de définitions077.if ! [ -w ${dpath} ]; then echo "ATTENTION - Le dossier ${dpath} n'est pas inscriptible - FIN D'EXECUTION DU SCRIPT"; exit; fi #Test d'écriture du dossier de définitions (echec=> arrêt du script)078.[ -e ${lpath} ] || mkdir ${lpath}; #Création du répertoire de log079.if ! [ -w ${lpath} ]; then echo "ATTENTION - Le dossier ${lpath} n'est pas inscriptible - FIN D'EXECUTION DU SCRIPT"; exit; fi #Test d'écriture du dossier de log (echec=> arrêt du script)080. 081.#ETAPE 3 : INITIALISATION DES FICHIERS DE LOG082.#----------------------------------------------------------------083.#Detail084.touch ${lpath}${detail}; #Création du fichier de détail085.echo -e "${header} ${time}\r" > ${lpath}${detail}; #Entête du fichier de détail086.#Log Global087.if (!(test -e ${lpath}${log})) then touch ${lpath}${log}; echo -e "${header}\r" > ${lpath}${log}; fi #Si le fichier de log n'existe pas on le crée, et on inscrit l'entête088.if (!(test -w ${lpath}${log})) then echo "ATTENTION - Le fichier de log n'est pas inscriptible - FIN D'EXECUTION DU SCRIPT "; exit; fi #Si le fichier de log n'est pas incriptible, on arrête l'exécution du script089. 090.#ETAPE 4 : NETTOYAGE (Ne met pas en échec l'exécution du script)091.#------------------------------------------------------------------------------092.echo -e ${separator} >> ${lpath}${detail}093.echo -e "\tNETTOYAGE\r\r" >> ${lpath}${detail}094.#Nettoyage des anciens fichiers de définitions ( Une fois par mois lors du chargement du Cumul, puisque les fichiers inclus au Cumul sont necessaires pour toute éventuelle nouvelle installation de Kaspersky sur un client )095.if [ "$(date +%d)" != "${monthly_day}" ] || [ -e "${cpath}${version}_cleaning-definitions.cache" ]096.then echo -e "Pas de nettoyage des définitions programmé\r" >> ${lpath}${detail};097.else098.echo -e "\t\tPurge des anciennes définitions\r" >> ${lpath}${detail}099.for old_file in ${old_files}100.do101.rm ${dpath}*.${old_file} && echo -e "fichiers ${old_file} effacés dans ${dpath}\r" >> ${lpath}${detail} || echo -e "aucun fichier ${old_file} a effacer dans ${dpath}\r" >> ${lpath}${detail};102.done103.touch "${cpath}${version}_cleaning-definitions.cache";104.fi105.#Nettoyage des anciens fichiers d'archives et possibles téléchargements incomplets106.echo -e "\t\tPurge des archives\r" >> ${lpath}${detail}107.i=0108.while [ $i -lt ${#archives[*]} ]109.do110.rm ${cpath}${archives[$i]}* && echo -e "tous les anciens fichiers d'archives de type ${archives[$i]} ont été supprimés dans ${cpath}\r" >> ${lpath}${detail} || echo -e "pas de fichiers d'archives de type ${archives[$i]} a supprimer\r" >> ${lpath}${detail};111.((i++));112.done113.#Nettoyage des anciens fichiers log et des anciens fichiers de cache114.limit=$(date -d "$cache days ago" +%y-%m-%d);115.buffer=$(date -d "$limit -7 days" +%y-%m-%d); #Le tampon sert a effacer tous les fichiers une semaine avant le cache (=>sécurité supplémentaire)116.while [ $buffer != ${limit} ]117.do118.rm -f ${lpath}$(date -d "${buffer}" +%d-%m-%Y)*.log;119.rm -f ${cpath}$(date -d "${buffer}" +%d-%m-%Y)*.cache;120.buffer=$(date -d "$buffer +1 day" +%y-%m-%d);121.done122.#ETAPE 5 : CHARGEMENT ET DECOMPRESSION DES ARCHIVES (CUMUL, WEEKLY, DAILY)123.#-----------------------------------------------------------------------------------------------------------124.echo -e ${separator} >> ${lpath}${detail}125.echo -e "\tCHARGEMENT ET DECOMPRESSION DES ARCHIVES\r\r" >> ${lpath}${detail}126. 127.# =>TEST DES ARCHIVES A RECUPERER128.# //DEFINITIONS CUMULATIVES (Cumul)129.if [ "$(date +%d)" != "${monthly_day}" ]130.then echo -e "Pas de mise à jour mensuel aujourd'hui\r" >> ${lpath}${detail};131.unset archives[0]; #Annulation de la récupération de l'archive de Cumul132.else133.if [ -e "${cpath}${version}_${archives[0]}.cache" ]134.then echo -e "Mise à jour mensuel déjà récupérée aujourd'hui\r" >> ${lpath}${detail};135.unset archives[0]; #Annulation de la récupération de l'archive de Cumul136.fi137.fi138.# //DEFINITIONS HEBDOMADAIRE(Weekly)139.if [ "$(date +%w)" != "${weekly_day}" ]140.then echo -e "Pas de mise à jour hebdomadaire aujourd'hui\r" >> ${lpath}${detail};141.unset archives[1]; #Annulation de la récupération de l'archive de Weekly142.else143.if [ -e "${cpath}${version}_${archives[1]}.cache" ]144.then echo -e "Mise à jour hebdomadaire déjà récupérée aujourd'hui\r" >> ${lpath}${detail};145.unset archives[1]; #Annulation de la récupération de l'archive de Weekly146.fi147.fi148. 149.# =>TRAITEMENT DES ARCHIVES A RECUPERER150.for archive in ${archives[@]} #Traitement de chaque archive de définition151.do152.echo -e "\r\tTraitement des définitions de ${archive}\r">> ${lpath}${detail}153.# //CHARGEMENT154.i=0;155.while [ $i -lt ${#miror[*]} ] #Test de chaque miroir de téléchargement156.do157.if wget -t ${attempt} -T ${waiting} -P${cpath} ${miror[$i]}${archive} #Test de chargement de l'archive de définitions158.then echo -e "Chargement du dernier fichier ${archive} sur ${miror[$i]}: réussi\r" >> ${lpath}${detail}; i=${#miror[*]}; dl=true; #Chargement réussi159.else160.echo -e "chargement du fichier ${archive} sur ${miror[$i]} : échec\r" >> ${lpath}${detail}; ((i++));# Si la tentative de chargement renvoie un échec on test sur le miroir suivant161.fi #Fin de test de chargement de l'archive de définitions162.done #Fin de test de chaque miroir de téléchargement163.if [ -z "${dl}" ]164.then echo -e "Impossible de charger le fichier de définition ${archive}\r" >> ${lpath}${detail}; #Toutes les tentatives sur tous les miroirs ont échoué165.fi166.# //DECOMPRESSION167.if ${dl} && unzip -o -q -d ${dpath} ${cpath}${archive} #Test de décompression de l'archive chargé et écrasement des anciennes versions de définitions168.then touch ${cpath}${version}_${archive}.cache ;169.echo -e "décompression du dernier fichier ${archive} dans ${dpath} : réussi\r" >> ${lpath}${detail}; dzip=true;#Décompression Réussie170.else171.echo -e "impossible de décompresser le dernier fichier ${archive} dans ${dpath}\r" >> ${lpath}${detail}; ((i++));#Problème de décompression on passe au miroir suivant172.fi #Fin de test de décompression de l'archive chargé173.done #Fin de traitement de chaque archive de définition174. 175.#ETAPE 6 : ECRITURE DU RESULTAT DE MISE A JOUR DANS LE FICHIER DE LOG176.#-------------------------------------------------------------------------------------------------177.#Resultat de la mise à jour178.echo -e ${separator} >> ${lpath}${log}179.if ${dl} && ${dzip}180.then echo -e "Mise à jour du ${version} à ${time} : ok\r" >> ${lpath}${log};181.else182.echo -e "Mise à jour du ${version} à ${time} : échec\r" >> ${lpath}${log};183.fi184.exit;Amateur de scripts et autres boucles, régale toi. Faire un descriptif exhaustif du script serait bien inutile et pas vraiment digne d’intérêt. Il est en plus déjà largement commentés.
Enfin sans être parfait il est toutefois fonctionnel puisque testé en conditions réelles.
La p’tite touche qui ferait plaisir…
185.#############################################################186.# par Jordy Manner187.# (cherche un emploi - contact : http://www.milkcreation.fr )188.#############################################################Facultatif mais si vous faites tourner le script soyez sympa de le rajouter, ça mange pas de pain et ça sauvera un informaticien pâtophobe !
Pour terminer vous pouvez télécharger le script update.sh
Quand à l’installation du script via un cron sur Kwartz, elle est largement détaillé dans les procédures d’installations de Kaspersky sur les sites des BAIP et de la CANTE :
http://baip.fr/nicolas/kaspersky/
http://www3.ac-lille.fr/crid-systeme/download/antivirus/kaspersky-kwartz.pdf
La procédure est la même sauf que vous n’avez qu’un script à installer au lieu de trois.
