Commits

Cédric Bonhomme committed 5705204 Draft

la serrure ferme SSH 30 secondes après l'ouverture de la serrure par le client.

  • Participants
  • Parent commits 90fa5e2

Comments (0)

Files changed (4)

 import threading
 
 class Client(object):
+    """Classe client.
+
+    Représente la clé de la serrure sécurisée.
+    """
     def __init__(self, adresseDistante, portDistant):
         self.adresseDistante = adresseDistante
         self.portDistant = portDistant
         #s.close()
         #print 'Received', repr(data)
 
-def generatePort():
+def generatePort(delta=0):
     """
     Génère un port aléatoirement.
     Basé sur EPOCH (temps passé depuis 1970).
+
+    delta représente la marge d'erreur possible en secondes.
     """
     heure = int(time.strftime("%H", time.localtime()))
     jour = int(time.strftime("%d", time.localtime()))
-    nombre_aleatoire = int(time.time() % 8000)
+    nombre_aleatoire = (int(time.time()) - delta) % 8000
     modulo = nombre_aleatoire % 30
     nombre_aleatoire = abs(nombre_aleatoire - modulo)
     nombre_aleatoire = nombre_aleatoire + reduce(operator.add, [int(nombre) + heure \
     Basé sur EPOCH (temps passé depuis 1970).
     """
     nombre_aleatoire = int(time.time() % 8000)
-    modulo = nombre_aleatoire % 5
+    modulo = nombre_aleatoire % 25
     nombre_aleatoire = abs(nombre_aleatoire - modulo)
     return nombre_aleatoire + reduce(operator.add, [int(nombre) + 69 for nombre in str(abs(nombre_aleatoire - 42))])
 
         exit(1)
 
     port = generatePort()
-    print "Tentative de connexion sur :", (adresse, port)
-    client = Client(adresse, port)
+    port_delta = generatePort(30)
+    try:
+        client = Client(adresse, port)
+        print "Connexion sur :", (adresse, port)
+    except socket.error:
+        # dans le cas où le client a quelques secondes d'avances (<=30s)
+        client = Client(adresse, port_delta)
+        print "Connexion sur :", (adresse, port_delta)
+
 
     # génération du mot de passe pseudo-aléatoire
     hashSHA224 = hashlib.sha224()
     data = action+":"+data # demande l'ouverture/fermeture du port ssh
 
     print "Envoie de", data
-    client.send(data) # envoie la demande
+    client.send(data) # envoie la demande

File closeFireWall.sh

 #!/bin/sh
 
 # Efface les regles concernant le port fourni en parametre
-cat iptable | grep -v $1 > tmp
-cat tmp > iptable
+cat /home/cdjs/pyLock/iptable.sh | grep -v $1 > /home/cdjs/pyLock/tmp
+cat /home/cdjs/pyLock/tmp > /home/cdjs/pyLock/iptable.sh
+
+rm -f /home/cdjs/pyLock/tmp
 
 # Reinitialise le firewall
 iptables -F
 iptables -X
 iptables -P INPUT ACCEPT
 iptables -P OUTPUT ACCEPT
-
-exit 0

File openFireWall.sh

 #!/bin/sh
 
+
 # Ajoute l'ouverture en entree vers le port aleatoire fourni en parametre
 # Remarque : aucune regle n'est donne en output, car la serrure ne repond pas au client
-echo "iptables -A INPUT -p tcp -i eth0 --dport $1 -j ACCEPT" >> iptable
+echo "iptables -A INPUT -p tcp -i eth0 --dport $1 -j ACCEPT" >> /home/cdjs/pyLock/iptable.sh
+echo "iptables -A OUTPUT -p tcp -o eth0 --sport $1 -j ACCEPT" >> /home/cdjs/pyLock/iptable.sh
 import threading
 
 class Serveur(object):
+    """Classe Serveur
+
+    Représente la serrure sécurisée.
+    """
     def __init__(self, portLocal):
         """
         Initialise le socket
         """
-        self.host = "127.0.0.1"
+        self.host = "0.0.0.0"
         self.port = portLocal
         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.sock.setblocking(0)
             try:
                 self.conn, addr = self.sock.accept()
                 self.conn.setblocking(1)
+		log("Tentative de connexion de " + str(addr))
 
                 print 'Connected by', addr
                 data = self.conn.recv(1024)
                     if data[:4] == "open":
                         os.system("/etc/init.d/ssh start")
                         print "SSH lancé ..."
+			log("SSH lancé")
+			c = threading.Thread(None, close_after_log, None,)
+		        c.setDaemon(True)
+		        c.start()
                     elif data[:4] == "clos":
                         os.system("/etc/init.d/ssh stop")
                         print "SSH fermé ..."
+			log("SSH fermé...")
                 else:
                     print "Mauvaise phrase de passe."
+		    log("Connexion échouée.")
 
-            except socket.timeout:
+            except:
                 pass
         self.sock.close()
 
         except:
             print "Oups..."
 
+
+
+def close_after_log():
+    """Ferme SSH 30 secondes après l'ouverture de la serrure.
+    """
+    time.sleep(30)
+    os.system("/etc/init.d/ssh stop")
+
+
+def log(message):
+    """Save the log in the log file.
+    """
+    try:
+        log_location = "/home/cdjs/logPyHIDS/logLOCK"
+        log_file = open(log_location, "a")
+        log_file.write(message+"\n")
+    except Exception , e:
+	 print "Erreur", e
+    finally:
+    	log_file.close()
+
 def generatePort():
     """
     Génère un port aléatoirement.
     Basé sur EPOCH (temps passé depuis 1970).
     """
     nombre_aleatoire = int(time.time() % 8000)
-    modulo = nombre_aleatoire % 5
+    modulo = nombre_aleatoire % 25
     nombre_aleatoire = abs(nombre_aleatoire - modulo)
     return nombre_aleatoire + reduce(operator.add, [int(nombre) + 69 \
                     for nombre in str(abs(nombre_aleatoire - 42))])
     while True:
         # génération du port aléatoire
         numero_port = generatePort()
-        print "Création serveur sur port", numero_port
-
+        #print "Création serveur sur port", numero_port
+	log("Changement de port :" + str(numero_port))
         # le firewall autorise la connexion sur le nouveau port
-        os.system('./openFireWall.sh '+str(numero_port))
+        #print "Modification des règles du pare-feu"
+        os.system('/home/cdjs/pyLock/openFireWall.sh ' + str(numero_port))
+        os.system('/home/cdjs/pyLock/iptable.sh')
 
         # ouverture du port et création du socket
         serveur = Serveur(numero_port)
         a = threading.Thread(None, serveur.receive, None,)
         a.setDaemon(True)
-        print "Lancement serveur"
+        #print "Lancement serveur"
         a.start()
 
         time.sleep(30)
 
         # fermeture du port
-        print "Destruction serveur"
+        #print "Destruction serveur"
         serveur.close()
         del serveur
         del a
 
         # réinitialisation du firewall
-        os.system('./closeFireWall.sh '+str(numero_port))
+        #print "Réinitialisation du pare-feu"
+	time.sleep(1)
+        os.system('/home/cdjs/pyLock/closeFireWall.sh ' + str(numero_port))
+        os.system('/home/cdjs/pyLock/iptable.sh')