Conociendo el Sudo

Sudo

Sudo (superuser do) es una herramienta de sistema que permite a los usuarios realizar la ejecución de mandatos como superusuario u otro usuario de acuerdo a como se especifique en el fichero /etc/sudoers, donde se determina quien está autorizado. Los números de identidad de usuario y de grupo (UID y GID) reales y efectivas se establecen para igualar a aquellas del usuario objetivo como esté especificado en el fichero /etc/passwd.

De modo predeterminado sudo requiere que los usuarios se autentiquen así mismos con su propia clave de acceso (nunca la clave de acceso de root). Una vez que el usuario se ha autenticado, el usuario podrá utilizar nuevamente sudo sin necesidad de volver a autenticarse durante 5 minutos, salvo que se especifique lo contrario en el fichero /etc/sudoers. Si el usuario ejecuta el mandato sudo -v podrá refrescar éste periodo de tiempo sin necesidad de tener que ejecutar un mandato, en cuyo caso contrario expirará esta autenticación y será necesario volver a realizarla.

Si un usuario no listado en el fichero /etc/sudoers. trata de ejecutar un mandato a través de sudo, se registra la actividad en la bitácora de sistema (a través de syslogd) y se envía un mensaje de correo electrónico al administrador del sistema (root).

Historia.

Sudo fue inicialmente concebido en 1980 por Bob Coggeshall y Cliff Spencer del departamento de ciencia computacional en SUNY (State University of New York o Universidad Estatal de Nueva York), en Buffalo.

En 1985 se publicó el grupo de noticias net.sources una versión mejorada acreditada a Phil Betchel, Cliff Spencer, Gretchen Phillips, John LoVerso y Don Gworek. Garth Snyder publicó otra versión mejorada en el verano de 1986 y durante los siguientes cinco años fue mantenido con al colaboración de muchas personas, incluyendo Bob Coggeshall, Bob Manchek, y Trent Hein.

En 1991 Dave Hieb y Jeff Nieusma escribieron una nueva versión con un formato mejorado para el fichero /etc/sudoers bajo contrato con la firma consultora The Root Group, versión que posteriormente fue publicada bajo los términos de la Licencia Pública General de GNU (GNU/GPL).

Desde 1996 el proyecto es mantenido por Todd Miller con la colaboración de Chris Jepeway y Aaron Spangler.

Fichero /etc/sudoers

El fichero /etc/sudoers se edita con el mandato visudo, herramienta que a través de vi permite realizar cambios y verificar sintaxis y errores. Si se trata de modificar directamente /etc/sudoers, éste tiene permisos de solo lectura.

La sintaxis básica de una lista sería:

CODE
XXXX_Alias NOMBRELISTA = elemento1, elemento2, elemento3


La sintaxis básica de una regla sería:

CODE
[usuario, %grupo, NOMBRELISTA] [anfitrión] = (id de usuario a usar) mandatos


Se pueden definir Aliases y reglas. Los aliases permiten definir una lista de mandatos , una lista de usuarios, un alista de anfitriones o bien ejecutar como otros usuarios.

Cmnd_Alias.
CODE
Cmnd_Alias MANDATOSHTTPD = /sbin/service httpd restart, \
/usr/bin/vim /etc/httpd/conf.d/variables.conf, \
/usr/bin/vim /etc/php.ini


Lo anterior define una lista de mandatos que podrían utilizarse para reiniciar el servicio de httpd, modificar un fichero de configuración en la ruta /etc/httpd/conf.d/varables.conf y modificar el fichero

CODE
fulano ALL = MANDATOSHTTPD


Lo anterior define que el usuario fulano puede utilizar los mandatos de la lista MANDATOSHTTPD desde cualquier anfitrión.

User_Alias.
CODE
User_Alias USUARIOSHTTP = fulano, mengano, zutano


Lo anterior define una lista denominada HTTPUSERS, integrada por los usuarios fulano, mengano y zutano.
CODE
USUARIOSHTTP ALL = /usr/bin/vim


La regla anterior define que los usuarios que conforman la lista USUARIOSHTTP pueden utilizar el mandato vim desde cualquier anfitrión.

Host_Alias.
CODE
Host_Alias HOSTSHTTPD = 192.168.0.25, 192.168.0.26, 192.168.0.23


Lo anterior define que la lista HOSTSHTTPD está integrada por las 3 direcciones IP listadas anteriormente. Si además se añade la siguiente regla:
CODE
USUARIOSHTTPD HOSTSHTTPD = ADMINHTTPD


Lo anterior define que los usuarios de la lista HTTPDUSERS pueden utilizar los mandatos listados en ADMINHTTPD solamente si están conectados desde las direcciones IP listadas en HOSTSHTTPD.

Runas_Alias.

Si por ejemplo se quisiera que los usuarios de la lista USUARIOSHTTP pudieran además utilizar los mandatos ls, rm, chmod, cp, mv, mkdir, touch y vim como el usuarios juan, pedro y hugo, se requiere definir una lista para estos mandatos y otra para los aliases de usuarios alternos, y la regla correspondiente.

