Jump to content
From ArchWiki
Esta traducción de sudo fue revisada el 2022-11-07. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Artículos relacionados

- Usuarios y grupos
- su
- doas

Sudo permite al administrador del sistema delegar autoridad para otorgar a ciertos usuarios (o grupos de usuarios) la capacidad de ejecutar órdenes como superusuario (root) u otro mientras proporciona un registro de auditoría de las órdenes y sus argumentos.

Sudo es una alternativa a su para ejecutar órdenes como superusuario. A diferencia de su, que lanza un shell de superusuario que permite que todas las demás órdenes tengan acceso de superusuario, sudo ofrece una elevación temporal de privilegios a una sola orden. Al activar los privilegios de superusuario solo cuando es necesario, el uso de sudo reduce la probabilidad de que un error tipográfico o en una orden invocada arruine el sistema.

Sudo también se puede usar para ejecutar órdenes como otros usuarios; además, sudo registra todas las órdenes y los intentos de acceso fallidos para la auditoría de seguridad.

## Instalación

Instale el paquete sudo.

## Utilización

Para comenzar a usar `sudo` como un usuario sin privilegios, debe estar configurado correctamente. Véase la sección configuración.

Para usar sudo, simplemente anteponga `sudo` y un espacio a ls orden y sus argumentos:

    $ sudo orden

Por ejemplo, para usar pacman:

    $ sudo pacman -Syu

Véase sudo(8) para más información.

## Configuración

### Estructura por defecto

sudoers(5) § SUDOERS OPTIONS lista todas las opciones que se pueden utilizar con la orden `Defaults` en el archivo `/etc/sudoers`.

Véase [1] para obtener una lista de opciones (analizadas desde el código fuente de la versión 1.8.7) en un formato optimizado para `sudoers`.

Véase sudoers(5) para más información, como configurar el tiempo de espera de la contraseña.

### Ver la configuración actual

Ejecute `sudo -ll` para visualizar la configuración actual de sudo, o `sudo -lU usuario` para un usuario específico.

### Utilizando visudo

El archivo de configuración de sudo es `/etc/sudoers`. Siempre debe editarse con la orden visudo(8). visudo bloquea el archivo `sudoers`, guarda los cambios en un archivo temporal y comprueba los errores sintácticos antes de copiarlo en `/etc/sudoers`.

Advertencia:

- ¡Es imperativo que el archivo `sudoers` no tenga errores de sintaxis! Cualquier error hará sudo inutilizable. Modifíquelo siempre con visudo para evitar errores.
- visudo(8) advierte que configurar visudo para respetar las variables de entorno del usuario para su editor de elección puede ser un agujero de seguridad, ya que permite al usuario con privilegios visudo ejecutar arbitrariamente órdenes como superusuario sin iniciar sesión simplemente estableciendo esa variable con cualquier cosa.

El editor predeterminado para visudo es vi. El paquete sudo se compila con `--with-env-editor` de forma predeterminada y respeta el uso de las variables `SUDO_EDITOR` y `EDITOR`. `EDITOR` no se usa cuando se establece `VISUAL`.

Para establecer nano como el editor de visudo durante la sesión actual de shell exporte `EDITOR=nano`; para usar un editor diferente una vez, simplemente configure la variable antes de llamar a visudo:

    # EDITOR=nano visudo

Alternativamente, puede editar una copia del archivo `/etc/sudoers` y verificarlo utilizando `visudo -c /copia/de/sudoers`. Esto podría ser útil en caso de que quiera eludir el bloqueo del archivo con visudo.

Para cambiar el editor permanentemente, véase la sección variables de entorno por usuario. Para cambiar el editor elegido solo para visudo de forma permanente en todo el sistema, añada lo siguiente a `/etc/sudoers` (suponiendo que nano es su editor preferido):

    # Restablece el entorno predeterminado
    Defaults      env_reset
    # Establece el EDITOR predeterminado a una versión restringida de nano, y no permite a visudo usar EDITOR/VISUAL.
    Defaults      editor=/usr/bin/rnano, !env_editor

### Ejemplos de entradas

