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é/etc/sudoers.d
directorio. Los archivos en el directorio deberían tener funciones similares a /etc/sudoers
(lo que significa que los scripts anteriores siguen siendo problemáticos incluso en /etc/sudoers.d
) y, sin embargo, un artículo decía que no deberíamos usar el directorio porque no podemos usarlo visudo
para editar archivos en él. Es decir, perdemos el derecho de uso sudo
si 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
?
Respuesta1
Los cambios realizados en los archivos /etc/sudoers.d
permanecen vigentes si actualiza el sistema. Esto puede evitar bloqueos de usuarios cuando se actualiza el sistema. A Ubuntu suele gustarle este comportamiento. Otras distribuciones también utilizan este diseño.
Según mi experiencia, las reglas para los archivos de este directorio son más flexibles que las de /etc/sudoers
. Esto ha incluido:
- Los errores en el archivo no provocaron
sudo
el fracaso. Sin embargo, el expediente fue ignorado. - Las reglas de permisos parecen menos estrictas. Permite que el grupo aplicable u otro lea el archivo. No creo que eso fuera posible con
/etc/sudoers
. Los permisos de escritura deben restringirse pararoot
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 requerir acceso de root).
El visudo
comando solo tiene por defecto /etc/sudoers
. Editará y verificará cualquier archivo que especifique con la -f
opción. Utilizo esta capacidad para editar archivos que se instalarán automáticamente como /etc/sudoers
o en /etc/sudoders.d
. Sin embargo, es posible que no se encuentren definiciones de otros archivos. Lo mejor es hacer que el archivo sea independiente.
La capacidad de tener archivos independientes hace que sea sencillo para una aplicación habilitar sudo
la capacidad durante la instalación y eliminarlos cuando se desinstala. Las herramientas de configuración automatizadas también pueden utilizar esta capacidad.
He utilizado esta capacidad para aislar los cambios necesarios para otorgar acceso a grupos de usuarios específicos en sistemas específicos.
Respuesta2
Sí, puedes usarlo visudo
para editar esos archivos. Todo lo que tienes que hacer es especificar el nombre del archivo que deseas editar con la -f
opció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
Especifique y alterne la ubicación del archivo sudoers. Con esta opción visudo editará (o comprobará) 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" añadido. Solo en modo de verificación, el argumento de -f puede ser "-", lo que indica que los sudoers se leerán desde la entrada estándar.
En resumen:
Sintaxis:Ambos
visudo
yvisudo -f
realizar la misma comprobación de sintaxis.Permisos/Propiedad: Como característica agregadapara ayudar a la administración de grandes sistemas
visudo -f
, no se verifica la propiedad o los permisos de los archivos editados en : esto permite verificar la sintaxis de un archivo sin conexión o como parte de un sistema de control de revisiones.
Por que usar/etc/sudoers.d/
Normalmente /etc/sudoers
está bajo el control del administrador de paquetes de su distribución. Si realizó cambios en ese archivo y el administrador de paquetes desea actualizarlo, deberá inspeccionar manualmente los cambios y aprobar cómo se fusionan 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 se sudo
ignora un archivo en /etc/sudoers
?
Si su /etc/sudoers
archivo contiene la línea:
#includedir /etc/sudoers.d
Luego sudo
leerá los archivos en el directorio /etc/sudoers.d
.
Las excepciones son:
- Archivos cuyos nombres terminan en
~
- Archivos cuyos nombres contienen un
.
carácter.
Esto se hace (a) para comodidad de los administradores de paquetes y también (b) para ignorar los archivos de respaldo de los editores.
Importante: Tenga en cuenta que la excepción 2 anterior es bastante general y significa que los nombres de archivos aparentemente razonables como mysudo.conf
o mysudo.txt
serán ignorados porque .
está en el nombre.
Respuesta3
¿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 /etc/sudoers
, que pueden ser frágiles.
Los archivos /etc/sudoers.d
están (en efecto) concatenados. Verá varios otros ejemplos de este patrón en /etc
, como /etc/cron.d
y /etc/logrotate.d
.
Respuesta4
Solo un breve complemento a cualquier respuesta general... ninguna de las otras respuestas solucionó mi problema, que era que el orden importa.
Si sus líneas funcionan en sudoers pero no en sudoers.d, intente mover #include o cambiar el orden de sus archivos sudoers.d (con el prefijo de un número). Parece que lo más específico debería estar primero en el expediente.
Tuve algo como:
somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand
Y el 2do 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.