+------------------------------------------------------------------------------+
|                                                                              |
|                               -  IMPORTANT  -                                |
|                                                                              |
| Nous utilisons Bosc-debian9, qui permet de choisir le nom du compte          |
| utilisateur au premier démarrage.                                            |
| Votre compte utilisateur doit avoir exactement votre nom de famille          |
| (sans accents).                                                              |
| Je dois garder une trace fiable de ce que chacun d'entre vous fera sur       |
| chaque machine.                                                              |
|                                                                              |
|   J'ai écrit cette consigne au tableau.  Si vous l'avez ignorée, redémarrez, |
|   , et nommez votre compte correctement.              |
|                                                                              |
+------------------------------------------------------------------------------+


Mailing list:
  https://lists.ageinghacker.net/ (acceptez le certificat.  Il
  est auto-signé).  Puis inscrivez-vous à la liste «Ldap».

TP
==

  Rapports à envoyer à mon adresse mail personnel (pas à la mailing list),
  comme expliqué dans http://ageinghacker.net/teaching/
  L'objet de votre mail *doit* contenir le texte « [LDAP TP] ».

  Je veux du *texte pur* : pas de LibreOffice, PDF, images, photos d'écran ou
  autres formats bizarres.  Je veux pouvoir tester votre code facilement.
  Vous pouvez soit écrire votre rapport directement dans le corps de votre mail
  (mais en format texte), soit attacher un ou plusieurs fichiers en format
  texte.  Utiliser votre éditeur préféré.
  Vous pouvez copier/coller ce texte dans votre rapport pour reproduire
  facilement les questions.
  Donnez-moi vos fichiers de configuration, scripts, lignes de commande.

  Si une question n'a pas de réponse possible, spéficiez-le explicitement.


Partie A : préliminaires
------------------------

J'ai simplifié et automatisé l'installation et la configuration du logiciel
d'une façon radicale.

* Exécutez cette ligne de commande, en tant qu'utilisateur ordinaire (non root) :

    pushd /tmp; wget -c http://ageinghacker.net/teaching/ldap/resources/mon-usr.tar.xz && tar xf mon-usr.tar.xz; . adapt; popd

  La ligne que vous avez juste exécuté a installé le logiciel, et modifié votre
  fichier d'initialisation de Bash.  Ce suffit d'exécuter la ligne *une* fois.

  Le shell du terminal où vous avez exécutez la ligne a déjà les variables
  d'environnement modifiées.  Tout nouveau shell non root que vous allez ouvrir
  à partir de ce moment (nouveau terminal, nouveau onglet, nouvelle session
  texte) sera également pré-configuré.

  slapd, ldapsearch, ldapadd et tout autre outil est automatiquement disponible.
  Un fichier de configuration du serveur est déjà disponible dans /tmp/slapd.conf .

  Le suffixe, la rootdn et le mot de passe sont ces que vous connaissez déjà.
  Le répertoire de la base de données existe déjà, mais il est vide.

* Démarrez votre serveur local.  Au moins au début, activez tout message de
  debug possible.

     slapd -f /tmp/slapd.conf -d255 -h ldap://localhost:10000

* Connectez-vous à votre serveur.  Vous devez pouvoir faire une recherche,
  et trouver zéro entrées, sans aucune erreur.


===========================================================================
Suggestion : gardez une copie de tout fichier LDIF !  Ce peut être utile en
             cas d'erreur, quand vous avez besoin de redémarrer à partir
             d'une base de données vide.

Si vous souhaitez vider la base de données :
  - arrêtez le serveur ;
  - videz le répertoire des données ;
  - redémarrez le serveur.
===========================================================================

* Cherchez toute entrée (suggestion : "objectclass=*" est un bon filtre, mais
  vous pouvez aussi appeler ldapsearch sans filtres).
  La base de donnée est vide, mais la recherche doit marcher sans erreurs.


Partie B : bâtir le DIT
-----------------------

Ici il faudra créer des branches en utilisant ldapadd.

* On a une organisation nommée ("o") comment vous voulez, qu'on utilise comme
  le domain Internet ageinghacker.net -- donc en LDAP encodé comme
    dc=ageinghacker,dc=net
  L'organisation est un "dcObject" (directory component) et aussi, bien sûr,
  une organisation (an anglais américain "organization", avec un Z).

* Notre organisation contient une unité organisationnelle ("organizationalunit")
  nommée ("ou") "hackers".

* Ajoutez des autres unités organisationnelles, nommées à votre plaisir, au même
  niveau de « ou=hackers ».


Partie C : peupler la base de données, à la main
------------------------------------------------

