Open Source School - Bachelor 3
Supports de cours Linux Administrateur
Ce support est sous licence Creative Commons (CC BY-SA 3.0 FR)
Attribution - Partage dans les Mêmes Conditions 3.0 France
Plan :
Programmation Bash Avancée
* Expressions logiques & boucles
* Paramètres d’entrée et valeurs de retour
* Environnements d'exécution
* Expressions régulières
Gestion des utilisateurs et des groupes
* L'utilisateur et le groupe POSIX
* Gestion des comptes
Administration du système
* Les logs et les mails
* Fichiers de configuration du système
* La gestion des paquets et des mises à jour
* Les services
* Exécution automatique de tâches (cron, at, ...)
* Localisation et internationalisation
TCP/IP et configuration du réseau
* Adressage IP et routage
* Protocoles réseaux (ICMP, TCP, UDP, …) et ports
* Configuration réseau (adresses, hooks, vlan, ...)
* Les outils de l'administrateu : ping, netstat, arp, netcat, traceroute, nmap, ...
Services système et Sécurité
* Permissions du système de fichiers, quotas utilisateurs
* Sécurité réseau
Iptables
OpenSSH et fail2ban
Authentification du serveur et des utilisateurs
2. 2
La 1ère école 100 % dédiée à l'open source
Open Source School est fondée à l'initiative de Smile, leader de
l'intégration et de l'infogérance open source, et de l'EPSI,établissement
privé pionnier de l’enseignement supérieur en informatique.
Dans le cadre du Programme d’Investissements d’Avenir (PIA), le
gouvernement français a décidé de soutenir la création de cette école en
lui attribuant une première aide de 1,4M€ et confirme sa volonté de
soutenir la filière du Logiciel Libre actuellement en plein développement.
Avec une croissance annuelle de plus de 10%, et 4 000
postes vacants chaque année dans le secteur du Logiciel
Libre, OSS entend répondre à la pénurie de compétences du
secteur en mobilisant l’ensemble de l’écosystème et en
proposant la plus vaste offre en matière de formation aux
technologies open source tant en formation initiale qu'en
formation continue.
3. 3
Les formations du plein emploi !
Formation Continue
Open Source School "Executive Education" est un organisme
de formation qui propose un catalogue de plus de 200
formations professionnelles et différents dispositifs de
reconversion permettant le retour à l’emploi (POE) ou une
meilleure employabilité pour de nombreux professionnels de
l’informatique.
Pour vos demandes : formations@opensourceschool.fr
Formation Initiale
100% logiciels libres et 100% alternance, le cursus Open
Source School s’appuie sur le référentiel des blocs de
compétences de l’EPSI.
Il est sanctionné par un titre de niveau I RNCP, Bac+5.
Le programme est proposé dans 6 campus à Bordeaux, Lille,
Lyon, Montpellier, Nantes, Paris.
5. 5
Plan
Programmation Bash Avancée
●
Expressions logiques & boucles
●
Paramètres d’entrée et valeurs de retour
●
Environnements d'exécution
●
Expressions régulières
Gestion des utilisateurs et des groupes
●
L'utilisateur et le groupe POSIX
●
Gestion des comptes
6. 6
Plan
Administration du système
●
Les logs et les mails
●
Fichiers de configuration du système
●
La gestion des paquets et des mises à jour
●
Les services
●
Exécution automatique de tâches (cron, at, ...)
●
Localisation et internationalisation
TCP/IP et configuration du réseau
●
Adressage IP et routage
●
Protocoles réseaux (ICMP, TCP, UDP, …) et ports
●
Configuration réseau (adresses, hooks, vlan, ...)
●
Les outils de l'administrateur : ping, netstat, arp, netcat, traceroute,
nmap, ...
7. 7
Plan
Services système et Sécurité
●
Permissions du système de fichiers, quotas utilisateurs
●
Sécurité réseau
Iptables
OpenSSH et fail2ban
Authentification du serveur et des utilisateurs
9. 9
Le terminal de commande
C'est l'interface de commande.
Il existe plusieurs terminaux:
●
TTY qui est le terminal de commande "de base" (CTRL+ALT+F1)
●
Terminaux virtuels (xterm, gnome-terminal, terminator, terminology...)
Il permet de gérer les "entrées/sorties" et d'y exécuter des "commandes"
Des logiciels savent utiliser le terminal et le placement de caractère pour y afficher
des interfaces plus complexes (curses) par exemple: vim, mutt, top...
11. 11
Le BASH
Bourne Again SHell, du nom du créateur du "Bourne shell" (Stephen Bourne, 1977
sur Unix 7)
Réécrit en 1988 par Brian Fox
C'est le SHELL POSIX généralement par défaut sur la plupart des distributions.
Il permet:
●
d'exécuter des commandes
●
de créer des scripts
●
vérifier le résultat d'une commande
●
interfacer l'homme et la machine (système)
12. 12
Le SHELL en général
C'est l'un des outils les plus importants pour un administrateur UNIX/Linux
Il permet d'effectuer la totalité des travaux - installation, mise à jour, contrôle,
paramétrage, etc.
Maîtriser les outils SHELL est indispensable à la vie d'un administrateur
système/réseau dans un environnement UNIX
13. 13
Le terminal et le SHELL
Un terminal est une interface de commande qui permet de lancer un SHELL
Ce SHELL permet à l'utilisateur d'exécuter des commandes
Une commande peut être:
- un exécutable binaire (un programme)
- un script (bash, perl, python...)
- un alias
- une fonction
- des instructions de contrôle (if, then, case, until...)
Bash est un SHELL
14. 14
TTY/PTY
Vous avez peut-être entendu les termes "tty" et/ou "pty"
Le mot "TTY" vient de teletype
Le mot "PTY" vient de pseudo-teletype
Pour faire simple: le TTY ou le PTY sont des "interfaces" connectées au système.
Voir les répertoires "/dev/tty*" et "/dev/pts/*"
15. 15
Les commandes
Les commandes sont prévues pour exécuter des tâches.
Une commande = une tâche (principe UNIX)
Les commandes de bases:
●
cd - change directory
●
ls - list directory
●
cp - copy
●
mv - move
●
rm - remove
●
cat - afficher un contenu (concatenate files)
Et la plus importante de toutes: man
et ses dérivées : "man man" et "man -k pattern"
Pour chaque commande, retenir le libellé long de la commande !!!
pour "cd" retenir "change directory", ls "list", pwd "print working dir.."
16. 16
Les commandes de base
Elle peuvent accepter :
- des paramètres
- des options
Les paramètres sont des arguments de commandes et ne sont pas spécifique.
Les options sont spécifiques à la commande. Elles modifient le comportement de
la commande. Elles commencent par un ou deux tirets "-" (-a, --all, -f, etc.)
17. 17
Les options
Exemple:
# affichage de la liste des fichiers et répertoires
ls
# affiche "tout" (all), y compris les fichiers cachés
ls -a
# affiche les informations des fichiers/répertoires
ls -l
# Retenir le mode le plus employé en administration système
ls -ltr
qui permet de trouver le dernier fichier modifié !!!
retenir : list long, time, reverse order...
18. 18
Les options
Les options sont (si la commande respecte la norme POSIX), de deux formes:
au format court, un seul tiret et une lettre "-a"
au format long, deux tirets et un "terme" "--all"
POSIX permet de "concaténer" les options courtes, par exemple:
ls -l -a
# équivaut à
ls -la
19. 19
Expressions logiques
On appelle "expression logique" une expression qui permet de "tester" un résultat.
La commande de base est "test", Bash permet de simplifier cela en l'intégrant
dans des crochets
test $A = $B
[ $A = $B ]
Mais bash propose depuis une version "double crochets" qui est plus avancée:
[[ $A == $B ]]
20. 20
Simple ou double ?
La version "simple crochet" est POSIX, elle fonctionne sur d'autres SHELL sans
souci. C'est un alias à la commande "test"
La version "double crochet" est plus poussée, elle permet de respecter une syntaxe
plus proche d'autres langages.
De plus, elle évite de forcer l'utilisation de guillemets.
21. 21
Les tests
Bash fait la distinction entre un test de chaine de caractères et un test numérique
(entiers)
[[ "1" == 01 ]] => faux
[[ "1" -eq 01 ]] => vrai
Les tests de chaines de caractères sont:
c1 == c2, vrai si c1 et c2 sont égaux
c1 != c2, vrai si c1 et c2 sont différents
c1 > c2, vrai si c1 est ordonné avant c2
... etc...
-z c, vrai si c est la chaîne vide
-n c, vrai si c n'est pas la chaîne vide
22. 22
Les tests
Tests numériques
n1 -eq n2, vrai si n1 et n2 sont égaux
n1 -ne n2, vrai si n1 et n2 sont différents
n1 -lt n2, vrai si n1 est strictement inférieur à n2
n1 -le n2, vrai si n1 est inférieur ou égal à n2
n1 -gt n2, vrai si n1 est strictement supérieur à n2
n1 -ge n2, vrai si n1 est supérieur ou égal à n2.
23. 23
Opérations après un test
Les opérateurs logique suivant permettent de contrôler le résultat d'un test:
"&&" = ET logique (and)
"||" = OU logique (or)
C'est donc assez simple:
# commande executée si condition vraie
[[ condition ]] && commande
# commande executée si condition fausse
[[ condition ]] || commande
Ces opérateurs permettent surtout d'écrire des commandes "mono-lignes"
(inline), qui peuvent être lancées par des outils comme cron
/etc/init.d/apache stop && sleep 20 && /etc/init.d/apache start
24. 24
Tests systèmes
[ -e $FILE ]
# vrai si $FILE existe dans le répertoire courant
[ -s $FILE ]
# vrai si $FILE existe dans le répertoire courant et si sa taille est
supérieure à zéro
[ -f $FILE ]
# vrai si $FILE est un fichier dans le répertoire courant
25. 25
Tests systèmes
[ -r $FILE ]
# vrai si $FILE est un fichier lisible dans le répertoire courant
[ -w $FILE ]
# vrai si $FILE est un fichier inscriptible dans le répertoire courant
[ -x $FILE ]
# vrai si $FILE est un fichier exécutable dans le répertoire courant
[ -d $FILE ]
# vrai si $FILE est un répertoire dans le répertoire courant
26. 26
Valeurs de retour
Bash permet de vérifier si une commande a bien terminée sans erreur.
La variable "$?" vaut:
●
0 si tout s'est bien passé
●
tout autre valeur correspond à une erreur
Les tests savent utiliser par défaut cette valeur.
[[ ls ]] && echo "j'ai réussi à lister le répertoire"
27. 27
Opérations
Bash sait calculer mais seulement avec des entiers:
echo $((1+5))
for ((i=0;i<10;i++)); do commande; commande; done
Sinon, on passe par l'outil "bc".
28. 28
Entrées/Sorties
Bash utilise au moins 3 "flux":
●
STDIN => entrée standard, numéroté "0"
●
STDOUT => sortie standard, numéroté "1"
●
STDERR => sortie erreur, numéroté "2"
STDIN est par défaut une entrée au clavier
STDOUT est par défaut un affichage écran
STDERR est aussi affiché à l'écran
29. 29
Entrées/Sorties
Par exemple, la commande "cat" peut lire STDIN si aucun argument (nom de
fichier) n'a été donné.
Dans ce cas, le terminal se met en mode "lecture de flux standard" et attend un
signal de coupure (CTRL+D)
"cat" affiche alors l'entrée sur la sortie standard.
30. 30
Entrées/Sorties
On peut rediriger les entrées/sorties
# envoie le contenu de "fichier" sur STDIN de la commande
commande <fichier
# envoie la sortie standard de la commande dans un fichier (qui sera vidé
avant)
commande >fichier
# envoie la sortie standard à la fin du fichier (le fichier n'est pas
vidé)
commande >>fichier
Comme vue précédemment, les entrées/sorties ont des numéros. Bash propose
cette écriture:
commande 1>fichier_out 2>fichier_err
Le "1" est optionnel, c'est le cas par défaut.
31. 31
Entrées/Sorties
Dans le cas où l'on désire fusionner des sorties, on peut utiliser la notation:
commande N>&M
N: flux à rediriger M: flux qui reçoit
Exemple:
# envoit le flux d'erreur dans STDOUT
# et envoit STDOUT dans fichier
commande 2>&1 >fichier
32. 32
Environnement
Bash fonctionne dans un environnement d'exécution. Cela signifie qu'il a des
repères système.
Les variables d'environnements sont très utiles
●
HOME qui défini le répertoire utilisateur (en cours)
●
PWD qui défini le répertoire courant
●
UID
●
SHELL désigne le shelle en cours (bash, sh, zsh...)
●
etc..
Voir la commande "env" et "printenv"
33. 33
Environnement
L'environnement peut être manipulé dans différents fichiers tels que:
$HOME/.bashrc
$HOME/.bash_profile
/etc/profile
/etc/profile.d/*.sh
Les variables d'environnements sont modifiées par les processus. Par exemple la
commande "cd" impacte la variable "$PWD"
34. 34
Environnement d'exécution
On parle aussi d'environnement d'exécution pour définir la manière dont le
système intègre la session.
Rappelez vous qu'un shell lance un programme: le SHELL
Il est lui même un processus enfant.
Tapez:
ps faux (version BSD)
ps -edfH (version Système V)
ps -w id_proc pour afficher la ligne de commande complète
top
35. 35
Définition
Une expression régulière permet de "matcher" une patron et une chaîne
Pour faire simple, cela permet de vérifier si une chaîne de caractère respecte un
certain format
On s'en sert dans bash pour tester des chaînes, soit nativement, soit avec des
outils tels que "sed", "awk" ou "grep"
36. 36
Définition
Les "regexp" (autre nom) sont de deux formes:
●
expression POSIX
●
expression PCRE
La version "PCRE" est relativement plus puissante.
C'est un langage en soit...
37. 37
Le langage regexp
On définit un pattron en suivant ces principes:
●
on défini un "matcher" (caractère, chiffre...)
●
on défini un "répétiteur" (une fois, au moins N fois...)
On peut aller très loin... mais pour le moment nous allons rester sur les bases
38. 38
Le langage regexp
Les "matchers":
●
"." (point) pour "n'importe quel caractère"
●
"d" pour "n'importe quel chiffre de 0 à 9"
●
"w" n'importe quel mot
●
"[n-m]" un caractère allant de "n" à "m"
Les répétiteurs:
●
"*" de 0 à l'infini
●
"?" 0 ou une fois
●
"+" au moins une fois
●
"{N}" N fois
●
"{N,M}" de N à M fois
●
"{N,}" au moins N fois
●
"{,N}" au plus N fois
39. 39
Limiteurs
Un dernier point sur les regexp:
●
si "$" est positionné en fin d'expression, il sert à identifier une "fin de
ligne"
●
si "^" est positionné en début de ligne, il sert à identifier un début de
ligne
Exemple:
# on ne veut pas afficher les commentaires dans un shell script
grep -v '^#' mon_script.sh
40. 40
Exemples
# foo suivi d'au moins un chiffre
food+
# foo suivi d'une lettre entre "a" et "f" suivi d'un caractère maximum
foo[a-f].?
41. 41
Utilisation
Avec grep:
echo "Hello world" | grep "^H.*o"
avec sed:
echo "Hello World" | sed 's/^H.*o/Hi/'
avec awk:
echo "Hello World" | awk '/H.*o/{ print $1}'
43. 43
Les commandes à connaitre
Nous allons voir quelques commandes très importantes et fortement utilisées:
●
cd, ls
●
cp, mv, rm, ln
●
grep
●
sed
44. 44
Manipuler - se déplacer dans les répertoires
# Va dans le répertoire $HOME
cd
# Va dans le répertoire /op
cd /opt
# liste le répertoire courant
ls
# liste un autre répertoire "rep"
ls rep
45. 45
Manipuler - précautions -i
En administration système, l'usage est de travailler avec un filet de sécurité.
Les commandes de suppression, remplacement, écrasement, sont configurées par
défaut pour demander une confirmation avec l'option -i.
Le fichier .bashrc contient au moins les lignes suivantes :
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'
alias ln='ln -i'
46. 46
Manipuler - déplacer des fichiers
# copie un fichier
cp source destination
# déplace un fichier
mv source destination
# supprime un fichier
rm source
# supprime un répertoire
rm -r rep
# en forcant
rm -rf rep
# autre commande
rmdir rep
# bonne pratique pour supprimer un répertoire :
rm -rf rep/*
rmdir rep
# permet d'éviter de lancer "rm -rf *"
47. 47
Manipuler - créer des liens
# créer un lien
ln source destination
# créer un lien symbolique
ln -s source destination
Si le lien est une lien "hard" (non symbolique), supprimer la source ou la
destination n'impacte pas le fichier. Les deux entrées ne sont pas "discernables" en
tant que lien
Le lien symbolique peut référencer une source "supprimé", on dit que le lien est
cassé.
48. 48
Grep
"grep" est une commande de recherche de "pattern".
# cherche "foo" dans le fichier file
grep "foo" file
# cherche "foo" dans le répertoire dir
grep -r "10.1.8" /etc
# ignore la casse et recursif
grep -ri "nom_host" /etc
# cherche "foo" dans STDIN
commande | grep "foo"
49. 49
Sed
"Sed" est un éditeur en ligne
Il permet de manipuler des flux ou des fichier en remplaçant du texte, insérant des
lignes, supprimant des lignes, etc.
Voir "man sed"
50. 50
Sed
La commande "s" pour "substitute"
echo "Hello" | sed 's/o/a/' Hella
echo "foo bar baz" | sed 's/ba./toto/'
# Remplace foo par bar dans fichier
# et affiche le résultat dans STDOUT
sed 's/foo/bar/' fichier
# idem mais remplace dans le fichier
sed -i 's/foo/bar/' fichier
52. 52
Utilisateur et groupes POSIX
Un utilisateur POSIX se défini par:
●
un login
●
un mot de passe
●
un identifiant numérique
●
un groupe principal
●
un ou plusieurs groupes secondaires
53. 53
Gestion de comptes
Pour créer et modifier un compte:
# crée un compte avec un "home"
useradd -m username
# ajoute le groupe secondaire "sudo" à l'utilisateur
usermod -a -G sudo username
# change le mot de passe du compte
passwd usermod
# adduser en mode interactif
# adduser smile
54. 54
Manipuler - changer les droits
Nous le verrons plus tard, mais les fichiers et répertoires ont des permissions.
Pour changer les permissions:
# change le propriétaire
chown user fichier1 fichier2...
chown répertoire
# changer récursivement
chown -R répertoire
#changer le groupe
chgrp groupe fichier1 fichier2...
chgrp répertoire
# changer récursivement
chgrp -R répertoire
55. 55
Manipuler - changer les droits
Pour changer le "owner" (propriétaire) et le groupe, la commande "chown" peut
permettre de le faire en une fois:
chown user:groupe fichier ou répertoire
# prendre le groupe par défaut - notez le ":"
chown user fichier ou répertoire
chown user:groupe fichier ou répertoire
56. 56
Manipuler - les droits
Pour voir les attributs de fichier, l'option "-l" de "ls" affiche les informations
nécessaires:
ls -l /etc
total 1728
drwxr-xr-x. 1 root root 126 15 févr. 12:28 abrt/
-rw-r--r--. 1 root root 16 17 oct. 21:43 adjtime
drwxr-xr-x. 1 root root 16 17 oct. 20:09 akmods/
-rw-r--r--. 1 root root 1518 13 mai 2015 aliases
drwxr-xr-x. 1 root root 58 10 févr. 02:52 alsa/
drwxr-xr-x. 1 root root 1726 18 févr. 09:40 alternatives/
-rw-r--r--. 1 root root 541 13 juil. 2015 anacrontab
Le premier tiret donne le type, "-" signifie "fichier standard", "d" signifie
"répertoire", "l" signifie "lien" etc...
Les 9 autres attributs indiquent quels droits sont appliqués au propriétaire, au
groupe et autres utilisateurs.
57. 57
Manipuler - les droits
Les attributs
un fichier peut être:
●
lisible (r)
●
modifiable (w)
●
executable (x)
un répertoire peut être:
●
listable (r)
●
modifiable (w)
●
traversable (x)
58. 58
Manipuler - les droits
Pour modifier les attributs d'un fichier, il y a deux écritures possibles. Soit avec le
mode "octal", soit avec les "raccourcis".
Un attribut octal est une addition de 3 chiffres:
●
4 = lisible pour les fichiers ou listable pour un répertoire
●
2 = modifiable
●
1 = exécutable pour les fichiers ou traversable pour les répertoires
La modification se fait pour les 3 possibilités: owner, groupe et other
On additionne les valeurs voulues pour chaque groupe de contrôle.
●
6 = 4+2 => le fichier est lisible et modifiable
●
7 = 4+2+1 => le fichier est lisible, modifiable et exécutable
●
5 = 4+1 => lisible est exécutable
59. 59
Manipuler - les droits
Pour un répertoire, le fait d'être traversable signifie qu'un utilisateur ne voit pas le
contenu du répertoire mais peut le traverser pour lire les sous-répertoires.
Par exemple:
Le répertoire "/var" peut n'être lisible que pour "root", mais il faut laisser l'accès à
"/var/www" à l'utilisateur apache "www-data".
De ce fait, "/var" à l'attribut "x" pour tous, et "/var/www" a pour attributs "rwx"
pour "www-data" (user et group)
En général, c'est plutôt "r-x" qui est appliqué pour permettre le listing de
répertoires.
60. 60
Manipuler - les droits
Quelques commandes utiles :
$ chmod a+x /usr/local/bin/*.sh
$ chmod -R a+X /var/www/mon_projet
$ chmod -R u+rw,g+r /var/www/mon_projet
$ chmod -R o-rw /var/www/mon_projet
$ chmod -R 777 un_répertoire # n'est jamais une bonne idée !
Il faut toujours savoir pourquoi on lance une commande !!!
61. 61
Sticky bit
Deux modes, seul le 2) est utilisé dans la pratique :
1) le sticky bit sur l'utilisateur, qui permet d'étendre les privilèges :
-rwsr-xr-x 1 root root 47032 janv. 27 01:50 /usr/bin/passwd
2) le sticky bit sur le groupe, qui permet de conserver les droits du groupe
Par défaut, un fichier prends les droits appliqués à l'utilisateur. Par exemple
l'utilisateur "foo" du groupe primaire "foo"
$ mkdir shared
$ ls -la
drwxr-xr-x. 1 foo foo 0 16 févr. 11:42 shared/
# on change le groupe du répertoire
$ chgrp users
$ ls -la
drwxr-xr-x. 1 foo users 0 16 févr. 11:42 shared/
$ touch shared/foo
# le fichier n'a pas pris les droits du répertoire
$ ls -la share/foo
-rw-r--r--. 1 foo foo 0 16 févr. 11:41 foo
62. 62
Sticky bit
Corrigeons le souci en appliquant un "sticky bit" sur le groupe:
$ rm shared/foo
$ chmod g+s shared
$ ls -la
drwxr-sr-x. 1 foo users 0 16 févr. 11:42 shared/
# remarquez le "s" désormais à la place de "x"
$ touch shared/foo
$ ls -la shared
-rw-r--r--. 1 foo users 0 16 févr. 11:44 foo
Le sticky-bit (bit collant) permet aux attributs de répertoire de "coller" aux fichiers
qui seront créés.
64. 64
Administration système
L'objectif de l'administrateur système est de fournir les ressources
nécessaires aux utilisateurs.
Les utilisateurs utilisent la ressource informatique, CPU, RAM, stockage, réseau,
etc.
Les administrateurs gèrent ces ressources au mieux.
L'objectif de l'administrateur n'est pas de bloquer les utilisateurs.
Les utilisateurs n'ont pas vocation à gaspiller les ressources.
=> Il faut trouver le bon équilibre.
"With Great Power Comes Great Responsibility"
65. 65
Les logs et les mails
GNU/Linux journalise beaucoup d'informations, du boot à l'exécutions de services,
en passant par les erreurs système, ou les événements
Les logs se trouvent généralement dans le répertoire "/var/log"
66. 66
Les Logs et les mails
La commande "dmesg" permet de lire les événements du noyau.
L'option "-w" permet de lire en continue les logs
L'option "-H" rend plus lisible les valeurs pour un humain (temps différentiels,
message plus lisibles, ...)
dmesg -wH
67. 67
Les mails
Les "mails" sont des messages au format mBox envoyés aux utilisateurs du
système. Le format mBox est supporté par beaucoup de logiciels de gestion d'e-
mail.
Attention: un mail n'est pas un "e-mail" en soit. Cela dit, si un service de gestion de
courrier est installé, les messages peuvent être envoyés comme des e-mail
traditionnels.
La gestion des mails est composée de 3 parties :
1) le routage des emails, travail réalisé par les serveurs SMTP
2) le service de gestion des boites aux lettres, travail réalisé par les applications de
messagerie, protocoles POP3, IMAP (Dovecot, Cyrus, Zimbra, Bluemind…)
3) les clients mails, pour lire ou envoyer du mail (Mutt, Thunderbird, etc...)
L'objectif du chapitre est de configurer proprement l'envoi d'un email depuis un
serveur.
La réception des emails est un service complexe qui ne sera pas abordé.
68. 68
Les mails - Clients
Pour voir les mails d'un utilisateur local à une machine, il est possible d'utiliser la
commande "mail" en ligne de commande.
Les outils de mail sur un poste proviennent souvent du serveur SMTP.
Il est fondamental pour un serveur de savoir envoyer du mail.
Le paquet "mailx" permet d'envoyer du mail en ligne de commande, ce qui permet
à un serveur d'envoyer des emails "administratifs".
69. 69
Les mails - Client
Pour lire les mails locaux sur une machine Unix, on tape la commande "mail":
$ mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/mail/foo": 2 messages 2 unread
>U 1 To foo Wed Feb 17 09:30 12/265 "test de mail"
U 2 To foo Wed Feb 17 09:30 11/260 "autre mail"
&
En pressant la touche "ENTER", on lit le mail pointé par ">". Le "U" signifie
"Unread".
70. 70
Les mails
Pour envoyer un mail, il faut un serveur "smtp" et un client mail. Il existe beaucoup
de serveurs SMTP, mais les plus utilisés :
●
PostFix pour gérer les messages entrants ou pour faire du mass mailing
●
Exim pour envoyer des messages administratifs (par défaut sur Debian)
●
Sendmail, le serveur SMTP historique n'est plus utilisé
71. 71
Les mails - Exim
Prérequis pour envoyer du mail avec Exim
Donner un FQDN au serveur et mettre à jour les PTR dans le DNS
Vérifier que 'hostname -f' renvoie correctement le FQDN
Lancer la commande
# dpkg-reconfigure exim4-config
définir les emails de réception dans /etc/aliases
définir les emails émetteurs dans /etc/email-addresses
Pour envoyer un mail à un utilisateur du système:
$ mail -v vraie_boite_aux_lettres
Subject : Test
Ici le contenu...
Pressez CTRL+D ou créer une ligne ne contenant
qu'un point
.
CC:
$
72. 72
Les mails
Le mail est envoyé à l'utilisateur avec une trace de la forme :
aa2@kawa2:~$ mail -v alain.arditi@smile.fr
Subject: Test
Bonjour
.
EOT
aa2@kawa2:~$
LOG: MAIN
<= aa2@smile.fr U=aa2 P=local S=456
delivering 1aeQgu-0004On-Ch
R: smarthost for alain.arditi@smile.fr
T: remote_smtp_smarthost for alain.arditi@smile.fr
Connecting to idris.smile.fr [91.216.209.19]:25 ... connected
SMTP<< 220 idris.smile.fr ESMTP Postfix (BlueMind)
SMTP>> EHLO kawa2
SMTP<< 250-idris.smile.fr
250-PIPELINING
250-SIZE 12582912
…..
SMTP>> STARTTLS
SMTP<< 220 2.0.0 Ready to start TLS
SMTP>> EHLO kawa2
SMTP<< 250-idris.smile.fr
SMTP>> MAIL FROM:<aa2@smile.fr> SIZE=1494
SMTP>> RCPT TO:<alain.arditi@smile.fr>
SMTP>> DATA
SMTP<< 250 2.1.0 Ok
SMTP<< 250 2.1.5 Ok
SMTP<< 354 End data with <CR><LF>.<CR><LF>
SMTP>> writing message and terminating "."
SMTP<< 250 2.0.0 Ok: queued as A71631EE036A
SMTP>> QUIT
LOG: MAIN
=> alain.arditi@smile.fr R=smarthost T=remote_smtp_smarthost H=idris.smile.fr [91.216.209.19]
X=TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128 DN="C=FR,ST=IDF,L=Levallois-Perret,O=Smile,CN=bluemind-
mta.smile.fr,EMAIL=pki@smile.fr" C="250 2.0.0 Ok: queued as A71631EE036A"
LOG: MAIN
Completed
73. 73
Fichiers de configuration du système
Les fichiers de configuration se trouvent généralement dans "/etc" (Editable Text
Configuration).
Les plus utilisés:
●
/etc/passwd : liste des utilisateurs
●
/etc/groups : liste les groupes utilisateurs
●
/etc/resolv.conf : liste des serveur DNS
●
/etc/rc.* : fichier de services au démarrage
●
/etc/fstab : points de montage du système de fichier
●
/etc/profile* : fichiers d'environnements SHELL
●
/etc/crontab : tâches planifiées
●
/etc/apache2 et /etc/httpd: selon la distribution, répertorie de
configuration apache
●
/etc/nginx/: répertoire de configuration nginx
Et bien d'autres.
74. 74
Les services
Un service, souvent nommé "démon" (mauvaise traduction de "daemon", qui
signifie en réalité "Disk And Execution MONitor ") est un processus exécuté en
arrière plan qui va proposer un service réseau et/ou des procédures système.
Jusqu'alors, Linux implémentait "SystemV" pour gérer les services.
Depuis 2009, un nouveau système nommé "SystemD" a vu le jour et remplace,
peu à peu, l'ancien système.
75. 75
Les services SystemV
Avec SystemV, un script exécutable est déposé dans le répertoire
"/etc/rc.d/init.d". Par convention, ces scripts doivent supporter en argument "start"
et "stop". Il est recommandé de supporter "restart".
Les script exécutent alors un programme. Par exemple: apache-httpd, nginx,
postfix, ...
76. 76
Les services SystemV
Pour permettre l'exécution d'un service au démarrage, il faut faire un lien
symbolique dans un des répertoire "/etc/rc.d/rcN.d" où "N" est un nombre allant
de 0 à 6 correspondant aux "runlevel" Linux:
Les runlevel:
●
0 - exctinction du système
●
1 - démarrage "single", root sans mot de passe, aucun disque monté
(recovery)
●
2 - non utilisé
●
3 - démarrage avec couche réseau
●
4 - non utilisé
●
5 - démarrage avec X (serveur graphique)
●
6 - reboot
77. 77
Les service SystemV
Les distributions utilisant SystemV proposent une commande "service" pour
démarrer, éteindre ou redémarer un service.
service start nom_service
service stop nom_service
...
En réalité, les commandes "start, stop, restart, status..." sont arbitraires. C'est le
script qui défini les arguments acceptés
Il est d'ailleurs possible d'exécuter:
$ /etc/init.d/nom_service start
78. 78
Les services SystemD
SystemD remplace peu à peu SystemV. Les services sont définis dans des fichier
"unit" au format "ini" dans les répertoire "/lib/systemd" et "/etc/systemd". Le
premier étant l'emplacement des fichiers "par défaut" et le second pour les
services surchargés ou créés par l'administrateur.
Exemple:
[Unit]
Requires=docker.service
After=docker.service
[Service]
ExecStartPre=commande à lancer avant
ExecStart=commande de service
ExecStop=commande pour éteindre le service
Il est possible de préfixer les commandes avec un tiret pour ne pas prendre en
compte l'état de la commande. Ainsi une commande de préparation dont le
résultat n'est pas important ne va pas définir le service comme étant en
disfonction.
79. 79
Les services SystemD
SystemD propose une série de commandes pour démarrer, lire l'état, lire les logs,
etc... des services
systemctl start mon.service
systemctl stop mon.service
systemctl status mon.service
journalctl -xe
journalctl -u mon.service
Les options de "journalctl" sont, par exemple:
●
"-e" pour aller à la fin des logs
●
"-x" pour paginer
●
"-u" pour définir quel service loguer
●
"-f" pour lire en continue et en temps réel
80. 80
Exécution automatique de tâches (cron,
at, ...)
Un "cron" est une tâche planifiée. Le principe est de définir un fichier de
configuration de tâche planifiée qui entre dans la table de tâches (crontab)
Il existe différentes manières de créer un cron:
●
soit en écrivant un script dans les repertoires /etc/cron.WHEN où WHEN
peut être "hourly", "daily", "weekly", "monthly")
●
soit en écrivant une ligne dans le crontab avec la commande "crontab -e"
81. 81
Crontab
En utilisant la commande "crontab -e", un éditeur propose l'écriture de ligne au
format "cron".
Elle se présente en 6 colonnes qui définissent quand exécuter une commande.
* * * * * commande 2>&1 >/dev/null
^ ^ ^ ^ ^
| | | | |
| | | | +-- jour de la semaine 0-6
| | | +---- mois 1-12
| | +------ jour du mois 1-31
| +-------- heure 0 23
+---------- minute 0-59
Notez: /dev/null est un fichier qui ne pointe sur rien, la sortie de commande est
donc envoyée nulle part. Cela permet de se débarrasser de la sortie pour ne pas la
loguer - d'autant que sans redirection, la sortie standard est envoyé par mail à
root. Cela dit, vous pouvez rediriger la sortie dans un fichier de log pour vous tenir
informer des erreurs qui peuvent survenir lors d'une tâche planifiée.
82. 82
Crontab
La syntaxe permet des intervales:
●
"*/5" = toutes les 5 <minutes, heures, jours>
●
"10-20-45" = à 10, 20 et 45 <minutes, heures, jours>
Exemple:
*/5 * * * * commande_toute_les_5_minutes
* 1-2-28-29 * * * commande
83. 83
Crontab - Les bonnes pratiques
Règle 1: Toutes les tâches doivent être regroupées dans le cron de l'utilisateur de
livraison, ceci afin de "voir" clairement ce qui se passe sur le serveur
Règle 2: Toutes les tâches 'non systèmes' doivent logger leur sortie standard
dans /tmp/nom_du_script.log
Règle 3: Les tâches systèmes (/etc/cron.*) doivent être maîtrisées. Les crons ne
sont pas tous dans le crontab de l'utilisateur. Il faut savoir ce qui se passe…
Règle 4: Mettre de l'aléa dans les séquencements. Il faut éviter les heures exactes
(minutes à 0) et les heures des crons système : *H17 hourly, 6H25 daily, 6H47
weekly et 6H52 monthly.
Règle 5: Les relances/reboots/etc... sont fait le matin, pas trop tôt.
84. 84
Crontab
Exercices:
Créer un crontab qui écrive la date dans le fichier /tmp/crondate tous les jours à
midi
Créer un crontab qui écrive la date dans le fichier /tmp/crondate tous les lundi à
14h
85. 85
At
La commande "at" permet d'exécuter une commande à un moment précis.
Elle reconnaît une syntaxe pratique pour calculer une date.
at 10:00 AM
at 9:00 PM December 21
at now +2min
86. 86
At
S'en suit une ouverture d'un shell "at" qui permet de définir la ou les commandes à
exécuter.
Pour terminer, il suffit de presser CTRL+D
87. 87
At
Les commandes suivantes permettent de lister les tâches, supprimer un job, etc..
$ atq
13 Tue Feb 9 10:31:00 2016 a pferlet
$ atrm 13
$ atq
"q" signifie "queue", on retrouve cette notion dans plusieurs outils, par exemple
"lpq" affiche la queue "lp" (Linux Printing).
88. 88
Batch
Conjointement à la commande "at", il existe la commande "batch" qui exécutera
une commande seulement quand la machine n'est pas surchargée (load < 0.8)
89. 89
Localisation et internationalisation
La localisation système se défini via des variables d'environnement:
LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
90. 90
Localisation et internationnalisation
Pour modifier les locales, vous pouvez modifier ces variables.
La méthode la plus adaptée est de reconfigurer le paquet "locale" sous debian, ou
utiliser "localectl" sur les systèmes supportant "systemd"
# debian sans systemd
dpkg-reconfigure locale
# avec systemd
localectl set-local fr_FR.UTF8
92. 92
Adressage et routage
L'adresse IP d'une interface réseau se configure de plusieurs manières
●
via la commande ifconfig
●
via des fichiers de configuraiton
●
via "NetworkManager"
On peut assigner statiquement une ip, ou utiliser un serveur DHCP
93. 93
Rappel sur les protocoles
La couche 4 du modèle OSI propose le "transport".
Les plus utilisés sont TCP et UDP.
●
TCP permet de faire un échange d'informations
●
UDP n'attend pas de "handshake", pas de sessions réelles
94. 94
Configuration réseau, vlan, hooks
La configuration réseau peut donc se faire de différentes manières. Sous debian
(sans systemd) le fichier /etc/network/interfaces fournie la configuration des
interfaces:
auto lo
iface lo inet loopback
iface eth0 inet dhcp
95. 95
Adresse Statique sous debian
Pour assigner une addresse statique, on peut définir ce type de fichier:
iface eth0 inet static
address 192.168.1.12
netmask 255.255.255.0
gateway 192.168.1.1
96. 96
Autres distributions
Sur la plupart des autres distributions, systemd (conjointement à NetworkManager)
va créer un fichier par interface. Par exemple /etc/sysconfig/network-
scripts/ifcfg-eth0
HWADDR=3C:97:0E:EF:7D:8C
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=enp3s0
...
97. 97
Les outils de l'administrateur
L'administration du réseau, contrôle et analyse se fait avec une série importante
d'outils.
Parmis, voyons:
●
ifconfig
●
ip (ip route, ip addr, ...)
●
route (qui est remplacé par ip)
●
netstat
●
arp
98. 98
Ifconfig
ifconfig permet de lire et modifier la configuration d'une interface réseau.
ifconfig
ifconfig eth0
ifconfig eth0 192.168.1.20 netmask 255.255.255.0
99. 99
ip
ip permet de modifier la configuration de routage, des interfaces, tunnels...
ip addr
ip route
Exemple
$ ip route
192.168.1.0/24 dev wlp2s0 proto kernel scope link src 192.168.1.29
metric 600
100. 100
ip
Par exemple pour ajouter une route vers le réseau 192.168.200.0/24 en passant
par la carte réseau eth1:
$ ip route add 192.168.200.0/24 dev eth1
Pour connaitre la route qu'empruntera un paquet pour aler vers 1.2.3.4:
$ ip route get 1.2.3.4
1.2.3.4 via 192.168.1.1 dev eth0 src 192.168.1.29
cache
Cela signifie que le paquet passera pas la carte eth0, aura l'ip 192.168.1.29 et
utilisera la passerelle 192.168.1.1
101. 101
netstat
netstat est un outil qui permet de connaître l'état des ports réseau en cours.
Exemple:
netstat -taupen
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale Adresse distante Etat
Utilisatr Inode PID/Program name
tcp 0 0 192.168.100.1:53 0.0.0.0:* LISTEN
0 120934 1482/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
0 119078 1295/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
0 130623 2142/cupsd
103. 103
Firewall
Iptables, anciennement ipfilters, est un firewall intégré au noyau permettant le
filtrage fin de paquets réseau.
Il permet de faire, entre autres:
●
filtrage ip source et destination
●
filtrage de port source et destination
●
préroutage et postroutage
●
journalisation
●
etc..
104. 104
Principe de règles
Iptables permet de créer des règles dans un ordre précis qui vont s'appliquer à une
trame réseau
Les règles de base:
●
ACCEPT
●
REJECT
●
DROP
●
LOG
Iptables propose un principe de "chaînes" et de "tables" auxquels s'appliquent les
règles.
105. 105
Chaines
Une chaine est, en quelques sortes, la direction que prend une trame réseau.
On distingue, des directions:
●
INPUT
●
OUTPUT
●
FORWARD...
Des états:
●
NEW
●
ESTABLISHED...
106. 106
Tables
Les tables sont les sous-ensembles de chaines. C'est le traitement à infliger à une
trame.
On distingue:
●
raw ou conntrack
●
nat (net address translation)
●
filter (par defaut)
●
mangle (pour modifier le paquet)
107. 107
Principe de commande
Une commade IPTables fonctionne ainsi:
iptables [-t table] command [match] [target]
Pour lister les règles:
iptables -L
ipatbles -S
iptables -t table -L
108. 108
Exemple, ouvrir un port
Voici un exemple d'ouverture de port 80 TCP en entrée et sortie:
iptables -A INPUT -t filter -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -t filter -p tcp --sport 80 -j ACCEPT
dport signifie "destination port" sport signifie "source port"
109. 109
Quelques principes de bases
Il convient de faire ces opérations en général:
●
on vide les règles
●
on définie des règles "par défaut" (-P)
●
on autorise ou ferme des ports
110. 110
Un exemple complet
iptables -F
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -t filter --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -t filter --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -t filter --dport 22 -j ACCEPT
111. 111
Création de règle
Tout comme ACCEPT, DROP, etc., il est possible de créer ses propres règles.
iptables -N LOG_DROP
iptables -A INPUT -t filter -p tcp --dport 8888 -j LOG_DROP
# On traire ensuite cette règle
iptables -A LOG_DROP -j LOG --log-prefix 'MYDROP '
iptables -A LOG_DROP -j DROP
112. 112
Forward
Iptables permet de créer des règles de "forward":
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j DNAT --to
192.168.1.2:8080
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 8080 -j ACCEPT
113. 113
Autres gestion de firewall
Iptables est une commande bas niveau, parfois complexe à mettre en place. Des
services tels que Docker ou Fail2ban vont impacter vos règles "à la volée".
De nos jours, les distributions orienté entreprises et/ou plus à jour utilisent
"firewalld" qui va injecter les règles de manière plus souple:
firewall-cmd --add-port=80/tcp --permanent
Conseil: si vous avez firewalld installé sur un système, évitez d'utiliser directement
iptables. D'autres services (par exemple docker) vont manipuler le firewall via un
bus système (dbus) et vous risquerez d'entrer en conflit avec, ou de sauver des
règles iptables temporaires (via iptables-save par exemple).
115. 115
SSH
SSH est un protocole réseau sécurisé permettant l'ouverture de Shell distant, le
transfère de fichier, le "tunnelling" et le transit d'affichage.
Le service "openssh" propose un serveur et un client SSH
116. 116
Authentification
Afin de se connecter à un serveur, la machine distante doit exécuter le service
"sshd"
service sshd start
#
systemctl start ssh
Pour se connecter, il suffit, depuis la machine cliente, de taper:
ssh user@serveur
117. 117
Login ou paire de clefs
Deux méthodes d'authentification sont proposée par SSH:
●
login et mot de passe
●
paire de clefs
SSH peut utiliser plusieurs types de paire de clefs:
●
rsa
●
dsa
●
...
118. 118
Paire de clefs
Pour générer une paire de clefs:
ssh-keygen -t dsa -b 2048
L'utilisation d'une passphrase permet de sécuriser l'ouverture de shell SSH depuis
le poste.
119. 119
Ajout de la clef sur le serveur
Le serveur peut autoriser un client à se connecter avec sa clef RSA ou DSA en
déposant la clef publique dans le fichier "~/.ssh/authorized_keys"
Les droits sur le répertoire ".ssh" sont très restrictifs. Il faut qu'ils soient en lecture
seul pour tous.
chmod -R a-rw .ssh chmod -R a+r .ssh
120. 120
Ajout de la clef sur le serveur
Autre méthode si le serveur permet l'authentification par login (au moins le temps
de mettre les clefs en place)
ssh-copy-id user@serveur
121. 121
Copie de fichier
Il est possible de copier des fichiers au travers du protocole ssh.
Les clients
●
sftp: client ssh de transfert de fichier
●
scp: commande capable d'utiliser le protocole ssh
●
rsync: commande de synchronisation capable d'utiliser le protocole ssh
Les outils de navigation de fichier peuvent aussi utiiser le protocole sftp: dans
nautilus (gnome) presser CTRL+L et entrez une addresse de la forme
"sftp://user@server"
122. 122
Execution de commande via SSH
SSH ouvre, par défaut, un shell. Mais on peut spécifier une commande à exécuter:
ssh user@serveur commande
"commande" sera exécutée et la connexion sera fermée juste après.
125. 125
Fail2ban
Un des outils de sécurité réseau très répandu et efficace est "fail2ban".
Le principe est simple: il utilise les logs du système pour trouver des tentatives en
erreur d'accès répétées. Selon la configuration, il va alors mettre en liste noire
l'adresse source.
Fail2ban utilise, entre autres, "iptables" pour fermer l'accès à l'attaquant.