2.6.4. Escalada de privilegios

Como no debe usarse jamás el usuario administrador a menos que sea estrictamente necesario, es habitual que el administrador se encuentre utilizando un usuario sin privilegios y, en un momento determinado, requiera escalar privilegios y convertirse en root para llevar a cabo la operación. Hay dos estrategias:

  • Usar su, cuyo uso ya se describió:

    $ su -
    

    Esta orden requiere la introducción de la contraseña de administrador1, tras lo cual conseguiremos una sesión interactivos en la que nos convertiremos en el administrador. La instalación básica de Debian está pensada para usar esta orden.

  • Usar sudo, que es la estrategia que han adoptado otras distribuciones como Ubuntu, y a cuya configuración y uso dedicaremos el resto del epígrafe.

Ambas son herramientas válidas y no tiene por qué ser preferible el uso de una sobre la otra, pero dependiendo del enfoque que han tomando los responsables de las distribuciones, se ha preferido una y otra. Algunos criterios para decantarse por la una o la otra son:

  • sudo requiere una configuración adicional. Las distribuciones que optan por incorporar la herramienta por defecto se limitan a permitir que el usuario sin privilegios que se crea durante la instalación no tenga limitaciones en su uso y requiera la introducción de su propia contraseña.

  • sudo está pensada en principio para ejecutar una orden puntual, pero recuerda durante un tiempo la contraseña introducida, por lo que en ulteriores usos no vuelve a pedirla. Esto la presta a que pueda usarse para ejecutar repetidamenete órdenes del administrador sin caer en el tedio de tener que introducir constantemente la contraseña.

  • Como consecuencia directa de los anterior, puede usarse sin llegar a tener que crear una sesión interactiva. Esto podrían verlo algunos como una ventaja, ya que evita que el usuario accidentalmente deje abierta la sesión de administrador.

  • sudo puede requerir la introducción de la propia contrasela del usuario, en vez de la del adminsitrador. Si esto es así, la contraseña del administrador no tiene utilidad y, en consecuencia, puede instalrse el sistema dejando root sin contraseña válida. La consecuencia es que una persona jamás podrá entrar en el sistema como administrador2 y no tendrá la tentación de loguearse siempre como administrador para evitar el tedio de no tener permisos. Esta es la principal razón que aducen los defensores del uso de sudo.

  • Por otra parte, el uso ilimitado qe sudo que se concede a un usuario, provoca que si se obtiene la contraseña de éste, se haya obtenido el acceso total al sistema.

El resto del epigrafe lo dedicaremos a describir cómo conbfigurar y usar sudo, porque aunque no viene instalado por defecto en Debian se puede instalar:

# apt-get install sudo

La forma habitual de ejecutar sudo es:

sudo <comando>

Pero esto exige haber configurado primero el programa. Si ha sido así, se comprobará que se permitió al usuario ejecutar tal programa como administrador3 y se pedirá la contraseña propia. Tras validarse, se ejecutará como administrador la orden que se haya determinado y durante los siguiente cinco minutos, sudo almacenará en su caché que ya nos validamos, con lo que podremos seguir ejecutando dentro de los siguientes cinco minutos comandos a través de él, sin volver a introducir la contraseña. Si se quiere ampliar quince minutos más este periodo, se puede hacer:

$ sudo -v

En cuanto a la configuración se encuentra bien en el fichero /etc/sudores bien en cualquier fichero dentro del directorio /etc/sudoers.d. Puede usarse un editor directamente para esta tarea, pero es más conveniente a través de:

visudo

Permite editar la configuración de sudo. Sin argumentos:

# visudo

edita el fichero general /etc/sudoers, de modo que si se quiere crear un fichero específico dentro de /etc/sudoers.d, debe expecificarse con la opción -f:

# visudo -f /etc/sudoers.d/pruebas

Configurar sudo implica básicamente conocer cuál es la sintaxis de sudoers. Esta se basa en definir alias, opciones y reglas de acceso. Trataremos lo primero y lo último:

Alias

Sirven para indentificar bajo un mismo nombre a grupos de usuarios, de máquinas o de órdenes. Para la definición, pueden usarse otros alias definidos anteriormente.

Cmnd_Alias

