SlideShare une entreprise Scribd logo
1  sur  103
Télécharger pour lire hors ligne
Investiguer des
dysfonctionnements
applicatifs dans le monde
Unix / Linux
Plan

0.
1.
2.
3.

Pourquoi faire
Connaître l’ennemi
Epier ses faits et gestes
Intercepter ses communications
0. Pourquoi faire ?
Pourquoi faire ?
Parce que les fichiers de logs ne sont pas toujours
suffisants
Parce qu’on a pas toujours de support
Parce que le support n’est pas toujours bon
Pour apporter des éléments objectifs au débat « c’est
la faute au système – réseau / c’est la faute à l’application »
1. Connaître l’ennemi
Qui connait son ennemi […],
en cents combats ne sera point défait.
Sun Tzu – L
’art de la guerre
Connaître l’ennemi
Quelques outils utiles

ps: toutes les informations de base sur les processus
Connaître l’ennemi
Quelques outils utiles

ps: toutes les informations de base sur les processus
lsof: pour connaître tous les échanges avec l’extérieur
(fichiers, réseau, socket, pipe…)
Connaître l’ennemi
Quelques outils utiles

ps: toutes les informations de base sur les processus
lsof: pour connaître tous les échanges avec l’extérieur
(fichiers, réseau, socket, pipe…)
netstat: pour connaître toutes les connexions réseaux
en cours et ou en écoute
Connaître l’ennemi
Quelques outils utiles

ps: toutes les informations de base sur les processus
lsof: pour connaître tous les échanges avec l’extérieur
(fichiers, réseau, socket, pipe…)
netstat: pour connaître toutes les connexions réseaux
en cours et ou en écoute
top: pour voir la consommation de ressources par le
processus
Connaître l’ennemi
Quelques outils utiles

ps: toutes les informations de base sur les processus
lsof: pour connaître tous les échanges avec l’extérieur
(fichiers, réseau, socket, pipe…)
netstat: pour connaître toutes les connexions réseaux
en cours et ou en écoute
top: pour voir la consommation de ressources par le
processus
/proc/PID/…: exhaustif … mais moins lisible
ipcs: tout ce qui concerne la communication
inter-processus (mémoire partagée, file de message…)
Connaître l’ennemi
La commande ps

Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Connaître l’ennemi
La commande ps

Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Quelques utilisations moins connues mais utiles:
Connaître l’ennemi
La commande ps

Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Quelques utilisations moins connues mais utiles:
Connaître les variables d’environnement d’un processus:
ps eww -p PID
Connaître l’ennemi
La commande ps

Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Quelques utilisations moins connues mais utiles:
Connaître les variables d’environnement d’un processus:
ps eww -p PID
Connaître les groupes additionnels d’un processus:
ps -o supgid -p PID
Connaître l’ennemi
La commande ps

Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Quelques utilisations moins connues mais utiles:
Connaître les variables d’environnement d’un processus:
ps eww -p PID
Connaître les groupes additionnels d’un processus:
ps -o supgid -p PID
Vue en arbre des processus:
ps auxf
Connaître l’ennemi
La commande lsof

Une véritable couteau suisse
Quelques usages classiques:
Connaître les fichiers/sockets ouverts par un processus
lsof -n -p PID
Connaître l’ennemi
La commande lsof

Une véritable couteau suisse
Quelques usages classiques:
Connaître les fichiers/sockets ouverts par un processus
lsof -n -p PID
Uniquement les connexions réseau d’un processus
lsof -n -p PID -a -i
Connaître l’ennemi
La commande lsof

Une véritable couteau suisse
Quelques usages classiques:
Connaître les fichiers/sockets ouverts par un processus
lsof -n -p PID
Uniquement les connexions réseau d’un processus
lsof -n -p PID -a -i
Exemple de sortie de la commande lsof:
COMMAND
chromium
chromium
chromium
chromium
chromium
chromium
chromium
[…]

PID
3164
3642
3642
3164
3164
3164
3164

USER
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard

FD
0r
1u
2u
68u
51r
84u
74u

TYPE
CHR
REG
REG
REG
FIFO
unix
IPv4

DEVICE
1,3
254,2
254,2
254,2
0,8
0x7280
152346

SIZE/OFF NODE NAME
0t0
2050 /dev/null
21801 786846 /home/yrouillard/.xsession-errors
21801 786846 /home/yrouillard/.xsession-errors
1016832 78869 /home/[…]/Cookies
0t0
17007 pipe
0t0
18484 socket
0t0
TCP atlas.local:34979 
->138.102.119.3:https (ESTABLISHED)
Connaître l’ennemi
La commande lsof

Une véritable couteau suisse
Quelques usages classiques:
Connaître les fichiers/sockets ouverts par un processus
COMMAND
PID
USER
FD TYPE DEVICE SIZE/OFF NODE NAME
chromium 3164 yrouillard
0r CHR 1,3 -n -p PID
2050 /dev/null
lsof 0t0
chromium 3642 yrouillard
1u REG 254,2 21801 786846
/home/yrouillard/.xsession-errors
Uniquement les connexions réseau d’un processus
chromium 3642 yrouillard
2u REG 254,2 21801 786846
/home/yrouillard/.xsession-errors -n -p PID -a -i
lsof
chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies
Exemple de 51r de 0,8
chromium 3164 yrouillardsortieFIFO la commande lsof: pipe
0t0
17007
chromium 3164 PID
yrouillard 84u TYPE DEVICE SIZE/OFF
unix 0x7280 0t0
COMMAND
USER
FD
chromium 3164 3164 yrouillard 74u CHR 1,3
yrouillard
IPv4 152346 0t0
chromium
0r
0t0
chromium
chromium
chromium
chromium
chromium
chromium
[…]

3642
3642
3164
3164
3164
3164

yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard

1u
2u
68u
51r
84u
74u

18484 socket

NODE NAME
TCP atlas.local:34979 
2050 /dev/null
->138.102.119.3:https (ESTABLISHED)
REG 254,2 21801 786846 /home/yrouillard/.xsession-errors
REG 254,2 21801 786846 /home/yrouillard/.xsession-errors
REG 254,2 1016832 78869 /home/[…]/Cookies
FIFO 0,8
0t0
17007 pipe
unix 0x7280 0t0
18484 socket
IPv4 152346 0t0
TCP atlas.local:34979 
->138.102.119.3:https (ESTABLISHED)
Connaître l’ennemi
La commande lsof

Une véritable couteau suisse
Quelques usages classiques:
Numéro Descripteur
de un processus
Connaître les fichiers/sockets ouverts par fichier
COMMAND
PID
USER
FD TYPE DEVICE SIZE/OFF NODE NAME
chromium 3164 yrouillard
0r CHR 1,3 -n -p PID
2050 /dev/null
lsof 0t0
chromium 3642 yrouillard
1u REG 254,2 21801 786846
/home/yrouillard/.xsession-errors
Uniquement les connexions réseau d’un processus
chromium 3642 yrouillard
2u REG 254,2 21801 786846
/home/yrouillard/.xsession-errors -n -p PID -a -i
lsof
chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies
Exemple de 51r de 0,8
chromium 3164 yrouillardsortieFIFO la commande lsof: pipe
0t0
17007
chromium 3164 PID
yrouillard 84u TYPE DEVICE SIZE/OFF
unix 0x7280 0t0
COMMAND
USER
FD
chromium 3164 3164 yrouillard 74u CHR 1,3
yrouillard
IPv4 152346 0t0
chromium
0r
0t0
chromium
chromium
chromium
chromium
chromium
chromium
[…]

3642
3642
3164
3164
3164
3164

yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard

1u
2u
68u
51r
84u
74u

18484 socket

NODE NAME
TCP atlas.local:34979 
2050 /dev/null
->138.102.119.3:https (ESTABLISHED)
REG 254,2 21801 786846 /home/yrouillard/.xsession-errors
REG 254,2 21801 786846 /home/yrouillard/.xsession-errors
REG 254,2 1016832 78869 /home/[…]/Cookies
FIFO 0,8
0t0
17007 pipe
unix 0x7280 0t0
18484 socket
IPv4 152346 0t0
TCP atlas.local:34979 
->138.102.119.3:https (ESTABLISHED)
Connaître l’ennemi
La commande lsof

Une véritable couteau suisse
Quelques usages classiques:
Type d’accès au « fichier »
Connaître les fichiers/sockets ouvertsr: lectureprocessus
par un
COMMAND
PID
USER
FD TYPE DEVICE SIZE/OFF NODE NAME
w:
chromium 3164 yrouillard
0r CHR 1,3 -n -p PID écriture
2050 /dev/null
lsof 0t0
chromium 3642 yrouillard
1u REG 254,2 21801 786846 lecture et écriture
u:
/home/yrouillard/.xsession-errors
Uniquement les connexions réseau d’un processus
chromium 3642 yrouillard
2u REG 254,2 21801 786846
/home/yrouillard/.xsession-errors -n -p PID -a -i
lsof
chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies
Exemple de 51r de 0,8
chromium 3164 yrouillardsortieFIFO la commande lsof: pipe
0t0
17007
chromium 3164 PID
yrouillard 84u TYPE DEVICE SIZE/OFF
unix 0x7280 0t0
COMMAND
USER
FD
chromium 3164 3164 yrouillard 74u CHR 1,3
yrouillard
IPv4 152346 0t0
chromium
0r
0t0
chromium
chromium
chromium
chromium
chromium
chromium
[…]

3642
3642
3164
3164
3164
3164

yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard

1u
2u
68u
51r
84u
74u

18484 socket

NODE NAME
TCP atlas.local:34979 
2050 /dev/null
->138.102.119.3:https (ESTABLISHED)
REG 254,2 21801 786846 /home/yrouillard/.xsession-errors
REG 254,2 21801 786846 /home/yrouillard/.xsession-errors
REG 254,2 1016832 78869 /home/[…]/Cookies
FIFO 0,8
0t0
17007 pipe
unix 0x7280 0t0
18484 socket
IPv4 152346 0t0
TCP atlas.local:34979 
->138.102.119.3:https (ESTABLISHED)
Connaître l’ennemi
La commande lsof

