¿Cómo ejecutar un programa específico como root sin una solicitud de contraseña?

170

Necesito ejecutar algo como sudo sin contraseña, así que usé visudoy agregué esto a mi sudoersarchivo:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Luego lo probé:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

¿Por qué pide una contraseña? ¿Cómo puedo ejecutar / usar comandos como root con un usuario no root, sin pedir una contraseña?

LanceBaynes
fuente

Respuestas:

91

Tiene otra entrada en el sudoersarchivo que también coincide con su usuario. La NOPASSWDregla debe ser posterior a esa para que tenga prioridad.

Una vez hecho esto, sudosolicitará una contraseña normalmente para todos los comandos excepto /path/to/my/program, que siempre le permitirá ejecutar sin solicitar su contraseña.

Warren Young
fuente
66
¿funcionaría esto si /path/to/my/programfuera un script de Python?
sadmicrowave
¿Puede el programa ser un alias, establecido para bash (es decir, en .bashrc) ¿O incluso un script de shell dentro /usr/local/sbin? Para probar.
Nikos Alexandris
Nikos: no, no puede ser un alias. Debe apuntar a un camino real.
Paul Hedderly
sudoers? ¿dónde está? pesado para usar su respuesta (
Vasilii Suricov
@VasiliiSuricov: Por lo general /etc, está dentro , pero algunos sistemas lo colocan en otro lugar. Si no puedes encontrarlo, inténtalo man sudoers. La ubicación local para ese archivo debe sustituirse en la manpágina en el momento en que sudose creó ese sistema.
Warren Young
135

Si hay varias entradas coincidentes /etc/sudoers, sudo usa la última. Por lo tanto, si puede ejecutar cualquier comando con una solicitud de contraseña, y desea poder ejecutar un comando en particular sin una solicitud de contraseña, necesitará la excepción al final.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Tenga en cuenta el uso de (root), para permitir que el programa se ejecute como root pero no como otros usuarios. (No otorgue más permisos que el mínimo requerido a menos que haya pensado en las implicaciones).

Nota para los lectores que no ejecutan Ubuntu o que han cambiado la configuración de sudo predeterminada (el sudo de Ubuntu está bien de forma predeterminada) : ejecutar scripts de shell con privilegios elevados es arriesgado, debe comenzar desde un entorno limpio (una vez que el shell ha comenzado, es demasiado tarde (consulte Permitir setuid en los scripts de shell ), por lo que necesita sudo para encargarse de eso). Asegúrese de que usted tiene Defaults env_reseten /etc/sudoerso que esta opción es el valor predeterminado de tiempo de compilación ( sudo sudo -V | grep envdebe incluir Reset the environment to a default set of variables).

Gilles
fuente
3
ex para ir de raíz de jhon con sudo su an no pass -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac
55
@adrian Si desea permitir comandos arbitrarios como root, haga eso john ALL=(ALL) NOPASSWD: all. No tiene sentido pasar por su.
Gilles
Pregunta: ¿debo modificar los permisos de mi script de shell para que pueda ser modificado y leído solo por el usuario root, por seguridad? Estoy pensando en un atacante que modifique el script, que tiene todos los permisos otorgados sin la necesidad de una contraseña, para que haga lo que quiere. Obviamente, el atacante ni siquiera puede leer el archivo sudoers para saber qué scripts tienen este privilegio, pero aún puede intentar con todos mis scripts personalizados una vez que encuentra la carpeta en la que están almacenados con la esperanza de que algunos estén permitidos, o algo así. .
Jeffrey Lebowski
1
@JeffreyLebowski Si tiene una regla de sudo que ejecuta el script (directa o indirectamente), entonces es vital que solo la raíz (o las personas que tienen privilegios de root de todos modos) puedan escribir en el archivo del script, y en el directorio que contiene el archivo del script, y en su directorio padre y así sucesivamente. No importa que alguien pueda leer el archivo de secuencia de comandos (a menos que contenga una contraseña o algo así, pero es una mala idea, si hay una contraseña debe estar en su propio archivo, de lo contrario, hay demasiado riesgo de que se filtre accidentalmente, p. Ej. copiar y pegar esa sección del código en una pregunta de este sitio).
Gilles
1
@alper No. Muy pocas cosas requieren reiniciar. Después de cambiar sudoers, no es necesario hacer nada especial: sudocheques cada vez.
Gilles
24

ADVERTENCIA : esta respuesta se ha considerado insegura. Ver comentarios a continuación

Solución completa: los siguientes pasos lo ayudarán a lograr el resultado deseado:

  1. Cree un nuevo archivo de script (reemplace create_dir.shcon el nombre de script deseado):

    vim ~/create_dir.sh
    

    El script se creará en el directorio de inicio del usuario.

  2. Añadir algunos comandos que sólo una rooto sudousuario puede ejecutar como crear una carpeta en el nivel de directorio raíz:

    mkdir /abc
    

    Nota: No agregue sudoa estos comandos. Guardar y salir (usando :wq!)

  3. Asignarle permisos de ejecución usando:

    sudo chmod u+x create_dir.sh
    
  4. Realice cambios para que este script no requiera una contraseña.

    1. Abre el sudoersarchivo:

      sudo visudo -f /etc/sudoers
      
    2. Agregue la siguiente línea al final:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Reemplace ahmadcon su nombre de usuario. También asegúrese de que esta sea la última línea. Guardar y Salir.

  5. Ahora, cuando ejecute el comando, agregue sudoantes:

    sudo ./create_dir.sh
    

    Esto ejecutará los comandos dentro del archivo de script sin pedir una contraseña.

Siga los sencillos pasos mencionados aquí http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

M. Ahmad Zafar
fuente
Sería mejor si proporcionara los pasos relevantes aquí y utilizara el enlace como respaldo para obtener información más detallada. De esa manera, su respuesta conserva el valor posible incluso si ese enlace ya no sería válido.
Anthon
15
Este consejo es inseguro. La sudoparte de sudo chmod u+x create_dir.shes innecesaria ya que el usuario tiene (presumiblemente) la propiedad sobre su directorio de inicio. Dado que el usuario puede escribir create_dir.sh, efectivamente le ha dado un shell raíz gratuito a ese usuario.
Lekensteyn
1
@Lekensteyn Lo que significa también para cualquier programa que se ejecute como usuario. También podría permitir al usuario ejecutar cualquier cosa con sudo sin contraseña.
Pydsigner
2
¿Me estoy perdiendo de algo? Creo que todo chmodes innecesario, ya que confías en sudoelevar tus privilegios.
G-Man
10

Creo que tu sintaxis está mal. Al menos uso lo siguiente que me funciona:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
musiKk
fuente
66
La (ALL)parte es opcional, dejarla afuera tiene exactamente el mismo efecto. Sin (root)embargo, tener sería mejor, pero su ausencia no explica el problema.
Gilles
¡+1 para sudo para este comando y nada más! No hay razón para romper todo el sistema ...
Johan
3
@Johan: Eso ya estaba en la pregunta.
Gilles
5

Si desea evitar tener que usar sudo ni cambiar el archivo de configuración de sudoers, puede usar:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Esto hará que el comando se ejecute como root sin la necesidad de sudo.

linuxgnuru
fuente
Wow, nunca había oído hablar de esta solución antes, alucinante
algo, el
¿Por qué necesito desplazarme al final de estas cosas para encontrar la mejor respuesta? Gracias por esta solución simple y segura.
RyanNerd
5

Si tiene una distribución como Manjaro, primero debe tratar con un archivo que anula la definición de / etc / sudoers, puede eliminarlo o trabajar directamente con ese archivo para agregar sus nuevas configuraciones.

Este archivo es:

sudo cat /etc/sudoers.d/10-installer

La ÚNICA forma de verlo está bajo privilegios de root, no puede enumerar este directorio sin él, este archivo es específico de Manjaro, puede encontrar esta configuración con otro nombre, pero en el mismo directorio.

En el archivo que elija, puede agregar las siguientes líneas para obtener las configuraciones deseadas:

Ignorar la autenticación para un grupo

%group ALL=(ALL) NOPASSWD: ALL

o Ignorar la autenticación de un usuario

youruser ALL=(ALL) NOPASSWD: ALL

o Ignorar la autenticación de un ejecutable para un usuario específico

youruser ALL=(ALL) NOPASSWD: /path/to/executable

NOTA RÁPIDA: está abriendo una puerta para usar SUDO sin autenticación, eso significa que puede ejecutar todo modificando todo desde su sistema, úselo con responsabilidad.

Lyoneel
fuente
4

Verifique que sudo no tenga alias. Corre asi

/usr/bin/sudo /path/to/my/program

Por ejemplo, un alias de shell como este:

alias sudo="sudo env PATH=$PATH"

puede causar este comportamiento.

Sepero
fuente
Tienes razón, mi comentario estaba fuera de servicio aquí , lo siento. Sin embargo, estoy intrigado: ¿cómo espera que los alias cambien el procesamiento de sudoerssudo? ¿O estás hablando de redirigir sudoa algo que siempre imprime este mensaje de error para sacar las contraseñas? Ese es el caso poco probable aquí ...
Peter
2
Estaba teniendo el mismo problema que el OP. Resultó ser causado por tener alias sudo="sudo env PATH=$PATH"en mi ~/.bashrc. En lugar de solo resolverlo por mí mismo y seguir ocupándome ciegamente de mi negocio, presenté mi respuesta como una posible solución para cualquier otra persona que se encuentre en este hilo.
Sepero
1
Eso está bien, pero cuando no es obvio (que en este caso no es al menos para algunas personas) es bueno poner una explicación en la respuesta para proporcionar algo de contexto y evitar que las personas usen encantamientos mágicos a ciegas. +2 (- (- 1) + +1). :)
peterph
2