Permite definir conjuntos de comandos:

Cmnd_Alias NETEXEC = /sbin/if*, /sbin/route, /sbin/ip

Para separar unos de otros se usa la coma. Pueden usarse comodines y también expresar argumentos que será obligatorio que escriba el usuario si quiere poder ejecutar el comando a través de sudo. Por ejemplo:

Cmnd_Alias NETEXEC = /sbin/if* eth*, /sbin/route

Esto permitiría usar /sbin/ifup o /sbin/ifdown pero sólo si justamente después hay un argumento que empieza por eth. Si es otro, se denegará la ejecución.

Como ya se ha dicho, unos alias pueden usarse en la definición de otros, así que esto mismo lo podíamos haber escrito del siguiente modo:

Cmnd_Alias IFUPDOWN = /sbin/if* eth*
Cmnd_Alias NETEXEC = IFUPDOWN, /sbin/route

Es tambíen posible indicar explícitamente comandos que no queremos que se puedan ejecutar anteponiendo una exclamación:

Cmnd_Alias IFUPDOWN = /sbin/if*, !/sbin/ifconfig

Existe el alias predefinido ALL que permite ejecutar cualquier cosa.

User_Alias

Permite definir grupos de usuarios y grupos. Para incluir estos últimos en la sentencia se les debe anteponer un %:

User_Alias COLEGUILLAS = pepe, paco, %amigospepe, %amigospaco

También existe ALL para referirse, en este caso, a cualquier usuario; y la posibilidad de anteponer una exclamación para excluir a un usuario:

User_Alias CASTA = ALL, !apestado, !%parias
RunAs_Alias

Como el anterior, pero permite incluir también identificadores de usuario en vez de nombres. Basta con anteponerles el carácter almohadilla:

RunAs_Alias COLEGUILLAS = pepe, #1001
Host_Alias

Define conjuntos de máquinas desde las que se podrá ejecutar el comando a través de sudo:

Host_Alias LAN = 172.22.0.0/16, 192.168.0.0/255.255.255.0, 192.168.1.1

Pueden usarse nombres también y el alias predefinido ALL

Reglas de acceso

Definen los permisos que se concede a los distintos usuarios. Tienen este aspecto:

<usuario> <maquina> = [(<poderdante>)] <comando1>[, <comando2>, ...]
  • El usuario es un usuario, grupo o alias que hayamos definido. Es al que se conceden el privilegio de usar los comandos mediante su.

  • La maquina es la máquina (o alias) desde la que se podrá ejecutar sudo.

  • El poderdante es el usuario en nombre del cual se ejecutará el comando. Si no se especifica se sobrentenderá que es root.

  • Por último se incluye la lista de comandos o alias.

Por ejemplo:

COLEGUILLAS ALL = (root) NETEXEC

Es posible incluir algunas opciones en las reglas. Una es NOPASSWD que evita la petición de la contraseña:

COLEGUILLAS ALL = (root) NOPASSWD: NETEXEC

Hay dos opciones interesantes cuando se ejecuta sudo. Una es -l que le muestra al usuario qué comandos puede ejecutar a través de sudo:

$ sudo -l

El otro es -e que permite editar ficheros, siempre que se haya incluido alguna regla de acceso que permita al usuario ejecutar sudoedit:

usuario ALL = sudoedit

Esta línea permitiría a usuario editar cualquier fichero.

Por último, es posible también abrir sesiones interactivas con sudo, del mismo modo que se abrian con su. Para ello podríamos hacer:

# sudo su -

o bien:

# sudo -i

La primera orden exige que hayamos proprocionados permisos para ejecutar su con sudo; y la segunda, permisos sobre la shell interactiva que use el usuario root (típicamente bash).

Notas al pie

1

En realidad, su permite convertirse en cualquier otro usuario:

$ su - otro_usuario

para la cual se requerirá la contraseña de ese otro usuario (a menos que ya seamos el administrador que cambiará de itentidad sin necesidad de contraseña alguna).

2

A menos, claro está, que le configure una contraseña. Pero, en ese caso, no estaremos hablando de un usuario despistado.

3

En realidad, sudo permite ejecutar comandos como otro usuario distinto al administrador. Consúltese la página del manual.