Para permitir a un usuario normal obtener privilegios de superusuario (root) cuando anteponga `sudo` a una orden, añada la siguiente línea:

    NOMBRE_DE_USUARIO   ALL=(ALL:ALL) ALL

Para permitir a un usuario ejecutar todas las órdenes como cualquier usuario, pero únicamente en la máquina con el nombre `NOMBRE_DEL_EQUIPO`:

    NOMBRE_DE_USUARIO   NOMBRE_DE_EQUIPO=(ALL:ALL) ALL

Para permitir que los miembros del grupo wheel tengan acceso a sudo:

    %wheel      ALL=(ALL:ALL) ALL

Sugerencia: Al crear nuevos administradores, a menudo es conveniente activar el acceso sudo para el grupo `wheel` y añadir el usuario a él, ya que por defecto Polkit trata a los miembros del grupo `wheel` como administradores. Si el usuario no es miembro de `wheel`, el programa que utiliza Polkit puede solicitar la autenticación mediante la contraseña del superusuario en lugar de la contraseña del usuario.

Para desactivar la solicitud de contraseña para el usuario `NOMBRE_DE_USUARIO`:

Advertencia: Esto permitirá que cualquier proceso que se ejecute con su nombre de usuario use sudo sin solicitar permiso.

    Defaults:NOMBRE_DE_USUARIO      !authenticate

Para activar las órdenes definidas explícitamente solo para el usuario `NOMBRE_DE_USUARIO` en el equipo `NOMBRE_DEL_EQUIPO`:

    NOMBRE_DE_USUARIO NOMBRE_DEL_EQUIPO=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu

Nota: La opción más personalizada debe ir al final del archivo, ya que las líneas posteriores anulan las anteriores. En particular, una línea de este tipo debe estar después de la línea `%wheel` si su usuario está en este grupo.

Para activar, sin necesidad de contraseña, las órdenes definidas explícitamente solo para el usuario `NOMBRE_DE_USUARIO` en el equipo `NOMBRE_DEL_EQUIPO`:

    NOMBRE_DE_USUARIO NOMBRE_DEL_EQUIPO= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu

Un ejemplo detallado de `sudoers` está disponible en `/usr/share/doc/sudo/examples/sudoers`. Por otro lado, véase sudoers(5) para obtener información detallada.

### Permisos de archivo predeterminados de sudoers

El propietario y el grupo para el archivo `sudoers` deben ser ambos 0. Los permisos de los archivos deben establecerse en 0440. Estos permisos se establecen de forma predeterminada, pero si los cambia accidentalmente, deberían ser cambiados de nuevo inmediatamente o sudo fallará.

    # chown -c root:root /etc/sudoers
    # chmod -c 0440 /etc/sudoers

## Consejos y trucos

### Desactivar el tiempo de espera al solicitar la contraseña

Una molestia común es un proceso de larga duración que se ejecuta con permisos normales en segundo plano en un terminal y se eleva solo cuando es necesario. Esto lleva a una solicitud de contraseña de sudo que pasa desapercibida y se agota el tiempo, en cuyo caso el proceso muere y el trabajo realizado se pierde o, en el mejor de los casos, se almacena en caché. Un consejo común es activar sudo sin contraseña o extender el tiempo de espera de sudo para recordar una contraseña. Ambos tienen implicaciones negativas de seguridad. El tiempo de espera para introducir la contraseña también se puede desactivar y, dado que eso no sirve para ningún propósito de seguridad razonable, debería ser la solución aquí:

    Defaults passwd_timeout=0

### Añadir una campana en el terminal a la solicitud de la contraseña

Para llamar la atención sobre un indicador de sudo en un terminal en segundo plano, los usuarios pueden hacer simplemente que muestre un carácter de campana:

    Defaults passprompt="^G[sudo] password for %p: "

Tenga en cuenta que `^G` es literalmente un carácter de campana. Por ejemplo en vim, se introduce mediante la secuencia `Ctrl+v` `Ctrl+g`, or in nano, `Alt+v` `Ctrl+g`.

### Transferir alias

