Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
1
Sommaire
Liste de figures ................................................................................................................................................................ 3
Introduction...................................................................................................................................................................... 4
La sécurité informatique .................................................................................................................................................. 5
Chapitre I : La signature numérique ................................................................................................................................ 7
1. Fonctionnement de la signature numérique : .................................................................................... 7
2. La signature numérique en java ........................................................................................................ 9
a) Envoi d'un message avec une signature numérique ...................................................................... 9
b) Vérification de la signature ......................................................................................................... 13
Chapitre II : FIREWALL ............................................................................................................................................... 16
1. FIREWALL .................................................................................................................................... 16
a) Pare-feu matériel et logiciel ........................................................................................................ 16
b) Fonctionnement général .............................................................................................................. 17
c) FIREWALL en java .................................................................................................................... 18
Chapitre III : Server Proxy............................................................................................................................................. 47
1. Les fonctionnalités d’un serveur PROXY ...................................................................................... 47
2. Server proxy en java ....................................................................................................................... 48
a) Implémentation............................................................................................................................ 48
b) Les classes ................................................................................................................................... 48
Chapitre IV : Systèmes de détection d’intrusion (IDS) ................................................................................................. 51
1. Les différents types d’IDS .............................................................................................................. 51
2. IDS à Modèles comportementaux :................................................................................................. 51
3. IDS réseau et IDS système .............................................................................................................. 52
4. Systèmes de détection d’intrusion (IDS) en java ............................................................................ 53
a) Port scannig ................................................................................................................................. 53
b) Explication du projet ................................................................................................................... 53
c) Affichage des résultats ................................................................................................................ 54
Conclusion ..................................................................................................................................................................... 55
2
Liste des figures
3
Introduction
Ce document est un rapport du travail effectué pour la réalisation du projet
de fin d’année ayant comme sujet « Plateforme des méthodes de la sécurité
informatique ».
Le travail sur le projet a suivi des étapes bien précises et logiques commençant
par une introduction générale sur la sécurité informatique, puis plus précisément,
les méthodes :
Signature numérique, FIREWALL, server PROXY et IDS et leurs programmation
en langage java.
4
La sécurité informatique
La sécurité informatique est l’ensemble des moyens mis en œuvre pour réduire la
vulnérabilité d’un système contre les menaces accidentelles ou intentionnelles. Il
convient d'identifier les exigences fondamentales en sécurité informatique. Elles
caractérisent ce à quoi s'attendent les utilisateurs de systèmes informatiques en regard
de la sécurité :
1. disponibilité : demande que l'information sur le système soit disponible aux
personnes autorisées.
2. Confidentialité : demande que l'information sur le système ne puisse être lue que par
les personnes autorisées.
3. Intégrité : demande que l'information sur le système ne puisse être modifiée que par
les personnes autorisées.
Identifier et authentifier
Les personnes qui accèdent à une ressource non publique doivent être identifiées
; leur identité doit être authentifiée ; leurs droits d’accès doivent être vérifiés au regard
des habilitations qui leur ont été attribuées. À ces trois actions correspond un premier
domaine des techniques de sécurité : les méthodes d’authentification, de signature, de
vérification de l’intégrité des données et d’attribution de droits.
La sécurité des accès par le réseau à une ressource protégée n’est pas suffisamment
garantie par la seule identification de leurs auteurs. Sur un réseau local de type Ethernet
ou Wi-Fi où la circulation des données fonctionne selon le modèle de l’émission
radiophonique que tout le monde est censé pouvoir capter, il est possible de détourner
cette circulation. Si la transmission a lieu à travers l’Internet, les données circulent de
façon analogue à une carte postale, c’est-à-dire qu’au moins le facteur et la concierge y
ont accès. Dès lors que les données doivent être protégées, il faut faire appel aux
5
techniques d’un autre domaine de la sécurité informatique : le chiffrement.
Authentification et chiffrement sont indissociables : chiffrer sans authentifier ne protège
pas des usurpations d’identité (comme notamment l’attaque par interposition, dite en
anglais attaque de type Man in the middle), authentifier sans chiffrer laisse la porte
ouverte au vol de données.
Pour couper court à toutes ces querelles autour des qualités respectives de telle ou
telle méthode de sécurité, il suffit d’observer l’état actuel des menaces et des
vulnérabilités. Il y a encore une quinzaine d’années, le paramétrage de filtres sur le
routeur de sortie du réseau d’une entreprise vers l’Internet pouvait être considéré comme
une mesure de sécurité bien suffisante, puis il a fallu déployer des antivirus sur les postes
de travail. Aujourd’hui, une dizaine de nouvelles vulnérabilités apparaissent chaque
semaine et l’idée de pouvoir se prémunir de ce flux d’intrusions semble impossible. La
conception moderne de la protection des systèmes et des réseaux s’appuie sur les notions
de défense en profondeur et de réaction aux incidents, par opposition à la défense
frontale rigide, où l’on mise tout sur l’efficacité absolue d’un dispositif unique.
6
Chapitre I : La signature numérique
La signature numérique est une signature électronique renforcée partiellement ou
entièrement grâce à la cryptographie. Dans l’état actuel des technologies de
l’information (TI), il s’agit de la meilleure méthode de signature pour s’assurer de
l’intégrité et de l’origine d’un document électronique. Elle constitue un élément
supplémentaire prouvant l'origine, l'identité et l'état d'un document électronique, d'une
transaction ou d'un message et démontre le consentement éclairé du signataire.
Cryptographie asymétrique :
Fonctions de hachage :
o Pour décrire les mécanismes permettant de s'assurer que des données n'ont pas été
modifiées : les fonctions de hachage.
o Une fonction de hachage est un procédé à sens unique permettant d'obtenir une suite
d'octets (une empreinte) caractérisant un ensemble de données. Pour tout ensemble de
données de départ, l'empreinte obtenue est toujours la même.
o Nous pouvons donc utiliser ces fonctions pour nous assurer de l'intégrité d'un document.
8
2. La signature numérique en java
Étant donné que la signature numérique utilise une clé privée et publique, nous utiliserons
respectivement les classes PrivateKey et PublicKey de l’architecture cryptographique du
java pour signer et vérifier un message.
Private Key (clé privée) : Utilisée seulement par l’émetteur pour chiffrer le résultat de
hachage de son message ce qui donne la signature numérique.
Public Key (clé public) : Disponible pour le publique. Utilisée pour déchiffrer le
hachage pour vérifier s’il correspond au hachage réel.
La question qui se repose est la suivante : Comment savons-nous que la clé publique
provient vraiment de la bonne entité ?
C’est ça ce que l’utilisation de certificats numériques viennent de résoudre.
Un certificat est un document qui associe une identité à une clé publique donnée. Les
certificats sont signés par une entité tierce appelée autorité de certification (CA). Un
certificat numérique contient une clé publique et est lui-même signé par une autre entité.
La signature de cette entité peut elle-même être vérifiée par une autre entité et ainsi de
suite. Nous finissons par avoir ce que nous appelons une chaîne de certificats. Chaque
entité supérieure certifie la clé publique de l'entité suivante. L'entité la plus élevée est
auto-signée, ce qui signifie que sa clé publique est signée par sa propre clé privée.
Le X.509 est le format de certificat le plus utilisé et il est livré au format binaire (DER)
ou au format texte (PEM).
9
Obtenir une paire de clés
Pour créer une paire de clés privée et publique, nous utiliserons l'outil de clé Java.
Générons une paire de clés à l'aide de la commande genkeypair :
Dans le CMD tapez:
keytool -genkeypair -alias senderKeyPair -keyalg RSA -keysize 2048 -validity 365
storetype PKCS12 -keystore sender_keystore.p12 -storepass password123
Cela crée une clé privée et sa clé publique correspondante pour nous. La clé publique
est encapsulée dans un certificat auto-signé X.509 qui est à son tour encapsulé dans une
chaîne de certificats à élément unique. Nous stockons la chaîne de certificats et la clé
privée dans le fichier Keystore sender_keystore. p12.
En outre, il faut se souvenir du mot de passe et de l'alias, car ils seront utilisés lors du
chargement du fichier Keystore.
Maintenant que nous avons obtenu une paire de clés ; une clé privée qu’on va utiliser
pour le chiffrement, et autre publique qu’on peut partager.
10
Keystore précédemment créé (sender_keystore.p12) . Nous pouvons le faire avec la
commande exportcert :
Dans le CMD tapez la commande suivante :
keytool -exportcert -alias senderKeyPair -storetype PKCS12 -keystore
sender_keystore.p12 -file sender_certificate.cer -rfc -storepass password123
Par cela on reçoit le certificat numérique qui associe l’identité du propriétaire de la clé
publique, représenter comme au-dessous :
Maintenant qu’on a la clé publique et le message à envoyer, il nous reste que la signature
pour terminer les trois éléments principaux dont on a parlé qu’ils sont nécessaires pour
l’envoi.
*/
11
String storePass = "password123";
PrivateKey privateKey =
(PrivateKey) keyStore.getKey("senderKeyPair", storePass.toCharArray());
Maintenant que nous avons une instance PrivateKey du côté expéditeur et une instance
de PublicKey , nous pouvons commencer le processus de signature.
Comme nous l'avons vu, la signature numérique est basée sur le hachage et le
chiffrement. Habituellement, nous utilisons la classe MessageDigest avec SHA ou
MD5 pour le hachage et la classe Cipher pour le chiffrement.
Génération d'un hachage de message
Un message peut être une chaîne, un fichier ou toute autre donnée. Prenons donc le
contenu d'un simple fichier “message.txt” :
/**
messageHash = md.digest(messageBytes);
Ici, nous avons utilisé l'algorithme SHA-256, qui est le plus couramment utilisé. D'autres
alternatives sont MD5, SHA-384 et SHA-512.
Pour crypter un message, nous avons besoin d'un algorithme et d'une clé privée. Ici, nous
allons utiliser l'algorithme RSA.
Créons une instance de chiffrement et initialisons-la pour le chiffrement. Ensuite, nous
appellerons la méthode doFinal() pour crypter le message haché précédemment :
12
/**
* encrypting the digest we got with our private key so we create the digital
signature
*/
La signature peut être enregistrée dans un fichier pour être envoyée ultérieurement :
Files.write(Paths.get("digital_signature"), digitalSignature);
b) Vérification de la signature
Ayant accès à la clé publique, un récepteur peut la charger dans son magasin de clés à
l'aide de la commande importcert :
keytool -importcert -alias receiverKeyPair -storetype PKCS12 \ -
keystore receiver_keystore.p12 -file \ sender_certificate.cer -rfc -storepass password123
Et en utilisant l’API KeyStore comme précédemment, nous pouvons obtenir une instance
PublicKey :
String storePass = "password123";
13
KeyStore keyStore = KeyStore.getInstance("PKCS12");
Maintenant que nous avons une instance PrivateKey du côté expéditeur, nous pouvons
commencer le processus de vérification.
Vérification de la signature
Lorsque nous recevons un message, nous devons vérifier sa signature. Pour ce faire,
nous déchiffrons le hachage chiffré reçu et le comparons avec un hachage que nous
faisons du message reçu.
Lisons la signature numérique reçue :
/**
*/ byte[] encryptedMessageHash =
Files.readAllBytes(Paths.get("digital_signatur
e"));
14
Pour le déchiffrement, nous créons une instance de chiffrement. Ensuite, nous appelons
la méthode doFinal :
/**
*/
cipher.init(Cipher.DECRYPT_MODE, publicKey);
*/
MessageDigest md = MessageDigest.getInstance("SHA-256");
/**
15
Chapitre II : FIREWALL
1. FIREWALL
Un firewall - littéralement "mur de feu" - est un logiciel et/ou un matériel permettant de
filtrer ce qui passe d'un réseau à un autre. C’est un mur virtuel qui bloque tout ce qui tente
d'entrer avec l'intention de nuire dans une machine ou un réseau. Il établit une barrière de
protection contre les intrusions et les contaminations venant de l’extérieur.
On s'en sert pour sécuriser les réseaux et les ordinateurs, c'est-à-dire contrôler les
accès et les flux de données et bloquer ce qui est interdit.
Typiquement, il va :
• Autoriser les ordinateurs du réseau local à se connecter à internet.
• Bloquer les tentatives de connexion d'internet vers les ordinateurs du réseau
local.
16
Pare-feu logiciel :
Un pare-feu logiciel est plus une machine individuelle lorsque le nombre
d'utilisateurs est relativement inférieur à une organisation. Cependant, dans les grandes
organisations, malgré une sécurité du pare-feu matériel, il est recommandé d'utiliser
également un pare-feu logiciel. C'est en grande partie parce qu'il peut y avoir des
utilisateurs / employés qui ont tendance à transporter et à travailler sur leurs systèmes
sur le réseau sécurisé des entreprises.
Dans ces cas, il est important de les protéger.
Un autre avantage majeur sur les pare-feu logiciels est qu'ils sont facilement évolutifs.
Les utilisateurs peuvent simplement télécharger des correctifs, des correctifs, des mises
à jour et des améliorations sur le site Web du fournisseur de pare-feu, ou dans la plupart
des cas, le fournisseur envoie ces améliorations via Internet.
b) Fonctionnement général
17
Technologies utilisées :
c) FIREWALL en java
18
fichier Server.java:
Ce fichier contient 3 classes :
• Class Server
Cette classe a pour but de lancer le serveur en localhost sur le port 7344 ;
ClientSession(Socket sock) {
clientsocket.getRemoteSocketAddress().toString();
Run()
Lecture des @IP interdite stockée sur 'block.txt' et remplissage de la liste noire déclarée
précédemment, si l'@IP du client et dispo sur la liste noire un message d'erreur sera affiché au
client.
• Class ServerWindowThread
Lance l’interface graphique ServerWindow
class ServerWindowThread extends Thread
{ public void
run()
}
Fichier ServerWindow.java:
Cette classe représente l’interface graphique coté serveur. Elle fonctionne en parallèle avec le
Thread du serveur ce qui garantit une interaction serveur-GUI ( graphic user interface) en temps
réel.
19
Données :
/*
*/
Constructeur «ServerWindow» :
• S’occupe ici de l’appel de composants d’interface
• Définir une boucle infini tant que le serveur est en cours, en attendant les messages
définissant l’état d’interaction client-serveur pour les affichées sur l’interface.
public ServerWindow() {
20
// set background color to black
this.setLocation(770, 0);
this.setVisible(true);
while(!t.isInterrupted())
if(confirm.equals(confirmation)==false)
jTextArea1.append(confirmation);
jTextArea2.append(print);
confirm=confirmation; print="";
Méthode «GetWelcomeMessage» :
Déclarée statique, appelée juste après le démarrage de serveur.
Prend en paramètre un tableau de taille 2 stockant l’@IP plus le port sur lesquels il marche.
confirmation="Welcome! This server is running on IP " + args[0] + "\nand port " + args[1] + "\nWaiting for Connection..\n";
Méthode «getConfirmation» :
Déclarée statique, appelée par le serveur dès qu’un nouveau client vient de se connecter .
Prend en paramètre un tableau contient une chaine de caractères indiquant si le client est bloqué
de rejoindre le serveur ou pas.
21
Exemples :
• 192.168.0.10 Blocked
Chargée aussi d’enregistrement de l’@ IP de client et la date de connexion sur le fichier
‘log.txt’.
public static void getConfirmation(String args[])
if(args[0].contains("Blocked")==false)
print=args[0] + "\n";
else
print=args[0] + "\n";
try
catch(IOException ioe)
} }
Méthode «GetClientMessage» :
Lors ce qu’un client envoie un message au serveur, ce dernier fait appel à cette méthode pour
qu’il affiche ce qu’il a reçu sur l’interface graphique.
22
public static void getClientMessage(String args[])
confirmation="The client " + args[1] + " has sent " + args[0] + "\n";
Méthode «initComponents» :
Chargée juste de l’initialisation des composants graphiques de l’interface.
private void initComponents() {
javax.swing.JMenuBar();
23
jMenuBar1.setForeground(new Color(0, 0, 0));
jMenuItem3.setText("jMenuItem3");
jMenu3.setText("File");
jMenuBar2.add(jMenu3);
jMenu4.setText("Edit");
jMenuBar2.add(jMenu4);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jTextArea1.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new
java.awt.Color(0, 0, 0), 2), "Server Report", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 14)));
jScrollPane1.setViewportView(jTextArea1);
jTextArea2.setColumns(10);
24
jTextArea2.setRows(5);
jTextArea2.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new
java.awt.Color(0, 0, 0), 2), "State Table", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Calibri", 1, 14)));
jScrollPane2.setViewportView(jTextArea2);
jMenuBar1.setBorder(null); jMenuBar1.setCursor(new
java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); jMenuBar1.setFont(new
jMenu1.setText("Server");
jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q,
});
jMenu1.add(jMenuItem1);
jMenuBar1.add(jMenu1);
jMenu2.setText("Rules");
jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R,
java.awt.event.InputEvent.CTRL_MASK)); jMenuItem2.setText("Server Rules");
jMenuItem2.addActionListener(new java.awt.event.ActionListener() { public void
actionPerformed(java.awt.event.ActionEvent evt) {
25
jMenuItem2ActionPerformed(evt);
});
jMenu2.add(jMenuItem2);
jMenuBar1.add(jMenu2);
jMenu5.setText("View");
jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L,
});
jMenu5.add(jMenuItem4);
jMenuBar1.add(jMenu5);
setJMenuBar(jMenuBar1);
layout.setHorizontalGroup( layout.createParallelGroup(Alignment.LEADING)
);
layout.setVerticalGroup(
26
layout.createParallelGroup(Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
);
getContentPane().setLayout(layout);
pack();
try{
catch(Exception e){}
27
jMenuItem4; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private
Fichier LogWindow.java:
Cette classe représente une interface graphique qui a pour but d'afficher toutes les
activités avec leurs dates qui sont dans le fichier log.txt afin de garder l’historique de
l’utilisateur.
Constructeur «LogWindow» :
• S’occupe ici de l’appel de composants d’interface ;
• De charger les activités qui existent déjà du fichier (log.txt) dans l’interface.
public LogWindow() throws Exception{ setResizable(false);
this.setVisible(true);
fis.close();
Méthode «initComponents» :
Chargée juste de l’initialisation des composants graphiques de l’interface.
28
private void initComponents() { jScrollPane1 =
javax.swing.JTextArea();
jTextArea1.setBorder(null);
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE)
; setTitle("Log
Window");
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG)
.addGroup(layout.createSequentialGroup()
29
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_
SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(19, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SI
ZE, 278, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}
class ServerRules:
Cette classe vas nous permettre de définir les règles sur le serveur, c’est-à-dire qu’on
peut ajouter des mots dans une blackliste des strings (stringblock.txt), ou supprimer cette
étape a pour but que lorsque le serveur reçoit un message contient un mot de ces mots
qui sont définis dans la blacklist automatiquement le mot ne s'accepte pas, pareil pour
une blacklist des adresses IP (block.txt).
Constructeur «ServerRules» :
• S’occupe ici de l’appel de composants d’interface ;
• Charger la liste des adresses IP qui existent dans le fichier block.txt ;
30
• Charger la liste des mots qui existent déjà dans le fichier stringblock.txt.
public ServerRules() { setResizable(false);
initComponents(); this.setVisible(true);
list.setBounds(100,100,100,200);
list2.setBounds(100,100,100,200);
getContentPane().add(list);
getContentPane().add(list2);
getContentPane().validate();
getContentPane().repaint(); this.pack();
try
31
String strLine; while
if(strLine.equals("XXX.XXX.XXX.XXX")==false)
in.close();
}catch(Exception e){}
try
in.close();
}catch(Exception e){}
setSize(550,350);
Méthode « jButton1ActionPerformed» :
Cette méthode s’exécute lors d’un évènement sur le JButton1 (click) :
32
• Une fenêtre de dialogue s’affiche demandant de saisir une nouvelle adresse IP
que vous souhaitez d’être bloquée ;
• Si l’adresse IP saisit est du format XXX.XXX.XXX.XXX elle sera enregistrer
dans le fichier block.txt comme une adresse interdite ;
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
if(mat.matches())
listModel.addElement(input);
try
FileWriter fw = new
FileWriter(filename,true); fw.write(input +
"\n"); fw.close();
catch(IOException ioe)
else
Méthode «JButton1ActionPerformed» :
Cette méthode s’exécute lors d’un évènement sur le JButton2 (click) : elle a pour but de
supprimer l’adresse IP sélectée de la liste ainsi de remplacer sans emplacement dans le
fichier block.txt par des XXX.XXX.XXX.XXX
33
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
try {
input.replace(str2delete, "XXX.XXX.XXX.XXX");
File.write(input.getBytes());
} catch (Exception e) {
} if
(selectedIndex != -1) {
listModel.removeElementAt(selectedIndex);
dispose();
Méthode «jButton4ActionPerformed» :
Cette méthode s’exécute lors d’un évènement sur le JButton1 (click) :
• Une fenêtre de dialogue s’affiche demandant de saisir un nouveau mot que vous
souhaitez d’être bloquée ;
• Le mot saisi sera enregistré dans le fichier stringblock.txt
34
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
FileWriter fw = new
FileWriter(filename,true); fw.write(input +
"\n"); fw.close();
catch(IOException ioe)
Méthode «jButton5ActionPerformed» :
Supprimer le mot sélecté de la liste et de remplacer son emplacement dans le fichier
stringblock.txt par une chaine vide.
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
try {
35
while ((line = file.readLine()) != null) input += line + '\n';
File.write(input.getBytes());
} catch (Exception e) {
} if
(selectedIndex != -1) {
listModel2.removeElementAt(selectedIndex);
}
Fichier Client.java:
Cette classe client marche sur un autre Thread indépendant de serveur, elle présente une
interface graphique pour le client, le permettant de se connecter au serveur et de lui
envoyer des messages aussi.
Données :
36
// définition d'un point de terminaison interne pour l'envoi ou la réception de données
Socket client;
InputStream clientIn;
OutputStream clientOut;
PrintWriter pw;
String ip="";
"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
Matcher matcher;
Constructeur :
Démarre le Thread déclaré précédemment et fait appel à la méthode d’initialisation des
composants graphique.
public Client() {
tc.start(); initialize();
37
Méthode «initialize» :
/**
frame.getContentPane().setBackground(Color.WHITE);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ImageIcon(Client.class.getResource("/startBtn.png")));
startBtn.addMouseListener(new MouseAdapter() {
mouseClicked(MouseEvent e) {
int flag=0;
38
matcher = pattern.matcher(ip); // Si
&& !ip.startsWith("0"))
try
catch(ConnectException ce)
flag=1;
{}
FileInputStream fstream;
// Lire les mots interdits stoqués sur le ficher block.txt et les ajoutés dans la list déclarée ci-dessus
try
39
DataInputStream in = new DataInputStream(fstream);
list.add(strLine.trim());
catch(Exception e1){}
// si l'@IP du client est présente dans la liste noire, un message d'erreur s'affiche , sinon une connexion vers le
serveur est bien établi.
if(list.contains(ip))
try
client.close();
catch(IOException e1){}
else {
if(flag!=1)
lblOnMode.setVisible(true);
40
else
});
ImageIcon(Client.class.getResource("/onMode.png")));
frame.getContentPane().add(lblOnMode); lblOnMode.setVisible(false);
// Champ d'IP
frame.getContentPane().add(lblNewLabel);
IpInput.setDocument(new JTextFieldLimit(15));
frame.getContentPane().add(IpInput);
IpInput.setColumns(10);
// Champ de port
frame.getContentPane().add(lblPort); portInput =
JTextFieldLimit(4));
frame.getContentPane().add(portInput);
portInput.setColumns(10);
41
JSeparator separator = new JSeparator();
separator.setBackground(new Color(164,219,251,70));
frame.getContentPane().add(separator);
JTextField(); msgInput.setBackground(new
Color(4,170,255));
msgInput.setForeground(Color.WHITE);
msgInput.setBorder(null);
msgInput.setColumns(10);
msgInput.setDocument(new JTextFieldLimit(25));
msgInput.addMouseListener(new MouseAdapter() {
mouseClicked(MouseEvent e) { //
super.mouseClicked(e);
msgInput.setText("");
});
scrollPane.setBorder(null);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
Color(0,128,255)); container.setLayout(null);
42
container.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
container.setPreferredSize(new Dimension(350,60));
// code exécuté lors du clique sur le bouton d'envoi d'un message au serveur
sendBtn.addMouseListener(new MouseAdapter() {
mouseClicked(MouseEvent e) {
// Si aucune @Ip client est disponible pour le moment on affiche un message demandant au client de se connecter
avant d'envoyer des messages.
if(ip.equals(""))
else
containerHeight = scrollPane.getPreferredSize().height;
container.setPreferredSize(new Dimension(containerWidth,containerHeight+90));
container.revalidate();
Client.lastPosition+=44;
Msg.setBackground(new Color(0,128,255));
Msg.setBorder(null);
Msg.setLayout(null);
container.add(Msg);
43
JLabel text = new JLabel(msgInput.getText());
text.setForeground(Color.WHITE); text.setBounds(21,
6, 180, 16);
Msg.add(text);
ImageIcon(Client.class.getResource("/blueMsg.png")));
int i=0,l=0;
pw.println(msgInput.getText()); //
try
l=div.length;
for(i=0;i<l;i++)
response += div[i];
Client.lastPosition+=44;
MsgBack.setBackground(new Color(0,128,255));
MsgBack.setBorder(null);
container.add(MsgBack);
MsgBack.setLayout(null);
MsgBack.add(textBack);
44
textBack.setForeground(new Color(17,127,246)); JLabel
MsgBack.add(msgBackBg); msgBackBg.setIcon(new
ImageIcon(Client.class.getResource("/whiteMsg.png"))); msgInput.setText("");
catch(Exception e1){}
});
frame.getContentPane().add(sendBtn);
ImageIcon(Client.class.getResource("/liveChat.png")));
frame.getContentPane().add(lblLiveChatBg); frame.setVisible(true);
// Classe pour limiter la taille des charactères entrées dans un champ de texte "JTextField"
JTextFieldLimit(int limit) {
super();
this.limit = limit;
45
public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
super.insertString(offset, str,attr); }
class Firewall
C’est la classe principale qui s’exécute la première, chargée de lancer le serveur et les
clients.
La méthode «main» :
S’occupe de l’instanciation d’un Thread pour le serveur et deux autres comme clients.
public static void main(String[] args) {
new ServerThread().start();
new ClientThread1().start();
new ClientThread2().start();
}
{ public void
run()
// instancier un serveur
Server s = new Server();
}
Thread
{ public void
run()
// instancier un client
46
Chapitre III : Server Proxy
Un serveur proxy est un serveur qui se trouve entre le client et le serveur distant dans
lequel le client souhaite récupérer des fichiers. Tout le trafic qui provient du client, est
envoyé au serveur proxy et le serveur proxy fait des demandes au serveur distant au nom
du client. Une fois que le serveur proxy reçoit les fichiers requis, il les transmet au client.
Cela peut être bénéfique car il permet à l’administrateur du serveur proxy de contrôler
ce que les machines sur son réseau peuvent faire. Par exemple, certains sites Web
peuvent être bloqués par le serveur proxy, ce qui signifie que les clients ne pourront pas
y accéder. Il est également bénéfique que les pages fréquemment visitées peuvent être
mis en cache par le serveur proxy.
Cela signifie que lorsque le client (ou d’autres clients) font des demandes ultérieures
pour des fichiers qui ont été mis en cache, le Proxy peut leur remettre les fichiers
immédiatement, sans avoir à les demander depuis le serveur distant ce qui peut être
beaucoup plus rapide si le proxy et les clients sont sur le même réseau. Bien que ces
fichiers soient connus pour être contenus dans le cache du proxy, il est intéressant de
noter que les clients n’ont aucune connaissance de cela et peuvent maintenir leurs
propres caches locaux.
Désormais, avec l'utilisation de TCP/IP au sein des réseaux locaux, le rôle de relais
du serveur proxy est directement assuré par les passerelles et les routeurs. Pour autant,
les serveurs proxy sont toujours d'actualité grâce à un certain nombre d'autres
fonctionnalités.
Le cache :
Un serveur proxy ayant la possibilité de cacher (néologisme signifiant "mettre en
mémoire cache") les informations est généralement appelé "serveur proxy-cache".
47
Cette fonctionnalité implémentée dans certains serveurs proxy permet d'une part de
réduire l'utilisation de la bande passante vers internet ainsi que de réduire le temps
d'accès aux documents pour les utilisateurs.
Le filtrage :
Il est ainsi possible de filtrer les connexions à internet en analysant d'une part les requêtes
des clients, d'autre part les réponses des serveurs. Lorsque le filtrage est réalisé en
comparant la requête du client à une liste de requêtes autorisées, on parle de liste
blanche, lorsqu'il s'agit d'une liste de sites interdits on parle de liste noire. Enfin l'analyse
des réponses des serveurs conformément à une liste de critères (mots-clés, ...) est appelé
filtrage de contenu
L'authentification :
Il est parfois possible de l'utiliser pour authentifier les utilisateurs, c'est-à-dire de leur
demander de s'identifier à l'aide d'un nom d'utilisateur et d'un mot de passe par exemple.
Il est ainsi aisé de donner l'accès aux ressources externes aux seules personnes autorisées
à le faire et de pouvoir enregistrer dans les fichiers journaux des accès identifiés.
Les reverse-proxy :
On appelle reverse-proxy (en français le terme de relais inverse est parfois employé) un
serveur proxy-cache "monté à l'envers", c'est-à-dire un serveur proxy permettant non pas
aux utilisateurs d'accéder au réseau internet, mais aux utilisateurs d'internet d'accéder
indirectement à certains serveurs internes.
a) Implémentation
Le proxy a été implémenté en utilisant Java et a fait une large utilisation des sockets
TCP. Firefox a été mis en place pour émettre tout son trafic vers le port spécifié et
l’adresse IP qui ont ensuite été utilisés dans la configuration proxy. Il y a deux
composantes principales à l’implémentation - la classe Proxy et la classe
Requesthandler.
b) Les classes
La classe Proxy
La classe Proxy est responsable de la création d’un Serversocket qui peut accepter les
connexions socket entrantes du client. Cependant, il est essentiel que l’implémentation
soit multithreadée car le serveur doit pouvoir servir plusieurs clients simultanément.
Ainsi, une fois qu’une connexion socket arrive, elle est acceptée et le Proxy crée un
nouveau thread qui dessert la requête (voir la classe Requesthandler). Comme le serveur
n’a pas besoin d’attendre que la requête soit entièrement réparée avant d’accepter une
nouvelle connexion de socket, plusieurs clients peuvent avoir leurs demandes traitées de
manière asynchrone.
48
La classe Proxy est également responsable de l’implémentation de la fonctionnalité de
cache et de blocage. Autrement dit, le proxy est capable de mettre en cache les sites qui
sont demandés par les clients et de bloquer dynamiquement les clients de visiter certains
sites Web. Comme la vitesse est de la plus haute importance pour le serveur proxy, il est
souhaitable de stocker les références aux sites actuellement bloqués et les sites qui sont
contenus dans le cache dans une structure de données avec un temps de recherche
d’ordre constant attendu. Pour cette raison, un Hashmap a été choisi. Il en résulte un
cache extrêmement rapide et des temps de recherche de site bloqués. Cela n’entraîne
qu’un léger surcoût si le fichier n’est pas contenu dans le cache, et une augmentation des
performances si le fichier est contenu dans le cache.
Enfin, la classe proxy est également responsable de fournir un système de gestion
dynamique de console, Cela permet à un administrateur d’ajouter/supprimer des fichiers
vers et depuis le cache et les sites Web vers et depuis la liste noire, en temps réel.
La Classe RequestHandler
La classe Requesthandler est chargée de traiter les demandes qui parviennent au proxy.
Le demandeur examine la demande reçue et la traite de façon appropriée. Les requêtes
peuvent être subdivisées en trois catégories principales - requêtes HTTP GET, requêtes
HTTP GET pour le fichier contenu dans le cache et requêtes HTTPS CONNECT.
Requête HTTP
Il s’agit des demandes standards faites lorsqu’un client tente de charger une page Web.
L’entretien de ces demandes est une tâche simple :
-Analysez l’URL associée à la requête.
-Créez une connexion HTTP à cette URL.
-Faire écho à la requête GET du client vers le serveur distant.
-Faire écho à la réponse du serveur au client.
-Enregistrez une copie locale du fichier dans le cache du proxy.
49
Cependant, à première vue, cela pose un problème pour les serveurs proxy : Comment
le proxy sait-il quoi faire avec ces données cryptées provenant du client ?
Afin de résoudre ce problème, au départ, un autre type de requête HTTP est fait par le
client, une requête CONNECT. Cette requête est HTTP standard et est donc non cryptée
et contient l’adresse avec laquelle le client souhaite créer une connexion HTTPS et peut
être extraite par le proxy. Il s’agit d’un processus connu sous le nom de tunnel HTTP
Connect et fonctionne comme suit :
-Le client émet une demande CONNECT
-Proxy extrait l’URL de destination.
-Proxy crée une connexion socket standard vers le serveur distant spécifié par l’URL.
-En cas de succès, le proxy envoie une réponse « 200 Connection Established » au client,
indiquant que le client peut maintenant commencer à transmettre les données chiffrées
au proxy.
-Le proxy transfère alors simultanément toutes les données envoyées par le client au
serveur distant et toutes les données reçues par le serveur distant au client.
Toutes ces données seront cryptées et donc le proxy ne peut pas mettre en cache ni même
interpréter les données.
50
Chapitre IV : Systèmes de détection d’intrusion
(IDS)
On peut dans un premier temps classer tous les outils de détection d'intrusion selon
deux modes de fonctionnement selon qu'ils se basent sur des signatures d'attaques
ou sur des modèles comportementaux. IDS à Bibliothèques de signatures :
Généralement, les IDS réseaux se basent sur un ensemble de signatures qui représentent
chacune le profil d'une attaque. Cette approche consiste à rechercher dans l'activité de
l'élément surveillé (un flux réseau) les empreintes d'attaques connues, à l'instar des anti-
virus.
Une signature est habituellement définie comme une séquence d'événements et de
conditions relatant une tentative d'intrusion. La reconnaissance est alors basée sur le
concept de "pattern matching" (analyse de chaînes de caractères présente dans le paquet,
à la recherche de correspondance au sein d'une base de connaissance). Si une attaque est
détectée, une alarme peut être remontée (si l'IDS est en mode actif, sinon, il se contente
d'archiver l'attaque).
Les IDS peuvent également se classer selon deux catégories majeures selon qu'ils
s'attachent à surveiller le trafic réseau ou l'activité des machines. On parle d'IDS réseau
(NIDS : Network IDS) ou d'IDS Système (Host based IDS).
Les IDS réseaux (Network IDS), analysent en temps réel le trafic qu'ils aspirent à l'aide
d'une sonde. Ensuite, les paquets sont décortiqués puis analysés. En cas, de détection
d'intrusion, des alertes peuvent être envoyées.
Ils peuvent être placés à divers endroits sur le réseau, en amont ou en aval d'un pare feu
ou encore sur chaque hôte, comme un antivirus. Ces IDS vont analyser tout le trafic
entrant et sortant du réseau afin d'y déceler des attaques. Les H-IDS, assurent la
sécurité au niveau des hôtes :
Les IDS systèmes (Host IDS), quant à eux, analysent le fonctionnement et l'état des
machines sur lesquels ils sont installés afin de détecter les attaques en se basant sur des
démons (tels que syslogd par exemple). L'intégrité des systèmes est alors vérifiée
périodiquement et des alertes peuvent être levées. Par nature, ces IDS sont limités et ne
peuvent détecter les attaques provenant des couches réseaux (tels que les attaques de
type DOS).
La fonction de base d'un HIDS est l'inspection des fichiers de configuration du système
d'exploitation afin d'y déceler des anomalies et agissent comme des antivirus mais en
plus poussé, car les antivirus ne sont intéressés que par les activités malveillantes du
poste alors qu'un HIDS va pouvoir intervenir s'il détecte des attaques.
52
4. Systèmes de détection d’intrusion (IDS) en java
a) Port scannig
Est une technique utilisée par les attaquants pour trouver des hôtes vulnérables qui ont des
services d'écoute sur certains ports. Dans une SYN scan attaque le scanner envoie des paquets
TCP SYN et attendre les réponses des hôtes qui renvoient les paquets SYN + ACK. Comme la
plupart les hôtes ne sont pas prêts à recevoir des connexions sur un port donné pendant le
scanning, un petit nombre d'hôtes répondra avec des paquets SYN + ACK que les paquets SYN
reçus à l'origine. En observant ce phénomène dans un fichier de trace, vous pouvez identifier
adresses sources qui peuvent lancer une analyse de port.
Prérequis
Jnetpcap : jnetpcap est une librairie de java open-source, elle peut être utilisée pour
capturer et décoder des données en ligne ainsi que hors ligne.
Portscan.pcap : un fichier de capture des paquets résultant d’une attaque «Port scanning»
b) Explication du projet
Constructeur ScannerFinder():
Prend en paramètre le chemin vers le fichier ‘’.pcap’’ pour l’analyser
public ScannerFinder(final String path) {
Ouvre un fichier nommé ‘’.pcap’’ à l'aide de pcap.OpenOffline (), puis parcourt les paquets à
l'aide de ‘’loop’’
pcap.loop(Pcap.LOOP_INFINITE, new JPacketHandler<StringBuilder>() {
53
Fonction nextPacket() nextPacket est une fonction de substitution de jPacketHandler
(Handler qui est utiliser pour recevoir des paquets entièrement décodés), dans cette
fonction en fait un test Si le paquet contient SYN et ACK Incrémenter le nombre SYN
ACK de l’adresse IP de destination et poser le dans une hashMap syn_ack sinon s’il
contient juste le SYN incrementer le SYN de l’adresse IP source et le poser dans la
hashMap syn.
public void nextPacket(JPacket packet, StringBuilder errbuf) {
if (packet.hasHeader(tcp) && packet.hasHeader(ip) && tcp.flags _SYN() &&
tcp.flags_ACK()) {
//si le paquet contient SYN et ACK les deux
//incrementer SYN ACK des adresses ip de destination
String synackip = org.jnetpcap.packet.format.FormatUtils.i
p(ip.destination()); if(syn_ack.containsKey(synackip))
syn_ack.put(synackip, syn_ack.get(synackip)+1); else
syn_ack.put(synackip, 1);
}else if(packet.hasHeader(tcp) && packet.hasHeader(ip) && tcp.
flags_SYN()){ //The Packet is just SYN
//Increment the source ip's SYN count
String synip = org.jnetpcap.packet.format.FormatUtils.ip(i
p.source()); if(syn.containsKey(synip))
syn.put(synip, syn.get(synip)+1); else
syn.put(synip, 1);
}
}
Pour toutes les adresses IP qui ont envoyé SYN nous vérifierons s'il y a des paquets
SYN ACK envoyés à cette IP et nous afficherons l’IP qui a envoyé plus de 3 fois plus
de paquets SYN que le nombre de paquets SYN + ACK qu'ils reçu.
for(String ssyn : syn.keySet()) //Pour tous les adresses IP qui ont envoyé SYN
if(syn_ack.containsKey(ssyn)) { //Vérification s’il y a des paquet s SYN ACK
envoyés
if(syn.get(ssyn) > 3*syn_ack.get(ssyn))
System.out.println(ssyn);
}else //sinon le serveur n'a pas répondu
System.out.println(ssyn);
54
Conclusion
Le projet de fin d’année ayant été conçu dès le départ d’une façon simple pour
nous permettre de bien développer chaque partie du projet s’est avéré bien plus
compliqué et vaste et très riche côté informations.
55