Une véritable couteau suisse
Quelques usages classiques:
Type d’accès au « fichier »
Connaître les fichiers/sockets ouverts parpériphérique caractère
CHR: un processus
COMMAND
PID
USER
FD TYPE DEVICE SIZE/OFF NODE NAME
REG: fichier standard
chromium 3164 yrouillard
0r CHR 1,3 -n -p PID
2050 /dev/null
lsof 0t0
chromium 3642 yrouillard
1u REG 254,2 21801 786846 pipe
FIFO:
/home/yrouillard/.xsession-errors
Uniquement les connexions réseau d’un processus
unix: socket unix
chromium 3642 yrouillard
2u REG 254,2 21801 786846
IPv4: connexion IP
/home/yrouillard/.xsession-errors -n -p PID -a -i
lsof
chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies
…
Exemple de 51r de 0,8
chromium 3164 yrouillardsortieFIFO la commande lsof: pipe
0t0
17007
chromium 3164 PID
yrouillard 84u TYPE DEVICE SIZE/OFF
unix 0x7280 0t0
COMMAND
USER
FD
chromium 3164 3164 yrouillard 74u CHR 1,3
yrouillard
IPv4 152346 0t0
chromium
0r
0t0
chromium
chromium
chromium
chromium
chromium
chromium
[…]

3642
3642
3164
3164
3164
3164

yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard

1u
2u
68u
51r
84u
74u

18484 socket

NODE NAME
TCP atlas.local:34979 
2050 /dev/null
->138.102.119.3:https (ESTABLISHED)
REG 254,2 21801 786846 /home/yrouillard/.xsession-errors
REG 254,2 21801 786846 /home/yrouillard/.xsession-errors
REG 254,2 1016832 78869 /home/[…]/Cookies
FIFO 0,8
0t0
17007 pipe
unix 0x7280 0t0
18484 socket
IPv4 152346 0t0
TCP atlas.local:34979 
->138.102.119.3:https (ESTABLISHED)
Connaître l’ennemi
Exemples concrets

Cas 1: Quels sont les fichiers de log du process weblogic ?
Connaître l’ennemi
Exemples concrets

Cas 1: Quels sont les fichiers de log du process weblogic ?
$

lsof -n -p 17102 | grep ".log"

java
java
java
[…]
java

[…]

17102 fs90prd
1w VREG
85,1 16735376
96588 
/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_stdout.log
17102 fs90prd
2w VREG
85,1 91890547
98263 
/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_stderr.log
17102 fs90prd
9w VREG
85,1
0
98931 
/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_weblogic.log
17102 fs90prd
21w VREG
85,1
0
96993 
/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PRD_WT1.log
java
17102 fs90prd
22w VREG
85,1 8406043
98954 
/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_access.log
Connaître l’ennemi
Exemples concrets

Cas 2: Mais avec qui discute ce processus Time Navigator ?
Connaître l’ennemi
Exemples concrets

Cas 2: Mais avec qui discute ce processus Time Navigator ?
$

lsof -n -p 12475 -a –i

COMMAND
PID USER
tina_daem 12475 root
tina_daem 12475 root
tina_daem 12475 root

FD
6u
7u
8u

TYPE
DEVICE SIZE/OFF NODE NAME
IPv4 0xffffffffadbc6880
0t0 TCP *:tina (LISTEN)
IPv4 0xffffffff933fbe00
0t0 UDP *:tina-msg
IPv4 0xffffffff9ccc5040
0t0 TCP
138.102.1.107:38051->138.102.1.27:59334 (ESTABLISHED)
Connaître l’ennemi
Exemples concrets

Cas 2: Mais avec qui discute ce processus Time Navigator ?
$

lsof -n -p 12475 -a –i

COMMAND
PID USER
tina_daem 12475 root
tina_daem 12475 root
tina_daem 12475 root

FD
6u
7u
8u

TYPE
DEVICE SIZE/OFF NODE NAME
IPv4 0xffffffffadbc6880
0t0 TCP *:tina (LISTEN)
IPv4 0xffffffff933fbe00
0t0 UDP *:tina-msg
IPv4 0xffffffff9ccc5040
0t0 TCP
138.102.1.107:38051->138.102.1.27:59334 (ESTABLISHED)

Sur le serveur 138.102.1.27:59334
#

lsof -n -i TCP:59334

COMMAND
PID USER
ATEMPO 16247 root

FD
16u

TYPE
DEVICE SIZE NODE NAME
IPv4 11757747
TCP 138.102.1.27:59334
->138.102.1.107:38051 (ESTABLISHED)
Connaître l’ennemi
Exemples concrets

Cas 3: Mais où est passé mon espace disque ?
$ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier &
$ rm grosfichier
$ df -h /home
/dev/mapper/vg1-home

1,1G

937M

$ du -xh --max-depth=1 /home
228M
/home

55M

95%

/home
Connaître l’ennemi
Exemples concrets

Cas 3: Mais où est passé mon espace disque ?
$ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier &
$ rm grosfichier
$ df -h /home
/dev/mapper/vg1-home

1,1G

937M

55M

95%

/home

$ du -xh --max-depth=1 /home
228M
/home
$

lsof -n /home | grep "(deleted)"

tail 22678 root 3r REG

254,5 734003200 20 /home/grosfichier (deleted)
Connaître l’ennemi
Exemples concrets

Cas 3: Mais où est passé mon espace disque ?
$ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier &
$ rm grosfichier
$ df -h /home
/dev/mapper/vg1-home

1,1G

937M

55M

95%

/home

$ du -xh --max-depth=1 /home
228M
/home
$

lsof -n /home | grep "(deleted)"

tail 22678 root 3r REG

254,5 734003200 20 /home/grosfichier (deleted)

$ kill -15 22678
$ df -h /home
/dev/mapper/vg1-home

1,1G

234M

758M

24%

/home
2. Epier ses faits et gestes
Espionne tous les gestes de ton adversaire […],
et tu trouveras le meilleur moment pour causer sa
perte.
L
’art du Ninja – Vol. 2
Epier ses faits et gestes
Quelques outils utiles

strace: pour connaître tous les appels système
effectués par le processus
 un outil clé pour comprendre ce que font les
processus
Epier ses faits et gestes
Quelques outils utiles

strace: pour connaître tous les appels système
effectués par le processus
 un outil clé pour comprendre ce que font les
processus
ltrace: pour connaître tous les appels à des librairies
effectués par le processus
 utile mais demande une connaissance des
librairies utilisées
Epier ses faits et gestes
Quelques outils utiles

strace: pour connaître tous les appels système
effectués par le processus
 un outil clé pour comprendre ce que font les
processus
ltrace: pour connaître tous les appels à des librairies
effectués par le processus
 utile mais demande une connaissance des
librairies utilisées
gdb: le debugger du projet GNU
 complexe mais utilisable dans quelques cas
Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
strace -f -p PID
Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
strace -f -p PID
Avoir l’affichage des temps:
strace -tt -f -p PID
Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
strace -f -p PID
Avoir l’affichage des temps:
strace -tt -f -p PID
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Epier ses faits et gestes
L
’outil strace

L’heure de l’appel
système

Un outil très puissant

Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Epier ses faits et gestes
L
’outil strace

Le nom de l’appel
système

Un outil très puissant

Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Epier ses faits et gestes
L
’outil strace

Un outil très
Les arguments

puissant

Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Epier ses faits et gestes
L
’outil strace
Un outil très puissant

Le code retour

Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Epier ses faits et gestes
L
’outil strace

Les appels système à connaître pour survivre
stat / lstat: connaître le status d’un fichier
stat("fichier_present", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("fichier_absent", 0x1bab190)
= -1 ENOENT 
(No such file or directory)

open / close: ouvrir / fermer un fichier
open("/var/www/toto.inra.fr/.htaccess", O_RDONLY|O_LARGEFILE) = 138
close(138)

read / write: lire / écrire dans un fichier
write(54, "138.102.XX.XX - - [07/Oct/2011:1"..., 348) = 348
read(5, "GET /design/plain/images/accueil"..., 4096) = 626

flock / fcntl (SET_LK): verrouiller ou déverrouiller un fichier
flock(19, LOCK_EX)
= 0
fcntl(4, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=0, len=0}) = 0
Epier ses faits et gestes
L
’outil strace

poll / select: attendre une activité sur un fichier ou
une connexion réseau
select(34, [26 27 28 29 30 31 32 33], NULL, NULL, NULL) = 1 (in [32])
poll([{fd=6, events=POLLOUT, revents=POLLOUT}], 1, 0) = 1

connect / socket: se connecter à un port réseau
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 6
connect(6, {sa_family=AF_INET, sin_port=htons(53), 
sin_addr=inet_addr("138.102.119.226")}, 28) = 0

send / recv / recvfrom: lire et écrire sur le réseau
send(6, "324x100100000020moteur-recherche"..., 42, 0) = 42
recv(6, "HTTP/1.0 200 OKrnConnection: Clo"..., 8192, 0) = 174

execve: exécuter un processus
execve("/bin/ls", ["/bin/ls", "-l"], [/* 40 vars */]) = 0
Epier ses faits et gestes
L
’outil strace

La règle la plus importante:
Epier ses faits et gestes
L
’outil strace

La règle la plus importante:

Accepter de ne pas tout comprendre
dans la floppée de lignes de strace !!
Epier ses faits et gestes
L
’outil gdb

Connaître la pile d’appel d’un processus en cours:
$ gdb –p PID ou gdb core
thread apply all bt
Exemple de sortie:
#0
#1
#2

0x00000035d1acb2af in poll () from /lib64/libc.so.6
0x00000035d522fa3d in ?? () from /lib64/libglib-2.0.so.0
0x00000035d522ff1a in g_main_loop_run () from
/lib64/libglib-2.0.so.0
#3 0x00002b1fc9f695d5 in ?? () from
/usr/lib64/python2.4/site-packages/gtk-2.0/gobject/_gobject.so
#4 0x0000003e81e96167 in PyEval_EvalFrame () from
/usr/lib64/libpython2.4.so.1.0
[…]
#12 0x00000035d1a1d994 in __libc_start_main () from /lib64/libc.so.6
#13 0x0000000000400629 in _start ()
Epier ses faits et gestes
La pratique

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS
Epier ses faits et gestes
La pratique

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

GLPI lance un processus
rsh pour se connecter sur
tours.inra.fr ?!
Epier ses faits et gestes
La pratique

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

On a perdu 15 secondes
entre ces deux appels
Epier ses faits et gestes
La pratique

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

On a perdu 15 secondes
entre ces deux appels

A cause d’une tentative de
connexion ssh qui finit en
timeout
(port non ouvert)
Epier ses faits et gestes
La pratique

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

GLPI essaie ensuite de connecter
en imap sur tours.inra.fr
Epier ses faits et gestes
La pratique

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

 glpi exécute des tâches périodiques quand quelqu’un se connecte
 La tâche de récupération des tickets mail essayait d’abord de faire
une connexion IMAP par ssh avant de faire une connexion IMAP
standard
Epier ses faits et gestes
La pratique

Cas 2: Problème de compilation

Vu
su
foru r le
m
PEP
I

# R CMD INSTALL Rmpi_0.5-9.tar.gz
[…]
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
Epier ses faits et gestes
La pratique

