Manuales para la línea de comandos

Man » Manual de sudo en línea: documentación detallada en línea para la página de manual de sudo

🌍
sudo, sudoedit — ejecutar un comando como otro usuario

SINOPSIS

sudo -h | -K | -k | -V
sudo -v [-ABkNnS] [-g grupo] [-h host] [-p indicador] [-u usuario]
sudo -l [-ABkNnS] [-g grupo] [-h host] [-p indicador] [-U usuario] [-u usuario] [comando [arg ...]]
sudo  [-ABbEHnPS]  [-C  núm]  [-D  directorio]  [-g  grupo]  [-h  host] [-p indicador] [-R directorio]
[-r rol] [-t tipo] [-T tiempo de espera] [-u usuario] [VAR=valor] [-i | -s] [comando [arg ...]]
sudoedit [-ABkNnS] [-C núm] [-D directorio] [-g  grupo]  [-h  host]  [-p  indicador]  [-R  directorio]
[-r rol] [-t tipo] [-T tiempo de espera] [-u usuario] archivo ...

DESCRIPCIÓN

sudo  permite a un usuario autorizado ejecutar un comando como superusuario o como otro usuario, según
lo especificado por la política de seguridad.  El ID de usuario real (no el efectivo) del usuario que invoca se utiliza para determinar
el nombre de usuario con el que consultar la política de seguridad.

sudo  admite  una  arquitectura  de  complementos  para  políticas  de  seguridad,  auditoría  y

registro de entrada/salida. Los terceros pueden desarrollar y distribuir sus propios complementos para que funcionen sin problemas con el front-end de sudo. La política de seguridad predeterminada es sudoers, que se configura mediante el archivo /etc/sudoers o mediante LDAP. Consulte la sección "Complementos" para obtener más información.

La política de seguridad determina qué privilegios, si los hay, tiene un usuario para ejecutar sudo. La política puede requerir que los usuarios se autentiquen con una contraseña u otro mecanismo de autenticación. Si se requiere autenticación, sudo finalizará si el usuario no introduce su contraseña dentro de un límite de tiempo configurable. Este límite es específico de la política; el límite de tiempo predeterminado para la solicitud de contraseña para la política de seguridad sudoers es de 0 minutos.

Las políticas de seguridad pueden admitir el almacenamiento en caché de credenciales para permitir que el usuario ejecute sudo de nuevo durante un período de tiempo sin necesidad de autenticación. De forma predeterminada, la política sudoers almacena en caché las credenciales por terminal durante 15 minutos. Consulte las opciones timestamp_type y timestamp_timeout en sudoers(5) para obtener más información. Al ejecutar sudo con la opción -v, un usuario puede actualizar las credenciales almacenadas en caché sin ejecutar un comando.

En los sistemas donde sudo es el método principal para obtener privilegios de superusuario, es fundamental evitar errores de sintaxis en los archivos de configuración de la política de seguridad. Para la política de seguridad predeterminada, sudoers(5), los cambios en los archivos de configuración deben realizarse con la utilidad visudo(8) que garantizará que no se introduzcan errores de sintaxis.

Cuando se invoca como sudoedit, se implica la opción -e (descrita a continuación).

Las políticas de seguridad y los complementos de auditoría pueden registrar los intentos de ejecutar sudo, tanto si tienen éxito como si fallan. Si se configura un complemento de E/S, el comando que se está ejecutando puede también registrar su entrada y salida.


Las opciones son las siguientes:

-A, --askpass

Normalmente, si sudo requiere una contraseña, la leerá desde el terminal del usuario. Si se especifica la opción -A (askpass), se ejecutará un programa auxiliar (posiblemente gráfico) para leer la contraseña del usuario y mostrar la contraseña en la salida estándar. Si la variable de entorno SUDO_ASKPASS está configurada, especifica la ruta al programa auxiliar. De lo contrario, si sudo.conf(5) contiene una línea que especifica el programa askpass, se utilizará ese valor. Por ejemplo:

# Ruta al programa auxiliar askpass

Path askpass /usr/bin/ssh-askpass

Si no hay disponible ningún programa askpass, sudo saldrá con un error.

-B, --bell

Hace sonar la campana como parte de la solicitud de contraseña cuando hay un terminal presente. Esta opción no tiene ningún efecto si se utiliza un programa askpass.

-b, --background

Ejecuta el comando dado en segundo plano. No es posible utilizar el control de trabajos del shell para manipular los procesos en segundo plano iniciados por sudo. La mayoría de los comandos interactivos no funcionarán correctamente en modo de segundo plano.

-C num, --close-from=num

Cierra todos los descriptores de archivo mayores o iguales que num antes de ejecutar un comando. No se permiten valores menores que tres. Por defecto, sudo cerrará todos los descriptores de archivo abiertos, excepto la entrada estándar, la salida estándar y el error estándar, al ejecutar un comando. La política de seguridad puede restringir la capacidad del usuario para utilizar esta opción. La política de sudoers solo permite el uso de la opción -C cuando el administrador ha habilitado la opción closefrom_override.

