vendredi 19 mai 2023

3 précautions à prendre quand on expose un serveur sur Internet

 Dans le cadre des formations Python, nous sommes amenés à faire des démonstrations de web scraping (aspiration de site) avec scrapy.

J'ai déployé une mini application web sur une VM accessible sur Internet.

Le site: http://lemonlabs.fr

Au bout de quelques heures le fichier de journalisation auth.log se rempli toute la journée avec des tentatives d'intrusion SSH souvent avec l'utilisateur root.

Donc trois précautions à prendre rapidement.

1: Fermer tous les ports.

En dehors des ports web et ssh n'ouvrir aucun port: pas de FTP , serveur de base de données

Une base postgresql ouverte sur Internet ne tiendra pas 10 minutes et elle servira de point d'entrée pour exécuter des scripts malveillants.

2: Utiliser un outil de surveillance.

Pour interdire l'acces à une adresse IP, cette adresse doit être ajoutée au fichier /etc/hosts.deny

Pour automatiser cette tache j'utilise denyhosts : c'est un programme python qui scrute les tentatives d'intrusion et qui met à jour le fichier /etc/hosts.deny  (doc en francais ici)


3:Interdire la connexion à l'utilisateur root.

Pour cela créer un utilisateur quelconque qui servira à se connecter en SSH, puis une fois connecté , utiliser la commende su root pour devenir administrateur. En effet l'utilisateur root est un nom d'utilisateur connu de tous alors que votre nom d'utilisateur est inconnu.

Pour interdire la connexion en root, il faut modifier le fichiers de configuration de sshd:   /etc/ssh/sshd_config

(paramètre PermitRootLogin a faire passer à no) 

Attention pensez à maintenir une autre console ouverte  pour intervenir en cas de probleme. 







 


Exo7 python initiation

 On continue sur notre série. Le corrigé de l'exo6 est en fin d'article.


Enoncé de l'exo7 python initiation.: un nombre est il divisible par 3 ?

Réaliser une fonction qui retourne vrai ou faux à la question : un nombre est-il divisible par 3.

Pour répondre à la question et pour rendre l'exercice amusant, il faudra ajouter chaque digit du nombre et vérifier que leur somme est divisible par 3.

Exemple : 121 est-il divisible par 3 ? : 1+2+1 = 4

4 - 3 = 1  => 121 n'est pas divisible par 3.


123 : 1+2+3 = 6 

6 - 3 - 3 = 0  => 123 est divisible par 3


Solution de l'exo6



def somme_impair(n):
    cp = 0
    for  x in range(1,n*2,2):
        cp+= x
    return cp
 
print(somme_impair(2))  
print(somme_impair(4))  
print(somme_impair(10))        
print(somme_impair(15))  
cache = {}
for x in range(1,20):
    cache[x] = somme_impair(x)
print(cache)    
 
def avec_cache(n):
    if n in cache:
        return cache[n]
    else:
        cache[n] = somme_impair(n)
        return cache[n]
print('avant cache')
print(avec_cache(20000))
print('apres cache')
print(avec_cache(20000))
 
 
 

vendredi 12 mai 2023

Exo-6 python initiation

Le corrigé du numéro 5 est à la fin de l'article.


Enoncé exo6.

1) Faire un fonction qui calcule la somme des N premiers nombres impairs.

Exemple : print(somme_impair(2))    => donnera : 4

La fonction doit utiliser une boucle et non pas une formule directe.

2)Utilisation d'un cache.

A l'aide d'un dictionnaire , conservez les résultats des calculs.

Avant de lancer la boucle de calcul, la fonction doit aller voir dans son cache.

Avec un notebook Jupyter placer une instruction %%timeit dans une cellule pour mesurer l'écart  entre un premier calcul et le second.



Corrigé de l'exercice 5



class Comptage():
    def __init__(self, texte):
        self.dico = {}
        tab_texte = texte.split(' ')
        for mot in tab_texte:  
            if mot.find("'") > 0:
                tab= mot.split("'")
                mot= tab[1]
            self.maj_dico(mot)
 
    def maj_dico(self, mot):
        if mot != '' and len(mot) > 1:
             if mot.lower() in self.dico:
                 self.dico[mot.lower()] += 1
             else:
                 self.dico[mot.lower()] = 1
 
    def liste(self):
        liste_ = []
        for cle, valeur in self.dico.items() :
            liste_.append((cle,valeur ))
        return liste_
 

vendredi 5 mai 2023

Collecte sur le web (3eme article)


 

Revoici, après un petit tour de la toile, des liens ou des projets intéressants .

Numero précédent:

 https://germanlinux.blogspot.com/2023/03/collecte-sur-le-web-2eme-article.html





Python.

Datasciences.

Collaboratif.

Exo 5 Python initiation

Voici l'énoncé de l'exercice de la semaine.

Pour rappel la correction de l'exercice 4 est donné en fin d'article;

Exercice 5:

 Construire une classe qui prend comme argument dans son constructeur une chaine de caractères et retourne une liste de tuple avec le mot et son compteur d'apparition dans le texte.

Exemple:  Comptage('Pourquoi , pourquoi , as tu fait ca , tu n'es pas un as de la route . Je voulais voir une fois quel effet ca fait')

Resultat: 

[('pourquoi', 2), ('as', 2), ('tu', 2), ('fait', 2), ('ca', 2), ('es', 1), ('pas', 1), ('un', 1), ('de', 1), ('la', 1), ('route', 1), ('je', 1), ('voulais', 1), ('voir', 1), ('une', 1), ('fois', 1), ('quel', 1), ('effet', 1)]


Règles de gestion: 

  • Ne tenir compte d'un mot d'une lettre
  • Ne pas compter ce qui est avant un apostrophe

On pourra utiliser le caractère <espace> pour repérer la séparation des mots.
Par simplification, les caractères de ponctuation sont entourés d'espace.

Corrigé de l'exercice exo4 python initiation


def transforme(liste):
    sortie = []
    lgl = len(liste)
    lgtuple = len(liste[0])
    for col in range(lgtuple):
        tup_ = ()
        for row in liste:
            tup_ += row[col],
        sortie.append(tup_)
    return sortie
 
a = [(1, 2), (3, 4), (5,6)]
print (transforme(a))

=> [(1, 3, 5), (2, 4, 6)]