I. Présentation

Sous GNU/Linux, comme sur n’importe quel autre système d’exploitation, il existe un moyen de connaître et/ou de modifier les ressources allouées aux processus du système. Il s’agit d’une commande permettant, au travers de divers indicateurs, de régler les seuils haut et bas des ressources du système. Dans ce tutoriel, je vais donc développer les fonctionnalités de cette commande ulimit.

II. Le contrôle de ressources

Un peu comme pour le contrôle des priorités à l’aide de nice ou renice, sous Linux on offre la possibilité aux utilisateurs de contrôler les ressources proposées aux processus du système. D’ailleurs, la priorité des processus utilisateur fait partie des seuils à administrer. Il s’agit d’un élément fondamental de la fiabilité du système GNU/Linux. L’objectif de ce mécanisme est d’éviter les dénis de services en cas de dysfonctionnement du processus en cours d’exécution. Ce type d’attaque, aussi appelée "fork bomb" peut s’avérer dévastateur pour le système, ses utilisateurs et leur environnement. Fort heureusement GNU/Linux permet de borner ces précieuses ressources système, soit par utilisateur, soit par groupes d’utilisateurs, en paramétrant le fichier /etc/security/limits.conf.

RAPPEL : ce fichier est chargé par PAM (Pluggable Authentication Modules) lors de chaque ouverture de session d’utilisateur. Cela permet de contrôler ce à quoi il a le droit.

Beaucoup de limites ne peuvent être gérées que par root. Mais, certaines peuvent être réglées par l’utilisateur lui-même, via la commande ulimit. Nombre de ces limites sont établies selon deux critères :

une limite souple (aussi appelée soft limit)

une limite maximale ou limite dure (aussi appelée hard limit)

La première peut facilement être augmentée par l’utilisateur grâce à la commande ulimit. Mais, en aucun cas, l’utilisateur ne pourra dépasser la limite dure. Le système, quant à lui, ne peut pas dépasser la valeur de la limite souple. Mais, si l’utilisateur souhaite accroitre la capacité de la ressource, il doit alors définir un nouveau seuil de cette limite souple à l’aide de la commande ulimit. Deux règles essentielles prévalent à la gestion de ces limites :

la limite souple est toujours inférieure (ou égale) à la limite dure.

Les limites d’un utilisateur sont préemptives sur celles d’un groupe.

Les seuils sont gérés au sein du fichier /etc/security/limits.conf et ulimit ne permet de modifier que certains d’entre eux :

Taille des fichiers

Nombre de fichiers ouverts

Temps CPU maximum pour un processus

Nombre de processus

Priorité maximale des processus de l’utilisateur

D’autres limites ne sont administrables que par les valeurs définies au sein du fichier /etc/security/limits.conf :

Nombre maximum de login simultanés

Nombre maximum d’utilisateurs connectés au système

Priorité maximale des processus de l’utilisateur

REMARQUE : il existe bien sûr de nombreuses autres limites paramétrables. Elles sont toutes décrites dans le manuel en ligne de limits.conf. Les seuils des limites hautes sont modifiables uniquement par le compte root.

III. Utilisation d'ulimit