Cuando ejecutas tu script necesitas ejecutarlo como sudo /path/to/my/script.

Editar: según su comentario a otra respuesta, desea ejecutar esto desde un icono. Deberá crear un .desktoparchivo que ejecute su programa con sudo, al igual que en el terminal.

También podría considerar usar gtk-sudouna solicitud visual de contraseña.

Probablemente debería considerar la idea de que no debería ejecutar las cosas como root y que cambiar el sistema más adelante para que no necesite permisos de root sea una mejor manera de hacerlo.

Caleb
fuente
77
No haga scripts de shell setuid . Consulte Permitir setuid en scripts de shell .
Gilles
Considere ni siquiera mencionarlo porque es una muy mala opción. ¡Lo eliminé porque me preocupa que este autor de la pregunta pueda usar el consejo incluso con la advertencia de que era un mal consejo!
Caleb
2

Esto resolvió el problema para mí (también probé algunas de las otras respuestas, que podrían haber ayudado):

El script al que estaba llamando estaba en /usr/binun directorio para el que no tengo permisos de escritura (aunque generalmente puedo leer cualquier archivo allí). El script tenía chmodded + x (permiso ejecutable), pero aún no funcionaba. Moviendo este archivo a una ruta en mi directorio de inicio, en lugar de /usr/bin, finalmente pude llamarlo con sudo sin ingresar una contraseña.

