Antes que nada me presento, soy nuevo en la comunidad y mi nombre es Martin, con objetivo del primer post y viendo que hay varios linuxeros me decidi a escribir un poco sobre el sistema "SUDO" y explicarlo un poco de forma practica =), espero que salga bien
Bueno, antes que nada vamos a tratar de explicar que es "sudo", seguramente como muchas veran de forma frecuente sirve para asignar "permisos de root", pero esto no es del todo cierto, sudo esta diseñado para manejar que permisos y para que cosas le damos a un usuario como otro usuario, o sea, partiendo de que todo en los sistemas tipo *nix se maneja por usuarios y grupos podriamos decir :
tenemos a usuario "A" y usuario "B", en sudo podemos decir que cosas va a poder hacer el usuario "A" como si fuera el usuario "B", para que nos sirve esto? por ejemplo para tareas administrativas o para permitir ciertas cosas puntuales, como por ejemplo al usuario "admin" permitirle ejecutar un navegador de archivos o cambiar las contraseñas de otros usuarios sin la necesidad de ser "root"
Para empezar hay que comentar que sudo es un programa que corre con el SUID de root, o sea cuando lo llamamos el mismo sudo tiene permisos de root y lee un archivo de configuracion que se encuentra por defecto en /etc/sudoers, por default el mismo contiene algo asi
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL) ALL
# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
Vamos a sacar los comentarios asi queda mas legible
Defaults env_reset
root ALL=(ALL) ALL
%sudo ALL=(ALL) ALL
vamos linea por linea, la primer linea define una politica que lo que hace es "vaciar" las variables locales, la segunda linea especifica lo siguiente:
El usuario root puede desde cualquier lado hacer cualquier cosa como cualquier usuario (cosa ya sabida )
Y la tercer linea dice a los miembros del grupo sudo se les permite hacer cualquier cosa como cualquier usuario (basicamente les damos permisos de root para lo que quieran)
Esto es recomendable cambiarlo un poco, veamos un ejemplo, en sudo va en la primer columna el "quien", en la segunda "desde donde" (esto es porque sudo se puede usar en red), despues del "=" y entre "()" va el "como quien" y al final el comando o la lista de comandos, asi por ejemplo podriamos decir:
martin ALL=(ALL) /usr/bin/passwd
asi diriamos que el usuario martin puede ejecutar como cualquier usuario el comando passwd (para cambiar contraseñas), pero esto podemos mejorarlo
martin ALL=(root) /usr/bin/passwd pepe
asi indicariamos que solamente puede cambiar la contraseña del usuario "pepe", de forma estricta , si quisieramos mas de un usuario podriamos usarlo de la siguiente forma
martin ALL=(root) /usr/bin/passwd pepe, /usr/bin/passwd juan
asi permitiriamos a martin ejecutar como root passwd para pepe y juan, pero bueno, si tuvieramos muchos usuarios esto seria bastante engorroso, por suerte podes usar una "denegacion" y decir que pueda cambiar cualquier contraseña salvo de la algunos usuarios puntuales, esto seria asi :
martin ALL=(root) /usr/bin/passwd [[\:alnum\:]]*, !/usr/bin/passwd root
donde martin podria cambiar cualquier contraseña excepto la de "root" (1)
Pero bien, todavia podemos hacer algunas cosas mas, como por ejemplo definir alias de usuarios para asignarles permisos a varias usuarios sin que tengan que estar en un mismo grupo, o definir alias de comandos para usarlos sin tener que escribirlos todos, veamos los dos
User_Alias SUDOS = martin, pepe, juan
Cmnd_Alias BASIC_OP = /usr/bin/ls, /usr/bin/rm, /etc/init.d/gdm
y ahora podemos usarlos libremente y hacer algo al estilo:
SUDOS ALL=(ALL) BASIC_OP, !/usr/bin/rm -rf /
Bien, veamos un "sudoers"
User_Alias SUDOS = martin, pepe, juan
Cmnd_Alias BASIC_OP = /usr/bin/ls, /usr/bin/rm, /etc/init.d/gdm, /bin/kill, /usr/bin/apt-get, /usr/bin/apt-cache
root ALL = (ALL) ALL
SUDOS ALL= (root) BASIC_OP, !/usr/bin/rm -rf /
martin ALL=(pepe) /usr/bin/rm , (root) NOPASSWD: halt
control ALL=(SUDOS) ALL , !/bin/bash
bien, veamos algo nuevo, en una misma linea puedo especificar distintos usuarios con distintos comandos, no teniendo asi la necesidad de repetir siempre lo mismo ante distintas necesidades, asi como tambien puedo usar los alias definidos para dar permisos "como varios usuarios" y finalmente vemos ese extraño "NOPASSWD", eso hace que nunca se pida la contraseña del usuario, para que el comando se ejecute de forma directa =)
finalmente para usar sudo usamos "sudo comando" si la operacion es como root, en caso contrario necesitaremos usar "sudo -u usuario comando" (facilmente solucionable con un alias)
por ultimo y para terminar, si intentamos editar directamente el archivo "sudoers" nos dira que es de solo lectura, para editarlo recomiento usar visudo ya que comprueba si escribimos todo bien, si la pifiamos sudo quedara inutilizable y en caso de no tener root no podremos solucionarlo (ejemplo ubuntu que por default no trae pass de root)
1)
[:alnum:]
es una lista estandar que contiene todos los numeros y letras, las "\" son caracteres de escapes y el "*" indica que se repiten 0 o mas veces (o sea cualquier cosa que tenga letras y/o numeros)
Bueno, este es mi primer aporte, espero haber sido bastante claro y si bien es medio escueto (sudo da para mucho mas) espero que les sea de utilidad, cualquier recomendacion sera bien recibida
PD: las paginas de man siempre son un buen recurso y es muy amplia y explicativa sobre el sudoers
PD2: explicacion de la bomba fork :-P el famoso script que mata la pc
: (){: |:&};:
que hace esto?, si lo escribimos de forma larga
function : {
: | :&
};
ahora escribamoslo mas entendible
#defino la funcion rompe en bash (metodo abreviado () )
rompe () {
#llamo a la funcion "rompe" y dirijo su salida a si misma , para completar la paso a segundo plano
rompe | rompe &
#termino de definir la funcion
};
#la llamo a si misma
rompe
como vemos se llama a si misma infinitamente duplicando los child en cada ejecucion y por eso mata el sistema =), para completar como se llama a si misma nunca devuelve el estado de salida

