Aunque restringe los argumentos de la línea de comandos, no hay nada que impida que el usuario use vim para abrir, editar y sobrescribir cualquier archivo aleatorio una vez que se esté ejecutando como root.
El usuario puede ejecutar sudo vim /etc/httpd/conf/httpd.conf
y luego
- borrar todo ese texto del búfer de edición
- luego, por conveniencia, obtenga un archivo existente (aunque eso ni siquiera es necesario): por ejemplo, la configuración de sudo
:r /etc/sudoers
NOTA: ¡A menos que sea restringido por SELinux, el usuario puede leer cualquier archivo de esta manera!
- concederse más privilegios de sudo
user ALL=(ALL) NOPASSWD: ALL
- sobrescribir la configuración anterior
:w /etc/sudoers
Puedo imaginar docenas de formas similares en las que su usuario ahora puede acceder, modificar o destruir su sistema.
Ni siquiera tendrá un seguimiento de auditoría de qué archivos se cambiaron de esta manera, ya que solo lo verá editando su configuración de Apache en los mensajes de registro de sudo. Este es un riesgo de seguridad al otorgar sudo
privilegios a cualquier editor.
Esta es más o menos la misma razón por la que otorgar derechos de nivel raíz sudo a comandos como tar
y a unzip
menudo es inseguro, nada le impide incluir reemplazos para archivos binarios del sistema o archivos de configuración del sistema en el archivo.
Un segundo riesgo, como lo han señalado muchos otros comentaristas, es que vim
permite escapes de shell , donde puede iniciar un sub-shell desde vim que le permite ejecutar cualquier comando arbitrario . Desde su sesión de sudo vim, se ejecutarán como root, por ejemplo, el escape de shell:
:!/bin/bash
te dará un shell raíz interactivo
:!/bin/rm -rf /
Hará buenas historias en el pub.
¿Qué hacer en su lugar?
Todavía puede usar sudo
para permitir a los usuarios editar archivos que no son de su propiedad de manera segura.
En la configuración de sudoers, puede establecer un comando reservado especial sudoedit
seguido del nombre de ruta completo (comodín) a los archivos que un usuario puede editar:
user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
El usuario puede usar el -e
interruptor en su línea de comando sudo o usar el sudoedit
comando:
sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Como se explica en la página del manual :
La -e (edit)
opción indica que, en lugar de ejecutar un comando, el usuario desea editar uno o más archivos. En lugar de un comando, la cadena "sudoedit" se usa cuando se consulta la política de seguridad.
Si el usuario está autorizado por la política, se toman los siguientes pasos:
- Se hacen copias temporales de los archivos que se editarán con el propietario configurado para el usuario que invoca.
- El editor especificado por la política se ejecuta para editar los archivos temporales. La política de sudoers utiliza las variables de entorno SUDO_EDITOR, VISUAL y EDITOR (en ese orden). Si ninguno de SUDO_EDITOR, VISUAL o EDITOR está configurado,
sudoers
se utiliza el primer programa que aparece en la opción del editor (5).
- Si se han modificado, los archivos temporales se vuelven a copiar en su ubicación original y se eliminan las versiones temporales.
Si el archivo especificado no existe, se creará.
Tenga en cuenta que, a diferencia de la mayoría de los comandos ejecutados por sudo, el editor se ejecuta sin modificar el entorno del usuario que invoca. Si, por alguna razón, sudo no puede actualizar un archivo con su versión editada, el usuario recibirá una advertencia y la copia editada permanecerá en un archivo temporal.
El sudoers
manual también tiene una sección completa sobre cómo puede ofrecer protección limitada contra escapes de shell con las opciones RESRICT
y NOEXEC
.
restrict
Evite dar a los usuarios acceso a comandos que le permitan ejecutar comandos arbitrarios. Muchos editores tienen un modo restringido donde los escapes de shell están deshabilitados, aunque sudoedit es una mejor solución para ejecutar editores a través de sudo. Debido a la gran cantidad de programas que ofrecen escapes de shell, restringir a los usuarios al conjunto de programas que no lo hacen a menudo es inviable.
y
noexec
Muchos sistemas que admiten bibliotecas compartidas tienen la capacidad de anular las funciones predeterminadas de la biblioteca apuntando una variable de entorno (generalmente LD_PRELOAD) a una biblioteca compartida alternativa. En tales sistemas, la funcionalidad noexec de sudo se puede usar para evitar que un programa ejecutado por sudo ejecute otros programas. Nota: ... ...
Para habilitar noexec para un comando, use la NOEXEC
etiqueta como se documenta en la sección de Especificaciones del usuario anterior. Aquí está ese ejemplo nuevamente:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Esto permite al usuario aaron ejecutar /usr/bin/more
y /usr/bin/vi
con noexec habilitado. Esto evitará que esos dos comandos ejecuten otros comandos (como un shell).
vim
, el usuario es libre de abrir y escribir en cualquier archivo que desee.