Cas 2: Problème de compilation

Vu
su
foru r le
m
PEP
I

# R CMD INSTALL Rmpi_0.5-9.tar.gz
[…]
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
# ls /usr/local/lib/libmpi.so.0
/usr/local/lib/libmpi.so.0

Pourtant la librairie
est bien là !?
Epier ses faits et gestes
La pratique

Cas 2: Problème de compilation

Vu
su
foru r le
m
PEP
I

# R CMD INSTALL Rmpi_0.5-9.tar.gz
[…]
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
# ls /usr/local/lib/libmpi.so.0
/usr/local/lib/libmpi.so.0
# strace -f R CMD INSTALL Rmpi_0.5-9.tar.gz 2>&1 | grep libmpi.so
open("/usr/local/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
open("/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
open("/usr/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
[…]

La librairie est recherchée
dans des répertoires /lib64/
Epier ses faits et gestes
La pratique

Cas 2: Problème de compilation

Vu
su
foru r le
m
PEP
I

# R CMD INSTALL Rmpi_0.5-9.tar.gz
[…]
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
# ls /usr/local/lib/libmpi.so.0
/usr/local/lib/libmpi.so.0
# strace -f R CMD INSTALL Rmpi_0.5-9.tar.gz 2>&1 | grep libmpi.so
open("/usr/local/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
open("/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
open("/usr/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
[…]

 /usr/local/lib/ n’est pas dans le chemin de recherche des
librairies 64 bits !
Epier ses faits et gestes
La pratique

Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
[…]
23 0x0806224f in main ()
Epier ses faits et gestes
La pratique

Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
[…]
23 0x0806224f in main ()

Le plantage semble survenir dans
cette librairie
Epier ses faits et gestes
La pratique

Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
A quel paquet appartient
[…]
cette librairie ?
23 0x0806224f in main ()

# dpkg -S /usr/lib/libc-client.so.2002edebian
libc-client2002edebian: /usr/lib/libc-client.so.2002edebian
Epier ses faits et gestes
La pratique

Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
Y a-t-il des bugs connus
[…]
pour ce paquet ?
23 0x0806224f in main ()

# dpkg -S /usr/lib/libc-client.so.2002edebian
libc-client2002edebian: /usr/lib/libc-client.so.2002edebian
# Consultation de
http://bugs.debian.org/libc-client2002edebian
Epier ses faits et gestes
La pratique

Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
[…]
23 0x0806224f in main ()

# dpkg -S /usr/lib/libc-client.so.2002edebian
Bin
libc-client2002edebian: /usr/lib/libc-client.so.2002edebian
go
!
# Consultation de
http://bugs.debian.org/libc-client2002edebian
 Bug 502996: Segfaults if IMAP server sends more than 30
user flags
3. Intercepter ses
communications
C’es grâce à [l’interception des communications allemandes]
que nous avons gagné la guerre.
Churchill
Intercepter ses
communications

Quelques outils utiles
tcpdump / snoop: outil de capture de bas niveau
Usage classique:
tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port
Intercepter ses
communications

Quelques outils utiles
tcpdump / snoop: outil de capture de bas niveau
Usage classique:
tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port

wireshark / tshark: pour faire l’analyse des captures
• Un outil très puissant à connaître absolument,
• capable de décoder énormément de protocole réseau
HTTPS, LDAP, ethernet, TCP, UDP, IP, …)

(SQL, HTTP,
Intercepter ses
communications

Quelques outils utiles
tcpdump / snoop: outil de capture de bas niveau
Usage classique:
tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port

wireshark / tshark: pour faire l’analyse des captures
• Un outil très puissant à connaître absolument,
• capable de décoder énormément de protocole réseau

(SQL, HTTP,

HTTPS, LDAP, ethernet, TCP, UDP, IP, …)

l’extension livehttpheaders de Firefox: pour connaître
les échanges HTTP lors de la consultation d’une page
Intercepter ses
communications

Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn

Client

+
Syn

Seq =
2,

Ac k

Serveur

Ack

Client

Len =

4, Ack
=

0,
Len =
q = 0,
Se

Seq =

6, Len

Ack =

0

6

Serveur

= 8, A

ck = 0

Traduction en capture tcpdump / wireshark

Traduction en capture tcpdump / wireshark

192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
Intercepter ses
communications

Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn

Client

Seq =
2,

Serveur

Client

Len =

4, Ack
=

0,
Len =
q = 0,
Se

Seq =

6, Len

Ack =

0

6

Serveur

= 8, A

ck = 0

Traduction en capture tcpdump / wireshark

Traduction en capture tcpdump / wireshark

192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
Intercepter ses
communications

Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn

Client

+
Syn

Seq =
2,

Ac k

Serveur

Client

Len =

4, Ack
=

0,
Len =
q = 0,
Se

Seq =

6, Len

Ack =

0

6

Serveur

= 8, A

ck = 0

Traduction en capture tcpdump / wireshark

Traduction en capture tcpdump / wireshark

192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
Intercepter ses
communications

Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn

Client

+
Syn

Seq =
2,

Ac k

Serveur

Ack

Client

Len =

4, Ack
=

0,
Len =
q = 0,
Se

Seq =

6, Len

Ack =

0

6

Serveur

= 8, A

ck = 0

Traduction en capture tcpdump / wireshark

Traduction en capture tcpdump / wireshark

192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
Intercepter ses
communications

Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn

Client

Rst

Seq =
2,

Serveur

Client

Len =

4, Ack
=

0,
Len =
q = 0,
Se

Seq =

6, Len

Ack =

0

6

Serveur

= 8, A

ck = 0

Traduction en capture tcpdump / wireshark

Traduction en capture tcpdump / wireshark

192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [RST]

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
Intercepter ses
communications

Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn

Client

+
Syn

Seq =
2,

Ac k

Serveur

Ack

Len =

4, Ack
=

Client

0

Serveur

J’ai déjà envoyé 2 octets
Je t’envoie 4 nouveaux
octets

Traduction en capture tcpdump / wireshark

Traduction en capture tcpdump / wireshark

192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
Intercepter ses
communications

Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn

Client

+
Syn

Seq =
2,

Ac k

Serveur

Ack

Client

Len =

4, Ack
=

0,
Len =
q = 0,
Se

Ack =

0

6

Serveur

J’ai bien reçu
6 octets en tout

Traduction en capture tcpdump / wireshark

Traduction en capture tcpdump / wireshark

192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
Intercepter ses
communications

Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn

Client

+
Syn

Seq =
2,

Ac k

Serveur

Ack

Client

Len =

4, Ack
=

0,
Len =
q = 0,
Se

Seq =

6, Len

Ack =

0

6

Serveur

= 8, A

ck = 0

Tu as bien reçu mes 6 octets
alors je t’en envoie 8 de plus
Traduction en capture tcpdump / wireshark

Traduction en capture tcpdump / wireshark

192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170

TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170

Le serveur envoie

TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
3306 + 395 = 3873 octets
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170

Le client accuse réception

TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
de 1846 octets
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170

TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 >Le client accuse réception
http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 de 3306 octets
OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
Le serveur TCP 58683 > http [ACK]
138.102.70.2 138.102.118.170 attend l’accusé de Seq=395 Ack=3306 Len=0
138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)
réception de ces 3873 octets…
138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
Pendant 5 secondes !!
138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)
138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170

TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 >Il décide ensuite Ack=3306 Len=0
http [ACK] Seq=395 de
HTTP HTTP/1.1 200 OK (text/css)
retransmettre le paquet
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170

TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
Il OK (text/css)
HTTP HTTP/1.1 200reçoit bien l’accusé de
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
réception des 3873 octets

cette fois-ci
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170

Avant le routeur, tout est
identique…

?

TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

… sauf que le 1er paquet envoyé
au client n’apparait pas !
Intercepter ses
communications
La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur
53
54
55
56

0.488462
0.586425
5.260831
5.306787

138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170

TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

 Le paquet était perdu dans le routeur dont il a fallu faire changer la
carte
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)

Vers qui sont envoyées
toutes ces requêtes ?
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)

$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)

$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

Il communique avec le
serveur postgres
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)

$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432

On écoute plus précisément ce
qu’ils se disent
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)

$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432

Sous wireshark, on voit toujours la même requête ?!
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)

$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432
$ strings -a | grep "^select" | wc -l
Combien de requêtes SQL ?
8467
$ strings -a | grep "^select" | sort -u | wc -l
1
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)

$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432
$ strings -a /tmp/capture.cap | grep "^select" | wc -l
8467
$ strings -a /tmp/capture.cap | grep "^select" | sort -u | wc -l
1

Combien de requêtes SQL uniques ?
Intercepter ses
communications
La pratique

Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)

$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432
$ strings -a /tmp/capture.cap | grep "^select" | wc -l
8467
$ strings -a /tmp/capture.cap | grep "^select" | sort -u | wc -l
1

 L’application effectue la même requête sql en boucle !!
Questions ?
Annexe
5. Connaître son passé
Connaître son passé
La problématique

Les problèmes n’arrivent pas toujours quand un
administrateur est présent (nuit, week-end…)
Les outils de monitoring classiques (Cacti, Nagios,
Zabbix…) ne permettent pas de faire des diagnostics
précis dans le passé
– aggrégations des données trop rapides,
– peu d’indicateurs détaillées,
– grain pas assez fin (pas de vision par processus ou
utilisateurs…)

 Un besoin d’outils adapté pour le diagnostic
Connaître son passé
dim_stat, une solution

Pour ceux qui ne peuvent pas s’offrir Sysload, Patrol…
Un outil gratuit (mais pas réellement open-source)
Librement téléchargeable sur http://dimitrik.free.fr/
Une interface fruste mais puissante
De nombreuses sondes par défaut (tout l’historique des
commandes iostat, vmstat, iostat, netstat sans perte de
données)
Très facilement extensible (sondes mysql, java…)
Exemples de requêtes possibles:
•
•
•

Quels sont les 10 processus qui ont occupé le plus de mémoire entre
22h et 4h du matin ?
Quel est le taux d’interruption du CPU 2 entre 2h et 4h ?
Quel utilisateur a consommé tout le CPU entre 5h et 6h ?
Connaître son passé
Exemple d’utilisation

Cas 1: Comprendre les raisons d’une saturation mémoire
Sous Solaris, le répertoire /tmp est stocké en mémoire et son
occupation peut saturer la mémoire  comment savoir si des
saturations étaient dues au /tmp ou à des processus ?
2 septembre 2011
90% RAM occupé par
les processus, ce
sont eux qui saturent
la mémoire !
9 septembre 2011
60% RAM seulement,
C’est le /tmp qui doit
occuper le reste de la
mémoire !!!
6. Passer à la vitesse
supérieure
Passer à la vitesse supérieure
2 outils pour aller plus loin

Dtrace sous Solaris: un outil d’analyse et de profilage du
système extrêmement puissant
• le précurseur, créé en 2003 et disponible depuis Solaris 10
• totalement sûr, avec un impact faible, conçu pour être utilisé
en production
• permet d’accéder à énormément d’information du système,
• un language de scripting spécifique: le D
b

Systemtap sous Linux: l’équivalent pour Linux, créé en
2005,
• disponible nativement dans Redhat depuis la version 5.2
• scripts systemtap compilés et chargés en tant que module
noyau
Passer à la vitesse supérieure
dtrace et systemtap

Des outils puissants qui permettent de répondre aux questions
suivantes:
Quels sont les processus qui génèrent le plus d’entrées/sorties disque ?
Quels processus sont responsables d’une occupation CPU Système
importante ?
Quels sont les processus qui génèrent le plus de traffic réseau ?
Quels sont les processus qui accèdent de manière brève à ce fichier ?
Quelle processus est responsable de la suppression de fichiers ?

…

Des outils complexes à maîtriser !
Mais il existe de nombreux scripts directement utilisables sur le net:
• DtraceToolkit:

http://hub.opensolaris.org/bin/view/Community+Group+dtrace/dtracetoolkit

• Exemples Systemtap:

http://sourceware.org/systemtap/examples/

Contenu connexe

En vedette

La Fibrillation Auriculaire (French) Symposia - The CRUDEM Foundation
La Fibrillation Auriculaire (French) Symposia - The CRUDEM FoundationLa Fibrillation Auriculaire (French) Symposia - The CRUDEM Foundation
La Fibrillation Auriculaire (French) Symposia - The CRUDEM FoundationThe CRUDEM Foundation
 
Niort, une ville qui bouge
Niort, une ville qui bougeNiort, une ville qui bouge
Niort, une ville qui bougejulinemanon
 
Joann fabric coupons
Joann fabric couponsJoann fabric coupons
Joann fabric couponsanthonygems
 
AgenceSolution.com - Création site internet Réunion 974
AgenceSolution.com - Création site internet Réunion 974AgenceSolution.com - Création site internet Réunion 974
AgenceSolution.com - Création site internet Réunion 974Agence-Solution
 
L’atelier préparatoire de la Time Machine Experience 2025
L’atelier préparatoire de la Time Machine Experience 2025L’atelier préparatoire de la Time Machine Experience 2025
L’atelier préparatoire de la Time Machine Experience 2025WithoutModel
 
Explication d'un handicap
Explication d'un handicapExplication d'un handicap
Explication d'un handicapndgc
 
Après midi détente 2013 aux chambres d'hôtes Aux Vieux Chênes
Après midi détente 2013 aux chambres d'hôtes Aux Vieux ChênesAprès midi détente 2013 aux chambres d'hôtes Aux Vieux Chênes
Après midi détente 2013 aux chambres d'hôtes Aux Vieux ChênesChambres d'hôtes Aux Vieux CHênes
 
Présentation1
Présentation1Présentation1
Présentation1baksimo
 
La verdad sobre la mentira
La verdad sobre la mentiraLa verdad sobre la mentira
La verdad sobre la mentiraCarlos Chacón
 
Double page development
Double page  developmentDouble page  development
Double page developmentryry1993
 
Le monde sport et forme du 3- 3-2012
Le monde sport et forme du 3- 3-2012Le monde sport et forme du 3- 3-2012
Le monde sport et forme du 3- 3-2012ahmed rahmouni
 
2011 talleres de artes plasticas mayo
2011 talleres de artes plasticas mayo2011 talleres de artes plasticas mayo
2011 talleres de artes plasticas mayoAdalberto
 
5. recomendaciones epilogo[1]
5. recomendaciones epilogo[1]5. recomendaciones epilogo[1]
5. recomendaciones epilogo[1]Adalberto
 
Exsell organisations professionnelles v10
Exsell organisations professionnelles v10Exsell organisations professionnelles v10
Exsell organisations professionnelles v10hammavitch
 
Heart Failure in Haiti (French) Symposia - The CRUDEM Foundation
Heart Failure in Haiti (French) Symposia - The CRUDEM FoundationHeart Failure in Haiti (French) Symposia - The CRUDEM Foundation
Heart Failure in Haiti (French) Symposia - The CRUDEM FoundationThe CRUDEM Foundation
 

En vedette (20)

CV Corinne MAIX
CV Corinne MAIXCV Corinne MAIX
CV Corinne MAIX
 
La Fibrillation Auriculaire (French) Symposia - The CRUDEM Foundation
La Fibrillation Auriculaire (French) Symposia - The CRUDEM FoundationLa Fibrillation Auriculaire (French) Symposia - The CRUDEM Foundation
La Fibrillation Auriculaire (French) Symposia - The CRUDEM Foundation
 
Niort, une ville qui bouge
Niort, une ville qui bougeNiort, une ville qui bouge
Niort, une ville qui bouge
 
Joann fabric coupons
Joann fabric couponsJoann fabric coupons
Joann fabric coupons
 
AgenceSolution.com - Création site internet Réunion 974
AgenceSolution.com - Création site internet Réunion 974AgenceSolution.com - Création site internet Réunion 974
AgenceSolution.com - Création site internet Réunion 974
 
L’atelier préparatoire de la Time Machine Experience 2025
L’atelier préparatoire de la Time Machine Experience 2025L’atelier préparatoire de la Time Machine Experience 2025
L’atelier préparatoire de la Time Machine Experience 2025
 
Explication d'un handicap
Explication d'un handicapExplication d'un handicap
Explication d'un handicap
 
Après midi détente 2013 aux chambres d'hôtes Aux Vieux Chênes
Après midi détente 2013 aux chambres d'hôtes Aux Vieux ChênesAprès midi détente 2013 aux chambres d'hôtes Aux Vieux Chênes
Après midi détente 2013 aux chambres d'hôtes Aux Vieux Chênes
 
1. Présentation générale du RFSC
1. Présentation générale du RFSC1. Présentation générale du RFSC
1. Présentation générale du RFSC
 
Présentation1
Présentation1Présentation1
Présentation1
 
La verdad sobre la mentira
La verdad sobre la mentiraLa verdad sobre la mentira
La verdad sobre la mentira
 
Double page development
Double page  developmentDouble page  development
Double page development
 
Le monde sport et forme du 3- 3-2012
Le monde sport et forme du 3- 3-2012Le monde sport et forme du 3- 3-2012
Le monde sport et forme du 3- 3-2012
 
2011 talleres de artes plasticas mayo
2011 talleres de artes plasticas mayo2011 talleres de artes plasticas mayo
2011 talleres de artes plasticas mayo
 
5. recomendaciones epilogo[1]
5. recomendaciones epilogo[1]5. recomendaciones epilogo[1]
5. recomendaciones epilogo[1]
 
Exsell organisations professionnelles v10
Exsell organisations professionnelles v10Exsell organisations professionnelles v10
Exsell organisations professionnelles v10
 
Formation archivistique 1
Formation archivistique 1Formation archivistique 1
Formation archivistique 1
 
Peinture sur route
Peinture sur routePeinture sur route
Peinture sur route
 
Heart Failure in Haiti (French) Symposia - The CRUDEM Foundation
Heart Failure in Haiti (French) Symposia - The CRUDEM FoundationHeart Failure in Haiti (French) Symposia - The CRUDEM Foundation
Heart Failure in Haiti (French) Symposia - The CRUDEM Foundation
 
PresentacióN1
PresentacióN1PresentacióN1
PresentacióN1
 

Similaire à Techniques sysadmin d'investigation de dysfonctionnements applicatifs

Comment analyser une machine linux compromise
Comment analyser une machine linux compromiseComment analyser une machine linux compromise
Comment analyser une machine linux compromiseTarek MOHAMED
 
Gestion des processus
Gestion des processusGestion des processus
Gestion des processusguebba sara
 
Découverte d'UNIX - ISIMA
Découverte d'UNIX - ISIMADécouverte d'UNIX - ISIMA
Découverte d'UNIX - ISIMALoic Yon
 
Expose linux gestion des processus
Expose linux  gestion des processusExpose linux  gestion des processus
Expose linux gestion des processusFatima Zahra Fagroud
 
How with Suricata you save the world - NDH2K14
How with Suricata you save the world - NDH2K14How with Suricata you save the world - NDH2K14
How with Suricata you save the world - NDH2K14Sebastien Larinier
 
Colloque cyber 2010 les botnets
Colloque cyber 2010   les botnetsColloque cyber 2010   les botnets
Colloque cyber 2010 les botnetsmichelcusin
 
09 02 configuration du serveur nfs
09 02 configuration du serveur nfs09 02 configuration du serveur nfs
09 02 configuration du serveur nfsNoël
 
Réseaux-et-Sécurité.pdf
Réseaux-et-Sécurité.pdfRéseaux-et-Sécurité.pdf
Réseaux-et-Sécurité.pdfMoufidaHajjaj
 
Initiation a la ligne de commande
Initiation a la ligne de commandeInitiation a la ligne de commande
Initiation a la ligne de commandeLakhdar Meftah
 
GAB 2017 PARIS - Tester la sécurité de vos annuaires Active Directory et Azur...
GAB 2017 PARIS - Tester la sécurité de vos annuaires Active Directory et Azur...GAB 2017 PARIS - Tester la sécurité de vos annuaires Active Directory et Azur...
GAB 2017 PARIS - Tester la sécurité de vos annuaires Active Directory et Azur...AZUG FR
 
LPIC1 11 01 sécurité réseaux
LPIC1 11 01 sécurité réseauxLPIC1 11 01 sécurité réseaux
LPIC1 11 01 sécurité réseauxNoël
 
Alphorm.com Formation Analyse de Malware 2/2 : Le guide complet
Alphorm.com Formation Analyse de Malware 2/2 : Le guide completAlphorm.com Formation Analyse de Malware 2/2 : Le guide complet
Alphorm.com Formation Analyse de Malware 2/2 : Le guide completAlphorm
 
cours-gratuit.com--id-3443.pdf
cours-gratuit.com--id-3443.pdfcours-gratuit.com--id-3443.pdf
cours-gratuit.com--id-3443.pdfSouha Bennani
 
Snort_Instal.pptx
Snort_Instal.pptxSnort_Instal.pptx
Snort_Instal.pptxHelmut13
 

Similaire à Techniques sysadmin d'investigation de dysfonctionnements applicatifs (20)

Comment analyser une machine linux compromise
Comment analyser une machine linux compromiseComment analyser une machine linux compromise
Comment analyser une machine linux compromise
 
13
1313
13
 
Gestion des processus
Gestion des processusGestion des processus
Gestion des processus
 
Découverte d'UNIX - ISIMA
Découverte d'UNIX - ISIMADécouverte d'UNIX - ISIMA
Découverte d'UNIX - ISIMA
 
Expose linux gestion des processus
Expose linux  gestion des processusExpose linux  gestion des processus
Expose linux gestion des processus
 
How with Suricata you save the world - NDH2K14
How with Suricata you save the world - NDH2K14How with Suricata you save the world - NDH2K14
How with Suricata you save the world - NDH2K14
 
Colloque cyber 2010 les botnets
Colloque cyber 2010   les botnetsColloque cyber 2010   les botnets
Colloque cyber 2010 les botnets
 
09 02 configuration du serveur nfs
09 02 configuration du serveur nfs09 02 configuration du serveur nfs
09 02 configuration du serveur nfs
 
Réseaux-et-Sécurité.pdf
Réseaux-et-Sécurité.pdfRéseaux-et-Sécurité.pdf
Réseaux-et-Sécurité.pdf
 
Initiation a la ligne de commande
Initiation a la ligne de commandeInitiation a la ligne de commande
Initiation a la ligne de commande
 
GAB 2017 PARIS - Tester la sécurité de vos annuaires Active Directory et Azur...
GAB 2017 PARIS - Tester la sécurité de vos annuaires Active Directory et Azur...GAB 2017 PARIS - Tester la sécurité de vos annuaires Active Directory et Azur...
GAB 2017 PARIS - Tester la sécurité de vos annuaires Active Directory et Azur...
 
Comprendre la securite web
Comprendre la securite webComprendre la securite web
Comprendre la securite web
 
LPIC1 11 01 sécurité réseaux
LPIC1 11 01 sécurité réseauxLPIC1 11 01 sécurité réseaux
LPIC1 11 01 sécurité réseaux
 
Alphorm.com Formation Analyse de Malware 2/2 : Le guide complet
Alphorm.com Formation Analyse de Malware 2/2 : Le guide completAlphorm.com Formation Analyse de Malware 2/2 : Le guide complet
Alphorm.com Formation Analyse de Malware 2/2 : Le guide complet
 
Parinux 2009
Parinux 2009Parinux 2009
Parinux 2009
 
sshGate
sshGatesshGate
sshGate
 
SdE2 - Planification, IPC
SdE2 - Planification, IPCSdE2 - Planification, IPC
SdE2 - Planification, IPC
 
cours-gratuit.com--id-3443.pdf
cours-gratuit.com--id-3443.pdfcours-gratuit.com--id-3443.pdf
cours-gratuit.com--id-3443.pdf
 
Snort_Instal.pptx
Snort_Instal.pptxSnort_Instal.pptx
Snort_Instal.pptx
 
Pentest bus pirate
Pentest bus piratePentest bus pirate
Pentest bus pirate
 