-D directorio, --chdir=directorio

Ejecuta el comando en el directorio especificado en lugar del directorio de trabajo actual. La política de seguridad puede devolver un error si el usuario no tiene permiso para especificar el directorio de trabajo.

-E, --preserve-env

Indica a la política de seguridad que el usuario desea conservar sus variables de entorno existentes. La política de seguridad puede devolver un error si el usuario no tiene permiso para conservar el entorno.

--preserve-env=lista

Indica a la política de seguridad que el usuario desea agregar la lista separada por comas de variables de entorno a las que se conservan del entorno del usuario. La política de seguridad puede devolver un error si el usuario no tiene permiso para conservar el entorno. Esta opción se puede especificar varias veces.

-e, --edit

Edita uno o más archivos en lugar de ejecutar un comando. En lugar de una ruta, se utiliza la cadena "sudoedit" al consultar la política de seguridad. Si el usuario está autorizado por la política, se realizan los siguientes pasos:

    Se crean copias temporales de los archivos que se van a editar, con el propietario establecido en el usuario que invoca el comando.

    Se ejecuta el editor especificado por la política para editar los archivos temporales. La política de sudoers utiliza las variables de entorno SUDO_EDITOR, VISUAL y EDITOR (en ese orden). Si no se establece ninguna de las variables de entorno SUDO_EDITOR, VISUAL o EDITOR, se utiliza el primer programa que aparece en la opción editor de sudoers(5).

Si se han modificado, los archivos temporales se copian de nuevo a su ubicación original y las versiones temporales se eliminan.

Para ayudar a evitar la edición de archivos no autorizados, se aplican las siguientes restricciones, a menos que la política de seguridad lo permita explícitamente:

Los enlaces simbólicos no se pueden editar (versión 1.8.15 y superior).

Los enlaces simbólicos a lo largo de la ruta que se va a editar no se siguen cuando el directorio principal es escribible por el usuario que invoca, a menos que ese usuario sea root (versión 1.8.16 y superior).

Los archivos ubicados en un directorio que es escribible por el usuario que invoca no se pueden editar a menos que ese usuario sea root (versión 1.8.16 y superior).

Los usuarios nunca tienen permitido editar archivos especiales de dispositivo.

Si el archivo especificado no existe, se creará. A diferencia de la mayoría de los comandos que se ejecutan con sudo, el editor se ejecuta con el entorno del usuario que invoca sin modificaciones. Si, por alguna razón, el archivo temporal queda vacío después de la edición, se le pedirá al usuario que confirme antes de que se instale.

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.

