TP sysres IMA2a5 2017/2018 G3

De Wiki d'activités IMA

Introduction

Dans cette page, nous avons décrit toutes les manipulations nécessaires afin de mener à bien ce projet.

Vous trouverez en annexe tous les fichiers de configuration liés à ce projet (ceux de la machine virtuelle, de bind, d'apache, de postfix).

Création et configuration de la Machine virtuelle

Création de la machine virtuelle

Nous avons tout d'abord créé une machine virtuelle, stockée sur le serveur cordouan. Cette machine est une MV Xen, nommée duvel (en référence au doux breuvage portant le même nom).

La machine virtuelle est hébergée sur le serveur cordouan. Voici les différentes commandes nécessaires pour créer la machine virtuelle :

xen-create-image --hostname=duvel --dhcp --dir=/usr/local/xen

Ensuite, nous avons allouer de la mémoire à nos /var et /home sur une partition du serveur Cordouan.

Voici les lignes de commandes permettant la création des partitions :

lvcreate -L10G -nIMA2A5_duvel_home virtual ; mke2fs /dev/virtual/IMA2A5_duvel_home
lvcreate -L10G -nIMA2A5_duvel_var virtual ; mke2fs /dev/virtual/IMA2A5_duvel_var

Le -L10G permet d'imposer une taille de 10 gigas.

Il faut alors ajouter les lignes suivantes à duvel.cfg afin de permettre à la MV duvel l'accès à ces partitions :

disk        = [
                'file:/usr/local/xen/domains/duvel/disk.img,xvda2,w',
                'file:/usr/local/xen/domains/duvel/swap.img,xvda1,w',
                'phy:/dev/virtual/IMA2A5_duvel_var,xvdb1,w',
                'phy:/dev/virtual/IMA2A5_duvel_home,xvdb2,w',
              ]

Configuration réseau de la MV

Lorsque notre machine virtuelle a été créée, nous avons mis en place une configuration réseau temporaire (adresse IP du réseau Insecure). Une fois que les collègues ont mis en place ce réseau, nous avons configuré notre réseau final. Sa nouvelle adresse IP est 193.48.57.165. Voici la configuration réseau du fichier /etc/network/interfaces :

    //The loopback network interface
         auto lo
         iface lo inet loopback

    // The primary network interface
         auto eth0
         iface eth0 inet static
            address 193.48.57.165
            netmask 255.255.255.240
            gateway 193.48.57.174


Création du DNS

Installation des paquets

Nous avons installé quelques paquets qui nous serviront pour la suite, notammant :
  • apache2 comme serveur web
  • bind9 pour monter notre serveur DNS
apt-get install bind9, apache2

Configuration de bind9


Après avoir acheté un nom de domaine sur gandi.net (duvel.space), nous avons monté le serveur DNS via bind9. Nous avons en premier lieu modifier les fichiers :

  • named.conf.local :
  • zone "duvel.space" { 
    type master;
    file "/etc/bind/webmail.duvel.space";
    //  allow-transfer {  };
    


  • named.conf.options :
  • dnssec-validation auto;
    auth-nxdomain no;    # conform to RFC1035
    listen-on-v6 { any; };
    


  • webmail.duvel.space :
  • $TTL 604800
    @ IN SOA ns.duvel.space. root.duvel.space. (
             3298267243       ; Version
             7200             ; Refresh (2h)
             3600             ; Retry   (1h)
             1209600          ; Expire (14j)
             259200 )         ; Minimum TTL (3j)
      IN NS ns.duvel.space.
      IN NS ns6.gandi.net.
    
    ns      IN A 193.48.57.165
    ns6     IN A 217.70.177.40
    

Une fois que la configuration de bind est terminée, nous avons ajouté les adresses IP sur gandi et ajuster la configuration de gandi. Après quelques bonnes heures de propagation, le DNS fonctionne. On obtient la page par défaut d'apache sur un navigateur à l'adresse http://ns.duvel.space.

Configuration DNS sécurisé

    Après avoir ajouté "dnssec-enable yes" dans le fichier "named.conf.options", nous avons modifié le fichier webmail.duvel.space pour la compatibilité avec les mails (ajout des 2 lignes suivantes).
    IN MX 100 ns.duvel.space.  //pour autoriser le serveur de mail.
    www	IN CNAME ns
    //pour pouvoir accéder au site web en tapant www.duvel.space

    Nous avons ensuite généré les clefs asymétriques :

    dnssec-keygen -a RSASHA1 -b 2048 -f KSK -r /dev/urandom -n ZONE duvel.space
    dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE duvel.space
    

    Voici les noms de ces clefs :

    clef asym clef de zone : Kduvel.space.+005+15754
    clef asym clef d'enregistrement : Kduvel.space.+005+43650
    

    Une fois ces clefs créées, nous les avons ajouté dans webmail.duvel.space :

    $include /etc/bind/duvel.space.dnssec/duvel.space-ksk.key
    $include /etc/bind/duvel.space.dnssec/duvel.space-zsk.key
    

    Enfin, il faut signer la zone via la commande :

    dnssec-signzone -o duvel.space -k duvel.space-ksk ../webmail.duvel.space duvel.space-zsk
    

    Le DNSSEC est alors correctement configuré.

    Sécurisation du site web par certificat

    Tout d'abord, il faut utiliser les commandes Apache pour autoriser le ssl :

    a2ensite default-ssl.conf
    a2enmod ssl
    

    Gandi propose un certificat gratuit lorsque l'on achète un domaine.

    Nous ajoutons donc 3 lignes de configuration dans le fichier default-ssl.conf :

    SSLCertificateFile	/root/duvel.crt
    SSLCertificateKeyFile /root/duvel.key
    SSLCertificateChainFile /root/GandiStandardSSLCA2.pem
    
    • Le fichier duvel.crt contient le certificat.
    • Le fichier duvel.key contient la clef privée du serveur.
    • Le fichier GandiStandardSSLCA2.pem contient la chaîne de certification (fournie par gandi.net).

    On relance apache :

    service apache2 restart
    

    Et on tente un connexion sécurisée vers le site web de duvel:

    https://www.duvel.space
    


    Tâche spécifique: Création d'un serveur mail

    Création d'un docker

    L'idée est ici de créer un serveur mail sur notre machine virtuelle à partir de postfix, tout en utilisant des conteneurs pour gérer les utilisateurs. Il est donc nécessaire de créer un conteneur par utilisateur.

    Tout d'abord, on installe docker.

    apt-get install docker
    

    Puis on récupère une image Debian de conteneur docker :

    docker pull debian
    

    On crée alors un docker sur notre MV avec

    docker run -i --privileged -p 5000:5000 -t debian /bin/bash 
    

    On peut alors lister les dockers existants à l'aide de la commande :

    docker ps -a
    

    On obtient par exemple :

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS
    caa067cd1a6a        debian:latest       "/bin/bash"         9 days ago          Exited (1) 2 days ago
    

    On peut démarrer ce docker à l'aide de la commande :

    docker start caa067cd1a6a
    

    On vérifie le démarrage en listant uniquement les conteneurs actifs :

    docker ps (sans le -a qui permet de visualiser les dockers éteints, en veille etc.)
    

    On obtient :

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS
    caa067cd1a6a        debian:latest       "/bin/bash"         9 days ago          Up About a minute
    

    Nous avons donc un conteneur en fonctionnement.

    Nous avons appris par la suite que si nous voulons que notre docker redémarre automatiquement, (au cas où la MV a redémarré, ou suite à un plantage), il faut les créer avec l'option :

    docker run -i -t debian /bin/bash --restart always
    

    Configuration réseau du docker

    On vérifie que la configuration réseau est conforme :

    Point de vue duvel :

    ip a
    
    3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
        inet 172.17.42.1/16 scope global docker0
           valid_lft forever preferred_lft forever
        inet6 fe80::5484:7aff:fefe:9799/64 scope link 
           valid_lft forever preferred_lft forever
    

    Et point de vue conteneur :

    ip a
    
    10: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
        inet 172.1.0.1/16 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:acff:fe11:4/64 scope link 
           valid_lft forever preferred_lft forever
    

    La configuration du bridge semble correcte. On remarque qu'une configuration ipv6 est automatiquement créée.

    Configuration de postfix sur la MV

    La première étape est de configurer postfix sur la MV :

    dpkg-reconfigure postfix
    

    De la, on se laisse guider par l'outil de configuration. Les paramètres sélectionnés importants sont :

    • Type de serveur de messagerie : Site internet
    • Nom de domaine: duvel.space

    On insère ensuite dans /etc/aliases :

    root: postmaster
    admin: root #mail de l'administrateur smtp
    

    On réalise ensuite la même configuration postfix sur le conteneur.

    Toutefois, le /etc/aliases du docker contiendra :

    root: postmaster
    $nom_de_l'utilisateur: root
    

    Les configurations de postfix et des alias sont terminées. Il faut penser à relancer postfix et appliquer les nouveaux alias :

    newaliases
    service postfix restart
    

    Redirection des mails vers le conteneur concerné

    L'objectif de ce serveur de messagerie est de respecter cette démarche :

    Le serveur de messagerie principal (MV duvel) reçoit un mail destiné à jean@duvel.space Le serveur redirige ce mail vers le docker de monsieur Jean. Le postfix du docker doit alors le placer dans la boite de messagerie de Jean.

    Pour cela, il nous faut créer un virtual alias maps dans la configuration de postfix :

    #Dans /etc/postfix/main.cf
    virtual_alias_maps = hash:/etc/postfix/relai_duvel
    

    Ensuite, on édite relai_duvel :

    jean    jean@[adresse_ip_du_docker_associé]
    michel  michel@[adresse_ip_du_docker_associé]
    etc...
    

    On peut alors envoyer un mail à jean@duvel.space, qui sera stocké dans le docker créé pour Jean.

    Automatisation de l'ajout d'un utilisateur

    Le dernier objectif de ce projet est d'automatiser l'ajout d'un utilisateur. Nous avons choisi d'utiliser un fichier script. Son rôle est de :

    • Créer un docker à partir d'un Dockerfile
    • Configurer le Docker (ouvrir le port 25, installer Postfix...)
    • Ajouter l'utilisateur dans le relai virtuel Postfix de la MV

    Voici le fichier script :

    #!/bin/bash
    

    #creation et configuration d'un docker pour un nouvel utilisateur

    #on recupere le fichier de configuration postfix pour le docker (le meme pour tous les dockers)

    config=`cat postfix.cf.docker`
    
    echo "Entrez le nom de l'utilisateur:"
    
    

    #nom de l'utilisateur nom@duvel.space

    read nom
    
    

    #creation du dockerfile

    echo "FROM debian" > Dockerfile
    echo "RUN apt update" >> Dockerfile
    
    

    #on ouvre le port 25 pour les mails

    echo "EXPOSE 25" >> Dockerfile
    echo "EXPOSE 80" >> Dockerfile
    
    

    #on injecte la config de postfix

    echo "RUN apt-get install -y postfix mailutils" >> Dockerfile
    

    #echo "RUN echo -e \"$config\" > /etc/postfix/main.cf" >> Dockerfile

    echo "COPY postfix.cf.docker /etc/postfix/main.cf" >> Dockerfile
    
    

    #on genere le /etc/aliases

    echo "postmaster: root" > aliases.docker
    echo "$nom: root" >> aliases.docker
    
    

    #ongenere /etc/mailname

    echo "RUN echo \"duvel.space\" > /etc/mailname" >> Dockerfile
    
    

    #on ajoute l'alias necessaire

    echo "COPY aliases.docker /etc/aliases" >> Dockerfile
    
    echo "RUN service postfix start" >> Dockerfile
    
    chemin=`pwd`
    
    echo $pwd
    
    

    #on construit l'image du docker

    docker build -t serveur_mail .
    
    

    #on cree le conteneur

    id_conteneur=`docker run -tid --restart always --privileged -p 1345:1345 serveur_mail`
    
    echo "\n*****ID du docker : ${id_conteneur:0:12}*****\n"
    
    

    #on recupere l'adresse ip du conteneur

    ip_conteneur=`docker inspect --format 'Modèle:.NetworkSettings.IPAddress' ${id_conteneur:0:12}`
    
    echo "adresse IPV4 du docker : $ip_conteneur"
     
    

    #on l'ajoute a la table de routage

    echo "$nom    $nom@[$ip_conteneur]" >> /etc/postfix/relai_duvel
    
    

    #on cree le nouveau fichier relai_duvel.db

    postmap /etc/postfix/relai_duvel
    
    

    #on redemarre postfix

    service postfix restart
    
    echo "\n*****Configuration docker de $nom terminee*****\n"
    
    echo "Enregistrement du nom du docker dans la BDD"
    
    

    #on ajout une ligne qui contient le nom d'utilisateur, avec l'ID et l'IP du conteneur associe

    echo "$nom : ${id_conteneur:0:12} : $ip_conteneur" >> bdd_serveur_mail
    
    echo "\n*****FIN*****\n"
    
    

    Ce fichier script permet la création de docker préconfiguré. Toutefois, Pour que ça fonctionne, nous sommes obligé de nous attacher au conteneur et de démarrer manuellement postfix :

    service postfix start
    

    Après, ça fonctionne très bien.

    Bon, il y a quelques warnings et erreurs lors de la génération du conteneur... un Dockerfile est simple à rédiger, mais il est difficile d'interpréter les erreurs de dénération de docker.

    Crack de la clef WEP

    • On commence par chercher le point d'accès:
    • airodump-ng --encrypt wep wlan0mon
      
    • Ensuite on écoute les trames wifi:
    • airodump-ng -w out -c 4 --essid ***** wlan0mon
      
    • On lance ensuite la commande suivante dans un autre terminal pour trouver la clef, la recherche dure environ 5 minutes. Ce temps est dû au fait que l'on procède par tentatives de connexion (force brute). On obtient finalement :
    • aircrack-ng out-01.cap 
      KEY FOUND! [ 63:32:34:67:4A:3A:51:34:76:25:43:77:3F ] (ASCII: c24gJ:Q4v%Cw? )
      

    Annexes

    /etc/postfix/main.cf de la MV

    # See /usr/share/postfix/main.cf.dist for a commented, more complete version
    
    
    # Debian specific:  Specifying a file name will cause the first
    # line of that file to be used as the name.  The Debian default
    # is /etc/mailname.
    #myorigin = /etc/mailname
    
    smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
    biff = no
    
    # appending .domain is the MUA's job.
    append_dot_mydomain = no
    
    # Uncomment the next line to generate "delayed mail" warnings
    #delay_warning_time = 4h
    
    readme_directory = no
    
    # TLS parameters
    smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
    smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
    smtpd_use_tls=yes
    smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
    smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
    
    # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
    # information on enabling SSL in the smtp client.
    
    smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
    myhostname = duvel
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    myorigin = /etc/mailname
    mydestination = duvel.space, duvel, localhost.localdomain, localhost
    relayhost = 
    mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 172.17.0.0/24
    mailbox_size_limit = 0
    recipient_delimiter = +
    inet_interfaces = all
    inet_protocols = all
    local_recipient_maps =
    
    # pour g�rer les mails
    
    virtual_alias_maps = hash:/etc/postfix/relai_duvel
    
    # authentification
    
    smtp_sasl_auth_enable   = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
    smtp_sasl_security_options = noanonymous 
    

    /etc/aliases de la MV

    # See man 5 aliases for format
    postmaster:    root
    admin: root
    

    /etc/postfix/main.cf d'un docker

    smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
    biff = no
    append_dot_mydomain = no
    readme_directory = no
    compatibility_level = 2
    smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
    smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
    smtpd_use_tls=yes
    smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
    smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
    smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
    myhostname = 19e0c1cfc011.duvel.space
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    myorigin = /etc/mailname
    mydestination = $myhostname, duvel.space, 19e0c1cfc011, localhost.localdomain, localhost
    relayhost = 
    mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
    mailbox_size_limit = 0
    recipient_delimiter = +
    inet_interfaces = all
    inet_protocols = all
    

    /etc/aliases d'un docker

    postmaster: root
    jean: root
    

    table de routage du postfix de la MV (/etc/postfix/relai_duvel

    cle-guen     cle-guen@[172.17.0.14]
    gogole    gogole@[172.17.0.104]
    gogole2    gogole2@[172.17.0.108]
    jean    jean@[172.17.0.110]