miércoles, 14 de noviembre de 2018

Sudo o no sudo, esa es la cuestión



Qué diferencias hay entre ejecutar comandos en Linux como root, ejecutar comandos como usuario común, ejecutar comandos como usuario con sudo o ejecutar comandos con su.



Sudo. Soy humano y los humanos tenemos glándulas sudoríparas en el cuerpo que nos hacen sudar. Esta podría ser una respuesta válida al título de esta entrada, pero no van por ahí los tiros (lo siento, no he podido resistirme a hacer la broma xD).

Con el título de la entrada me refería a la pregunta que todo sysadmin que maneje Linux se ha planteado en algún momento: si es aceptable acceder a un servidor vía SSH como root y trabajar bajo ese usuario o si es mejor acceder con un usuario "limitado" y usar sudo cada vez que queramos ejecutar un comando que requiera permisos de superusuario. Y es que cada vez son más las distribuciones de Linux que, por defecto, no nos permiten conectarnos a una máquina como root.

Veamos algnos ejemplos:

Debian: en Debian, el acceso por SSH al sistema con el usuario root viene deshabilitado por defecto (PermitRootLogin no). Si queremos trabajar como root, tenemos que configurar el acceso de root vía SSH previamente o configurar sudo.

Ubuntu: en Ubuntu, durante la instalación, no se nos pregunta en ningún momento por el password de root, por lo que, directamente, no es posible conectarse a la máquina como root por SSH (es posible si lo configuramos nosotros posteriormente, obviamente).


¿Por qué no es aconsejable usar la cuenta root?



La respuesta a esta pregunta no es otra que el principio de mínimo privilegio, por el cuál cada usuario debería poder acceder solamente a los recursos que necesite. No más.

Me explico.

Si una persona no tiene que reiniciar servicios de un sistema, no tiene por qué acceder a ese sistema con la cuenta root. Si una persona no tiene que instalar paquetes en el sistema, no necesita poder acceder como root. Si una persona sólo va a subir imágenes por SFTP a una carpeta, no necesita la cuenta root, basta con que tenga acceso a la carpeta en cuestión.

¿Y si un usuario necesita poder reiniciar un servicio, por ejemplo nginx, por si el servicio cae?

La respuesta es sencilla: usar sudo.


Beneficios e inconvenientes de sudo



Para empezar, con el uso de sudo podemos especificar qué comandos puede ejecutar un usuario determinado usando privilegios de root, así como impedirle el uso de otros comandos como root. Así, si no queremos que un usuario pueda parar Apache, por poner un ejemplo, podemos impedirle explícitamente que ejecute el comando "sudo service apache2 stop". Y sin privilegios de root, no podrá parar el servicio. Por si esto fuera poco, podemos logear todos los comandos que un usuario realiza como root para ver quién y cuándo, ha hecho qué cambios.

Además, sudo nos puede salvar de catástrofes. Imaginemos que accedemos a un sistema como root y ejecutamos algo como "rm -rf /tmp/*" y por error ponemos un espacio entre / y * o entre / y tmp; el resultado será desastroso. Si ejecutamos la instrucción como usuario normal (no root o sin usar sudo), un mensaje nos dirá que no tenemos permisos para borrarlo todo.

Por otro lado, usar sudo es algo incómodo. Para empezar, debemos escribir "sudo comando" cada vez que queramos ejecutar un comando con privilegios de root, cuando normalmente sólo escribiríamos "comando". Muchas veces nos olvidaremos de escribir sudo y debremos recurrir a "sudo !!" para ejecutar el comando anterior con sudo o deberemos volver a escribir los comandos que queramos ejecutar. Algunas veces no hay problema, repetimos el comando y listo. Otras veces, veremos cosas "raras" en pantalla cuando no usemos sudo.

Con "cosas raras" me refiero a, por ejemplo, el caso siguiente. Queremos ver el estado de Apache:

HOST# service httpd status httpd dead but subsys locked

Ahora bien, si lo ejecutamos con sudo:

HOST# sudo service httpd status httpd (pid 4703) is running...

Esto ocurre porque un usuario sin privilegios no puede monitorizar ciertos servicios, mientras que usando sudo vemos el mismo output que vería root en la terminal.


¿Qué diferencias hay entre sudo y su?



Desde un usuario limitado, podemos usar dos formas para ejecutar comandos con privilegios de root:

sudo comando
su - root -c comando

La diferencia entre ambos es la siguiente:

- sudo nos pedirá el password de la cuenta que estemos usando para ejecutar un comando como root (podemos especificar que no nos pida password, aunque no es aconsejable desde el punto de vista de la seguridad).

- su nos pide el password del usuario "destino" con el que queremos ejecutar el comando. Eso significa que si no conocemos el password de root, no podremos usar "su - root".

Por lo tanto, si acceden varios usuarios a una misma máquina y queremos que usen su, deberemos comunicarles a todos el password de root para que accedan a una shell de root, mientras que usando sudo, los usuarios sólo deben conocer su propio password. Usando sudo, el password de root queda más protegido ante posibles robos de credenciales.


Conclusión



Por todo lo mencionado anteriormente, es desaconsejable usar la cuenta root en un servidor, y entre sudo y su, es claramente más recomendable usar sudo para ejecutar comandos con privilegios de root.


Fuentes:

https://www.howtoforge.com/tutorial/sudo-vs-su/
https://askubuntu.com/questions/16178/why-is-it-bad-to-log-in-as-root
https://security.stackexchange.com/questions/119410/why-should-one-use-sudo
0

0 comentarios:

Publicar un comentario