# 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


### 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

#### Sur quoi pointe /proc/PID/exe ?

### Pastile 8.8
Change les variables d'environnement

### Pastille 8.9
Ça affiche les répertoires à la racine

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)

### 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.