# ASE2 - portifolio des compétences ## Séquence 7 ### Pastile 7.2 et 7.3 - crontab Pour éditer crontab : crontab -e Pour afficher la crontab : crontab -l fichier permettant de rendre une action régulière sur la durée ![](https://i.imgur.com/rShhSnm.png) ![](https://i.imgur.com/mXd5U33.png) ### Pastile 7.4 - crontab #### A quel moment sont elles précisément déclenchées ? akrb1com1stg01.ankama.lan Les directives cron sont éxécutés en fonction de leur heures d'éxécutions définis (paramètres en général). #### Peut-on, avec ces mécanismes, éviter de lancer toutes les actions de la même catégorie au même moment ? Si oui, comment ? Oui en définissant lors de l'élaboration de la crontab des jours/mois/heures différent(e)s ET en faisant plusieurs règles pour chaque itération de l'action ### Pastile 7.5 - création d'une crontab Permet de déclencher une action le dernier dimanche de chaque mois : 50 23 25-31 1,3,5,7,8,10,12 sun tache.sh 50 23 24-30 4,6,9,11 sun tache.sh 50 23 22-29 2 sun tache.sh 50 23 = correspond à 23h50, on aurait pu mettre l'heure qu'on veut. 25-31 = dernière semaine du mois pour les mois impairs 24-30 = dernière semaine du mois pour les mois pairs (hors février) 22-29 = CAS PARTICULIÉ : dernière semaine du mois de février sun = tout les dimanches tache.sh = la tâche a exécuté ### Pastile 7.6 - Crontab et machine éteinte #### Que se passe-t-il si une machine n'est pas en fonctionnement au moment où une commande devait être lancée ? Cron est utilisé pour des machines à fonctionnement permanent (plutôt des serveurs). La commande de la crontab ne se lance pas si la machine est éteinte. En effet, cron lance une tâche à un moment pré-déterminé (« le 14 janvier 2018 à 15h 30 »). Si la machine n'est pas allumée, la tâche n'est pas lancée, et ne le sera jamais, même après le re-démarrage. Elle est perdue. #### Justifiez de l'existence de timestamp dans /var/spool/anacron. Anacron est utilisé pour des machines à fonctionnement discontinu (plutôt des PC), donc qui peuvent-être éteintes. Anacron utilise au contraire des indications de temps relatives (« une fois par jour / par semaine / par mois »). Si vous avez demandé une tâche toute les semaines, et que votre PC est démarré seulement au bout de 10 jours, anacron constatera le retard, et lancera donc la tâche juste après le démarrage de votre PC. #### Une commande lancée tous les jours à 2h30 sera-telle exécutée durant la nuit du changement d'heure au printemps ? Sera-t-elle exécutée deux fois au retour à l'heure d'hiver ? Lorsqu'on avance d'une heure au printemps, par exemple à 2h il sera 3h. Ainsi, si on a une tâche à 2h30, la tâche ne s'exécutera pas. Lorsqu'on recule d'une heure en hiver, par exemple à 3h il sera de nouveau 2h. Ainsi, si on a une tâche à 2h30, la tâche s'éxécutera deux fois. Solution : gérer les machines en temps universel (GMT) ou par défaut (UTC). ### Pastille 7.7 - utilisateurs et crontab #### Qui peut lancer des commandes régulièrement ? Un utilisateur non-privilégié peut-il lui-même activer des crontables ? Tous les utilisateurs peuvent créer des tâches dans le crontab, si un utilisateur n'est pas autorisé c'est qu'il est présent dans les fichiers de configuration de cron. #### L'administrateur peut-il techniquement interdire l'usage de cron à un utilisateur donné ? Comment ? Est-ce à lui de décider ? Oui en éditant le fichier /etc/cron.deny. C'est une sorte de blacklist. #### Peut-il l'interdire à tout le monde ? Puis autoriser seulement quelques utilisateurs particuliers ? Le fichier /etc/cron.allow permet d'autoriser uniquement les utilisateurs présent dans ce fichier. C'est une sorte de whitelist. ### Pastile 7.8 - Retour vers le futur... #### Comment lancer une commande dans le futur ? Décrivez le fonctionnement de ce mécanisme. Quelle en est la précision/granularité ? #### Que faut-il pour ces commandes s'exécutent effectivement à l'heure voulue ? ### Pastile 7.9 - #### Où sont stockées les commandes en attente d'exécution ? /var/spool/cron/crontabs On y retrouve des fichiers ayant comme nom l'utilisateur qui a créé une tâche. Lorsqu'on fait un crontab -e, on appel en réalité le fichier correspondant à l'utilisateur courant. #### Sous quel format sont-elles stockées ? Ouvrez un de ces fichiers et étudiez le contenu. Vous pourrez alors facilement répondre à la question. format : ASCII text (format texte classic). ### Une commande lancée dans le futur par un utilisateur peut-elle s'exécuter si l'utilisateur n'existe plus au moment du déclenchement ? Et si cet utilisateur est root ? Non Root ne peut être supprimé. ### Pastille 7.10 Je le verifie et j'avise, mais il y a de grande chance que je le laisse. ### Pastille 7.11 Comment reprendre la main ? "grace a PAM" Préambule a la suite ### Pastille 7.12 Le fichier /etc/pam.conf ne contient plus d'informations sur les configurations de base des distributions basées sur debian. Où les informations sont désormais réparties ? Dans le /etc/pam.d/ Trouvez dans un des fichiers de configuration le service qui a été utilisé dans la pastille précédente (celui qui empêche le login lors de maintenance système). Dans quel fichier est-il appelé ? pam_nologin.so ### Pastille 7.13 auth is used for providing some kind of challenge/response (depending on the module) – usually username/password. account is used to time or otherwise restrict the user account -i.e. user must use faillock, load all the sssd account requirements etc. password is used to update the authtoken associated with the user account. This is mainly used to change passwords and it can be where the rules around local password strength can be formulated. session is used to determine what the user needs before they are allowed a session: working home directory, to which system limits apply (open filehandles, number of terminals, etc.), and user keyring. ------- auth est utilisé pour fournir une sorte de défi / réponse - challenge/response (selon le module) - généralement un nom d'utilisateur / mot de passe. *Le compte* est utilisé pour chronométrer ou restreindre le compte d'utilisateur -i.e. l'utilisateur doit utiliser faillock, charger toutes les exigences du compte sssd, etc. *le mot de passe* est utilisé pour mettre à jour l'authtoken associé au compte d'utilisateur. Ceci est principalement utilisé pour changer les mots de passe et c'est là que les règles concernant la force du mot de passe local peuvent être formulées. *la session* est utilisée pour déterminer les besoins de l'utilisateur avant qu'une session lui soit autorisée: répertoire de travail, auquel s'appliquent les limites du système (ouvrir les descripteurs de fichiers, nombre de terminaux, etc.), et trousseau de clés utilisateur. ### Pastille 7.14 required - if this fails return failure but continue executing anyway [success=ok new_authtok_reqd=ok ignore=ignore default=bad] requisite - if this fails return failure and die (don't even attempt to preauth) [success=ok new_authtok_reqd=ok ignore=ignore default=die] sufficient - this is enough for success and exit if nothing previously has failed [success=done new_authtok_reqd=done default=ignore] optional - we don't care unless this is the only module in the stack associated with this type [success=ok new_authtok_reqd=ok default=ignore] ----- required - si cela échoue, retournez à l'échec mais continuez à exécuter quand même [success=ok new_authtok_reqd=ok ignore=ignore default=bad] requisite - si cela échoue retourner l'échec et mourir (n'essayez même pas de préautoriser) [success=ok new_authtok_reqd=ok ignore=ignore default=die] sufficient - c'est suffisant pour réussir et sortir si rien n'a échoué auparavant [success=done new_authtok_reqd=done default=ignore] optional - peu nous importe, sauf s'il s'agit du seul module de la pile associé à ce type [success=ok new_authtok_reqd=ok default=ignore] ### Pastille 7.15 Ajouter dans /etc/update-motd.d/50-motd-news exec /usr/games/fortune | /usr/games/cowsay -n ### Pastille n°7.16 Le service DNS permet de s'abstraire des numéros IP en nommant une machine par un identifiant plus parlant pour l'humain. Ce service est dispensé pour un réseau par un serveur dédié (généralement assuré par le logiciel BIND -- qui le développe ?) mais nous allons dans un premier temps utiliser les fichiers système locaux pour notre data-center. Une machine peut conjointement rechercher un nom de machine dans son fichier local (/etc/hosts) et faire une requête au DNS de son LAN. La priorité est écrite dans le fichier /etc/nsswitch.conf. Ecrivez un fichier /etc/hosts contenant toutes les machines du data-center et dupliquez-le sur chaque machine. Installez le package dnsutils sur toutes les machines du data-center. Vous avez alors accès à la commande dig pour faire une requête DNS. Testez vos fichiers /etc/hosts Format fichier hosts : adresseIP NomDeLaMachine ### Pastille n°7.19 apt install cowsay apt install fortune fortune | cowsay ### Pastille n°7.20 Point bonus ## Séquence 8 ### Pastille 8.1 Le vide ### Pastille 8.2 Sur les systèmes du type Unix, procfs (process file system, système de fichiers processus en anglais) est un pseudo-système de fichiers (pseudo car dynamiquement généré au démarrage1) utilisé pour accéder aux informations du noyau sur les processus. Le système de fichiers est souvent monté sur le répertoire /proc. Puisque /proc n'est pas une arborescence réelle, il ne consomme aucun espace disque mais seulement une quantité limitée de mémoire vive. Cela aboutit à un paradoxe apparent : un fichier non vide a une taille affichée de 0 (avec ls). ### Pastille 8.3 Monte le répertoire /mnt/proc comme une partition L'on y voit le contenu du repertoire proc ### Pastille 8.4 Le root voit les pid lancées par tout les utilisateurs, alors qu'un utilisateur non priviligé ne voit que ceux qu'il a lancé. Utile dans le cas d'un serveur de partage d'application auquel plusieurs utilisateurs ont accées. ### Pastille 8.5 Autant qu'il y a de processus de lancés La commande hexdump permet d'afficher le contenu d'un fichier au format spécifié (hexadecimal, ...). -c One-byte character display -C Canonical hex+ASCII display ### Pastille 8.6 à voir ### Pastille 8.7 Tableau qui contient String ("Errare humanum est" et "1000") Affiche le PID courant #### Lance la commande sleep avec en paramètre chaque valeur dans le premier tableau : - sleep Errare humanum est -> ne fonctionne pas - sleep 1000 ![](https://i.imgur.com/C3MF0wK.png) #### Sur quoi pointe /proc/PID/exe ? ![](https://i.imgur.com/wwsGici.png) ### Pastile 8.8 Change les variables d'environnement ![](https://i.imgur.com/LIMKjAm.png) ### Pastille 8.9 Ça affiche les répertoires à la racine ![](https://i.imgur.com/8sRUsVM.png) Dans /proc/PID/cwd, on voit les fichiers qui sont présents dans les répértoires parcourus, en temps réel. (commande à faire pls fois : cd /proc/PID/pwd && ls) ![](https://i.imgur.com/05IxZRG.png) ### Pastille 8.11 cat /proc/self/cmdline n'affiche rien hexdump -C /proc/self/cmdline affiche des lignes de textes en hexa et ASCII ls -l /proc/self/cwd affiche un lien vers /proc cat /proc/self/status affiche toutes les caractéristiques technique (umask, pid, running, utillisation de la mémoire etc...) de la commande cat cat /proc/self/stat affiche des données presque similaire à status mais pas organisé du tout #### À qui appartiennent (user/group) les fichiers/répertoires du répertoire /proc ? APPARTIENT A ROOT. ### Pastille 8.13 ls -l /proc/self/root --> lien vers / cat /proc/self/mounts --> affichage du df -ah (partitions montées) ls -l /proc/self/net --> outils réseaux cat /proc/self/net/dev --> statistiques sur l'état réseau /proc/self regroupe les infos systèmes ### Pastille 8.14 root@Tp-Lucas-DNS1:~# ldd /bin/bash linux-vdso.so.1 (0x00007ffd125fe000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f805d87b000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f805d677000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f805d286000) /lib64/ld-linux-x86-64.so.2 (0x00007f805ddbf000) ### Pastille 8.15 ## Séquence 9 ### Pastille 9.2 - commande unshare Namespace : caractéristiques propre à chacun des processus Répertoire proc -> contient des fichier/rep qui a la basr sur un système linux,la racine devrait pas être le = un lien symbolique pour chaque processus tuto : echo $$ : donne le pid du processus ls /proc/1204/root ls -l /proc/1204/root : donne des infos sur le processus commande unshare : programme qui lance un programme avec un namespace différent que celui du mamespace parent ip link= interface physique (mac address) en gros possibilité de lancer un programme avec des droits différents tuto unshare : ip link unshare --net bash ip link id du root : 0 (utilisateur privilégié) ### Pastille 9.3 - namespace mount only préparation - travailler sur un disque virtuelle créer à partir d'un fichier en le transformant en partition commande dans la pastille 9.3 ### Pastille 9.4 unshare --mount bash : créer un conteneur avec bash dedans etape 1 : monter le disque en étant dans le namespace, alors il n'apparait pas en dehors du namespace Conclusion : en dehors du namespace le point de montage est absent, le bash a un pt de vue différent des points de montage, possible de changer les vues en modifiant le dossier proc ### Pastille 9.5 #### Que se passe-t-il lorsqu'on quitte le namespace sans démonter un système de fichier monté à l'intérieur de celui-ci ? Ca supprime tout ### Pastille 9.6 chroot permet de changer le répertoire racine. chroot <repertoire> A savoir : chroot est partagé, donc accessible avec plusieurs terminaux contrairement à unshare qui est vraiment isolé, accessible uniquement avec le terminal courant. Si répertoire vide : (exemple processus) mount -t proc proc /proc/ Pour /dev mount -t devtmpfs none /dev/ Modifier les points de montage, modifier les droits, modifier la / etc etc Info : Namespace non nommé genre bash, ls, etc etc nsenter --mount --target <pid> bash = namespace enter, permet d'entrer dans un namespace à l'aide de son pid ### Pastille 9.7 chaque processus a un identifiant unique servant à le désigner et a lui envoyer de signaux. Le namespace PID va servir à changer ce fonctionnement Changer le namespace : unshare --pid --fork bash /!\ Faut faite --fork car ça bug, ça relance un PID au sein du namespace plutot que de faire buger tout /!\ ps aux - rappel : la commande ps parse le repertoire proc et s'en fout des namespace donc ça marche pas quand tu fais un ps dans un namespace PID, le processus est visible avec un autre identifiant, pour le tuer ils faut utiliser les bons PID Problème : les namespace bloquent les autres utilisations des PIDs, il faut le corriger pid dans namespace différent que dans le /proc, ainsi quand on veut kill avec le PID depuis namespace, il ne trouve pas le process. Dans un autre terminal qui n'est pas dans ce namespace, quand on kill à l'aide du PID, ça fonctionne. ### Pastille 9.8 - correction des problème avec namespace PID régler les interactions entre PID et /proc unshare --mount --pid --fork --mount-proc bash Crée un namespace avec un /proc Les PID sont différents du namespace racine et du namespace unshare unshare --mount --pid --fork ça bug ### Pastille 9.9 - namespace mount et PID dans un chroot Activer l'option Kernel unpriviligied userns clone /!\ Création du namespace : unshare --user bash -> création d'un nouveau bash Problème : id et gid en nobody whoami nobody l'option map-root-user permet de faire du mapping d'utilisateur. Ainsi, ca permet de se connecter en root dans un namespace sans avoir à saisir un mdp. ### Pastille 9.10 - namespace --map-root-user Il y a des user privilégié comme root, et des normaux. Quand tu fais un namespace par défaut, il se créé avec les droits d'un utilisateur classic. $ unshare --user bash l'utilisateur par défaut d'un namespace est *nobody* On peut modifier cela avec $ unshare --user --map-root-user bash L'utilisateur est root grâce à cette commande. Ainsi, on créer le namespace avec root, mais pour avoir les privilèges, voir la pastille 9.11. ### Pastille 9.11 - namespace UTS unshare --user --map-root-user -uts bash Options uts permet d'avoir les privilèges root en travaillant dans ce namespace permet d'héberger des VMS sans VM en utilisant des namespace sans être root C'est un root chinté - on peut changer le hostname, le nom de domaine, etc #### En utilisateur non-privilégié, essayez de redéfinir le hostname et le domainname : que se passe-t-il ? erreur #### Toujours en utilisateur non-privilégié, démarrez un shell dans un namespace utilisateur comme vu à la pastille précédente et réessayez. Que se passe-t-il ? pas d'erreurs affichées mais ça ne marche pas pour autant. #### avec --uts fonctionne ### Pastille 9.12 - le namespace network Now on sait faire : séparer les points de montage, les PID, les UID, les GID et les nom d'hôtes/domaine de base, un user random peut pas bosser sur la config réseaux, avec un namespace réseau, ce user pourra modifier une machine interne unshare --user --map-root-user --uts --net bash le user peut alors modifier la config réseaux avec le --net on voit que le loopback quand on fait ip a, le réseau est donc isolé. ### Pastille 9.13 - interfaces virtuelles a partir d'un namespace, on peut créer un interface virtuelle connecté à l'interface de base de la machine ip link add vhost type veth peer name vguest Créer une seconde interface (vérif #ip link) SI je regarde en dehors du namespace de base, il y a toujours un seul interface (il faut le up avant !) ### Pastille 9.14 -assocation d'une interface réseaux virtuelles à un namespace ip link set vguest up (créer le lien avec la machine réelle) ip a (affiche les interfaces) ### Pastille 9.15 - ajouter une ip a une interface : ip addr add 192.168.1.2/24 dev vguest ip route add default via 192.168.1.1 dev vguest (permet de créer une route pour ping internet) ### Pastille 9.16 - les namespace sont en réalité une commande isolé dans un conteneur ip netns add netns0 (créer namespace réseau) ipnetns list ip netns exec netns0 ip link Créer une interface virtuelle ip link add ns-host type veth peer name ns-guest Lier l'interface virtuelle au réseau namespace ip link set ns-guest netns netns0 ### Pastille 9.17 - $ unshare --cgroup --mount-proc --user -r --mount --pid --uts --net --fork bash -c "mount --rbind /sys chroot/sys ; mount --rbind /dev chroot/dev ; /sbin/chroot chroot/ bash" Permet d'avoir un vrai conteneur, un namespace fonctionnel.