También algo que dudé (aclarando para futuros lectores): debe ejecutar su script como sudo. Escriba sudocuando llame al script. No lo use sudopara el comando dentro de su script que realmente necesita root (cambiar la luz de fondo del teclado en mi caso). Quizás eso también funcione, pero no es necesario, y parece una mejor solución para no hacerlo.

Luc
fuente
El segundo párrafo tenía la respuesta a mi problema
M. Ahmad Zafar
@MuhammadAhmadZafar Me alegro de que haya ayudado.
Luc
44
En realidad, usar sudodentro de un script está perfectamente bien siempre que tenga los derechos apropiados (establecidos sudoers) para ejecutar el comando en cuestión sin una contraseña. Hace las cosas un poco más seguras.
Peter
Realmente podría usar esta respuesta reescrita como un paso a paso 'así es como lo haces' en lugar de un diálogo con las otras respuestas
Walrus the Cat
@WalrustheCat Buen punto. Al releer mi respuesta, creo que podría haberme confundido un poco. Sin embargo, en este momento, no recuerdo cuál era la situación exacta, así que realmente no puedo hacer una mejor redacción. Si lo resuelve, quizás una combinación de varias respuestas, ¡presente una nueva respuesta!
Luc
1

Otra posibilidad podría ser instalar, configurar y luego usar el supercomando para ejecutar su script como

super /path/to/your/script

Si desea ejecutar alguna binario ejecutable (por ejemplo, que ha compilado en ELF binario a partir de un cierto código fuente de C), lo cual es no un Script como root, es posible considerar la posibilidad de que setuid (y, de hecho /bin/login, /usr/bin/sudoy /bin/su, y supertodos están usando esa técnica ) Sin embargo, tenga mucho cuidado, podría abrir un gran agujero de seguridad .

Concretamente, su programa debe estar codificado paranoicamente (así que verifique todos los argumentos y el entorno y las condiciones externas antes de "actuar", suponiendo que sea un usuario potencialmente hostil), entonces puede usar seteuid (2) y amigos (ver también setreuid (2) ) cuidadosamente (ver también capacidades (7) y credenciales (7) y execve (2) ...)

Utilizará chmod u+s(lea chmod (1) ) cuando instale dicho binario.

Pero ten mucho cuidado .

Lea muchas cosas sobre setuid , incluida la Programación avanzada de Linux , antes de codificar tal cosa.

Tenga en cuenta que un script, o cualquier cosa de shebang , no se puede configurar. Pero podría codificar (en C) un pequeño setuid-binario envolviéndolo.