Los alias en Zsh y Bash normalmente solo se expanden para la primera palabra de una orden. Esto significa que sus alias normalmente no se expandirán cuando ejecute la orden `sudo`. Una forma de hacer que la siguiente palabra se expanda es hacer un alias para sudo que termine con un espacio. Añada lo siguiente a su archivo de configuración del intérprete de línea de órdenes:

    alias sudo='sudo '

zshmisc(1) § ALIASING describe cómo funciona esto:

  Si el texto de reemplazo termina con un espacio, la siguiente palabra en la entrada del intérprete de línea de órdenes siempre es elegible para propósitos de expansiones de alias.

Así como bash(1) § ALIASES:

  Si el último carácter del valor del alias es un espacio en blanco, la siguiente palabra de la orden que sigue al alias también se comprueba para la expansión del alias.

### Desactivar sudo por cada terminal

Advertencia: Esto permitirá que cualquier proceso use su sesión sudo.

Si le molesta que sudo, de forma predeterminada, requiera introducir la contraseña cada vez que abra un nuevo terminal, configure `timestamp_type` a `global`:

    Defaults timestamp_type=global

### Reducir la cantidad de veces que tiene que escribir una contraseña

Si le molesta tener que volver a escribir su contraseña cada 5 minutos (predeterminado), puede cambiar esto estableciendo un valor más largo para `timestamp_timeout` (en minutos):

    Defaults timestamp_timeout=10

Si está utilizando muchas órdenes sudo en una línea, es más lógico actualizar el tiempo de espera cada vez que utilice sudo que aumentar `timestamp_timeout`. Se puede actualizar el tiempo de espera con `sudo -v` (mientras que `sudo -K` se revoca inmediatamente).

Es posible que quiera automatizar esto añadiendo lo siguiente a su `.bashrc`:

    alias sudo='sudo -v; sudo '

También es posible utilizar una función bash; para obtener más detalles, véase stackexchange.

### Variables de entorno

Si se tienen muchas variables de entorno, o exporta la configuración del proxy a través de `export http_proxy="..."`, al usar sudo estas variables no se pasan a la cuenta de superusuario, a menos que ejecute sudo con la opción `-E`.

    $ sudo -E pacman -Syu

La forma recomendada de preservar las variables de entorno es añadiendo a `env_keep`:

    /etc/sudoers

    Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

### Contraseña de superusuario

Los usuarios pueden configurar sudo para solicitar la contraseña del superusuario en lugar de la contraseña de usuario añadiendo `targetpw` (usuario de destino, predeterminado a superusuario) o `rootpw` a la línea Defaults en `/etc/sudoers`:

    Defaults targetpw

Para evitar exponer su contraseña de superusuario a los usuarios, puede restringirla a un grupo específico:

    Defaults:%wheel targetpw
    %wheel ALL=(ALL) ALL

### Desactivar el acceso de superusuario

Los usuarios pueden querer desactivar el inicio de sesión del superusuario. Sin este, los atacantes deben primero adivinar un nombre de usuario configurado como sudoer, así como su contraseña. Véase por ejemplo Denegar.

Advertencia:

- Tenga cuidado, puede bloquearse al desactivar el inicio de sesión del superusuario. Sudo no se instala automáticamente y su configuración predeterminada no permite el acceso al superusuario sin contraseña ni con su propia contraseña. Asegúrese de que el usuario esté configurado correctamente como un sudoer antes de desactivar la cuenta de superusuario.
- Si ha cambiado su archivo sudoers para utilizar rootpw como predeterminado, entonces no desactive el inicio de sesión del superusuario con ninguno de las siguientes órdenes.
- Si ya está bloqueado, véase como reiniciar la contraseña del superusuario para obtener ayuda.

La cuenta puede ser bloqueada mediante `passwd`:

    # passwd -l root

Una orden similar desbloquea al superusuario.

    $ sudo passwd -u root

Alternativamente, edite `/etc/shadow` y reemplace la contraseña cifrada del superusuario (root) con "!":

    root:!:12345::::::

Para activar de nuevo el acceso del superusuario:

    $ sudo passwd root

Sugerencia: Para acceder a un shell de superusuario, incluso después de desactivar la cuenta del superusuario, utilice `sudo -i`.