* Ajoutez un hacker nommé « J. Random Hacker ».
  Les hackers sont des personnes ("objectclass: person") dans l'unité
  organisationnelle des hackers dans notre organisation.
  Quels attributs sont obligatoires ?  Quels sont optionnels ?  Ajoutez le moindre
  possible d'attributs à ce moment.  Des messages d'erreur vont vous prévenir si
  des attributs obligatoires sont manquants.

* Ajouter un autre hacker, à votre plaisir.  Cette fois testez le caractère de
  continuation de LDIF (espace).

* Créez une nouvelle entrée: un hacker, ayant votre nom et prénom (pas de surnoms
  dans cette phase).

* Cherchez tout hacker avec ldapsearch.  Combien d'entrées vous trouvez ?

* Répétez la dernière opération, cette fois en espionnant la connextion entre
  client et serveur avec Wireshark.
  Vous devriez arriver à identifier les requêtes et les réponses.
  Vous devez arriver à intercepter l'échange entre client
  et serveur, et à décoder les messages LDAP.  (Attention : nous utilisons un
  port non standard, donc Wireshark ne reconnaîtra pas LDAP automatiquement ;
  quand même, Wireshark a un bon support pour LDAP.)
  *Appelez-moi* quand vous avez bien décodé un messages.  Gardez la fenêtre de
  Wireshark ouverte en attendant mon arrivé, et continuez.

* [Question annulée: M. Hu a découvert que ldapdelete peut éliminer
   des entrées récursivement, donc ce que je considérais comme impossible
   est en réalité possible.  N'éliminez pas les hackers.]
  Essayez d'éliminer les hackers (toute l'unité organisationnelle) avec
  ldapdelete et puis avec ldapmodify.
  Si vous voyez des messages d'erreur mais vos pensez que vos lignes de
  commande soient correctes, montrez-les-moi.

* Si nécessaire, recréez les hackers que vous avez éliminé.
  Ajoutez un autre hacker.  Éliminez-le avec ldapdelete.

* Ajoutez encore un autre hacker.  Éliminez-le avec ldapmodify.

* Modifiez l'entrée de « votre » hacker (celui que vous avez nommé après
  vous) en lui donnant un numéro de téléphone.
  Ici vous avez besoin de ldapmodify.

* Modifiez l'entrée de votre hacker en lui donnant un deuxième numéro de
  téléphone.

* Éliminez le premier numéro de téléphone, en gardant le deuxième, avec
  un outil à votre choix.

* Modifiez le nom commun de votre hacker avec ldapmodify, en changeant le nom
  commun avec votre surnom préféré.  Le type d'opération sera «modrdn» (il
  faudra donner un attribut «newrdn»)
  * Son DN est-il changé ?  Et son CN ?  Est-ce le seul comportement possible ?
  * Pourquoi j'ai parlé de «newrdn»?  Expliquez «r».

* Essayer de changer l'unité organisationnelle de votre hacker : il va passer
  de l'unité des hackers à une autre unité que vous avez créé.


Partie D : mots de passe
------------------------

* Modifiez l'entrée de votre hacker, en ajoutant un attribut userPassword en lui
  donnant une valeur.

* Authentifiez-vous avec votre DN et mot de passe, au lieu d'utiliser Manager.
  Avec notre configuration (non sûre) ce doit marcher.

* faites une recherche, et affichez tout attribut de votre entrée
  le mot de pass est-il visible?

* Essayez slappasswd.  À quoi ce sert?  Lisez la documentation pour comprendre
  l'idée.

* Utilisez la sortie de slappasswd de façon utile, en modifiant votre entrée.
  * L'authentification marche-t-elle encore ?

* Refaitez la dernière opération, cette fois en espionnant la connextion entre
  le client et le serveur LDAP en utilisant Wireshark.
  Dites-moi ce que vous remarquez.


Partie E : peupler la base de données, en masse
-----------------------------------------------

* Étant donnés les noms et prénoms dans les fichiers de texte à la page des
  ressources
    http://ageinghacker.net/teaching/ldap/resources/noms/
  , remplissez l'unité organisationnelle des hackers.  Vous pouvez combiner des
  prénoms et des noms pour obtenir des noms complets d'hackers.  Utilisez juste
  une partie des données, car les combinaisons possibles sont très nombreuses,
  et votre script ne sera pas très rapide.
  Vous pouvez ajouter environs 1000~2000 entrées.

  Générez, en Bash ou en Python, ou de quelque autre façon automatique ou
  semi-automatique, un (seul) fichier LDIF contenant toutes les entrées à ajouter.

    Remarque pour vous motiver : cet exercice est réaliste, voire simplifié par
                                 rapport à la réalité.  Un administrateur
                                 système peut avoir besoin d'ajouter à une base
                                 de données LDAP des données extraites à partir de
                                 un ou plusieurs fichier de texte à combiner, ou
                                 à partir d'une base de données SQL.
                                 Exemple : 1000 étudiants s'inscrivent à
                                 l'université, et doivent avoir chacun un compte
                                 Unix et un compte imprimante.

  Ajoutez les données à votre serveur local.
  Je veux voir votre script Bash ou Python dans le rapport, ou une description de
  votre stratégie.


