Lors de l’utilisation d’un serveur Unix, un administrateur peut être amené à devoir gérer le contrôle des ressources systèmes via la commande ulimit.
Définition
Le contrôle des ressources qui est offert par le système est un élément important de la fiabilisation d’un système Unix. Un système qui est correctement configuré ne souffrira pas de déni de services en cas de dysfonctionnement d’un processus, ou encore d’attaques (qu’elles soient voulues ou non) par les utilisateurs (forkbombs notamment).
Celui-ci peut donc adapter les ressources dont il dispose via la commande ulimit, ou l’édition du fichier suivant en fonction des environnements :
- AIX :/etc/security/limits
- Solaris :/etc/system
- Linux:/etc/security/limits.conf
Remarque : Ce fichier est chargé par le module PAM à chaque ouverture de session.
Principe d’utilisation
Il est possible de définir, pour un certain nombre de ressources (nombre de fichiers ouverts, taille des fichiers, nombre de processus instanciés, temps CPU, etc), une limite dite souple (limite soft) qui peut être augmentée par l’utilisateur, via la commande ulimit, jusqu’à une limite maximale qualifiée de limite dure (limite hard).
Le système ne dépasse pas la valeur de la limite soft. Si l’utilisateur souhaite repousser cette limite, il devra définir une nouvelle limite soft avec ulimit. Bien entendu, la limite soft est toujours inférieure ou égale à la limite hard. De manière générale, les limites appliquées à un utilisateur sont prioritaires sur celles appliquées à un groupe.
Les ressources gérées
Comme nous l’avons vu précédemment les limites sont fixées dans un fichier. La commande ulimit permet d’en modifier certaines telles que :
- La taille des fichiers, nombre de fichiers ouverts, le nombre de processus, etc…
A contrario, d’autres limites sont imposées et seulement modifiables via le fichier, telles que :
- Nombre de login simultanés, le nombre maximum d’utilisateurs connectés, la priorité maximale des processus utilisateur, etc…
Pour plus d’informations concernant l’utilisation des paramètres de la commande ulimit, vous pouvez vous reporter aux documentation suivantes : [AIX] [Solaris] [Linux]
Méthode d’utilisation
De manière générale, passer l’option « S » à ulimit impactera la limite effective (limite soft), et l’option « H » la limite hard (qui correspond à la valeur maximum pouvant être définie par l’utilisateur).
La commande ulimit -a retourne toutes les limites imposées au compte courant (donc les softs) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
root@testhost# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15906 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 100 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited |
Remarque : La commande ulimit -Ha retourne la liste des limites maximales pouvant être atteintes.
Les valeurs d’une ressource particulière sont affichées en utilisant les options qui leurs sont associées :
1 2 3 4 |
root@testhost# ulimit -u # nombre de processus maximum autorisé : 100 root@testhost# ulimit -Hu # la limite peut être augmentée jusqu'à : 300 |
Remarque : L’ordre des options à de l’importance.
- Pour afficher les ulimit d’un user :
1 2 3 4 5 6 7 8 |
root@testhost# ulimit -a time(seconds) unlimited file(blocks) unlimited data(kbytes) 524288 stack(kbytes) 131072 memory(kbytes) unlimited coredump(blocks) 2097151 nofiles(descriptors) 2000 |
- Pour modifier les limites d’un utilisateur :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@testhost# chuser X =Y Z Avec : X = le type de ressource à modifier : time -> cpu file -> fsize data -> data stack -> stack memory -> rss coredump -> core nofiles -> nofiles Y = la nouvelle valeur à attribuer : unlimited -> -1 Z = l'utilisateur à modifier |
Remarque : Pour les valeurs stack,data et memory -> la valeur du ulimit est en kbytes alors que celle entrée avec le chuser est en block de 512 bytes. Donc, penser à multiplier la valeur par deux pour obtenir la bonne correspondance.