¿Por qué el sistema tiene /etc/sudoers.d? ¿Cómo debería editarlo?

48

La última vez, pregunté sobre el riesgo de estos (en / etc / sudoers):

    user_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
    %group_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Mientras pensaba en este problema, encontré el directorio /etc/sudoers.d . Los archivos en el directorio deben tener funciones similares a / etc / sudoers (lo que significa que los scripts anteriores aún son problemáticos incluso en /etc/sudoers.d), y sin embargo, un artículo dijo que no deberíamos usar el directorio porque no podemos usarlo visudopara editar archivos en eso. Es decir, perdemos el derecho de uso sudosi cometemos un error en el directorio.

Si eso es cierto, ¿por qué tenemos /etc/sudoers.d ? ¿O tenemos una buena manera de editar archivos en /etc/sudoers.d ?

cualquier otro negocio
fuente

Respuestas:

45

Los cambios realizados en los archivos /etc/sudoers.dpermanecen en su lugar si actualiza el sistema. Esto puede evitar bloqueos del usuario cuando se actualiza el sistema. A Ubuntu le gusta este comportamiento. Otras distribuciones también están utilizando este diseño.

Según mi experiencia, las reglas sobre los archivos en este directorio son más flexibles que para /etc/sudoers. Esto ha incluido:

  • Los errores en el archivo no causaron sudofallas. Sin embargo, el archivo fue ignorado.
  • Las reglas de permisos parecen menos estrictas. Permite que el grupo correspondiente u otro lea el archivo. No creo que eso fuera posible con /etc/sudoers. Los permisos de escritura deben restringirse rootpara mantener la seguridad. La versión actual de Ubuntu de sudo permite permisos de lectura para grupos u otros. (Esta capacidad permite auditar el acceso a sudo sin necesidad de acceso de root)

El visudocomando solo está predeterminado /etc/sudoers. Editará y verificará cualquier archivo que especifique con la -fopción. Utilizo esta capacidad para editar archivos que se instalarán automáticamente como /etc/sudoerso en /etc/sudoders.d. Sin embargo, es posible que no se encuentren definiciones de otros archivos. Es mejor hacer que el archivo sea independiente.

La capacidad de tener archivos independientes hace que sea simple para una aplicación habilitar la sudocapacidad de instalación y eliminarlos cuando no está instalada. Las herramientas de configuración automatizadas también pueden usar esta capacidad.

He utilizado esta capacidad para aislar los cambios necesarios para otorgar acceso a grupos de usuarios específicos en sistemas específicos.

BillThor
fuente
1
Los dos rasgos de sudoers.d que mencionaste parecen realmente importantes y útiles. ¡Gracias!
aob
Vea mi respuesta y advertencia sobre por qué esos no son en realidad rasgos de sudoers.d.
dragon788
1
Totalmente en desacuerdo con la afirmación 'Los errores en el archivo no causaron sudofallas'. Rompí sudo en RHEL con una sintaxis incorrecta en un archivo de /etc/sudoers.d. Esto requirió un esfuerzo significativo para rectificar y creo que la recomendación debería ser usar siempre visudo -fpara editar esos archivos.
79E09796
@ 79E09796 He roto archivos en /etc/sudoers.d sin causar problemas con las reglas en otros archivos. YMMV. Si interrumpe la configuración de sudo que lo introduce en el sistema, tendrá problemas. Si tiene acceso para reiniciar el sistema, es relativamente fácil reiniciar en modo de recuperación y corregir el archivo. Estoy de acuerdo en que es una buena práctica usar visodo para editar, o al menos verificar los cambios en los archivos de configuración de sudo.
BillThor
62

Sí, puedes usar visudopara editar esos archivos. Todo lo que tiene que hacer es especificar el nombre del archivo que desea editar con la -fopción. Por ejemplo:

visudo -f /etc/sudoers.d/somefilename

O, si es necesario:

sudo visudo -f /etc/sudoers.d/somefilename

Documentación

De man visudo:

-f sudoers
Especifica y alterna la ubicación del archivo sudoers. Con esta opción, visudo editará (o verificará) el archivo sudoers de su elección, en lugar del predeterminado, / etc / sudoers. El archivo de bloqueo utilizado es el archivo sudoers especificado con ".tmp" adjunto. Solo en el modo de verificación, el argumento para -f puede ser "-", lo que indica que los sudoers se leerán desde la entrada estándar.

En resumen:

  1. Sintaxis: Ambos visudoy visudo -f realizan la misma verificación de sintaxis .

  2. Permisos / Propiedad: Como una característica agregada para ayudar a la administración de sistemas grandes , los archivos editados bajo visudo -fno se verifican por propiedad o permisos: esto permite la verificación de sintaxis de un archivo fuera de línea o como parte de un sistema de control de revisión.

Por que usar /etc/sudoers.d/

Normalmente /etc/sudoersestá bajo el control del administrador de paquetes de su distribución. Si ha realizado cambios en ese archivo y el administrador de paquetes desea actualizarlo, deberá inspeccionar manualmente los cambios y aprobar cómo se combinan en la nueva versión. Al colocar sus cambios locales en un archivo en el /etc/sudoers.d/directorio, evita este paso manual y las actualizaciones pueden continuar automáticamente.

¿Cuándo sudoignora un archivo /etc/sudoers?

Si su /etc/sudoersarchivo contiene la línea:

#includedir /etc/sudoers.d

