Sudo (Español)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Estado de la traducción: esta traducción de sudo fue revisada el 2020-12-12. Si existen cambios puede actualizarla o avisar al equipo de traducción.

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

Sudo es una alternativa a su para ejecutar comandos como superusuario. A diferencia de su, que lanza un shell de superusuario que permite que todos los demás comandos tengan acceso de superusuario, sudo ofrece una escalada temporal de privilegios a un solo comando. 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 un comando invocado arruine el sistema.

Sudo también se puede usar para ejecutar comandos como otros usuarios; además, sudo registra todos los comandos 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 al comando y sus argumentos:

$ sudo comando

Por ejemplo, para usar pacman:

$ sudo pacman -Syu

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

Configuración

Estructura por defecto

La página de los autores tiene una lista de todas las opciones que se puede usar con el comando 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 el comando 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 -f /copy/of/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 nano, y no permite a visudo usar EDITOR/VISUAL.
Defaults      editor=/usr/bin/nano, !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

Para permitir a un usuario ejecutar todas los comandos como cualquier usuario, pero únicamente en la máquina con el nombre NOMBRE_DEL_EQUIPO:

NOMBRE_DE_USUARIO   NOMBRE_DE_EQUIPO=(ALL) ALL

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

%wheel      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, los comandos definidos 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. En vim se introduce mediante la secuencia ^V ^G.

Transferir alias

Si utiliza muchos alias, es posible que haya notado que no se transfieren a la cuenta de superusuairo cuando utiliza sudo. Sin embargo, existe una forma sencilla de hacer que funcionen. Simplemente añada lo siguiente a su ~/.bashrc o /etc/bash.bashrc:

alias sudo='sudo '

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 los siguientes comandos.
  • 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 use el siguiente comando:

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

Alternativamente, instale kdesudoAUR, que tiene la ventaja adicional de autocompletar con tabulador el comando siguiente.

Ejemplo de protección con sudo

Digamos que crea 3 usuarios: admin, devel y joe. El usuario «admin» se usa para journalctl, systemctl, mount, kill e iptables; «devel» se usa para instalar paquetes y editar archivos de configuración; y «joe» es el usuario con el que inicia sesión. Para permitir a «joe» reiniciar, apagar y usar netctl, haríamos lo siguiente:

Edite /etc/pam.d/su y /etc/pam.d/su-l Requiere 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 «joe» será parte de este grupo.

groupadd -r ssh
gpasswd -a joe 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 joe $g ;done
for g in network power storage ;do ;gpasswd -a admin $g ;done

Ajuste los permisos en las configuraciones para que «devel» pueda editarlos.

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
joe         ALL         =   (devel) SHELL, (admin) SHELL 

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

«joe» se puede conectar a una red inalámbrica doméstica:

sudo netctl start home
sudo poweroff

«joe» no puede utilizar netctl como cualquier otro usuario.

sudo -u admin -- netctl start home

Cuando «joe» necesite utilizar journalctl o terminar la ejecución de un proceso puede cambiar a dicho usuario:

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

Pero «joe» no puede cambiar a superusuario:

sudo -i -u root

Si «joe» quiere iniciar una sesión gnu-screen como «admin» puede 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 editar /etc/sudoers, puede cambiar la configuración mediante archivos independientes y soltarlos en ese directorio. Esto tiene dos ventajas:

  • No hay necesidad de editar un archivo sudoers.pacnew;
  • Si hay un problema con una nueva entrada, puede eliminar el archivo afectado en lugar de editar /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 editarlos 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 editar un archivo como otro usuario mientras ejecuta el editor de texto como su usuario.

Esto es especialmente útil para editar 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/file{,.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.

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

/etc/sudoers
Defaults insults

Solución de problemas

Problemas de SSH sin TTY

SSH no asigna una tty de forma predeterminada cuando ejecuta un comando remoto. 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.