¿Por qué el comando sudo no necesita la contraseña de root?

48

He estado usando Linux por un tiempo y cada vez que escribía sudopensaba que me estaba cambiando al usuario root por un comando.

Aparentemente esto no es cierto porque todo lo que necesito es la contraseña de mi cuenta de usuario. Supongo que dado que no he trabajado con varios usuarios, realmente no me he dado cuenta de esto en el mundo real.

No estoy seguro de cómo Ubuntu configura mi primera cuenta. ¿Hay un usuario root? ¿Soy root? Supongo que acabo de crear un nuevo usuario después de la instalación, pero ¿me dio privilegios de root? Solo un poco confundido aquí ...

Entonces, ¿por qué puedo ejecutar comandos raíz con la contraseña de mi usuario?

EGHDK
fuente
¿Con qué usuario necesita la contraseña y en qué no? ¿Qué comando estás ejecutando? Recuerde que sudo almacena su contraseña por un tiempo antes de que tenga que volver a escribirla.
Braiam
11
sudotiene el bit "setuid" establecido. Por lo tanto, se ejecuta como el usuario que lo posee (que es root en todos los sistemas estándar si no me equivoco), no como el usuario que lo inicia. sudoluego carga el /etc/sudoersarchivo y comprueba lo que está permitido en función de quién lo lanzó.
LawrenceC
1
Lo siento si estoy repitiendo algo que alguien más dijo, pero no pude encontrarlo. La respuesta es: es una decisión política. Mi mejor conjetura sobre la motivación es que, en una instalación grande donde tiene muchas personas con sudoprivilegios, tal vez trabajando en ubicaciones distribuidas geográficamente y en turnos 24 × 7, desea poder revocar el acceso privilegiado de una persona de inmediato (por ejemplo, si sospechas de su integridad). Si todo el mundo usa la contraseña raíz única y la cambia sin coordinación previa, puede producirse un caos. ...
G-Man dice 'Restablecer a Mónica' el
1
@HagenvonEitzen Sé que llego un par de días tarde, pero ¿cómo es que esto no es un engaño de nuestra pregunta?
strugee

Respuestas:

65

En detalles funciona de la siguiente manera:

  1. /usr/bin/sudoel archivo ejecutable tiene un conjunto de bits setuid , por lo que incluso cuando lo ejecuta otro usuario, se ejecuta con la identificación de usuario del propietario del archivo (root en ese caso).

  2. sudocomprueba en el /etc/sudoersarchivo qué privilegios tiene y si tiene permiso para ejecutar el comando que está invocando. Dicho simplemente, /etc/sudoerses un archivo que define qué usuarios pueden ejecutar qué comandos utilizando el sudomecanismo.

    Así es como se ve ese archivo en mi Ubuntu:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    La tercera línea es lo que presumiblemente te interesa. Permite que cualquiera en el grupo "sudo" ejecute cualquier comando como cualquier usuario.

    Cuando Ubuntu configura la primera cuenta durante la instalación, agrega esa cuenta al grupo "sudo". Puede verificar a qué grupos pertenecen los usuarios con el groupcomando.

  3. sudote pide una contraseña En cuanto al hecho de que necesita la contraseña del usuario, no la de la raíz, es un extracto del manual de sudoers :

    Autenticación y registro

    La política de seguridad de sudoers requiere que la mayoría de los usuarios se autentiquen antes de poder usar sudo. No se requiere una contraseña si el usuario que invoca es root, si el usuario objetivo es el mismo que el usuario que invoca, o si la política ha deshabilitado la autenticación para el usuario o comando. A diferencia de su (1), cuando sudoers requiere autenticación, valida las credenciales del usuario que invoca, no las credenciales del usuario objetivo (o de la raíz). Esto se puede cambiar a través de los indicadores rootpw, targetpw y runaspw, descritos más adelante.

    Sin embargo, de hecho, sudono necesita su contraseña de usuario para nada. Se lo solicita solo para asegurarse de que realmente es usted y para proporcionarle algún tipo de advertencia (o la posibilidad de detenerse) antes de invocar algún comando potencialmente peligroso. Si desea desactivar la solicitud de contraseña, cambie la entrada de sudoers a:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Después de que la autenticación sudogenera el proceso hijo que ejecuta el comando invocado. El hijo hereda el ID de usuario raíz de su padre: el sudoproceso.


Entonces, respondiendo sus preguntas con precisión:

Pensé que estaba cambiando al usuario root por un comando.