-g grupo, --group=grupo
Ejecute el comando con el grupo principal establecido en grupo en lugar del grupo principal especificado en la entrada de la base de datos de contraseñas del usuario de destino. El grupo puede ser un nombre de grupo o un ID de grupo numérico (GID) precedido por el carácter '#' (por ejemplo, '#0' para el GID 0). Cuando se ejecuta un comando como un GID, muchos shells requieren que el '#' se escape con una barra invertida ('\'). Si no se especifica una opción -u, el comando se ejecutará como el usuario que lo invoca. En cualquier caso, el grupo principal se establecerá en grupo. La política de sudoers permite que se especifique cualquiera de los grupos del usuario de destino mediante la opción -g, siempre que no se esté utilizando la opción -P.

-H, --set-home
Solicite que la política de seguridad establezca la variable de entorno HOME en el directorio de inicio especificado en la entrada de la base de datos de contraseñas del usuario de destino. Dependiendo de la política, este puede ser el comportamiento predeterminado.

-h, --help
Muestre un breve mensaje de ayuda en la salida estándar y salga.

-h host, --host=host
Ejecute el comando en el host especificado si el complemento de la política de seguridad admite comandos remotos. El complemento de sudoers no admite actualmente la ejecución de comandos remotos. Esto también se puede usar en conjunto con la opción -l para enumerar los privilegios de un usuario para el host remoto.

-i, --login
Ejecute el shell especificado en la entrada de la base de datos de contraseñas del usuario de destino como un shell de inicio de sesión. Esto significa que los archivos de recursos específicos del inicio de sesión, como .profile, .bash_profile o .login, se leerán por el shell. Si se especifica un comando, se pasa al shell como un comando simple utilizando la opción -c. El comando y cualquier argumento se concatenan, separados por espacios, después de que cada carácter (incluido el espacio en blanco) se escape con una barra invertida ('\'), excepto por los caracteres alfanuméricos, los guiones bajos, los guiones y los signos de dólar. Si no se especifica ningún comando, se ejecuta un shell interactivo. Sudo intenta cambiar al directorio de inicio de ese usuario antes de ejecutar el shell. El comando se ejecuta con un entorno similar al que recibiría un usuario al iniciar sesión. La mayoría de los shells se comportan de manera diferente cuando se especifica un comando en comparación con una sesión interactiva; consulte el manual del shell para obtener más detalles. La sección Entorno de comandos en el manual de sudoers(5) documenta cómo la opción -i afecta el entorno en el que se ejecuta un comando cuando se utiliza la política de sudoers.

-K, --remove-timestamp
Similar al -k, excepto que elimina cada credencial almacenada en caché para el usuario, independientemente de la terminal o el ID del proceso padre. La próxima vez que se ejecute sudo, se deberá ingresar una contraseña si la política de seguridad lo requiere. No es posible usar la opción -K en conjunto con un comando u otra opción. Esta opción no requiere una contraseña. No todas las políticas de seguridad admiten el almacenamiento en caché de credenciales.

-k, --reset-timestamp
Cuando se usa sin un comando, invalida las credenciales almacenadas en caché del usuario para la sesión actual. La próxima vez que se ejecute sudo en la sesión, se deberá ingresar una contraseña si la política de seguridad lo requiere. Por defecto, la política de sudoers utiliza un registro separado en la caché de credenciales para cada terminal (o ID del proceso padre si no hay terminal presente). Esto evita que la opción -k interfiera con los comandos sudo que se ejecutan en una sesión de terminal diferente. Consulte la opción timestamp_type en sudoers(5) para obtener más información. Esta opción no requiere una contraseña y se agregó para permitir que un usuario revoque los permisos de sudo desde un archivo .logout.

Cuando se usa en conjunto con un comando o una opción que pueda requerir una contraseña, esta opción hará que sudo ignore las credenciales almacenadas en caché del usuario. Como resultado, sudo solicitará una contraseña (si la política de seguridad lo requiere) y no actualizará las credenciales almacenadas en caché del usuario.

No todas las políticas de seguridad admiten el almacenamiento en caché de credenciales.

-l, --list
Si no se especifica ningún comando, enumere los privilegios del usuario que invoca (o del usuario especificado por la opción -U) en el host actual. Se utiliza un formato de lista más largo si esta opción se especifica varias veces y la política de seguridad admite un formato de salida detallado.

Si se especifica un comando y está permitido por la política de seguridad para el usuario que invoca (o el usuario especificado por la opción -U) en el host actual, la ruta absoluta al comando se muestra junto con cualquier argumento. Si -l se especifica más de una vez (y la política de seguridad lo admite), la regla coincidente se muestra en un formato detallado junto con el comando. Si se especifica un comando pero no está permitido por la política, sudo saldrá con un valor de estado de 1.

-N, --no-update

No actualizar las credenciales en caché del usuario, incluso si el usuario se autentica correctamente. A diferencia de la opción -k, las credenciales en caché existentes se utilizan si son válidas. Para detectar cuándo las credenciales en caché del usuario son válidas (o cuándo no se requiere autenticación), se puede utilizar lo siguiente:

sudo -Nnv

No todas las políticas de seguridad admiten el almacenamiento en caché de credenciales.

-n, --non-interactive

Evitar solicitar al usuario cualquier tipo de entrada. Si se requiere una contraseña para ejecutar el comando, sudo mostrará un mensaje de error y saldrá.

-P, --preserve-groups

Conservar el vector de grupos del usuario que lo invoca sin cambios. De forma predeterminada, la política de sudoers inicializará el vector de grupos con la lista de grupos de los que es miembro el usuario de destino. Sin embargo, los ID de grupo reales y efectivos seguirán estableciéndose para que coincidan con el usuario de destino.

-p prompt, --prompt=prompt

Utilizar un mensaje de contraseña personalizado con secuencias de escape opcionales. Las siguientes secuencias de escape de porcentaje (‘%’) son admitidas por la política de sudoers:

%H se expande al nombre de host, incluido el nombre de dominio (solo si el nombre de host de la máquina está completamente calificado o si la opción fqdn está configurada en sudoers(5))

%h se expande al nombre de host local sin el nombre de dominio

%p se expande al nombre del usuario cuya contraseña se está solicitando (respeta las opciones rootpw, targetpw y runaspw en sudoers(5))

%U se expande al nombre de inicio de sesión del usuario para el que se ejecutará el comando (por defecto, root a menos que también se especifique la opción -u)

%u se expande al nombre de inicio de sesión del usuario que invoca el comando

%% dos caracteres de porcentaje (‘%’) consecutivos se combinan en un solo carácter de porcentaje (‘%’)

El mensaje personalizado anulará el mensaje predeterminado especificado por la política de seguridad o la variable de entorno SUDO_PROMPT. En los sistemas que utilizan PAM, el mensaje personalizado también anulará el mensaje especificado por un módulo PAM a menos que la opción passprompt_override esté desactivada en sudoers.

-R directory, --chroot=directory

Cambiar al directorio raíz especificado (consulte chroot(8)) antes de ejecutar el comando. La política de seguridad puede devolver un error si el usuario no tiene permiso para especificar el directorio raíz.

Esta opción está en desuso y se eliminará en una versión futura de sudo.

-r role, --role=role

Ejecutar el comando con un contexto de seguridad SELinux que incluya el rol especificado.

-S, --stdin

Escribir el mensaje en el error estándar y leer la contraseña desde la entrada estándar en lugar de utilizar el dispositivo de terminal.

-s, --shell

Ejecutar el shell especificado por la variable de entorno SHELL si está configurada o el shell especificado en la entrada de la base de datos de contraseñas del usuario que lo invoca. Si se especifica un comando, se pasa al shell como un comando simple utilizando la opción -c. El comando y cualquier argumento se concatenan, separados por espacios, después de escapar cada carácter (incluido el espacio en blanco) con una barra invertida (‘\’) excepto los caracteres alfanuméricos, guiones bajos, guiones y signos de dólar. Si no se especifica ningún comando, se ejecuta un shell interactivo. La mayoría de los shells se comportan de forma diferente cuando se especifica un comando en comparación con una sesión interactiva; consulte el manual del shell para obtener más detalles.


-t tipo, --type=tipo
Ejecuta el comando con un contexto de seguridad SELinux que incluya el tipo especificado. Si no se especifica ningún tipo, el tipo predeterminado se deriva de la función.

-U usuario, --other-user=usuario
Se utiliza en conjunto con la opción -l para listar los privilegios para un usuario diferente al que invoca el comando. La política de seguridad puede restringir la visualización de los privilegios de otros usuarios. Cuando se utiliza la política de sudoers, la opción -U está restringida al usuario raíz y a los usuarios que tienen el privilegio "list" para el usuario especificado o la capacidad de ejecutar cualquier comando como raíz o como el usuario en el host actual.

-T tiempo de espera, --command-timeout=tiempo de espera
Se utiliza para establecer un tiempo de espera para el comando. Si el tiempo de espera expira antes de que el comando haya finalizado, el comando se terminará. La política de seguridad puede restringir la capacidad del usuario para establecer tiempos de espera. La política de sudoers requiere que los tiempos de espera especificados por el usuario estén habilitados explícitamente.

-u usuario, --user=usuario
Ejecuta el comando como un usuario diferente al usuario de destino predeterminado (generalmente raíz). El usuario puede ser un nombre de usuario o un ID de usuario numérico (UID) precedido por el carácter '#' (por ejemplo, '#0' para el UID 0). Al ejecutar comandos como un UID, muchos shells requieren que el '#' se escape con una barra invertida ('\'). Algunas políticas de seguridad pueden restringir los UID a aquellos que figuran en la base de datos de contraseñas. La política de sudoers permite los UID que no están en la base de datos de contraseñas siempre que la opción targetpw no esté configurada. Otras políticas de seguridad pueden no admitir esto.

-V, --version
Imprime la cadena de versión de sudo, así como la cadena de versión de cualquier complemento configurado. Si el usuario que invoca el comando ya es raíz, la opción -V mostrará las opciones que se pasaron a configure cuando se compiló sudo; los complementos pueden mostrar información adicional, como las opciones predeterminadas.

-v, --validate
Actualiza las credenciales almacenadas en caché del usuario, autenticando al usuario si es necesario. Para el complemento de sudoers, esto extiende el tiempo de espera de sudo durante 15 minutos más por defecto, pero no ejecuta un comando. No todas las políticas de seguridad admiten las credenciales almacenadas en caché.

--
El -- se utiliza para delimitar el final de las opciones de sudo. Las opciones posteriores se pasan al comando.

Las opciones que toman un valor solo se pueden especificar una vez, a menos que se indique lo contrario en la descripción. Esto es para ayudar a evitar problemas causados por scripts mal escritos que invocan sudo con entradas controladas por el usuario.

Las variables de entorno que se establecerán para el comando también se pueden pasar como opciones a sudo en el formato VAR=valor, por ejemplo, LD_LIBRARY_PATH=/usr/local/pkg/lib. Las variables de entorno pueden estar sujetas a restricciones impuestas por el complemento de la política de seguridad. La política de sudoers somete las variables de entorno que se pasan como opciones a las mismas restricciones que las variables de entorno existentes, con una diferencia importante. Si la opción setenv está configurada en sudoers, el comando que se va a ejecutar tiene la etiqueta SETENV o el comando que coincide es ALL, el usuario puede establecer variables que de otro modo estarían prohibidas. Consulte sudoers(5) para obtener más información.

EJECUCIÓN DE COMANDOS

Cuando sudo ejecuta un comando, la política de seguridad especifica el entorno de ejecución para el comando. Normalmente, el usuario y grupo reales y efectivos, así como sus ID, se establecen para que coincidan con los del usuario de destino, según lo especificado en la base de datos de contraseñas, y el vector de grupo se inicializa en función de la base de datos de grupos (a menos que se especifique la opción -P).

Los siguientes parámetros pueden ser especificados por la política de seguridad:

ID de usuario real y efectivo
ID de grupo real y efectivo
ID de grupos suplementarios
la lista de entorno
directorio de trabajo actual
máscara de creación de archivos (umask)
rol y tipo de SELinux
prioridad de programación (también conocida como valor "nice")

Modelo de proceso

Existen dos formas distintas en las que sudo puede ejecutar un comando.

Si se configura un complemento de registro de E/S para registrar la E/S del terminal, o si la política de seguridad lo solicita explícitamente, se asigna un nuevo pseudo-terminal ("pty") y se utiliza fork(2) para crear un segundo proceso sudo, denominado monitor. El monitor crea una nueva sesión de terminal con él mismo como líder y el pty como su terminal de control, llama a fork(2) nuevamente, configura el entorno de ejecución como se describe anteriormente y luego utiliza la llamada al sistema execve(2) para ejecutar el comando en el proceso hijo. El monitor existe para retransmitir las señales de control de trabajos entre el terminal del usuario y el pty en el que se está ejecutando el comando. Esto hace posible suspender y reanudar el comando normalmente. Sin el monitor, el comando estaría en lo que POSIX denomina un "grupo de procesos huérfano" y no recibiría ninguna señal de control de trabajos del kernel. Cuando el comando sale o es terminado por una señal, el monitor pasa el estado de salida del comando al proceso sudo principal y sale. Después de recibir el estado de salida del comando, el proceso sudo principal pasa el estado de salida del comando a la función de cierre de la política de seguridad, así como a la función de cierre de cualquier complemento de auditoría configurado, y sale. Este es el modo predeterminado para las versiones de sudo 1.9.14 y posteriores cuando se utiliza la política de sudoers.

Si no se utiliza ningún pty, sudo llama a fork(2), configura el entorno de ejecución como se describe anteriormente y utiliza la llamada al sistema execve(2) para ejecutar el comando en el proceso hijo. El proceso sudo principal espera hasta que el comando se haya completado, luego pasa el estado de salida del comando a la función de cierre de la política de seguridad, así como a la función de cierre de cualquier complemento de auditoría configurado, y sale. Como caso especial, si el complemento de la política no define una función de cierre, sudo ejecutará el comando directamente en lugar de llamar primero a fork(2). El complemento de la política de sudoers solo definirá una función de cierre cuando se habilite el registro de E/S, se requiera un pty, se especifique un rol de SELinux, el comando tenga un tiempo de espera asociado o las opciones pam_session o pam_setcred estén habilitadas. Tanto pam_session como pam_setcred están habilitadas por defecto en los sistemas que utilizan PAM. Este es el modo predeterminado para las versiones de sudo anteriores a la 1.9.14 cuando se utiliza la política de sudoers.


En los sistemas que utilizan PAM, la función de cierre de la política de seguridad es responsable de cerrar la sesión de PAM. También puede registrar el estado de salida del comando.

Manejo de señales

Cuando el comando se ejecuta como un proceso hijo del proceso sudo, sudo retransmitirá las señales que reciba al comando. Las señales SIGINT y SIGQUIT solo se retransmitirán cuando el comando se esté ejecutando en un nuevo pty o cuando la señal la haya enviado un proceso de usuario, no el kernel. Esto evita que el comando reciba SIGINT dos veces cada vez que el usuario presiona Ctrl+C. Algunas señales, como SIGSTOP y SIGKILL, no se pueden capturar y, por lo tanto, no se retransmitirán al comando. Como regla general, se debe usar SIGTSTP en lugar de SIGSTOP cuando desee suspender un comando que se esté ejecutando con sudo.

Como caso especial, sudo no retransmitirá las señales que haya enviado el comando que se está ejecutando. Esto evita que el comando se mate accidentalmente. En algunos sistemas, la utilidad reboot(8) envía SIGTERM a todos los procesos que no son de sistema, excepto a sí mismo, antes de reiniciar el sistema. Esto evita que sudo retransmita la señal SIGTERM que recibió al reboot(8), lo que podría provocar que este salga antes de que el sistema se reinicie realmente, dejándolo en un estado intermedio similar al modo de un solo usuario. Tenga en cuenta, sin embargo, que esta comprobación solo se aplica al comando que ejecuta sudo y no a ningún otro proceso que el comando pueda crear. Como resultado, ejecutar un script que llame a reboot(8) o shutdown(8) a través de sudo puede hacer que el sistema termine en este estado indefinido, a menos que reboot(8) o shutdown(8) se ejecuten utilizando la familia de funciones exec() en lugar de system() (lo que interpone un shell entre el comando y el proceso de llamada).

Plugins

Los plugins se pueden especificar mediante directivas Plugin en el archivo sudo.conf(5). Se pueden cargar como objetos compartidos dinámicos (en los sistemas que los admiten) o compilarse directamente en el binario sudo. Si no hay un archivo sudo.conf(5) o si no contiene ninguna línea Plugin, sudo utilizará sudoers(5) para los plugins de política, auditoría y registro de E/S. Consulte el manual sudo.conf(5) para obtener más detalles sobre el archivo /etc/sudo.conf y el manual sudo_plugin(5) para obtener más información sobre la arquitectura de plugins de sudo.

VALOR DE SALIDA

Tras la ejecución correcta de un comando, el valor de salida de sudo será el valor de salida del programa que se ejecutó. Si el comando finaliza debido a la recepción de una señal, sudo se enviará a sí mismo la misma señal que finalizó el comando.

Si se especifica la opción -l sin un comando, sudo saldrá con un valor de 0 si el usuario tiene permiso para ejecutar sudo y se autenticó correctamente (según lo requiera la política de seguridad). Si se especifica un comando con la opción -l, el valor de salida será 0 solo si el comando está permitido por la política de seguridad; de lo contrario, será 1.

Si hay un fallo de autenticación, un problema de configuración/permisos o si no se puede ejecutar el comando especificado, sudo sale con un valor de 1. En este último caso, la cadena de error se imprime en la salida de error estándar. Si sudo no puede stat(2) una o más entradas en la variable PATH del usuario, se imprime un error en la salida de error estándar. (Si el directorio no existe o si realmente no es un directorio, la entrada se ignora y no se imprime ningún error). Esto no debería ocurrir en circunstancias normales. La razón más común para que stat(2) devuelva "permiso denegado" es si está ejecutando un automontador y uno de los directorios en su PATH se encuentra en una máquina que actualmente no está accesible.

NOTAS DE SEGURIDAD

sudo intenta ser seguro al ejecutar comandos externos.

Para evitar la manipulación de comandos, sudo verifica "." y "" (ambos denotan el directorio actual) al final cuando busca un comando en la variable PATH del usuario (si uno o ambos están en el PATH). Dependiendo de la política de seguridad, la variable de entorno PATH del usuario puede ser modificada, reemplazada o transmitida sin cambios al programa que sudo ejecuta.

Nunca se deben otorgar privilegios de sudo a los usuarios para ejecutar archivos que sean modificables por el usuario o que residan en un directorio que sea modificable por el usuario. Si el usuario puede modificar o reemplazar el comando, no hay forma de limitar qué comandos adicionales puede ejecutar.

De forma predeterminada, sudo solo registrará el comando que ejecuta explícitamente. Si un usuario ejecuta un comando como 'sudo su' o 'sudo sh', los comandos posteriores que se ejecuten desde esa shell no están sujetos a la política de seguridad de sudo. Lo mismo ocurre con los comandos que ofrecen escapes de shell (incluidos la mayoría de los editores). Si se habilita el registro de E/S, los comandos posteriores tendrán su entrada y/o salida registradas, pero no habrá registros tradicionales para esos comandos. Debido a esto, se debe tener cuidado al otorgar a los usuarios acceso a comandos a través de sudo para verificar que el comando no les brinde inadvertidamente una shell de root efectiva. Para obtener información sobre formas de abordar esto, consulte la sección Prevención de escapes de shell en sudoers(5).

Para evitar la divulgación de información potencialmente confidencial, sudo desactiva los volcados de memoria predeterminadamente mientras se está ejecutando (se vuelven a habilitar para el comando que se ejecuta). Esta práctica histórica se remonta a una época en la que la mayoría de los sistemas operativos permitían que los procesos con ID de usuario establecido realizaran volcados de memoria de forma predeterminada. Para facilitar la depuración de los bloqueos de sudo, es posible que desee volver a habilitar los volcados de memoria estableciendo "disable_coredump" en false en el archivo sudo.conf(5) de la siguiente manera:


Establece disable_coredump en false

Consulta el manual de sudo.conf(5) para obtener más información.

ENTORNO

sudo utiliza las siguientes variables de entorno. La política de seguridad controla el contenido real del entorno del comando.

EDITOR Editor predeterminado para usar en el modo -e (sudoedit) si ni SUDO_EDITOR ni VISUAL están configurados.

MAIL Se establece en el archivo de correo del usuario de destino cuando se especifica la opción -i o cuando env_reset está habilitado en sudoers (a menos que MAIL esté presente en la lista env_keep).

HOME Se establece en el directorio de inicio del usuario de destino cuando se especifican las opciones -i o -H, cuando se especifica la opción -s y set_home está configurado en sudoers, cuando always_set_home está habilitado en sudoers, o cuando env_reset está habilitado en sudoers y HOME no está presente en la lista env_keep.

LOGNAME Se establece en el nombre de inicio de sesión del usuario de destino cuando se especifica la opción -i, cuando la opción set_logname está habilitada en sudoers, o cuando la opción env_reset está habilitada en sudoers (a menos que LOGNAME esté presente en la lista env_keep).

PATH Puede ser sobrescrito por la política de seguridad.

SHELL Se utiliza para determinar el shell que se ejecutará con la opción -s.

SUDO_ASKPASS Especifica la ruta a un programa auxiliar que se utiliza para leer la contraseña si no hay terminal disponible o si se especifica la opción -A.

SUDO_COMMAND Se establece en el comando que ejecuta sudo, incluidos todos sus argumentos. Los argumentos se truncan a 4096 caracteres para evitar un posible error de ejecución.

SUDO_EDITOR Editor predeterminado para usar en el modo -e (sudoedit).

SUDO_GID Se establece en el ID de grupo del usuario que invocó sudo.

SUDO_HOME Se establece en el directorio de inicio del usuario que invocó sudo.

SUDO_PROMPT Se utiliza como indicador de contraseña predeterminado a menos que se especifique la opción -p.

SUDO_PS1 Si está configurado, PS1 se establecerá en su valor para el programa que se está ejecutando.

SUDO_TTY Se establece en el dispositivo de terminal del usuario que invocó sudo, si está presente.

SUDO_UID Se establece en el ID de usuario del usuario que invocó sudo.

SUDO_USER Se establece en el nombre de inicio de sesión del usuario que invocó sudo.

USER Se establece en el mismo valor que LOGNAME, descrito anteriormente.

VISUAL Editor predeterminado para usar en el modo -e (sudoedit) si SUDO_EDITOR no está configurado.

ARCHIVOS

/etc/sudo.conf Configuración del front-end de sudo

EJEMPLOS

Los siguientes ejemplos asumen una política de seguridad configurada correctamente.

Para obtener una lista de archivos de un directorio al que no se puede acceder:

$ sudo ls /usr/local/protected

Para listar el directorio de inicio del usuario yaz en una máquina donde el sistema de archivos que contiene ~yaz no se exporta como root:

$ sudo -u yaz ls ~yaz

Para editar el archivo index.html como usuario www:

$ sudoedit -u www ~www/htdocs/index.html

Para ver los registros del sistema a los que solo pueden acceder root y los usuarios del grupo adm:

$ sudo -g adm more /var/log/syslog

Para ejecutar un editor como jim con un grupo primario diferente:

$ sudoedit -u jim -g audio ~jim/sound.txt

Para apagar una máquina:

$ sudo shutdown -r +15 "reinicio rápido"

Para crear una lista de uso de los directorios en la partición /home. Los comandos se ejecutan en un subshell para permitir que los comandos cd y la redirección de archivos funcionen.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

DIAGNÓSTICOS

Los mensajes de error producidos por sudo incluyen:

editar archivos en un directorio con permisos de escritura no está permitido

De forma predeterminada, sudoedit no permite editar un archivo cuando cualquiera de los directorios principales tiene permisos de escritura para el usuario que lo invoca. Esto evita una condición de carrera que podría permitir al usuario sobrescribir un archivo arbitrario. Consulte la opción sudoedit_checkdir en sudoers(5) para obtener más información.

editar enlaces simbólicos no está permitido

De forma predeterminada, sudoedit no sigue los enlaces simbólicos al abrir archivos. Consulte la opción sudoedit_follow en sudoers(5) para obtener más información.

el ID de usuario efectivo no es 0, ¿está sudo instalado con el bit setuid root?

^ udo no se ejecutó con privilegios de root. El archivo binario sudo debe ser propiedad del usuario root y tener el bit set-user-ID establecido. Además, no debe estar ubicado en un sistema de archivos montado con la opción nosuid o en un sistema de archivos NFS que asigne el ID de usuario 0 a un ID de usuario no privilegiado.

el ID de usuario efectivo no es 0, ¿está sudo en un sistema de archivos con la opción 'nosuid' establecida o en un sistema de archivos NFS sin privilegios de root?

^ udo no se ejecutó con privilegios de root. El archivo binario sudo tiene el propietario y los permisos adecuados, pero aún así no se ejecutó con privilegios de root. La razón más común de esto es que el sistema de archivos en el que se encuentra el archivo binario sudo está montado con la opción nosuid o es un sistema de archivos NFS que asigna el ID de usuario 0 a un ID de usuario no privilegiado.

error fatal, no se pueden cargar los complementos

Se produjo un error al cargar o inicializar los complementos especificados en sudo.conf(5).

nombre de variable de entorno no válido

Uno o más nombres de variables de entorno especificados a través de la opción -E contenían un signo igual (=). Los argumentos de la opción -E deben ser nombres de variables de entorno sin un valor asociado.

no se proporcionó ninguna contraseña

Cuando sudo intentó leer la contraseña, no recibió ningún carácter. Esto puede suceder si no hay una terminal disponible (o se especifica la opción -S) y la entrada estándar se ha redirigido desde /dev/null.

se requiere una terminal para leer la contraseña

^ udo necesita leer la contraseña, pero no hay ningún mecanismo disponible para que lo haga. Los comandos remotos que se ejecutan a través de ssh(1) no tienen una terminal disponible de forma predeterminada; pasar la opción -t a ssh(1) hará que asigne una terminal, lo que debería permitir que sudo lea la contraseña. Para permitir que sudo ejecute comandos locales sin una terminal, se puede usar la opción -S para leer una contraseña desde la entrada estándar, o se puede configurar un asistente askpass a través del archivo sudo.conf(5) o configurando la variable de entorno SUDO_ASKPASS.


no se encontró un directorio temporal con permisos de escritura
sudoedit no pudo encontrar un directorio temporal utilizable en el que almacenar sus archivos
intermedios.

La bandera "no nuevos privilegios" está establecida, lo que impide que sudo se ejecute como root. sudo se ejecutó mediante un proceso que tiene la bandera "no nuevos privilegios" de Linux establecida. Esto provoca que el bit set-user-ID se ignore al ejecutar un ejecutable, lo que impedirá que sudo funcione. La causa más probable de esto es ejecutar sudo dentro de un contenedor que establece esta bandera. Consulte la documentación para ver si es posible configurar el contenedor de tal manera que la bandera no se establezca.

sudo debe ser propiedad del uid 0 y tener el bit setuid establecido
sudo no se ejecutó con privilegios de root. El binario sudo no tiene el propietario o los permisos correctos. Debe ser propiedad del usuario root y tener el bit set-user-ID establecido.

sudoedit no es compatible en esta plataforma
Solo es posible ejecutar sudoedit en sistemas que admiten la configuración del ID de usuario efectivo.

se agotó el tiempo de espera para leer la contraseña
El usuario no ingresó una contraseña antes de que expirara el tiempo de espera de la contraseña (5 minutos por defecto).

no existe en la base de datos de contraseñas
Su ID de usuario no aparece en la base de datos de contraseñas del sistema.

es posible que no pueda especificar variables de entorno en modo de edición
Solo es posible especificar variables de entorno al ejecutar un comando. Cuando se edita un
archivo, el editor se ejecuta con el entorno del usuario sin modificar.

VÉASE TAMBIÉN

su(1), stat(2), login_cap(3), passwd(5), sudo.conf(5), sudou_plugin(5), sudoers(5), sudoers_timestamp(5), sudoreplay(8), visudo(8)

HISTORIA

Consulte el archivo HISTORY.md en la distribución de sudo (https://www.sudo.ws/about/history/) para obtener un resumen de la historia de sudo.

AUTORES

Muchas personas han trabajado en sudo a lo largo de los años; esta versión consta de código escrito principalmente por:

Todd C. Miller

Consulte el archivo CONTRIBUTORS.md en la distribución de sudo (https://www.sudo.ws/about/contributors/) para obtener una lista exhaustiva de las personas que han contribuido a sudo.

ADVERTENCIAS

No hay una manera fácil de evitar que un usuario obtenga un shell root si se permite que ese usuario ejecute comandos arbitrarios a través de sudo. Además, muchos programas (como los editores) permiten al usuario ejecutar comandos a través de secuencias de escape de shell, evitando así las comprobaciones de sudo. Sin embargo, en la mayoría de los sistemas es posible evitar las secuencias de escape de shell con la funcionalidad noexec del plugin sudoers(5).

No tiene sentido ejecutar el comando 'cd' directamente a través de sudo, por ejemplo:

$ sudo cd /usr/local/protected

ya que cuando el comando finaliza, el proceso principal (su shell) seguirá siendo el mismo. La opción -D se puede utilizar para ejecutar un comando en un directorio específico.

Ejecutar scripts de shell a través de sudo puede exponer los mismos errores del kernel que hacen que los scripts de shell con set-user-ID no sean seguros en algunos sistemas operativos (si su SO tiene un directorio /dev/fd/, los scripts de shell con set-user-ID generalmente son seguros).


ERRORES

Si cree que ha encontrado un error en sudo, puede presentar un informe de errores en la base de datos de errores de sudo, https://bugzilla.sudo.ws/, o abrir un problema en https://github.com/sudo-project/sudo/issues. Si prefiere utilizar el correo electrónico, puede enviar mensajes a la lista de correo sudo-workers, https://www.sudo.ws/mailman/listinfo/sudo-workers (pública) o <_> (privada).

Por favor, no informe sobre vulnerabilidades de seguridad a través de problemas públicos de GitHub, Bugzilla o listas de correo. En su lugar, infórmelas por correo electrónico a <_>. Puede cifrar su mensaje con PGP si lo desea, utilizando la clave que se encuentra en https://www.sudo.ws/dist/PGPKEYS.

SOPORTE

Hay soporte gratuito limitado disponible a través de la lista de correo sudo-users, consulte https://www.sudo.ws/mailman/listinfo/sudo-users para suscribirse o buscar en los archivos.

EXENCIÓN DE RESPONSABILIDAD

sudo se proporciona "TAL CUAL" y se rechazan todas las garantías expresas o implícitas, incluidas, entre otras, las garantías implícitas de comerciabilidad y adecuación para un propósito particular. Consulte el archivo LICENSE.md distribuido con sudo o https://www.sudo.ws/about/license/ para obtener información completa.