Sudo (Español)
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 elevación 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
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
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 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
.
- ¡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 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) ALL
Para permitir que los miembros del grupo wheel tengan acceso a sudo:
%wheel ALL=(ALL:ALL) ALL
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
:
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
%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. Por ejemplo en vim, se introduce mediante la secuencia Ctrl+v
Ctrl+g
, or in nano, Alt+v
Ctrl+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
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.
- 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
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
Ejemplo de protección con sudo
Digamos que crea tres usuarios: admin, devel y joe. 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 "joe" es el usuario con el que inicia sesión. Para permitir que "joe" 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 «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 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 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 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
.
/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/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
.
/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 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.