SuDO es una herramienta que, como comentamos en esta entrada anterior, nos permite realizar una buena gestión de privilegios e implementar una administración compartida de los sistemas. En general, lo que nos permite es ejecutar las órdenes deseadas con los identificadores de usuario (UID y EUID) y grupo (GID y EGID) necesarios para su correcta ejecución, no es necesario que sea solo para root. En el caso (bastante deseable) de que se necesite autenticar al usuario, esta acción se realizará con la contraseña del usuario que ejecuta la orden y no con la del usuario objetivo (es decir, NO con la de root).
La instalación es sencilla (sistemas Debian):
apt-get install sudo
Para la configuración: /etc/sudoers
Este es un fichero de texto en el que, cada línea, debe seguir la siguiente sintaxis:
[usuario/%grupo] [equipo] = [(id:gid del usuario objetivo)] órdenes
También admite alias con esta sintaxis:
alias nombre = elemento_alias
Los alias pueden ser de órdenes: Cmnd_Alias para lista de órdenes; User_alias para listas de usuarios; Host_alias, para listas de equipos
Un ejemplo de /etc/sudoers que usamos en la EPS es:
Cmnd_Alias CMDADMIN = /sbin/shutdown, /etc/init.d/sshd, /etc/init.d/network, /etc/init.d/rsysklog, /etc/init.d/nscd, /etc/init.d/tomcat, /etc/init.d/httpd, /etc/init.d/apache2 User_Alias USRWWWDATA = www-data, wwwadm USRWWWDATA ALL= NOPASSWD: CMDWWWDATA
En este ejemplo se han definido 2 alias: CMDADMIN con la lista de comandos que van a poder ejecutar los usuarios listados en USRWWWDATA.
La última línea habilita la ejecución de las órdenes listadas en CMDWWWDATA por los usuarios definidos en USRWWWDATA como si las estuviera ejecutando el usuario root (no pone usuario objetivo por lo que es root). La expresión «como si las estuviera ejecutando» es una forma de expresarme. Como he comentado antes, la ejecución es con UID, EUID, GID y EGID de root (para este caso, en otros, con el del usuario objetivo.
De esta forma, los usuarios wwwadm y www-data pueden parar, reiniciar, lanzar Apache, Tomcat, nscd, ssh,… sin necesidad de conocer la contraseña del administrador.
También podríamos usar la directiva Defaults con la que podríamos definir determinadas opciones globales de comportamiento de sudo. Un uso interesante es:
Defaults env_reset, timestamp_timeout=1,passwd_timeout=2,passwd_tries=1
que implica que los usuarios tendrán:
- Un solo intento de autenticación (passwd_tries=1),
- tiempo de sesión sin solicitar de nuevo la contraseña de 1 minuto (timestamp_timeout=1),
- timeout de 2 minutos.
Con la opción env_reset lo que se pretende es eliminar todas las variables de entorno del usuario salvo LOGNAME, SHELL, USER, USERNAME, MAIL y las de SUDO_*
Referencias:
- man 8 sudo
- man 5 sudoers
- Hardening de servidores GNNU/Linux, Carlos Álvarez Martín y Palo González Pérez, 0xWord, 2013