tinchotgz
Usuario (Argentina)

Envíos De Dinero a México Envía dinero por Internet a México de manera rápida por tan solo $4.99 www.xoom.com 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