Usted tenía razón. Cada comando precedido de se sudoejecuta con el ID de usuario raíz.

¿Hay un usuario root?

Sí, hay una cuenta de usuario root, separada de su cuenta de usuario creada durante la instalación del sistema. Sin embargo, de manera predeterminada en Ubuntu no puede iniciar sesión en la terminal interactiva como usuario root.

¿Soy root?

No, no eres una raíz. Usted sólo tiene privilegios para ejecutar comandos individuales como una raíz , mediante el sudomecanismo descrito anteriormente.

Entonces, ¿por qué puedo ejecutar comandos raíz con la contraseña de mi usuario?

Debe ingresar la contraseña del usuario solo debido al sudomecanismo de seguridad interno. Se puede apagar fácilmente. Obtienes tus poderes de raíz por el bit setuid /usr/bin/sudo, no por las contraseñas que ingresas.

Piotr Jurkiewicz
fuente
66
La respuesta realmente debería comenzar con la parte setuid, porque esa es la razón por la que es realmente posible. / etc / sudoers es solo la razón de la flexibilidad del comando sudo.
daniel kullmann
Interesante. No sabía que podía especificar que sudopodría ejecutarse sin ingresar mi contraseña. ¡Gran respuesta!
jwir3
1
Tenga en cuenta que sudo se puede configurar para solicitar la contraseña de root con el rootpwindicador sudoers.
Restablecer a Monica - M. Schröder
2
De hecho, puede iniciar sesión como usuario root: sudo su - roothará exactamente eso y le dará un terminal raíz. Sin embargo, no puede iniciar sesión fácilmente en una sesión de escritorio como root.
jmiserez
1
Básicamente sudotiene el privilegio de root por sí mismo, y decide si se lo imparte en función de un archivo de configuración.
Siyuan Ren
15
  • El objetivo sudoes otorgarle los privilegios de otra persona (generalmente root) sin solicitar la contraseña de esta otra cuenta (a diferencia su).

  • sudo está solicitando aquí su contraseña solo para asegurarse de que un transeúnte no utilice incorrectamente su terminal desbloqueado.

  • Ubuntu y muchos otros sistemas operativos Linux y Unix están otorgando a una cuenta inicial creada en el momento de la instalación el derecho de ejecutar cualquier comando como root.

  • Si bien roottodavía es una cuenta en Linux, los rootinicios de sesión directos están deshabilitados de forma predeterminada para una mejor seguridad y trazabilidad.

jlliagre
fuente
77
Aunque el inicio de sesión raíz directo está deshabilitado de forma predeterminada, todavía hay una cuenta raíz con Ubuntu. Ya no es una cuenta en Solaris, por lo menos, donde es un rol por defecto.
jlliagre
Muchas gracias. Siempre me pregunté cómo funcionaba eso, y ahora tiene mucho más sentido.
mikeserv
5

Piotr dio una muy buena explicación de cómo sudofunciona. Sin embargo, él realmente no motivó por qué funciona de esta manera, así que intentaré agregar eso aquí.

Antes de sudocrear el comando, teníamos el sucomando. Este comando permite que un usuario ejecute comandos como otro usuario, por lo general root(como con sudo, este es el usuario objetivo predeterminado). Fue totalmente indiscriminado, puede ejecutar cualquier comando. Como podía ser utilizado por cualquier usuario, era efectivamente equivalente a iniciar sesión como ese usuario, requería que conociera la contraseña del usuario objetivo.

En algún momento, se agregó un poco más de control de acceso: para usar su, tenía que ser miembro del wheelgrupo. Pero como todavía podía ejecutar cualquier comando, tenía sentido exigirle que conociera su contraseña.

Sin embargo, exigir a los usuarios que conocieran la contraseña del otro o del superusuario no era muy seguro. A menudo solo desea dar a ciertos usuarios acceso limitado a alguna otra cuenta (esto es parte de un concepto de seguridad llamado principio de mínimo privilegio ). También dificulta la rendición de cuentas: si varias personas conocen la contraseña de una cuenta, y esa cuenta está involucrada en un error o abuso, no se puede saber cuál de ellas realmente lo hizo.