#### kdesu

kdesu puede ser utilizado bajo KDE para lanzar aplicaciones gráficas con privilegios de superusuario. Es posible que, por defecto, kdesu trate de usar su incluso si la cuenta de superusuario está desactivada. Afortunadamente se puede invocar kdesu para usar sudo en lugar de su. Cree/modifique el archivo `~/.config/kdesurc`:

    [super-user-command]
    super-user-command=sudo

o utilice la siguiente orden:

    $ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo

### Ejemplo de protección con sudo

Digamos que crea tres usuarios: admin, devel y archie. El usuario "admin" se utiliza para journalctl, systemctl, mount, kill e iptables; "devel" se utiliza para instalar paquetes y modificar archivos de configuración; y "archie" es el usuario con el que inicia sesión. Para permitir que "archie" reinicie, apague y utilice netctl, haríamos lo siguiente:

Modifique `/etc/pam.d/su` y `/etc/pam.d/su-l`. Requriera que el usuario esté en el grupo wheel, pero no ponga a nadie en él.

    #%PAM-1.0
    auth            sufficient      pam_rootok.so
    # Descomente la siguiente línea para confiar implícitamente en los usuarios del grupo "wheel".
    #auth           sufficient      pam_wheel.so trust use_uid
    # Descomente la siguiente línea para requerir que un usuario esté en el grupo "wheel".
    auth            required        pam_wheel.so use_uid
    auth            required        pam_unix.so
    account         required        pam_unix.so
    session         required        pam_unix.so

Limite el inicio de sesión de SSH al grupo 'ssh'. Solo "archie" será parte de este grupo.

1. groupadd -r ssh

    # gpasswd -a archie ssh
    # echo 'AllowGroups ssh' >> /etc/ssh/sshd_config

Reinicie `sshd.service`.

Añada usuarios a otros grupos.

    # for g in power network ;do ;gpasswd -a archie $g ;done
    # for g in network power storage ;do ;gpasswd -a admin $g ;done

Ajuste los permisos en las configuraciones para que "devel" pueda modificarlos.

    # chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc}

    Cmnd_Alias  POWER       =   /usr/bin/shutdown -h now, /usr/bin/halt, /usr/bin/poweroff, /usr/bin/reboot
    Cmnd_Alias  STORAGE     =   /usr/bin/mount -o nosuid\,nodev\,noexec, /usr/bin/umount
    Cmnd_Alias  SYSTEMD     =   /usr/bin/journalctl, /usr/bin/systemctl
    Cmnd_Alias  KILL        =   /usr/bin/kill, /usr/bin/killall
    Cmnd_Alias  PKGMAN      =   /usr/bin/pacman
    Cmnd_Alias  NETWORK     =   /usr/bin/netctl
    Cmnd_Alias  FIREWALL    =   /usr/bin/iptables, /usr/bin/ip6tables
    Cmnd_Alias  SHELL       =   /usr/bin/zsh, /usr/bin/bash
    %power      ALL         =   (root)  NOPASSWD: POWER
    %network    ALL         =   (root)  NETWORK
    %storage    ALL         =   (root)  STORAGE
    root        ALL         =   (ALL)   ALL
    admin       ALL         =   (root)  SYSTEMD, KILL, FIREWALL
    devel       ALL         =   (root)  PKGMAN
    archie      ALL         =   (devel) SHELL, (admin) SHELL

Con esta configuración, casi nunca necesitará iniciar sesión como superusuario.

"archie" se puede conectar a sus redes inalámbricas domésticas:

    $ sudo netctl start home
    $ sudo poweroff

"archie" no puede utilizar netctl como cualquier otro usuario.

    $ sudo -u admin -- netctl start home

Cuando "archie" necesite utilizar journalctl o terminar la ejecución de un proceso pueden cambiar a dicho usuario:

    $ sudo -i -u devel
    $ sudo -i -u admin

Pero "archie" no puede cambiar a superusuario:

    $ sudo -i -u root

Si "archie" quiere iniciar una sesión gnu-screen como "admin" pueden hacerlo así:

    $ sudo -i -u admin
    [admin]$ chown admin:tty `echo $TTY`
    [admin]$ screen