Partie F : recherches sur des bases de données de taille importante
-------------------------------------------------------------------

* Cherchez toute entrée dans la base de donnée locale avec ldapsearch.  Il y a combien de
  résultats ?

* Cherchez toute entrée dans la base de donnée locale avec ldapsearch, encore une fois.
  Cette fois, ne faites pas BIND (c'est à dire, ne passez pas les options -D et -w/-W).
  Ça marche encore ?  Il y a combien de résultats ?

* Connectez-vous à mon serveur (il ne sera actif que pendant le TP).
     hostname:     ageinghacker.net
     port:         10000
     mot de passe: onlyevilpeopledislikeldap42
       (maintenant désactivé, après la fin du cours)

  Le DIT sur mon serveur est le même que vous utilisez au TP, mais les entrées sur mon
  serveur sont bien plus nombreuses.
  Cherchez toute entrée sur mon serveur.  Il y a combien de résultats ?

* Cherchez toute entrée sur mon serveur avec ldapsearch, encore une fois.
  Cette fois, ne faites pas BIND (c'est à dire, ne passez pas les options -D et -w/-W).
  Ça marche encore ?  Il y a combien de résultats ?

* Si vous avez fait tout le reste ajoutez une entrée avec votre nom dans *mon*
  serveur LDAP.  Si vous êtes arrivés ici vous méritez un bonus.  Appelez-moi.


Partie G : performances et bases de données de taille importante
----------------------------------------------------------------

À ce point (re-)démarrez le serveur sans aucune option de debugging
activée, c'est à dire en utilisant -d0
.

* Lisez slapd-mdb(5) à propos des options checkpoint, dbnosync.
  Dans quelle situation sont-elles une bonne idée ?  Essayez-les, en
  mesurant les performances.
  Comment pouvez-vous mesurer ?  (Suggestion: vous avez votre fichier LDIF
  contenant un grand nombre d'hackers).
  Mesurez la différence en performance, d'une façon raisonnable.
  Montrez-moi vos lignes de commande, et la sortie *exacte* des commandes.

* Lisez slapcat(8).  Utilisez-le pour exporter votre base de données, en
  imaginant de devoir migrer les données, d'un serveur à un autre serveur.

* Testez l'option
    checkpoint 0 60
  dans le fichier de configuration du serveur, bien expliquée dans la
  documentation.
  Décrivez en détail (et testez) un cas pratique où avec cette option de
  configuration on peut perdre des données.  Suggestion: utilisez killall -KILL.
  Pourquoi «-KILL» ?  Est-ce la simulation d'un cas d'utilisation réaliste qui
  peut arriver en utilisant un système réel ?  (Oui.)  Quel cas ?

* Regardez slapadd.  Quelle est la différence entre slapadd et ldapadd ?

* Si vous êtes arrivés à ce point, appelez-moi.  Je vais vous fournir un fichier
  LDIF compatibile avec votre DIT, de taille très importante.
  Ajoutez-le à la base de données (qui devra peut-être être vidée).
  Est-ce que ldapadd marche avec mon fichier ?  Pourquoi ?

* Utilisez l'option maxsize , toujours dans le fichier de configuration du serveur,
  documentée dans la page de man de slapd.conf .


Partie H
--------

* Déduisez la sémantique des filtres multiples, en utilisant ldapsearch avec
  *plusieurs* filtres (voir slides2.pdf) sur votre annuaire.
  En utilisant plusieurs filtres séparés, les résultats de chaque filtrage
  sont-ils combinés en conjonction (« et ») ou en disjonction (« ou ») logique ?

  Montrez-moi avec quelles commandes vous avez découvert la réponse.

* Est-ce qu'on peut obtenir l'autre connectif logique (« et »/« ou »---celui
  qui n'est pas le défaut que vous avez découvert) dans les filtres ?  Quelle
  est la syntaxe ?

Local Variables: eval: (ispell-change-dictionary "francais") eval: (flyspell-mode t) End: