Dans la partie précédente, nous avons audité le processus de démarrage du serveur et émis des recommandations pour le sécuriser. Considérons que ces recommandations sont appliquées et penchons-nous à présent sur le système. Dans ce chapitre, nous allons prendre connaissance de la machine en auditant ses composants matériels : CPU, Disque et Mémoire.
Auditez les composants CPU de la machine
Lors de la prise en main d'une machine que vous ne connaissez pas, il paraît important de dresser un petit inventaire du matériel.
Concernant le CPU, Linux met à notre disposition plusieurs commandes pour relever l'architecture et le composant matériel : dmesg ou more /proc/cpuinfo.
Dans un premier temps, consultons les traces du processus de démarrage de la machine que le noyau a laissées et voyons comment Linux perçoit le CPU, grâce à la commande suivante :
[root@fichesproduits ~]# dmesg | grep CPU
[ 0.000000] CPU MTRRs all blank - virtualized system.
[ 0.000000] ACPI: SSDT 000000003fff02a0 001CC (v01 VBOX VBOXCPUT 00000002 INTL 20100528)
[ 0.000000] smpboot: Allowing 1 CPUs, 0 hotplug CPUs
[ 0.000000] setup_percpu: NR_CPUS:5120 nr_cpumask_bits:1 nr_cpu_ids:1 nr_node_ids:1
[ 0.000000] PERCPU: Embedded 35 pages/cpu @ffff9326ffc00000 s104856 r8192 d30312 u2097152
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] RCU restricting CPUs from NR_CPUS=5120 to nr_cpu_ids=1.
[ 0.029375] CPU: Physical Processor ID: 0
[ 0.030343] mce: CPU supports 0 MCE banks
[ 0.086315] smpboot: CPU0: Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz (fam: 06, model: 9e, stepping: 0a)
[ 0.182324] Performance Events: unsupported p6 CPU model 158 no PMU driver, software events only.
[ 0.184102] Brought up 1 CPUs
[ 0.485378] microcode: CPU0 sig=0x906ea, pf=0x2, revision=0x0
Ici, cette commande nous indique que le CPU est virtualisé et repose sur un composant matériel de type Intel i9 à 2,9 GHz. La machine dispose donc d'un seul CPU.
Le noyau maintient également quelques variables relatives au CPU sur son système de fichier virtuel /proc/. Vous pouvez lister ces variables avec la commande suivante :
[root@fichesproduits ~]# more /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 model name : Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz stepping : 10 cpu MHz : 2904.000 cache size : 12288 KB physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc pni pclmulqdq monitor ssse 3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase avx2 invpcid rdseed clflushopt bogomips : 5808.00 clflush size : 64 cache_alignment : 64 address sizes : 39 bits physical, 48 bits virtual power management:
Parmi ces variables, nous pouvons notamment relever :
Variable | Description |
---|---|
processor | Le numéro du processeur |
cpu family | La famille du processeur (ici 6, héritage des Pentium Pro) |
model name | Le nom du modèle |
cpu MHz | Sa fréquence précise |
flags | Une liste d'attributs associés au CPU |
Ici, ce qui est important est de remarquer, dans les flags, la présence de PAE et NX. Ces deux attributs indiquent que le processeur protège l'exécution d'instructions stockées dans les régions mémoire non autorisées.
Par exemple, avec la commande suivante :
[root@fichesproduits ~]# grep ^flags /proc/cpuinfo | head -n1 | egrep --color=auto ' (pae|nx) ' flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase avx2 invpcid rdseed clflushopt [root@fichesproduits ~]#
Cette commande filtre le contenu du fichier /proc/cpuinfo sur les lignes contenant le mot-clé flags.
Auditez les composants mémoire de la machine
Passons désormais aux composants mémoire. Le noyau laisse aussi une trace des composants mémoire qu'il sollicite au démarrage :
[root@fichesproduits ~]# dmesg | grep Memory [ 0.000000] Memory: 991412k/1048512k available (7324k kernel code, 392k absent, 56708k reserved, 6305k data, 1832k init) [root@fichesproduits ~]#
Cette commande permet de connaître la quantité de mémoire disponible et la quantité de mémoire totale présentes sur le système. Celle-ci est exprimée en Ko. Comme vous pouvez le constater, le démarrage mobilise quelques Ko. C'est tout à fait normal. Remarquez cependant que la quantité utilisée est très faible.
Le noyau affiche ensuite les statistiques d'occupation des ressources mémoire en temps réel, dans le fichier /proc/meminfo :
[root@fichesproduits ~]# cat /proc/meminfo MemTotal: 1015508 kB MemFree: 672608 kB MemAvailable: 678432 kB Buffers: 2108 kB Cached: 118560 kB SwapCached: 0 kB Active: 152884 kB ... DirectMap4k: 24512 kB DirectMap2M: 1024000 kB [root@fichesproduits ~]#
Diverses commandes de Linux permettent de trier les informations de ce fichier, comme par exemple free, vmstat, top.
J'utilise assez souvent la commande suivante :
# Mémoire vive [root@fichesproduits ~]# vmstat -s | grep memory 1015508 K total memory 170684 K used memory 154328 K active memory 94916 K inactive memory 670736 K free memory 2108 K buffer memory [root@fichesproduits ~]#
La mémoire SWAP permet d'ajouter au noyau un périphérique de type bloc (stocké sur le disque dur) pour écrire et lire les pages mémoire au cas où la mémoire vive serait saturée. Cette fonctionnalité était primordiale lorsque les ressources physiques des machines étaient limitées ou lorsque le prix de la mémoire vive était élevé. Aujourd'hui, la mémoire vive est moins chère et les systèmes peuvent gérer plusieurs dizaines de Go sans problème. Quoi qu'il en soit, il est toujours important de conserver un minimum de SWAP, ne serait-ce que pour compenser un bug qui viendrait manger toute la mémoire vive... et ainsi éviter ainsi un crash du système.
Par exemple, avec la commande suivante :
# SWAP [root@fichesproduits ~]# vmstat -s | grep swap 171980 K swap cache 839676 K total swap 0 K used swap 839676 K free swap 0 pages swapped in 0 pages swapped out
Auditez les composants DISK de la machine
À nouveau, faisons l'inventaire des traces laissées par le noyau lors du démarrage :
[root@fichesproduits ~]# dmesg | grep disk [ 0.495770] systemd[1]: Running in initial RAM disk. [ 1.379411] sd 0:0:0:0: [sda] Attached SCSI disk [root@fichesproduits ~]#
Le noyau détecte un disque de type SCSI, comme souvent dans le cas d'une virtualisation.
Ici, pas de recommandation particulière : la présence d'un périphérique de type bloc est chose commune pour un système Linux. Les choses se compliquent lorsqu'il s'agit de sécuriser son accès. C'est l'objet du chapitre suivant.
En résumé
Dans ce chapitre, nous avons pris connaissance de la machine en effectuant un petit audit de ses composants CPU, Mémoire et Disque. Deux recommandations ont été émises, notamment sur le CPU et la mémoire. Dans le cas du disque, c'est souvent le partitionnement et les options associées qui posent problème. Je vous propose d'étudier cet aspect dans le chapitre suivant.