Basile Starynkevitch
fuente
0

Idealmente, si está personalizando qué comandos se pueden ejecutar sudo, debería realizar estos cambios en un archivo separado en /etc/sudoers.d/lugar de editar el sudoersarchivo directamente. También debe usar siempre visudopara editar los archivos. NUNCA debe otorgar NOPASSWDlos ALLcomandos.

Ejemplo: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Inserte su línea otorgando permiso: myuser ALL= NOPASSWD: /path/to/your/program

Luego guarde y salga y visudole avisará si tiene algún error de sintaxis.

Puede ejecutar sudo -lpara ver los permisos que se le han otorgado a su usuario, si alguno de los NOPASSWDcomandos específicos del usuario aparece ANTES de cualquier %groupyouarein ALL=(ALL) ALLcomando en la salida, se le solicitará su contraseña.

Si se encuentra creando muchos de estos archivos sudoers.d, entonces tal vez desee crearlos nombrados por usuario para que sean más fáciles de visualizar. Tenga en cuenta que el orden de los NOMBRES DE ARCHIVO y de las REGLAS dentro del archivo es muy importante, el ÚLTIMO cargado gana, ya sea MÁS o MENOS permisivo que las entradas anteriores.

Puede controlar el orden de los nombres de archivo utilizando un prefijo de 00-99 o aa / bb / cc, aunque también tenga en cuenta que si tiene CUALQUIER archivo que no tenga un prefijo numérico, se cargará después de los archivos numerados, anulando la configuración. Esto se debe a que, según la configuración de su idioma, la "clasificación léxica" que utiliza el shell clasifica primero los números y luego puede intercalar mayúsculas y minúsculas al ordenar en orden "ascendente".

Intente ejecutar printf '%s\n' {{0..99},{A-Z},{a-z}} | sorty printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortver si su idioma actual se imprime, AaBbCcetc. o ABCluego abcpara determinar cuál sería el mejor "último" prefijo de letra para usar.

dragon788
fuente
0

Para permitir que cualquier usuario ejecute el programa como sudo sin pedir contraseña, puede agregar la siguiente línea

%sudo ALL=(root) NOPASSWD: /path/to/your/program

en /etc/sudoers

Tenga en cuenta que % sudo lo hace.

ultimatex
fuente
Si bien esa es una forma de lograr una regla de sudo, no responde a la pregunta sobre por qué establecer el indicador NOPASSWD en esta regla todavía dio como resultado una solicitud de contraseña. Vea la respuesta aceptada para una idea de por qué sucedió.
Jeff Schaller
0

Lo siguiente es para el caso en el que desea ejecutar un comando sin contraseña solo si tiene un conjunto específico de opciones, donde una parte de las opciones es variable . AFAIK no es posible usar variables o rangos de valores en las declaraciones de sudoers, es decir, puede permitir el acceso explícito a, command option1pero no command option2usar:

user_name ALL=(root) /usr/bin/command option1

pero si la estructura es command option1 value1, donde value1puede variar, necesitaría tener líneas sudoers explícitas para cada valor posible de value1. El script de Shell proporciona una forma de evitarlo.

Esta respuesta fue inspirada por la respuesta de M. Ahmad Zafar y soluciona el problema de seguridad allí.

  1. Cree un script de shell donde llame al comando sin sudo.
  2. Guarde el script en una carpeta con privilegios de root (por ejemplo /usr/local/bin/), haga que el archivo sea propiedad de root (por ejemplo chown root:wheel /usr/local/bin/script_name) sin acceso de escritura para otros (por ejemplo chmod 755 /usr/local/bin/script_name).
  3. Agregue la excepción a los sudoers usando visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Ejecutar la secuencia de comandos sudo script_name.

Por ejemplo, quiero cambiar el tiempo de espera de la pantalla en macOS. Esto se hace usando:

sudo pmset displaysleep time_in_minutes

Considero que cambiar el tiempo de espera del sueño es una acción inocente que no justifica la molestia de escribir una contraseña, pero pmsetpuede hacer muchas cosas y me gustaría mantener estas otras cosas detrás de la contraseña de sudo.

Entonces tengo el siguiente script en /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

Al final del sudoersarchivo tengo la siguiente línea:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Para establecer el tiempo de espera en 3 minutos, ejecuto mi script desde la cuenta de usuario normal user_name:

sudo ds 3

PD La mayor parte de mi script es validación de entrada, que no es obligatoria, por lo que lo siguiente también funcionaría:

#!/bin/bash
pmset displaysleep $1 
Koit Saarevet
fuente