Table of Contents

SUDO

Sudo es, como su propia palabra indica 1), “actuar como SUperusuario”, es decir suplantar al superusuario para ciertas tareas.

Lo que inicialmente comenzó como una aplicación que permitía actuar como superusuario –es decir, como root–, para algunas tareas, se ha convertido en una aplicación que permite suplantar al usuario e incluso mantener la cuenta de superusuario desactivada en un sistema, dejando a los usuarios normales que realicen las tareas de superusuario, quedando registradas sus acciones en el sistema.

Creando un sistema de alta seguridad con sudo

A mi juicio el problema de la seguridad radica en que los expertos pasan demasiado tiempo “mirándose el ombligo” sin resolver los problemas reales de la administración de sistemas.

Nuestro objetivo

Vamos a configurar un sistema en el que un grupo de usuarios –el que nosotros digamos– actuará como superusuario de una manera totalmente transparente. Al mismo tiempo, indicaremos cómo desactivar la cuenta de superusuario, de forma que nadie pueda suplantar al superusuario.

Todos los pasos y configuraciones los he realizado en un SuSE 10.1. Es posible que algunos de los cambios que propongo –como establecer el PATH por defecto y cosas similares– se hagan de un modo diferente en otras distribuciones; es trabajo del administrador de sistemas determinar cómo llevarlo a cabo.

Configuración de SUDO

En líneas generales, sudo nos permitirá determinar quién ejecuta qué comandos –incluso con qué parámetros– en nuestra máquina 2).

La configuración se guarda en el fichero /etc/sudoers, y puede modificarse mediante el comando “visudo”, que nos permitirá controlar los accesos al mismo.

Toda la configuración se puede resumir en una sóla línea de configuración:

a_quien_permito   en_que_maquinas = (suplantando_a_quien): que_comandos

Es decir, en esta línea indicamos que el usuario “a_quien_permito” podrá ejecutar “que_comandos” como si fuera el usuario “suplantando_a_quien” en la lista de máquinas “en_que_maquinas”.

Y llegaron los alias

Especificar, usuario por usuario y comando por comando la lista completa sería interminable. Así que sudo permite definir alias que nos permitan hacer el trabajo más fácil. Por ejemplo, en lugar del usuario “a_quien_permito” crearemos un alias con los usuarios 3) que van a actuar como administradores, que vamos a llamar POWER_USERS:

User_Alias   POWER_USERS = rluna, nacho, juan

Con lo que nuestra regla anterior se modificaría así:

POWER_USERS    en_que_maquinas = (suplantando_a_quien): que_comandos

El siguiente paso consiste en crear alias para los comandos:

Cmnd_Alias    CMD_NOT_ALLOWED = /usr/bin/passwd
Cmnd_Alias    CMD_POWER = ALL, !CMD_NOT_ALLOWED

No vamos a permitir ejecutar el comando passwd como root ya que eso nos permitiría cambiar su contraseña. En la definición del alias podemos incluir aquellos comandos que NO QUERAMOS que se ejecuten con sudo, como puede ser visudo, por ejemplo. Para pensarlo.

Finalmente indicar que existe un alias especial, ALL, que significa “todos los usuarios” o “todas las máquinas” o “todos los comandos”. De ahí que la siguiente regla sea altamente peligrosa, ya que haría que todos fueramos administradores de la máquina:

ALL   ALL = (ALL) ALL

Bueno, vamos a lo que nos ocupa. Nuestra regla inicial:

a_quien_permito   en_que_maquinas = (suplantando_a_quien): que_comandos

Se queda así:

POWER_USERS    ALL = (root): CMD_POWER

Y nuestro fichero /etc/sudoers de configuración se queda como:

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#

# Host alias specification

# User alias specification
User_Alias      POWER_USERS = rluna, juan, nacho

# Cmnd alias specification
Cmnd_Alias    CMD_NOT_ALLOWED = /usr/bin/passwd
Cmnd_Alias    CMD_POWER = ALL, !CMD_NOT_ALLOWED

# Defaults specification

# prevent environment variables from influencing programs in an
# unexpected or harmful way (CVE-2005-2959, CVE-2005-4158,
# CVE-2006-0151)
Defaults always_set_home
Defaults env_reset

