.. _sudo: .. index:: sudo :command:`sudo` =============== En muchas distribuciones *Linux* se opta por dejar al usuario *root* sin contraseña lo que impide el acceso directo como administrador. Por lo general, aunque :command:`sudo` es muy configurable, las distribuciones conceden su uso ilimitado al usuario sin privilegios que se crea durante la instalación con la sola condición de que se introduzca la propia contraseña del usuario. En estas condiciones: - :command:`sudo` está pensada para ejecutar una orden puntual:: $ sudo apt update pero recuerda durante un tiempo la contraseña introducida, por lo que en ulteriores usos no vuelve a pedirse. Esto propicia que pueda usarse para ejecutar repetidamenete órdenes del administrador sin caer en el tedio de tener que introducir constantemente la contraseña. - Usado del modo anterior, no llega a abrise nunca una sesión interactica. Esto puede verse como una ventaja, pues evita que el usuario accidentalmente deje abierta la sesión de administrador, después de haber hecho todo lo que requería privilegios. - En contraprestación, esta configuración predefinida que hemos explicado, tiene el inconveniente de que, si se obtiene la contraseña del usuario, se habrá obtenido acceso total al sistema. El resto del epigrafe se dedicará a describir cómo configurar y usar :program:`sudo`, porque aunque no viene instalado por defecto en *Debian* se puede instalar:: # apt-get install sudo La forma habitual de ejecutar :command:`sudo` es:: $ sudo Pero esto exige haber configurado primero el programa. Si ha sido así, se comprobará que se permitió al usuario ejecutar tal programa como administrador\ [#]_ y se pedirá la contraseña propia. Tras validarse, se ejecutará como administrador la orden que se haya decidido y durante los siguiente cinco minutos, :command:`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 :file:`/etc/sudores` bien en cualquier fichero dentro del directorio :file:`/etc/sudoers.d`. Puede usarse un editor directamente para esta tarea, pero es más conveniente a través de: .. _visudo: .. index:: visudo :command:`visudo` Permite editar la configuración de :command:`sudo`. Sin argumentos:: # visudo edita el fichero general :file:`/etc/sudoers`, de modo que si se quiere crear un fichero específico dentro de :file:`/etc/sudoers.d`, debe expecificarse con la opción ``-f``:: # visudo -f /etc/sudoers.d/pruebas Configurar :command:`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 :command:`sudo`. Por ejemplo:: Cmnd_Alias NETEXEC = /sbin/if* eth*, /sbin/route Esto permitiría usar :file:`/sbin/ifup` o :file:`/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 :command:`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:: = [()] [, , ...] * El *usuario* es un usuario, grupo o alias que hayamos definido. Es al que se conceden el privilegio de usar los comandos mediante :command:`su`. * La *maquina* es la máquina (o alias) desde la que se podrá ejecutar :command:`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 :command:`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 :command:`sudoedit`:: usuario ALL = sudoedit Esta línea permitiría a usuario editar cualquier fichero. Por último, es posible también abrir sesiones interactivas con :command:`sudo`, del mismo modo que se abrian con :ref:`su `. Para ello podríamos hacer:: # sudo su - o bien:: # sudo -i La primera orden exige que hayamos proprocionados permisos para ejecutar :ref:`su ` con :command:`sudo`; y la segunda, permisos sobre la *shell* interactiva que use el usuario *root* (típicamente :program:`bash`). .. rubric:: Notas al pie .. [#] En realidad, sudo permite ejecutar comandos como otro usuario distinto al administrador. Consúltese su página del manual :manpage:`sudo`.