Pregunta:
Me gustaría crear un nuevo usuario y darle acceso a sudo. Para ser específico, quiero que use sudo vim
y 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?
Respuesta:
Aunque restringe los argumentos de la línea de comandos, no hay nada que evite 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:r /etc/sudoers
restringido por SELinux, el usuario puede leer cualquier archivo de esta manera! - concederse más privilegios de sudo
user ALL=(ALL) NOPASSWD: ALL
- sobrescribe 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á una pista de auditoría de los archivos que 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 privilegios de sudo
a cualquier editor.
Esta es más o menos la misma razón por la que otorgar derechos de nivel raíz de sudo a comandos como tar
y unzip
menudo es inseguro, nada le impide incluir reemplazos para binarios del sistema o archivos de configuración del sistema en el archivo.
Un segundo riesgo, como han señalado muchos otros comentaristas, es que vim
permite escapes de shell , donde puede iniciar un sub-shell desde dentro de 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
le dará un shell de root interactivo -
:!/bin/rm -rf /
hará buenas historias en el pub.
¿Qué hacer en su lugar?
Aún puede usar sudo
para permitir a los usuarios editar archivos que no son de su propiedad de forma segura.
En la configuración de sudoers, puede establecer un comando reservado especial sudoedit
seguido del nombre de ruta completo (comodín) al archivo (s) que un usuario puede editar:
user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Luego, el usuario puede usar el sudoedit
-e
en su línea de comando sudo o usar el comando sudoedit
:
sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Como se explica en la página del manual :
La opción
-e (edit)
indica que, en lugar de ejecutar un comando, el usuario desea editar uno o más archivos. En lugar de un comando, se utiliza la cadena "sudoedit" cuando se consulta la política de seguridad.
Si el usuario está autorizado por la política, se toman los siguientes pasos:
- Se realizan copias temporales de los archivos que se van a editar con el propietario establecido en el usuario que invoca.
- El editor especificado por la política se ejecuta para editar los archivos temporales. La política de sudoers usa las variables de entorno SUDO_EDITOR, VISUAL y EDITOR (en ese orden). Si no se establece ninguno de SUDO_EDITOR, VISUAL o EDITOR, se usa el primer programa listado en la opción editor
sudoers
(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 manual de sudoers
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 es a menudo inviable.
y
noexec
Muchos sistemas que admiten bibliotecas compartidas tienen la capacidad de anular las funciones de biblioteca predeterminadas apuntando una variable de entorno (generalmente LD_PRELOAD) a una biblioteca compartida alternativa. En tales sistemas, la funcionalidad noexec de sudo se puede utilizar para evitar que un programa ejecutado por sudo ejecute otros programas. Nota,... ...
Para habilitar noexec para un comando, use la etiquetaNOEXEC
como se documenta en la sección Especificación 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).