Lorsque le seuil le permet, on peut alors modifier la valeur d’une limite en utilisant l’option S avec la commande ulimit, afin d’impacter la limite souple ou l’option H, pour fixer le seuil de la limite dure (représentant la valeur maximale pouvant être définie par l’utilisateur. Au sein de son espace utilisateur, la commande ulimit permet de confiner un programme et/ou un script, à une quantité de ressource souhaitée. Le meilleur moyen de connaître les différents seuils déjà fixés, pour l’utilisateur courant, est d’exécuter la commande suivante :

$ ulimit –a

Généralement, on doit obtenir un tableau dans lequel on trouve l’ensemble des valeurs limites imposées à l’utilisateur courant. Il s’agit donc des limites souples :

De la même façon, si l’on exécute la commande ci-dessous, on récupèrera alors les seuils des limites dures :

$ ulimit –Ha

REMARQUE : on en déduit que par défaut, si l’on ne précise pas l’option H c’est forcément l’option S qui est valorisée.

Dans le répertoire /etc/security/limits.d on peut également placer la définition de différentes limites accessibles aux utilisateurs. Par défaut, il n’existe que le fichier 90-nproc.conf permettant de modifier les seuils du nombre de processus maximum. Ce fichier contient deux lignes :

l’une pour définir le seuil souple des utilisateurs en général

l’autre pour définir la limite basse pour le super-utilisateur root

Mais, rien n’empêche de placer dans ce répertoire d’autres ressources dont on souhaite autoriser l’accès aux utilisateurs. Chaque ressource particulière correspond à une option de la commande ulimit qui peut alors être affichée via la directive mentionnée entre parenthèse dans la capture d’écran issue de la commande ulimit -a:

On peut alors faire afficher le seuil bas ou la limite haute en utilisant les options mentionnées précédemment :

$ ulimit –f (pour faire afficher la taille maximale des fichiers) $ ulimit –Hf (pour faire afficher la limite haute de la taille maximale de fichier)

ATTENTION : l’ordre dans lequel on précise les options à son importance. On met toujours l’option définissant le type de seuil (‘S’ ou ‘H’), en premier, suivi de l’indicateur de la limite.

L’utilisateur a alors tout loisir de modifier la limite souple à sa guise, en respectant le schéma ci-dessous :

$ ulimit -S<Option> <Valeur>

Exemple : pour modifier la limite souple du nombre d’utilisateurs :

$ ulimit -Su 300

IMPORTANT : mais, on ne pourra jamais passer le seuil dur sous la limite souple. Dans ce cas, on recevrait un message : "-bash: ulimit: max user processes: cannot modify limit: Invalid argument".

Il revient donc à l’administrateur de définir des limites cohérentes et fonctionnelles pour l’ensemble des utilisateurs de son système au travers du fichier /etc/security/limits.conf. Ce fichier est constitué d’enregistrements dont la syntaxe est la suivante :

Le domaine peut être un utilisateur, un groupe d’utilisateurs (préfixé par ‘@’), ou une plage d’utilisateurs, définis par leur n° uid (sous le format uid min :uid max ), ou une plage de groupes définis par leur n° gid et également précédée par le caractère ‘@’, à l’identique du groupe d’utilisateurs. Ce fichier doit être chargé par le mécanisme des modules PAM lors de chaque authentification d’utilisateur. A cet égard, le module pam_limits.so est positionné par la ligne ci-dessous dans le fichier /etc/pam.d/system-auth :

… session required pam_limits.so …

On peut aussi placer cette ligne dans les fichiers /etc/pam.d/password-auth et/ou /etc/pam.d/sudo afin d’être certain de toujours fixer les seuils définis par l’administrateur lors de chaque connexion d’utilisateur au système. Si les limites définies dans ce fichier ne sont pas prises en compte le premier réflexe consiste à s’assurer que le module pam_limits.so est bien activé dans les fichiers de configuration de PAM.

REMARQUE : sur certaines distributions les fichiers de configuration de PAM peuvent différer. On peut rencontrer la définition des limites dans les fichiers common-session ou login. Mais, le principe reste le même : s’assurer qu’à chaque connexion utilisateur les seuils des ressources du système sont bien appliqués.

IV. Conclusion

Cette fonctionnalité permet de protéger le systeme contre d’éventuelles attaques en limitant l’utilisation des ressources utilisées. Seul le compte root du super-utilisateur peut fixer les limites hautes avec au choix, le fichier /etc/security/limits.conf (ou ses dérivés dans /etc/security/limits.d), ou via la commande ulimit. Les utilisateurs, quant à eux, peuvent accéder à la configuration des seuils de limites souples. Cela permet de rester cohérent vis-à-vis des ressources physiques disponibles sur le système, tout en laissant un peu de marge de manœuvre aux utilisateurs connectés.

Au travers des exemples mentionnés ci-dessus, on peut constater que les seuils du système (définis dans /etc/sysctl.conf) sont reliés à la définition des ressources, au travers du fichier /etc/security/limits.conf (ou de ses homologues listés dans /etc/security/limits.d). Parmi ces ressources, on trouve la notion de priorité qui est elle-même définie et modifiable par les utilisateurs, au travers de la commande nice et/ou renice. L’ensemble de ces fonctions permettent de renforcer la gestion du système, en laissant les utilisateurs libres d’utiliser ou non les ressources qui leurs sont allouées, mais en conservant un maximum de sécurité afin d’empêcher tout débordement.