luego sudoleerá los archivos en el directorio /etc/sudoers.d.

Las excepciones son:

  1. Archivos cuyos nombres terminan en ~
  2. Archivos cuyos nombres contienen un .caracter

Esto se hace (a) para la comodidad de los administradores de paquetes y también (b) para que los archivos de respaldo de los editores sean ignorados.

John1024
fuente
Gracias, pero tengo una duda. Es visudo -fseguro?
aob
55
Sí, visudo -fedita de manera segura como de costumbre visudo. Es por eso que tenemos visudoy por qué ofrece la -fopción.
John1024
Gran nota acerca de cómo se ignoran los permisos cuando se usa, -fya que esto podría omitir a alguien que luego lo copia en /etc/sudoers.d/ sin verificarlos dos veces.
dragon788
1
GRACIAS por la sección de excepción. Llamé a mi archivo algo así /etc/sudoers.d/mysudorules.sudoy no pude entender por qué las reglas dentro no se aplicaron antes de leer su respuesta.
Zaroth
1
Gracias por mencionar las excepciones. ¡Mi archivo debajo /sudoers.d/mysite.co.ukno funcionaba y después de cambiarle el nombre a mysiteél funciona! :)
J86
20

¿Por qué tenemos /etc/sudoers.d?

Porque es más fácil para las herramientas automatizadas (como Chef o Puppet) colocar archivos individuales en este directorio, en lugar de realizar cambios en ellos /etc/sudoers, que pueden ser frágiles.

Los archivos en /etc/sudoers.dson (en efecto) concatenados. Verá varias otras instancias de este patrón en /etc, como /etc/cron.dy /etc/logrotate.d.

Roger Lipscombe
fuente
No sabía que hay otros directorios similares. Gracias.
aob
14

Otro beneficio de usar visudo -fcomo se menciona en algunas respuestas es que hay una opción correspondiente -co --checkque verifica que no tiene información no válida en un archivo sudoers.d o cualquier otro archivo que desee poner en sudoers.d. Esto es REALMENTE útil en los casos mencionados con herramientas automatizadas, ya que puede ejecutar, por ejemplo

sudo visudo -c -q -f /home/myuser/mysudoers && \
sudo chmod 600 /home/myuser/mysudoers && \
sudo cp /home/myuser/mysudoers /etc/sudoers.d/mysudoers

Esto comprueba silenciosamente el archivo (sin salida debido a -q) y solo si eso NO devuelve un error (la salida 1 significa un archivo sudoers no válido), entonces copiará el archivo en sudoers.d, de esta manera puede crear el archivo y trabaje en él sin tener que corregirlo la primera vez (el uso sudo visudo -f /etc/sudoers.d/myfiletiene que tener éxito o descarta el contenido si no lo arregla).

Además, una palabra de precaución con respecto a estas declaraciones de las otras respuestas.

Según mi experiencia, las reglas sobre los archivos en este directorio son más flexibles que para / etc / sudoers. Esto ha incluido:

Los errores en el archivo no hicieron que sudo fallara. Sin embargo, el archivo fue ignorado. Las reglas de permisos parecen menos estrictas. Permito que el grupo correspondiente lea el archivo. No creo que sea posible con / etc / sudo.

Los archivos en /etc/sudoers.d deben cumplir con la misma sintaxis que / etc / sudoers, porque debajo de las cubiertas el sistema simplemente concatena todos los archivos con el último en "ganador" si hay varias entradas para el mismo Entorno singular.

Si los permisos son horriblemente incorrectos (se pueden escribir en todo el mundo) en archivos en /etc/sudoers.d/, entonces se ignoran, esto puede ser la causa de que se pasen por alto los archivos no válidos, de lo contrario puede romper seriamente el sudocomando al tener un sudoers no válido. d archivo con los permisos correctos.

Puede permitir que los archivos sudoers sean legibles en todo el mundo, si accidentalmente le permite a 'otro' el permiso de escritura que necesita sudo como otro usuario o desde un terminal raíz ejecute este comando. Esto también puede romperse si el archivo es propiedad de otra persona que no sea root: root.

sudo chmod 644 /etc/sudoers.d/mysudoers
sudo chown root:root /etc/sudoers.d/mysudoers

Acabo de confirmar que si ejecuto chmod o+w /etc/sudoers.d/vagrantya no puedo sudo como el usuario vagabundo, me pide mi contraseña y luego falla.

Cuando corrí sudo -lpara ver los permisos del comando aplicado como otro usuario de sudo válido, también recibí una advertencia sobre los permisos del archivo. Este es el mismo comando que utilicé para confirmar que el usuario 'vagabundo' perdió sudo cuando apliqué o+wpermisos al archivo que le daba permiso a ese usuario.

dragon788
fuente
3

Solo un pequeño complemento a cualquier respuesta general ... ninguna de las otras respuestas solucionó mi problema, que era ese orden importante.

Si sus líneas funcionan en sudoers pero no en sudoers.d, intente mover el #include o cambie el orden de sus archivos sudoers.d (con el prefijo de un número). Parece que lo más específico debería ser el primero en el archivo.

Tenía algo como:

somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand

Y el segundo no tuvo efecto porque el primero ya coincidía. NOPASSWD no es una condición, sino una forma de modificar la acción.

Y no era obvio porque no estaba en un solo archivo, debido al directorio sudoers.d.

Peter
fuente