# Runas alias specification
POWER_USERS    ALL = (root): CMD_POWER


# Uncomment to allow people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL

# Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now

Activar acceso a los comandos de superusuario

En SuSE –ignoro si en otras distribuciones pasa también– el acceso a los comandos de superusuario no está incluido en el PATH. Eso significa que si intentamos ejecutar el comando ifconfig como un usuario normal, tendremos que teclear /sbin/ifconfig.

Este problema se puede resolver de dos formas:

Forma 1: modificando un script de inicio de cada usuario

Consiste en modificar el fichero .bashrc y añadir esta línea:

export PATH=/sbin:/usr/sbin:$PATH

Forma 2: haciendolo de forma global para todo el sistema

Dentro de la carpeta /etc/profile.d crearemos un fichero llamado local.sh con el siguiente contenido:

#
# local.sh - local changes for this system
#

export PATH=/sbin:/usr/sbin:$PATH

El paso final: desactivar la cuenta de superusuario

Hasta aquí la cosa va muy bien, porque además de tener unas cuentas de usuarios normales que ahora pueden actuar como superusuarios del sistema, el paso final es desactivar la cuenta de superusuario.

TODO: incluir instrucciones para desactivar la cuenta de super-usuario.

Cómo trabajar con sudo

Seamos precisos: hablaremos de cómo trabajar con sudo con la configuración que hemos descrito aquí. Por un lado, cada vez que queramos ejecutar un comando como root, haremos lo siguiente:

# sudo comando [parámetros]

o bien, si queremos ser más precisos:

#sudo -u root comando [parámetros]

También podemos convertirnos temporalmente en root:

# sudo su 

o bien en otro usuario:

# sudo su - nombre_usuario 

Aunque si lo pensamos bien, estas dos opciones deberíamos desactivarlas, ya que una vez que la persona ejecuta “su”, ya no hay una traza sobre sus acciones en el sistema.

La informática con seguridad nunca es fácil

Hay que escribir "sudo" para cualquier comando de root

La informática con seguridad no hace las cosas más fáciles. Parece que esos dos palabros estén condenados a no llevarse bien.

De momento, usar sudo nos hace la tarea de administración del sistema bastante más dura. En lugar de escribir:

# mkdir /etc/prueba

Ahora tendremos que escribir:

# sudo mkdir /etc/prueba

Si no te parece una concesión importante, prueba a escribir cincuenta comandos así.

Hombre, siempre podremos crear un alias:

# alias s='sudo -u root' 

que nos haga la vida más fácil.

Otro truco es hacer un “su” cuando tengamos que ejecutar varios comandos seguidos como root:

# sudo su 

A partir de ese momento nos convertimos en root.

Copiar ficheros entre servidores ya no es tan fácil

TODO: hacer un scp entre dos comandos exige de una cuenta, que de momento sólo vamos a disponer de nuestra propia cuenta por lo que hay que hacer una copia temporal a nuestro directorio de usuario “normal” antes de hacer la copia. Otra posibilidad es hacer la copia a la carpeta /tmp, pero tiene el problema de que lo puede leer muchos usuarios.

Es posible copiar un fichero remotamente sin tener la contraseña de root, en un sistema en el que tengamos acceso mediante sudo. Se trata de usar una facilidad de SSH que permite ejecutar un comando en la máquina remota en lugar de un shell: si ejecutamos

maquina_origen> ssh maquina_remota comando 

SSH ejecutará el comando en la máquina remota y devolverá el resultado por pantalla.

Para conseguir copiar un comando al que sólo tenga acceso root, podemos hacer lo siguiente:

maquina_origen> ssh maquina_remota sudo cat /fichero-de-root > fichero_local

De esta forma, nos conectaremos como nuestro usuario en la máquina remota, y ejecutaremos “sudo” para hacer la copia del fichero. El “> fichero_local” recogera el fichero que saldrá por pantalla y lo guardará en un fichero local.

Algunos enlaces interesantes

Página principal del proyecto

BULMA: Iniciación de sudo

NotasDescartadas

1)
para los que conocen inglés y unix, está claro
2)
También puede ser configurado para muchas máquinas, pero no entraremos en eso aquí
3)
también se pueden incluir grupos