¿Por qué es arriesgado dar acceso a sudo vim a usuarios comunes?

30

Me gustaría crear un nuevo usuario y darle acceso a sudo. Para ser específico, quiero que use sudo vimy edite httpd.conf. Escribí esto en sudoers:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Sin embargo, escuché que esto podría ser arriesgado. ¿Por qué es esto problemático? ¿Qué tan serio es el problema?

mi0pu
fuente
16
Por un lado, su comando le dará al usuario acceso de lectura y escritura a todos los archivos en la computadora. Una vez dentro vim, el usuario es libre de abrir y escribir en cualquier archivo que desee.
John1024
44
Además, puede crear un nuevo grupo para agregar a cualquier usuario que necesite acceso /etc/httpd/confs/httpd.conf. Luego, use chgrp [OPTION] GROUPNAME FILEpara cambiar la propiedad del grupo /etc/httpd/confs/httpd.conf. Algo así como groupadd vimportantcrear el nuevo grupo y chgrp -v vimportant /etc/httpd/confs/httpd.confcambiar la propiedad del grupo. yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin
44
Tenga en cuenta que, debido a todos los problemas mencionados en las respuestas, sudo incluye una forma de permitir a los usuarios editar archivos con un editor que se ejecuta con sus propios privilegios. Busque "Edición segura" en la sudoerspágina del manual.
Michał Politowski
2
(No estoy seguro si lo que digo es correcto) Dado que le está dando sudoacceso a vim, el usuario podrá usar vim como root. En vim puede ejecutar comandos UNIX ( ¿Cómo ejecutar comandos Unix desde Vim? ) Para que un usuario pueda hacer cosas como useradd <myuser>, rm -rf /o muchas otras cosas.
fedorqui
66
Esta es una pregunta equivocada. Al considerar otorgar privilegios elevados de cualquier tipo, no debe pensar "Haré esto, a menos que piense en alguna razón por la cual es peligroso". Quiere pensar "No haré esto, a menos que pueda probarme a mí mismo que es seguro".
Nate Eldredge

Respuestas:

60

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 sudoprivilegios 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 tary a unzipmenudo 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 vimpermite 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 sudopara 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 sudoeditseguido 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 -einterruptor en su línea de comando sudo o usar el sudoeditcomando:

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, sudoersse 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 sudoersmanual también tiene una sección completa sobre cómo puede ofrecer protección limitada contra escapes de shell con las opciones RESRICTy 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 NOEXECetiqueta 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/morey /usr/bin/vicon noexec habilitado. Esto evitará que esos dos comandos ejecuten otros comandos (como un shell).

HBruijn
fuente
No lo sabía sudo tary sudo unziptambién causo problemas. Gracias.
mi0pu
55
Buena respuesta. Sería aún mejor si también mencionara escapar desde dentro de vim a un shell. Una vez que está en un shell, es gratuito para todos, y aún así todo lo que aparecería en los registros es que el usuario está editando su archivo de configuración de Apache.
un CVn
2
¿Adicionalmente? Si estás usando vim, ¡podrías hacer algo horrible, como :!rm -rf /, whoops!
Wayne Werner
1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcY bum. El acceso de raíz a tar es una vulnerabilidad.
Qix
1
@ MichaelKjörling esa es la respuesta que esperaba, :shluego boom, caparazón de raíz
Creek
5

Esta configuración permite a ese usuario editar ese archivo. Para hacerlo, inicia un vimeditor con derechos de root.

Una vez que vimse inicia el comando, el usuario puede hacer lo que quiera con ese editor. - Puede abrir un archivo diferente o incluso iniciar un shell desde vim.

Por lo tanto, el usuario ahora puede ver y editar archivos arbitrarios y ejecutar comandos arbitrarios en su sistema.

michas
fuente
¿Qué quiere decir con "Esta configuración permite a todos los usuarios editar ese archivo"? ¿"Usuario" tiene un significado especial?
mi0pu
Vaya, no le presté atención. arregló la respuesta.
michas
5

Cerraduras de seguridad

Algunos programas, como por ejemplo less, vi, vimy more, permitir que otros programas se ejecuten de un comando shell-lo que se conoce como escape Shell o escapar al intérprete de comandos. En estos casos, puede utilizar NOEXECpara evitar que algunos programas permitan la ejecución de otros privilegios de programas. Ejemplo:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