Así sudofue creado. En lugar de permitir a los usuarios ejecutar cualquier comando, tiene un archivo de configuración elaborado, brevemente mencionado en la respuesta de Piotr, que especifica con precisión quién puede usarlo, a qué usuarios pueden cambiar y qué comandos pueden ejecutar. Con este control detallado sobre quién puede hacer qué a quién, ya no necesitamos darles a los usuarios la contraseña de la cuenta de destino; si lo hiciéramos, podrían omitir fácilmente todos los controles en el archivo de configuración iniciando sesión como ese usuario. En cambio, normalmente solo les pedimos que demuestren que son las personas con las que iniciaron sesión, ingresando su propia contraseña; esto tiene la intención de evitar que alguien aproveche una cuenta si el terminal se deja desatendido.

Este requisito no se aplica al superusuario: esta cuenta puede hacer casi cualquier cosa al sistema sin usar sudo, por lo que se consideró superfluo. También es posible especificar en el archivo de configuración que los usuarios no tienen que ingresar una contraseña; algunas organizaciones usan esto cuando creen que la seguridad física del entorno de su estación de trabajo es suficiente para evitar abusos.

Barmar
fuente
No he explorado esto, pero entiendo que una de las características de sudo que su no tiene es que (¿puede?) Mantener un registro de qué comandos fueron ejecutados por cada usuario para que sea más fácil rastrear los problemas hasta sus fuentes Acabo de mirar mi sistema kubuntu y no veo ese registro, por lo que tal vez este no sea un comportamiento predeterminado.
Joe
Acabo de encontrar el inicio de sesión de sudo en /var/log/auth.log, junto con muchas otras cosas, incluidas algunas IP de China que intentan obtener acceso ssh raíz a mi sistema, por lo que, si solo desea ver sudo, debe filtrar a través de grep o similar.
Joe
Correcto. sutambién registra, pero como solo inicia un nuevo shell, solo registra el hecho de que alguien lo ejecutó.
Barmar
No puede confiar en los registros, cualquiera que pueda obtener root puede cambiar los registros (a menos que inicie sesión en otra máquina y se asegure de no dar acceso hasta que se complete la transacción de registro). Sin embargo sudo, permite que se revoquen los privilegios, sin tener que volver a emitir la contraseña de root a todos los que la necesiten.
ctrl-alt-delor
1
@richard Dado sudoque le permite restringir qué comandos puede ejecutar un usuario, puede intentar asegurarse de no darles acceso a los comandos que sobrescribirían el registro.
Barmar
3

La respuesta a tu pregunta es:

Cuando ejecuta un comando con sudo , ejecuta el comando con privilegios elevados , es decir, privilegios de raíz . Solo tiene que escribir su contraseña de usuario normal porque usted (el usuario) ha sido agregado al archivo sudoers que le brinda privilegios de root .

algo algo
fuente
2
Excepto que sudo no implica privilegios elevados, solo diferentes para el usuario actual. Por ejemplo, podría ejecutar un programa como un usuario normal que no tiene un shell. Además, estar en el archivo sudoers no da root.
James Tocknell
1
@aragilar yes sudono siempre otorga privilegios elevados, pero se ejecuta con privilegios elevados, después de hacer lo suyo (verificando la autenticación, puede perder privilegios). Necesita estos privilegios elevados para poder cambiar de usuario.
ctrl-alt-delor
1
Claro, sudohace uso de privilegios elevados (pero eso no es única para sudo, por ejemplo, montar también lo hace), pero el comando que llame es decir, commanden la sudo commandque no puede (dependiendo de lo que se establece en /etc/sudoers).
James Tocknell
1

Primero, la desactivación de una cuenta generalmente se realiza configurando la contraseña cifrada en *, que no es el valor cifrado de ninguna cadena. No puedo comprobarlo ahora, pero creo que eso es lo que Ubuntu hace también para root. Entonces, técnicamente, no hay una contraseña de root en Ubuntu.

Pero sudo precede a Ubuntu; Fue diseñado para sistemas donde ciertamente había contraseñas raíz. Entonces, ¿por qué no requiere la contraseña de root? Básicamente, sudo está diseñado para dar permiso para ejecutar comandos específicos a ciertos usuarios, por ejemplo, permitir que un desarrollador tenga acceso root para reiniciar la aplicación web, pero no para iniciar servidores arbitrarios. Conocer la contraseña de root, por otro lado, le brinda acceso ilimitado; puede usar login o su para abrir un shell raíz y ejecutar comandos arbitrarios. Como sudo tiene que funcionar para personas sin ese nivel de acceso, no puede requerir la contraseña de root para ejecutarse.

Jonathan Cast
fuente
También le permite a uno revocar los privilegios de root de un usuario sin tener que cambiar la contraseña de root.
Ian D. Scott