### Configurar sudo mediante archivos complementarios en /etc/sudoers.d

sudo analiza los archivos contenidos en el directorio `/etc/sudoers.d/`. Esto significa que en lugar de modificar `/etc/sudoers`, puede cambiar la configuración mediante archivos independientes y soltarlos en ese directorio. Esto tiene dos ventajas:

- No hay necesidad de modificar un archivo `sudoers.pacnew`;
- Si hay un problema con una nueva entrada, puede eliminar el archivo afectado en lugar de modificar `/etc/sudoers` (pero véase la advertencia a continuación).

El formato para las entradas en estos archivos complementarios es el mismo que para `/etc/sudoers`. Para modificarlos directamente, utilice `visudo -f /etc/sudoers.d/nombre_archivo`. Véase sudoers(5) § Incluir otros archivos desde sudoers para más información.

Los archivos en el directorio `/etc/sudoers.d/` se analizan en orden lexicográfico, los nombres de archivo que contienen `.` o `~` se omiten. Para evitar problemas de clasificación, los nombres de los archivos deben comenzar con dos dígitos, por ejemplo `01_foo`.

Nota: El orden de las entradas en los archivos complementarios es importante: asegúrese de que las declaraciones no se anulan a sí mismas.
Advertencia: Los archivos en `/etc/sudoers.d/` son tan frágiles como el mismo `/etc/sudoers`: cualquier archivo incorrectamente formateado evitará el funcionamiento de `sudo`. Por lo tanto, por esta misma razón, se recomienda encarecidamente usar `visudo`

### Edición de archivos

`sudo -e` o `sudoedit` le permite modificar un archivo como otro usuario mientras ejecuta el editor de texto como su usuario.

Esto es especialmente útil para modificar archivos como superusuario sin elevar el privilegio de su editor de texto. Véase sudo(8) § e para más detalles.

Tenga en cuenta que puede configurar el editor para cualquier programa, por lo que, por ejemplo, uno puede usar meld para administrar archivos pacnew:

    $ SUDO_EDITOR=meld sudo -e /etc/archivo{,.pacnew}

### Activar insultos

Los usuarios pueden activar el huevo de Pascua de insultos en sudo añadiendo la siguiente línea en el archivo `sudoers` con `visudo`.

    /etc/sudoers

    Defaults insults

Al introducir una contraseña incorrecta se reemplazará el mensaje `Inténtelo de nuevo.` por insultos en tono de humor.

## Solución de problemas

### Problemas de SSH sin TTY

SSH no asigna una tty de forma predeterminada cuando ejecuta una orden remota. Sin una tty asignada, sudo no puede evitar que se muestre la contraseña. Puede utilizar la opción de ssh `-t` para forzar la asignación de una tty.

La opción `requiretty` de `Defaults` permite al usuario ejecutar sudo solo si tiene una tty.

    # Desactive "ssh hostname sudo <cmd>", ya que mostrará la contraseña en texto claro. Se tiene que ejecutar "ssh -t hostname sudo <cmd>".
    #
    #Defaults    requiretty

### Umask permisiva

Sudo unirá el valor umask del usuario con su propia umask (que por defecto es 0022). Esto evita que sudo cree archivos con permisos más abiertos que los que permite el umask del usuario. Si bien este es un valor predeterminado cuando no se usa umask personalizada, esto puede llevar a situaciones en las que una utilidad ejecutada por sudo puede crear archivos con permisos diferentes que si se ejecutara directamente desde el superusuario (root). Si surgen errores a partir de esto, sudo proporciona un medio para reparar la umask, incluso si la umask deseada es más permisiva que la umask que el usuario ha especificado. Añadir esto (usando `visudo`) anulará el comportamiento predeterminado de sudo:

    Defaults umask = 0022
    Defaults umask_override

Esto establece el umask de sudo en umask predeterminado del superusuario (0022) y anula el comportamiento predefinido, utilizando siempre la umask indicada, independientemente de la umask definida del usuario.

Categories:

- Security (Español)
- Commands (Español)