Bien que vous restreigniez les arguments de la ligne de commande, rien n'empêche l'utilisateur d'utiliser vim pour ouvrir, modifier et écraser tout fichier aléatoire une fois qu'il s'exécute en tant que root.
L'utilisateur peut exécuter sudo vim /etc/httpd/conf/httpd.conf
puis
- effacer tout ce texte du tampon d'édition
- puis pour plus de commodité, sourcez un fichier existant (bien que cela ne soit même pas requis): par exemple la configuration sudo
:r /etc/sudoers
REMARQUE: Sauf restriction par SELinux, l'utilisateur peut lire n'importe quel fichier de cette façon!
- s'octroyer plus de privilèges sudo
user ALL=(ALL) NOPASSWD: ALL
- écraser l'ancienne configuration
:w /etc/sudoers
Je peux imaginer des dizaines de façons similaires dont votre utilisateur peut désormais accéder, modifier ou détruire votre système.
Vous n'aurez même pas de piste d'audit sur les fichiers qui ont été modifiés de cette manière, car vous ne le verrez que modifier votre configuration Apache dans les messages du journal sudo. Il s'agit d'un risque de sécurité dans l'octroi de sudo
privilèges à n'importe quel éditeur.
C'est plus ou moins la même raison pour laquelle l'octroi de droits de niveau racine sudo à des commandes telles que tar
et unzip
est souvent non sécurisé, rien ne vous empêche d'inclure des remplacements pour les binaires du système ou les fichiers de configuration du système dans l'archive.
Un deuxième risque, comme de nombreux autres commentateurs l'ont souligné, est qu'il vim
permet des échappements shell , où vous pouvez démarrer un sous-shell depuis vim qui vous permet d' exécuter n'importe quelle commande arbitraire . Depuis votre session sudo vim, ceux-ci s'exécuteront en tant que root, par exemple l'échappement shell:
:!/bin/bash
vous donnera un shell racine interactif
:!/bin/rm -rf /
fera de bonnes histoires dans le pub.
Que faire à la place?
Vous pouvez toujours utiliser sudo
pour permettre aux utilisateurs de modifier des fichiers dont ils ne sont pas propriétaires de manière sécurisée.
Dans votre configuration sudoers, vous pouvez définir une commande réservée spéciale sudoedit
suivie du chemin d'accès complet (caractère générique) aux fichiers qu'un utilisateur peut modifier:
user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
L'utilisateur peut ensuite utiliser le -e
commutateur dans sa ligne de commande sudo ou utiliser la sudoedit
commande:
sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Comme expliqué dans la page de manuel :
L' -e (edit)
option indique qu'au lieu d'exécuter une commande, l'utilisateur souhaite modifier un ou plusieurs fichiers. Au lieu d'une commande, la chaîne "sudoedit" est utilisée lors de la consultation de la politique de sécurité.
Si l'utilisateur est autorisé par la politique, les étapes suivantes sont prises:
- Des copies temporaires sont faites des fichiers à éditer avec le propriétaire défini sur l'utilisateur appelant.
- L'éditeur spécifié par la stratégie est exécuté pour modifier les fichiers temporaires. La stratégie sudoers utilise les variables d'environnement SUDO_EDITOR, VISUAL et EDITOR (dans cet ordre). Si aucun SUDO_EDITOR, VISUAL ou EDITOR n'est défini, le premier programme répertorié dans l'
sudoers
option éditeur (5) est utilisé.
- S'ils ont été modifiés, les fichiers temporaires sont recopiés à leur emplacement d'origine et les versions temporaires sont supprimées.
Si le fichier spécifié n'existe pas, il sera créé.
Notez que contrairement à la plupart des commandes exécutées par sudo, l'éditeur est exécuté avec l'environnement de l'utilisateur appelant non modifié. Si, pour une raison quelconque, sudo n'est pas en mesure de mettre à jour un fichier avec sa version modifiée, l'utilisateur recevra un avertissement et la copie modifiée restera dans un fichier temporaire.
Le sudoers
manuel contient également une section complète sur la façon dont il peut offrir une protection limitée contre les échappements de shell avec les options RESRICT
et NOEXEC
.
restrict
Évitez de donner aux utilisateurs l'accès aux commandes qui permettent à l'utilisateur d'exécuter des commandes arbitraires. De nombreux éditeurs ont un mode restreint où les échappements shell sont désactivés, bien que sudoedit soit une meilleure solution pour exécuter des éditeurs via sudo. En raison du grand nombre de programmes qui offrent des échappements shell, restreindre les utilisateurs à l'ensemble des programmes qui ne le sont pas est souvent impossible.
et
noexec
De nombreux systèmes qui prennent en charge les bibliothèques partagées ont la possibilité de remplacer les fonctions de bibliothèque par défaut en pointant une variable d'environnement (généralement LD_PRELOAD) vers une autre bibliothèque partagée. Sur ces systèmes, la fonctionnalité noexec de sudo peut être utilisée pour empêcher un programme exécuté par sudo d'exécuter d'autres programmes. Remarque, ... ...
Pour activer noexec pour une commande, utilisez la NOEXEC
balise comme indiqué dans la section Spécifications utilisateur ci-dessus. Voici cet exemple encore:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Ceci permet à l' utilisateur d'exécuter aaron /usr/bin/more
et /usr/bin/vi
avec noexec activé. Cela empêchera ces deux commandes d'exécuter d'autres commandes (comme un shell).
vim
, l'utilisateur est libre d'ouvrir et d'écrire dans n'importe quel fichier qu'il souhaite.