Techniques sysadmin d'investigation de dysfonctionnements applicatifs

  • 2. Plan 0. 1. 2. 3. Pourquoi faire Connaître l’ennemi Epier ses faits et gestes Intercepter ses communications
  • 4. Pourquoi faire ? Parce que les fichiers de logs ne sont pas toujours suffisants Parce qu’on a pas toujours de support Parce que le support n’est pas toujours bon Pour apporter des éléments objectifs au débat « c’est la faute au système – réseau / c’est la faute à l’application »
  • 5. 1. Connaître l’ennemi Qui connait son ennemi […], en cents combats ne sera point défait. Sun Tzu – L ’art de la guerre
  • 6. Connaître l’ennemi Quelques outils utiles ps: toutes les informations de base sur les processus
  • 7. Connaître l’ennemi Quelques outils utiles ps: toutes les informations de base sur les processus lsof: pour connaître tous les échanges avec l’extérieur (fichiers, réseau, socket, pipe…)
  • 8. Connaître l’ennemi Quelques outils utiles ps: toutes les informations de base sur les processus lsof: pour connaître tous les échanges avec l’extérieur (fichiers, réseau, socket, pipe…) netstat: pour connaître toutes les connexions réseaux en cours et ou en écoute
  • 9. Connaître l’ennemi Quelques outils utiles ps: toutes les informations de base sur les processus lsof: pour connaître tous les échanges avec l’extérieur (fichiers, réseau, socket, pipe…) netstat: pour connaître toutes les connexions réseaux en cours et ou en écoute top: pour voir la consommation de ressources par le processus
  • 10. Connaître l’ennemi Quelques outils utiles ps: toutes les informations de base sur les processus lsof: pour connaître tous les échanges avec l’extérieur (fichiers, réseau, socket, pipe…) netstat: pour connaître toutes les connexions réseaux en cours et ou en écoute top: pour voir la consommation de ressources par le processus /proc/PID/…: exhaustif … mais moins lisible ipcs: tout ce qui concerne la communication inter-processus (mémoire partagée, file de message…)
  • 11. Connaître l’ennemi La commande ps Un commande très connue mais qui reste incontournable La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…): ps u -p PID
  • 12. Connaître l’ennemi La commande ps Un commande très connue mais qui reste incontournable La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…): ps u -p PID Quelques utilisations moins connues mais utiles:
  • 13. Connaître l’ennemi La commande ps Un commande très connue mais qui reste incontournable La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…): ps u -p PID Quelques utilisations moins connues mais utiles: Connaître les variables d’environnement d’un processus: ps eww -p PID
  • 14. Connaître l’ennemi La commande ps Un commande très connue mais qui reste incontournable La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…): ps u -p PID Quelques utilisations moins connues mais utiles: Connaître les variables d’environnement d’un processus: ps eww -p PID Connaître les groupes additionnels d’un processus: ps -o supgid -p PID
  • 15. Connaître l’ennemi La commande ps Un commande très connue mais qui reste incontournable La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…): ps u -p PID Quelques utilisations moins connues mais utiles: Connaître les variables d’environnement d’un processus: ps eww -p PID Connaître les groupes additionnels d’un processus: ps -o supgid -p PID Vue en arbre des processus: ps auxf
  • 16. Connaître l’ennemi La commande lsof Une véritable couteau suisse Quelques usages classiques: Connaître les fichiers/sockets ouverts par un processus lsof -n -p PID
  • 17. Connaître l’ennemi La commande lsof Une véritable couteau suisse Quelques usages classiques: Connaître les fichiers/sockets ouverts par un processus lsof -n -p PID Uniquement les connexions réseau d’un processus lsof -n -p PID -a -i
  • 18. Connaître l’ennemi La commande lsof Une véritable couteau suisse Quelques usages classiques: Connaître les fichiers/sockets ouverts par un processus lsof -n -p PID Uniquement les connexions réseau d’un processus lsof -n -p PID -a -i Exemple de sortie de la commande lsof: COMMAND chromium chromium chromium chromium chromium chromium chromium […] PID 3164 3642 3642 3164 3164 3164 3164 USER yrouillard yrouillard yrouillard yrouillard yrouillard yrouillard yrouillard FD 0r 1u 2u 68u 51r 84u 74u TYPE CHR REG REG REG FIFO unix IPv4 DEVICE 1,3 254,2 254,2 254,2 0,8 0x7280 152346 SIZE/OFF NODE NAME 0t0 2050 /dev/null 21801 786846 /home/yrouillard/.xsession-errors 21801 786846 /home/yrouillard/.xsession-errors 1016832 78869 /home/[…]/Cookies 0t0 17007 pipe 0t0 18484 socket 0t0 TCP atlas.local:34979  ->138.102.119.3:https (ESTABLISHED)
  • 19. Connaître l’ennemi La commande lsof Une véritable couteau suisse Quelques usages classiques: Connaître les fichiers/sockets ouverts par un processus COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chromium 3164 yrouillard 0r CHR 1,3 -n -p PID 2050 /dev/null lsof 0t0 chromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors Uniquement les connexions réseau d’un processus chromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors -n -p PID -a -i lsof chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies Exemple de 51r de 0,8 chromium 3164 yrouillardsortieFIFO la commande lsof: pipe 0t0 17007 chromium 3164 PID yrouillard 84u TYPE DEVICE SIZE/OFF unix 0x7280 0t0 COMMAND USER FD chromium 3164 3164 yrouillard 74u CHR 1,3 yrouillard IPv4 152346 0t0 chromium 0r 0t0 chromium chromium chromium chromium chromium chromium […] 3642 3642 3164 3164 3164 3164 yrouillard yrouillard yrouillard yrouillard yrouillard yrouillard 1u 2u 68u 51r 84u 74u 18484 socket NODE NAME TCP atlas.local:34979  2050 /dev/null ->138.102.119.3:https (ESTABLISHED) REG 254,2 21801 786846 /home/yrouillard/.xsession-errors REG 254,2 21801 786846 /home/yrouillard/.xsession-errors REG 254,2 1016832 78869 /home/[…]/Cookies FIFO 0,8 0t0 17007 pipe unix 0x7280 0t0 18484 socket IPv4 152346 0t0 TCP atlas.local:34979  ->138.102.119.3:https (ESTABLISHED)
  • 20. Connaître l’ennemi La commande lsof Une véritable couteau suisse Quelques usages classiques: Numéro Descripteur de un processus Connaître les fichiers/sockets ouverts par fichier COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chromium 3164 yrouillard 0r CHR 1,3 -n -p PID 2050 /dev/null lsof 0t0 chromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors Uniquement les connexions réseau d’un processus chromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors -n -p PID -a -i lsof chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies Exemple de 51r de 0,8 chromium 3164 yrouillardsortieFIFO la commande lsof: pipe 0t0 17007 chromium 3164 PID yrouillard 84u TYPE DEVICE SIZE/OFF unix 0x7280 0t0 COMMAND USER FD chromium 3164 3164 yrouillard 74u CHR 1,3 yrouillard IPv4 152346 0t0 chromium 0r 0t0 chromium chromium chromium chromium chromium chromium […] 3642 3642 3164 3164 3164 3164 yrouillard yrouillard yrouillard yrouillard yrouillard yrouillard 1u 2u 68u 51r 84u 74u 18484 socket NODE NAME TCP atlas.local:34979  2050 /dev/null ->138.102.119.3:https (ESTABLISHED) REG 254,2 21801 786846 /home/yrouillard/.xsession-errors REG 254,2 21801 786846 /home/yrouillard/.xsession-errors REG 254,2 1016832 78869 /home/[…]/Cookies FIFO 0,8 0t0 17007 pipe unix 0x7280 0t0 18484 socket IPv4 152346 0t0 TCP atlas.local:34979  ->138.102.119.3:https (ESTABLISHED)
  • 21. Connaître l’ennemi La commande lsof Une véritable couteau suisse Quelques usages classiques: Type d’accès au « fichier » Connaître les fichiers/sockets ouvertsr: lectureprocessus par un COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME w: chromium 3164 yrouillard 0r CHR 1,3 -n -p PID écriture 2050 /dev/null lsof 0t0 chromium 3642 yrouillard 1u REG 254,2 21801 786846 lecture et écriture u: /home/yrouillard/.xsession-errors Uniquement les connexions réseau d’un processus chromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors -n -p PID -a -i lsof chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies Exemple de 51r de 0,8 chromium 3164 yrouillardsortieFIFO la commande lsof: pipe 0t0 17007 chromium 3164 PID yrouillard 84u TYPE DEVICE SIZE/OFF unix 0x7280 0t0 COMMAND USER FD chromium 3164 3164 yrouillard 74u CHR 1,3 yrouillard IPv4 152346 0t0 chromium 0r 0t0 chromium chromium chromium chromium chromium chromium […] 3642 3642 3164 3164 3164 3164 yrouillard yrouillard yrouillard yrouillard yrouillard yrouillard 1u 2u 68u 51r 84u 74u 18484 socket NODE NAME TCP atlas.local:34979  2050 /dev/null ->138.102.119.3:https (ESTABLISHED) REG 254,2 21801 786846 /home/yrouillard/.xsession-errors REG 254,2 21801 786846 /home/yrouillard/.xsession-errors REG 254,2 1016832 78869 /home/[…]/Cookies FIFO 0,8 0t0 17007 pipe unix 0x7280 0t0 18484 socket IPv4 152346 0t0 TCP atlas.local:34979  ->138.102.119.3:https (ESTABLISHED)
  • 22. Connaître l’ennemi La commande lsof Une véritable couteau suisse Quelques usages classiques: Type d’accès au « fichier » Connaître les fichiers/sockets ouverts parpériphérique caractère CHR: un processus COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME REG: fichier standard chromium 3164 yrouillard 0r CHR 1,3 -n -p PID 2050 /dev/null lsof 0t0 chromium 3642 yrouillard 1u REG 254,2 21801 786846 pipe FIFO: /home/yrouillard/.xsession-errors Uniquement les connexions réseau d’un processus unix: socket unix chromium 3642 yrouillard 2u REG 254,2 21801 786846 IPv4: connexion IP /home/yrouillard/.xsession-errors -n -p PID -a -i lsof chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies … Exemple de 51r de 0,8 chromium 3164 yrouillardsortieFIFO la commande lsof: pipe 0t0 17007 chromium 3164 PID yrouillard 84u TYPE DEVICE SIZE/OFF unix 0x7280 0t0 COMMAND USER FD chromium 3164 3164 yrouillard 74u CHR 1,3 yrouillard IPv4 152346 0t0 chromium 0r 0t0 chromium chromium chromium chromium chromium chromium […] 3642 3642 3164 3164 3164 3164 yrouillard yrouillard yrouillard yrouillard yrouillard yrouillard 1u 2u 68u 51r 84u 74u 18484 socket NODE NAME TCP atlas.local:34979  2050 /dev/null ->138.102.119.3:https (ESTABLISHED) REG 254,2 21801 786846 /home/yrouillard/.xsession-errors REG 254,2 21801 786846 /home/yrouillard/.xsession-errors REG 254,2 1016832 78869 /home/[…]/Cookies FIFO 0,8 0t0 17007 pipe unix 0x7280 0t0 18484 socket IPv4 152346 0t0 TCP atlas.local:34979  ->138.102.119.3:https (ESTABLISHED)
  • 23. Connaître l’ennemi Exemples concrets Cas 1: Quels sont les fichiers de log du process weblogic ?
  • 24. Connaître l’ennemi Exemples concrets Cas 1: Quels sont les fichiers de log du process weblogic ? $ lsof -n -p 17102 | grep ".log" java java java […] java […] 17102 fs90prd 1w VREG 85,1 16735376 96588  /opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_stdout.log 17102 fs90prd 2w VREG 85,1 91890547 98263  /opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_stderr.log 17102 fs90prd 9w VREG 85,1 0 98931  /opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_weblogic.log 17102 fs90prd 21w VREG 85,1 0 96993  /opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PRD_WT1.log java 17102 fs90prd 22w VREG 85,1 8406043 98954  /opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_access.log
  • 25. Connaître l’ennemi Exemples concrets Cas 2: Mais avec qui discute ce processus Time Navigator ?
  • 26. Connaître l’ennemi Exemples concrets Cas 2: Mais avec qui discute ce processus Time Navigator ? $ lsof -n -p 12475 -a –i COMMAND PID USER tina_daem 12475 root tina_daem 12475 root tina_daem 12475 root FD 6u 7u 8u TYPE DEVICE SIZE/OFF NODE NAME IPv4 0xffffffffadbc6880 0t0 TCP *:tina (LISTEN) IPv4 0xffffffff933fbe00 0t0 UDP *:tina-msg IPv4 0xffffffff9ccc5040 0t0 TCP 138.102.1.107:38051->138.102.1.27:59334 (ESTABLISHED)
  • 27. Connaître l’ennemi Exemples concrets Cas 2: Mais avec qui discute ce processus Time Navigator ? $ lsof -n -p 12475 -a –i COMMAND PID USER tina_daem 12475 root tina_daem 12475 root tina_daem 12475 root FD 6u 7u 8u TYPE DEVICE SIZE/OFF NODE NAME IPv4 0xffffffffadbc6880 0t0 TCP *:tina (LISTEN) IPv4 0xffffffff933fbe00 0t0 UDP *:tina-msg IPv4 0xffffffff9ccc5040 0t0 TCP 138.102.1.107:38051->138.102.1.27:59334 (ESTABLISHED) Sur le serveur 138.102.1.27:59334 # lsof -n -i TCP:59334 COMMAND PID USER ATEMPO 16247 root FD 16u TYPE DEVICE SIZE NODE NAME IPv4 11757747 TCP 138.102.1.27:59334 ->138.102.1.107:38051 (ESTABLISHED)
  • 28. Connaître l’ennemi Exemples concrets Cas 3: Mais où est passé mon espace disque ? $ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier & $ rm grosfichier $ df -h /home /dev/mapper/vg1-home 1,1G 937M $ du -xh --max-depth=1 /home 228M /home 55M 95% /home
  • 29. Connaître l’ennemi Exemples concrets Cas 3: Mais où est passé mon espace disque ? $ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier & $ rm grosfichier $ df -h /home /dev/mapper/vg1-home 1,1G 937M 55M 95% /home $ du -xh --max-depth=1 /home 228M /home $ lsof -n /home | grep "(deleted)" tail 22678 root 3r REG 254,5 734003200 20 /home/grosfichier (deleted)
  • 30. Connaître l’ennemi Exemples concrets Cas 3: Mais où est passé mon espace disque ? $ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier & $ rm grosfichier $ df -h /home /dev/mapper/vg1-home 1,1G 937M 55M 95% /home $ du -xh --max-depth=1 /home 228M /home $ lsof -n /home | grep "(deleted)" tail 22678 root 3r REG 254,5 734003200 20 /home/grosfichier (deleted) $ kill -15 22678 $ df -h /home /dev/mapper/vg1-home 1,1G 234M 758M 24% /home
  • 31. 2. Epier ses faits et gestes Espionne tous les gestes de ton adversaire […], et tu trouveras le meilleur moment pour causer sa perte. L ’art du Ninja – Vol. 2
  • 32. Epier ses faits et gestes Quelques outils utiles strace: pour connaître tous les appels système effectués par le processus  un outil clé pour comprendre ce que font les processus
  • 33. Epier ses faits et gestes Quelques outils utiles strace: pour connaître tous les appels système effectués par le processus  un outil clé pour comprendre ce que font les processus ltrace: pour connaître tous les appels à des librairies effectués par le processus  utile mais demande une connaissance des librairies utilisées
  • 34. Epier ses faits et gestes Quelques outils utiles strace: pour connaître tous les appels système effectués par le processus  un outil clé pour comprendre ce que font les processus ltrace: pour connaître tous les appels à des librairies effectués par le processus  utile mais demande une connaissance des librairies utilisées gdb: le debugger du projet GNU  complexe mais utilisable dans quelques cas
  • 35. Epier ses faits et gestes L ’outil strace Un outil très puissant Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable
  • 36. Epier ses faits et gestes L ’outil strace Un outil très puissant Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable Afficher les appels système d’un processus en cours: strace -f -p PID
  • 37. Epier ses faits et gestes L ’outil strace Un outil très puissant Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable Afficher les appels système d’un processus en cours: strace -f -p PID Avoir l’affichage des temps: strace -tt -f -p PID
  • 38. Epier ses faits et gestes L ’outil strace Un outil très puissant Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable Afficher les appels système d’un processus en cours: strace -f -p PID Avoir l’affichage des temps: strace -tt -f -p PID Exemple de sortie: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 14:18:38.209716 time(NULL) = 1317903518 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
  • 39. Epier ses faits et gestes L ’outil strace Un outil très puissant Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable Afficher les appels système d’un processus en cours: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 strace -f -p PID 14:18:38.209716 time(NULL) = 1317903518 Avoir l’affichage des temps: 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 strace -tt -f -p PID 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8 Exemple de sortie: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 14:18:38.209716 time(NULL) = 1317903518 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
  • 40. Epier ses faits et gestes L ’outil strace L’heure de l’appel système Un outil très puissant Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable Afficher les appels système d’un processus en cours: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 strace -f -p PID 14:18:38.209716 time(NULL) = 1317903518 Avoir l’affichage des temps: 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 strace -tt -f -p PID 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8 Exemple de sortie: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 14:18:38.209716 time(NULL) = 1317903518 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
  • 41. Epier ses faits et gestes L ’outil strace Le nom de l’appel système Un outil très puissant Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable Afficher les appels système d’un processus en cours: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 strace -f -p PID 14:18:38.209716 time(NULL) = 1317903518 Avoir l’affichage des temps: 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 strace -tt -f -p PID 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8 Exemple de sortie: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 14:18:38.209716 time(NULL) = 1317903518 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
  • 42. Epier ses faits et gestes L ’outil strace Un outil très Les arguments puissant Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable Afficher les appels système d’un processus en cours: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 strace -f -p PID 14:18:38.209716 time(NULL) = 1317903518 Avoir l’affichage des temps: 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 strace -tt -f -p PID 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8 Exemple de sortie: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 14:18:38.209716 time(NULL) = 1317903518 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
  • 43. Epier ses faits et gestes L ’outil strace Un outil très puissant Le code retour Afficher tous les appels système dès le démarrage: strace -f /chemin/vers/executable Afficher les appels système d’un processus en cours: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 strace -f -p PID 14:18:38.209716 time(NULL) = 1317903518 Avoir l’affichage des temps: 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 strace -tt -f -p PID 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8 Exemple de sortie: 14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581 14:18:38.209716 time(NULL) = 1317903518 14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0 14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
  • 44. Epier ses faits et gestes L ’outil strace Les appels système à connaître pour survivre stat / lstat: connaître le status d’un fichier stat("fichier_present", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 stat("fichier_absent", 0x1bab190) = -1 ENOENT  (No such file or directory) open / close: ouvrir / fermer un fichier open("/var/www/toto.inra.fr/.htaccess", O_RDONLY|O_LARGEFILE) = 138 close(138) read / write: lire / écrire dans un fichier write(54, "138.102.XX.XX - - [07/Oct/2011:1"..., 348) = 348 read(5, "GET /design/plain/images/accueil"..., 4096) = 626 flock / fcntl (SET_LK): verrouiller ou déverrouiller un fichier flock(19, LOCK_EX) = 0 fcntl(4, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=0, len=0}) = 0
  • 45. Epier ses faits et gestes L ’outil strace poll / select: attendre une activité sur un fichier ou une connexion réseau select(34, [26 27 28 29 30 31 32 33], NULL, NULL, NULL) = 1 (in [32]) poll([{fd=6, events=POLLOUT, revents=POLLOUT}], 1, 0) = 1 connect / socket: se connecter à un port réseau socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 6 connect(6, {sa_family=AF_INET, sin_port=htons(53),  sin_addr=inet_addr("138.102.119.226")}, 28) = 0 send / recv / recvfrom: lire et écrire sur le réseau send(6, "324x100100000020moteur-recherche"..., 42, 0) = 42 recv(6, "HTTP/1.0 200 OKrnConnection: Clo"..., 8192, 0) = 174 execve: exécuter un processus execve("/bin/ls", ["/bin/ls", "-l"], [/* 40 vars */]) = 0
  • 46. Epier ses faits et gestes L ’outil strace La règle la plus importante:
  • 47. Epier ses faits et gestes L ’outil strace La règle la plus importante: Accepter de ne pas tout comprendre dans la floppée de lignes de strace !!
  • 48. Epier ses faits et gestes L ’outil gdb Connaître la pile d’appel d’un processus en cours: $ gdb –p PID ou gdb core thread apply all bt Exemple de sortie: #0 #1 #2 0x00000035d1acb2af in poll () from /lib64/libc.so.6 0x00000035d522fa3d in ?? () from /lib64/libglib-2.0.so.0 0x00000035d522ff1a in g_main_loop_run () from /lib64/libglib-2.0.so.0 #3 0x00002b1fc9f695d5 in ?? () from /usr/lib64/python2.4/site-packages/gtk-2.0/gobject/_gobject.so #4 0x0000003e81e96167 in PyEval_EvalFrame () from /usr/lib64/libpython2.4.so.1.0 […] #12 0x00000035d1a1d994 in __libc_start_main () from /lib64/libc.so.6 #13 0x0000000000400629 in _start ()
  • 49. Epier ses faits et gestes La pratique Cas 1: Mais pourquoi le login dans GLPI est-il lent ? 18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0 […] 18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT 18:16:29.305480 time(NULL) = 1308154589 […] 18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS
  • 50. Epier ses faits et gestes La pratique Cas 1: Mais pourquoi le login dans GLPI est-il lent ? 18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0 […] 18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT 18:16:29.305480 time(NULL) = 1308154589 […] 18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS GLPI lance un processus rsh pour se connecter sur tours.inra.fr ?!
  • 51. Epier ses faits et gestes La pratique Cas 1: Mais pourquoi le login dans GLPI est-il lent ? 18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0 […] 18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT 18:16:29.305480 time(NULL) = 1308154589 […] 18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS On a perdu 15 secondes entre ces deux appels
  • 52. Epier ses faits et gestes La pratique Cas 1: Mais pourquoi le login dans GLPI est-il lent ? 18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0 […] 18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT 18:16:29.305480 time(NULL) = 1308154589 […] 18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS On a perdu 15 secondes entre ces deux appels A cause d’une tentative de connexion ssh qui finit en timeout (port non ouvert)
  • 53. Epier ses faits et gestes La pratique Cas 1: Mais pourquoi le login dans GLPI est-il lent ? 18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0 […] 18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT 18:16:29.305480 time(NULL) = 1308154589 […] 18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS GLPI essaie ensuite de connecter en imap sur tours.inra.fr
  • 54. Epier ses faits et gestes La pratique Cas 1: Mais pourquoi le login dans GLPI est-il lent ? 18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0 […] 18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT 18:16:29.305480 time(NULL) = 1308154589 […] 18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143), sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS  glpi exécute des tâches périodiques quand quelqu’un se connecte  La tâche de récupération des tickets mail essayait d’abord de faire une connexion IMAP par ssh avant de faire une connexion IMAP standard
  • 55. Epier ses faits et gestes La pratique Cas 2: Problème de compilation Vu su foru r le m PEP I # R CMD INSTALL Rmpi_0.5-9.tar.gz […] Error in dyn.load(file, DLLpath = DLLpath, ...) : unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so': libmpi.so.0: cannot open shared object file: No such file or directory
  • 56. Epier ses faits et gestes La pratique Cas 2: Problème de compilation Vu su foru r le m PEP I # R CMD INSTALL Rmpi_0.5-9.tar.gz […] Error in dyn.load(file, DLLpath = DLLpath, ...) : unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so': libmpi.so.0: cannot open shared object file: No such file or directory # ls /usr/local/lib/libmpi.so.0 /usr/local/lib/libmpi.so.0 Pourtant la librairie est bien là !?
  • 57. Epier ses faits et gestes La pratique Cas 2: Problème de compilation Vu su foru r le m PEP I # R CMD INSTALL Rmpi_0.5-9.tar.gz […] Error in dyn.load(file, DLLpath = DLLpath, ...) : unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so': libmpi.so.0: cannot open shared object file: No such file or directory # ls /usr/local/lib/libmpi.so.0 /usr/local/lib/libmpi.so.0 # strace -f R CMD INSTALL Rmpi_0.5-9.tar.gz 2>&1 | grep libmpi.so open("/usr/local/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT open("/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT open("/usr/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT […] La librairie est recherchée dans des répertoires /lib64/
  • 58. Epier ses faits et gestes La pratique Cas 2: Problème de compilation Vu su foru r le m PEP I # R CMD INSTALL Rmpi_0.5-9.tar.gz […] Error in dyn.load(file, DLLpath = DLLpath, ...) : unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so': libmpi.so.0: cannot open shared object file: No such file or directory # ls /usr/local/lib/libmpi.so.0 /usr/local/lib/libmpi.so.0 # strace -f R CMD INSTALL Rmpi_0.5-9.tar.gz 2>&1 | grep libmpi.so open("/usr/local/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT open("/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT open("/usr/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT […]  /usr/local/lib/ n’est pas dans le chemin de recherche des librairies 64 bits !
  • 59. Epier ses faits et gestes La pratique Cas 3: Plantage d’un webmail lors de la consultation # gdb –p PID_Process_Apache ou gdb fichier_core 0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian 1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so 2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so […] 13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so 15 0x08074607 in ap_run_handler () […] 23 0x0806224f in main ()
  • 60. Epier ses faits et gestes La pratique Cas 3: Plantage d’un webmail lors de la consultation # gdb –p PID_Process_Apache ou gdb fichier_core 0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian 1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so 2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so […] 13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so 15 0x08074607 in ap_run_handler () […] 23 0x0806224f in main () Le plantage semble survenir dans cette librairie
  • 61. Epier ses faits et gestes La pratique Cas 3: Plantage d’un webmail lors de la consultation # gdb –p PID_Process_Apache ou gdb fichier_core 0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian 1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so 2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so […] 13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so 15 0x08074607 in ap_run_handler () A quel paquet appartient […] cette librairie ? 23 0x0806224f in main () # dpkg -S /usr/lib/libc-client.so.2002edebian libc-client2002edebian: /usr/lib/libc-client.so.2002edebian
  • 62. Epier ses faits et gestes La pratique Cas 3: Plantage d’un webmail lors de la consultation # gdb –p PID_Process_Apache ou gdb fichier_core 0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian 1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so 2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so […] 13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so 15 0x08074607 in ap_run_handler () Y a-t-il des bugs connus […] pour ce paquet ? 23 0x0806224f in main () # dpkg -S /usr/lib/libc-client.so.2002edebian libc-client2002edebian: /usr/lib/libc-client.so.2002edebian # Consultation de http://bugs.debian.org/libc-client2002edebian
  • 63. Epier ses faits et gestes La pratique Cas 3: Plantage d’un webmail lors de la consultation # gdb –p PID_Process_Apache ou gdb fichier_core 0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian 1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so 2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so […] 13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so 15 0x08074607 in ap_run_handler () […] 23 0x0806224f in main () # dpkg -S /usr/lib/libc-client.so.2002edebian Bin libc-client2002edebian: /usr/lib/libc-client.so.2002edebian go ! # Consultation de http://bugs.debian.org/libc-client2002edebian  Bug 502996: Segfaults if IMAP server sends more than 30 user flags
  • 64. 3. Intercepter ses communications C’es grâce à [l’interception des communications allemandes] que nous avons gagné la guerre. Churchill
  • 65. Intercepter ses communications Quelques outils utiles tcpdump / snoop: outil de capture de bas niveau Usage classique: tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port
  • 66. Intercepter ses communications Quelques outils utiles tcpdump / snoop: outil de capture de bas niveau Usage classique: tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port wireshark / tshark: pour faire l’analyse des captures • Un outil très puissant à connaître absolument, • capable de décoder énormément de protocole réseau HTTPS, LDAP, ethernet, TCP, UDP, IP, …) (SQL, HTTP,
  • 67. Intercepter ses communications Quelques outils utiles tcpdump / snoop: outil de capture de bas niveau Usage classique: tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port wireshark / tshark: pour faire l’analyse des captures • Un outil très puissant à connaître absolument, • capable de décoder énormément de protocole réseau (SQL, HTTP, HTTPS, LDAP, ethernet, TCP, UDP, IP, …) l’extension livehttpheaders de Firefox: pour connaître les échanges HTTP lors de la consultation d’une page
  • 68. Intercepter ses communications Les bases à savoir pour analyser les flux Acquittement des paquets Etablissement de la connexion S yn Client + Syn Seq = 2, Ac k Serveur Ack Client Len = 4, Ack = 0, Len = q = 0, Se Seq = 6, Len Ack = 0 6 Serveur = 8, A ck = 0 Traduction en capture tcpdump / wireshark Traduction en capture tcpdump / wireshark 192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN] 209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK] 192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK] 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0 209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
  • 69. Intercepter ses communications Les bases à savoir pour analyser les flux Acquittement des paquets Etablissement de la connexion S yn Client Seq = 2, Serveur Client Len = 4, Ack = 0, Len = q = 0, Se Seq = 6, Len Ack = 0 6 Serveur = 8, A ck = 0 Traduction en capture tcpdump / wireshark Traduction en capture tcpdump / wireshark 192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN] 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0 209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
  • 70. Intercepter ses communications Les bases à savoir pour analyser les flux Acquittement des paquets Etablissement de la connexion S yn Client + Syn Seq = 2, Ac k Serveur Client Len = 4, Ack = 0, Len = q = 0, Se Seq = 6, Len Ack = 0 6 Serveur = 8, A ck = 0 Traduction en capture tcpdump / wireshark Traduction en capture tcpdump / wireshark 192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN] 209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK] 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0 209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
  • 71. Intercepter ses communications Les bases à savoir pour analyser les flux Acquittement des paquets Etablissement de la connexion S yn Client + Syn Seq = 2, Ac k Serveur Ack Client Len = 4, Ack = 0, Len = q = 0, Se Seq = 6, Len Ack = 0 6 Serveur = 8, A ck = 0 Traduction en capture tcpdump / wireshark Traduction en capture tcpdump / wireshark 192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN] 209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK] 192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK] 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0 209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
  • 72. Intercepter ses communications Les bases à savoir pour analyser les flux Acquittement des paquets Etablissement de la connexion S yn Client Rst Seq = 2, Serveur Client Len = 4, Ack = 0, Len = q = 0, Se Seq = 6, Len Ack = 0 6 Serveur = 8, A ck = 0 Traduction en capture tcpdump / wireshark Traduction en capture tcpdump / wireshark 192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN] 209.85.148.106 192.168.0.156 TCP 80 > 45261 [RST] 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0 209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
  • 73. Intercepter ses communications Les bases à savoir pour analyser les flux Acquittement des paquets Etablissement de la connexion S yn Client + Syn Seq = 2, Ac k Serveur Ack Len = 4, Ack = Client 0 Serveur J’ai déjà envoyé 2 octets Je t’envoie 4 nouveaux octets Traduction en capture tcpdump / wireshark Traduction en capture tcpdump / wireshark 192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN] 209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK] 192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK] 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
  • 74. Intercepter ses communications Les bases à savoir pour analyser les flux Acquittement des paquets Etablissement de la connexion S yn Client + Syn Seq = 2, Ac k Serveur Ack Client Len = 4, Ack = 0, Len = q = 0, Se Ack = 0 6 Serveur J’ai bien reçu 6 octets en tout Traduction en capture tcpdump / wireshark Traduction en capture tcpdump / wireshark 192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN] 209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK] 192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK] 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0 209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
  • 75. Intercepter ses communications Les bases à savoir pour analyser les flux Acquittement des paquets Etablissement de la connexion S yn Client + Syn Seq = 2, Ac k Serveur Ack Client Len = 4, Ack = 0, Len = q = 0, Se Seq = 6, Len Ack = 0 6 Serveur = 8, A ck = 0 Tu as bien reçu mes 6 octets alors je t’en envoie 8 de plus Traduction en capture tcpdump / wireshark Traduction en capture tcpdump / wireshark 192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN] 209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK] 192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK] 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0 209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6 192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
  • 76. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 138.102.70.2 138.102.118.170 138.102.118.170 138.102.70.2 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 HTTP HTTP/1.1 200 OK (text/css) HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
  • 77. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 138.102.70.2 138.102.118.170 138.102.118.170 138.102.70.2 138.102.70.2 138.102.118.170 Le serveur envoie TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 3306 + 395 = 3873 octets TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 HTTP HTTP/1.1 200 OK (text/css) HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
  • 78. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 138.102.70.2 138.102.118.170 138.102.118.170 138.102.70.2 138.102.70.2 138.102.118.170 Le client accuse réception TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 de 1846 octets TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 HTTP HTTP/1.1 200 OK (text/css) HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
  • 79. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 138.102.70.2 138.102.118.170 138.102.118.170 138.102.70.2 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 TCP 58683 >Le client accuse réception http [ACK] Seq=395 Ack=3306 Len=0 HTTP HTTP/1.1 200 de 3306 octets OK (text/css) HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
  • 80. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 Le serveur TCP 58683 > http [ACK] 138.102.70.2 138.102.118.170 attend l’accusé de Seq=395 Ack=3306 Len=0 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css) réception de ces 3873 octets… 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
  • 81. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 Pendant 5 secondes !! 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css) 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
  • 82. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 138.102.70.2 138.102.118.170 138.102.118.170 138.102.70.2 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 TCP 58683 >Il décide ensuite Ack=3306 Len=0 http [ACK] Seq=395 de HTTP HTTP/1.1 200 OK (text/css) retransmettre le paquet HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
  • 83. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 138.102.70.2 138.102.118.170 138.102.118.170 138.102.70.2 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 Il OK (text/css) HTTP HTTP/1.1 200reçoit bien l’accusé de HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0 réception des 3873 octets cette fois-ci
  • 84. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 138.102.70.2 138.102.118.170 138.102.118.170 138.102.70.2 138.102.70.2 138.102.118.170 Avant le routeur, tout est identique… ? TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 HTTP HTTP/1.1 200 OK (text/css) HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0 … sauf que le 1er paquet envoyé au client n’apparait pas !
  • 85. Intercepter ses communications La pratique Cas 1: Lenteur d’accès aléatoire à des sites Web Capture depuis le serveur web 53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567 54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 … 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567 57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325 Capture avant le routeur 53 54 55 56 0.488462 0.586425 5.260831 5.306787 138.102.70.2 138.102.118.170 138.102.70.2 138.102.118.170 138.102.118.170 138.102.70.2 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0 HTTP HTTP/1.1 200 OK (text/css) HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0  Le paquet était perdu dans le routeur dont il a fallu faire changer la carte
  • 86. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle)
  • 87. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle) Vers qui sont envoyées toutes ces requêtes ?
  • 88. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle) $ lsof -d 243 -a -p 5937 java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
  • 89. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle) $ lsof -d 243 -a -p 5937 java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED) Il communique avec le serveur postgres
  • 90. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle) $ lsof -d 243 -a -p 5937 java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED) $ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432 On écoute plus précisément ce qu’ils se disent
  • 91. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle) $ lsof -d 243 -a -p 5937 java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED) $ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432 Sous wireshark, on voit toujours la même requête ?!
  • 92. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle) $ lsof -d 243 -a -p 5937 java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED) $ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432 $ strings -a | grep "^select" | wc -l Combien de requêtes SQL ? 8467 $ strings -a | grep "^select" | sort -u | wc -l 1
  • 93. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle) $ lsof -d 243 -a -p 5937 java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED) $ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432 $ strings -a /tmp/capture.cap | grep "^select" | wc -l 8467 $ strings -a /tmp/capture.cap | grep "^select" | sort -u | wc -l 1 Combien de requêtes SQL uniques ?
  • 94. Intercepter ses communications La pratique Cas 2: Problème de performance sous tomcat $ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617 recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487 […] (en boucle) $ lsof -d 243 -a -p 5937 java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED) $ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432 $ strings -a /tmp/capture.cap | grep "^select" | wc -l 8467 $ strings -a /tmp/capture.cap | grep "^select" | sort -u | wc -l 1  L’application effectue la même requête sql en boucle !!
  • 98. Connaître son passé La problématique Les problèmes n’arrivent pas toujours quand un administrateur est présent (nuit, week-end…) Les outils de monitoring classiques (Cacti, Nagios, Zabbix…) ne permettent pas de faire des diagnostics précis dans le passé – aggrégations des données trop rapides, – peu d’indicateurs détaillées, – grain pas assez fin (pas de vision par processus ou utilisateurs…)  Un besoin d’outils adapté pour le diagnostic
  • 99. Connaître son passé dim_stat, une solution Pour ceux qui ne peuvent pas s’offrir Sysload, Patrol… Un outil gratuit (mais pas réellement open-source) Librement téléchargeable sur http://dimitrik.free.fr/ Une interface fruste mais puissante De nombreuses sondes par défaut (tout l’historique des commandes iostat, vmstat, iostat, netstat sans perte de données) Très facilement extensible (sondes mysql, java…) Exemples de requêtes possibles: • • • Quels sont les 10 processus qui ont occupé le plus de mémoire entre 22h et 4h du matin ? Quel est le taux d’interruption du CPU 2 entre 2h et 4h ? Quel utilisateur a consommé tout le CPU entre 5h et 6h ?
  • 100. Connaître son passé Exemple d’utilisation Cas 1: Comprendre les raisons d’une saturation mémoire Sous Solaris, le répertoire /tmp est stocké en mémoire et son occupation peut saturer la mémoire  comment savoir si des saturations étaient dues au /tmp ou à des processus ? 2 septembre 2011 90% RAM occupé par les processus, ce sont eux qui saturent la mémoire ! 9 septembre 2011 60% RAM seulement, C’est le /tmp qui doit occuper le reste de la mémoire !!!
  • 101. 6. Passer à la vitesse supérieure
  • 102. Passer à la vitesse supérieure 2 outils pour aller plus loin Dtrace sous Solaris: un outil d’analyse et de profilage du système extrêmement puissant • le précurseur, créé en 2003 et disponible depuis Solaris 10 • totalement sûr, avec un impact faible, conçu pour être utilisé en production • permet d’accéder à énormément d’information du système, • un language de scripting spécifique: le D b Systemtap sous Linux: l’équivalent pour Linux, créé en 2005, • disponible nativement dans Redhat depuis la version 5.2 • scripts systemtap compilés et chargés en tant que module noyau
  • 103. Passer à la vitesse supérieure dtrace et systemtap Des outils puissants qui permettent de répondre aux questions suivantes: Quels sont les processus qui génèrent le plus d’entrées/sorties disque ? Quels processus sont responsables d’une occupation CPU Système importante ? Quels sont les processus qui génèrent le plus de traffic réseau ? Quels sont les processus qui accèdent de manière brève à ce fichier ? Quelle processus est responsable de la suppression de fichiers ? … Des outils complexes à maîtriser ! Mais il existe de nombreux scripts directement utilisables sur le net: • DtraceToolkit: http://hub.opensolaris.org/bin/view/Community+Group+dtrace/dtracetoolkit • Exemples Systemtap: http://sourceware.org/systemtap/examples/