Esto permitiría al usuario editar más o menos y ver privilegiadamente cualquier archivo en el sistema que ejecute vim y más, pero deshabilita la posibilidad de ejecutar otros programas con privilegios desde el intérprete de comandos de escape vim.

Es importante sudoincluir varios bloqueos de seguridad (predeterminados) que pueden evitar tareas peligrosas, como redirigir la salida estándar de la ejecución de un programa ( STDOUT) a archivos fuera del directorio de inicio del usuario.

Si se define en el archivo /etc/sudoersque un usuario puede ejecutar con privilegios /usr/bin/vim, es decir, algo como lo siguiente:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudopermite que el usuario regular definido pueda ejecutarse /usr/bin/vimde las siguientes maneras:

sudo /usr/bin/vim
sudo vim

Pero evite ejecutar vim de la siguiente manera:

cd /usr/bin
sudo ./vim
Pawan Kumar
fuente
2
¿Se supone que esto es una respuesta o un error de cortar y pegar?
jasonwryan
1
La mayor parte de eso no está relacionado con la pregunta.
Hauke ​​Laging
4

La respuesta simple:

El siguiente es un comando Vim:

:shell

Ahora tienen una cáscara de raíz.

Comodín
fuente
1

Una posible mejora de seguridad incremental sería reemplazar:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

con

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

y luego haga que el usuario se ejecute en su sudo rvim /etc/httpd/confs/httpd.conflugar.

Vim admite un modo restringido activado con la opción de línea de comando -Z o iniciando el programa como rvim. Cuando el modo restringido está activado, "todos los comandos que utilizan un shell externo están desactivados". Este enfoque no impediría que el usuario utilice un :split filecomando ex para abrir otros archivos, pero al menos debería impedir deliberadamente comandos shell maliciosos como :!rm -rf /.

Johann
fuente
1
Desafortunadamente, esto también es 100% inseguro. Si el usuario logra editar / etc / sudoers para hacerse omnipotente en el sistema, entonces puede ejecutar cualquier comando como root.
vurp0
0

Estoy de acuerdo con la respuesta de HBruijn de que ejecutar vim como root abre el sistema de manera muy amplia, y sudoedit sería una solución más segura.

Pero incluso entonces, es probable que su sistema siga siendo bastante abierto. Al menos suponiendo que se inicie algún proceso de apache con privilegios de root en función de esa configuración. Hay un millón de formas de configurar apache de tal manera que ejecute programas externos. Como un ejemplo, considere el argumento de la tubería a la directiva CustomLog . El manual establece explícitamente:

Seguridad:

Si se utiliza un programa, se ejecutará como el usuario que inició httpd. Esto será root si el servidor fue iniciado por root; asegúrese de que el programa sea seguro.

Obviamente, si sus usuarios pueden escribir la configuración, pueden cambiar ese programa a lo que quieran, por ejemplo, algo que ejecute un script de shell para otorgarles más permisos.

Por esta razón, recientemente he pirateado una forma de usar las capacidades de tal manera que Apache puede obtener la capacidad especial de unirse a un puerto privilegiado, aunque de lo contrario se ejecuta como un usuario normal. De esa manera, los usuarios pueden editar la configuración e incluso iniciar el servidor, y aún están en su mayoría seguros. El único problema es que pueden vincular cualquier proceso en cualquier IP. Permanece un cierto grado de confianza, ya que posiblemente podrían encontrar una manera de bloquear el sshd del sistema y luego lanzar su propia versión en un intento de obtener la contraseña de root.

MvG
fuente
0

Cabe señalar que incluso un sudoedit {.../whatever.conf}puede ser un riesgo de seguridad.

Crear un script de shell /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

y llame a este script en su archivo de configuración. Conozco varios ejemplos en los que funciona este enfoque:

samba -> comando de token log nt

log nt token command = /tmp/make_me_root.sh

syslog-ng -> programa: envío de mensajes a aplicaciones externas

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Supongo que uno puede extender esta lista sin fin.

Todo lo que tiene que hacer es reiniciar el servicio. Por supuesto, una vez que sea root, revertirá dichas líneas de configuración para desdibujar sus rastros.

Wernfried Domscheit
fuente
0

Por supuesto, no es más seguro en absoluto. Como se dijo antes de sudoedit, es la forma más fácil y adecuada de hacerlo.

Lo que quiero agregar es que vim permite iniciar un shell, por lo que no solo puede editar cualquier archivo del sistema, sino que también permite iniciar un shell y hacer lo que quiera.

Solo intenta iniciar un vim y escribe: sh

Lauskin
fuente