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 sudoprivilè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 taret unzipest 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 vimpermet 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 sudopour 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 sudoeditsuivie 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 -ecommutateur dans sa ligne de commande sudo ou utiliser la sudoeditcommande:
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'
sudoersoption é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 sudoersmanuel 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 RESRICTet 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 NOEXECbalise 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/moreet /usr/bin/viavec 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.