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.