CODE
Runas_Alias CLIENTES1 = juan, pedro, hugo
Cmnd_Alias MANDATOSCLIENTES = /bin/ls, \
/bin/rm, \
/bin/chmod, \
/bin/cp, /bin/mv, \
/bin/mkdir, \
/bin/touch, \
/usr/bin/vim
USUARIOSHTTPD HOSTSHTTPD = (CLIENTES1) MANDATOSCLIENTES


Lo anterior permite a los usuarios definidos en USUARIOSHTTPD (fulano, mengano y zutano), utilizar los mandatos definidos en MANDATOSCLIENTES (ls, rm, chmod, cp, mv, mkdir, touch y vim) identificándose como los usuarios definidos en CLIENTES1 (juan, pedro y hugo) solamente si se realiza desde las direcciones IP listadas en HOSTSHTTPD (192.168.0.25, 192.168.0.26, 192.168.0.23).

Candados de seguridad.

Sudo incluye varios candados de seguridad que impiden se puedan realizar tareas peligrosas.

Si se define el mandato /usr/bin/vim en /etc/sudoers, se podrá hacer uso de éste de los siguientes modos:
CODE
$ sudo /usr/bin/vim
$ sudo vim


Sin embargo, no podrá ser utilizado así:
CODE
$ cd /usr/bin
$ sudo ./vim


Si se define el mandato /bin/echo, el usuario podrá utilizarlo de los siguientes modos:

CODE
$ sudo /bin/echo "Hola"
$ sudo echo "Hola"


Pero no podrá utilizarlo de la siguiente forma:

CODE
$ sudo echo "Hola" > algo.txt


Para poder realizar la operación anterior, tendría que utilizar:

CODE
$ sudo bash -c "echo 'Hola' > algo.txt"


Sudo le permitirá realizar una tarea sobre cualquier fichero dentro de cualquier directorio aún si no tiene permisos de acceso para ingresar a dicho directorio siempre y cuando especifique la ruta exacta de dicho fichero.

CODE
$ sudo chown named /var/named/dominio.zone


Pero no podrá utilizarlo así:

CODE
$ sudo chown named /var/named/*.zone


Lo que no se recomienda.

Si se quiere permitir a un usuario utilizar lo que sea, desde cualquier anfitrión, cómo cualquier usuario del sistema y sin necesidad de autenticar, se puede simplemente definir:

CODE
fulano ALL = (ALL) NOPASSWD: ALL


Facilitando la vida a través de ~/.bash_profile.

BASH (Bourne-Again Shell) permite utilizar variables de entorno y aliases definidas en ~/.bash_profile al iniciar la sesión, siendo que el administrador utilizará activamente muchos mandatos diversos, estos se pueden simplificar a través de aliases que resuman éstos. Por ejemplo, si se quiere definir que se utilice sudo cada vez que se invoque al mandato chkconfig, se puede añadir lo siguiente al fichero ~/.bash_profile:

CODE
alias chkconfig="sudo /sbin/chkconfig"


Lo anterior permitirá ejecutar directamente el mandato chkconfig sin necesidad de preceder éste con el mandato sudo. A continuación los diversos aliases que pueden ser de utilidad en el fichero ~/.bash_profile y que permitirán utilizar mandatos diversos con sudo.


CODE
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/sbin:/usr/sbin

export PATH
unset USERNAME

alias chkconfig="sudo /sbin/chkconfig"
alias service="sudo /sbin/service"
alias route="sudo /sbin/route"
alias depmod="sudo /sbin/depmod"
alias ifconfig="sudo /sbin/ifconfig"
alias chmod="sudo /bin/chmod"
alias chown="sudo /bin/chown"
alias chgrp="sudo /bin/chgrp"
alias useradd="sudo /usr/sbin/useradd"
alias userdel="sudo /usr/sbin/userdel"
alias groupadd="sudo /usr/sbin/groupadd"
alias groupdel="sudo /usr/sbin/groupdel"
alias edquota="sudo /usr/sbin/edquota"
alias vi="sudo /usr/bin/vim"
alias less="sudo /usr/bin/less"
alias tail="sudo /usr/bin/tail"
alias yum="sudo /usr/bin/yum"
alias saslpasswd2="sudo /usr/sbin/saslpasswd2"
alias htpasswd="sudo /usr/bin/htpasswd"
alias openssl="sudo /usr/bin/openssl"
alias system-config-printer="sudo /usr/sbin/system-config-printer"
alias system-config-network="sudo /usr/sbin/system-config-network"
alias system-config-display="sudo /usr/bin/system-config-display"


Para que surtan efectos los cambios, hay que salir de la sesión y volver a ingresar al sistema con la misma cuenta de usuario, en cuyo fichero ~/.bash_profile se añadieron estos aliases.

stumbleupondelicious