Cómo convertir tu memoria externa en la llave de tu distribución (2)
Por Antonio Félix Enríquez
Presento la segunda versión del script.
Nuevas funciones:
- Podemos utilizar sha-1 o md5 para autentificar.
- Podemos utilizar sha-1 o md5 para generar el hash.
Un script un poco más limpio. (Gracias a los usuarios que comentaron aquí)
[Descargar nueva versión del script].
Ahora intentaré dar respuestas a algunos comentarios...
- No metí ningún argumento o parámetro en la función del script, el administrador se confundió y colocó mal el script sin querer ^^, de todos modos muchas gracias por avisar y recordemos que nadie es perfecto. (También avisé de que no soy ningún experto en bash).
- El script no se puede matar con crtl+c ya que en el momento que se lanzaría al inicio del sistema no tendríamos aún ese control. (Comprobado).
- Sólo tendrás que configurar el script una vez, por lo tanto cada vez que inicies tendrás que insertar el dispositivo y listo ^^.
- En caso de pérdida o avería del dispositivo, podríamos modificar desde un livecd o liveusb el fichero.
Recomendaciones:
Utilizar chattr para dificultar la eliminación o modificación del fichero por parte de terceros,
chattr +ui script.sh
Muchas gracias a todos y un saludo.

- 853 lecturas
Twitter

Modestamente
Modestamente, me parece un poco injusto afirmar con tanta rotundidad "el administrador se confundió y colocó mal el script".
En principio el administrador ni se confundió ni colocó mal el script, aunque sí le corresponde un tirón de orejas por haber permitido que el código se publicara dentro de la etiqueta para citas en que tú lo incluiste, que no es la mejor forma de publicar código como ha quedado demostrado ;)
La prueba es que la versión para descarga (un simple copy&paste hacia vi) está correcta desde el primer momento.
Un saludo y muchas gracias de nuevo por compartir tu idea con nuestros lectores.
Tienes razón.
Buenas, es cierto, pido perdón.
¿Razones?
Posible error mío o posible error tuyo al modificar la entrada.
Pero el código no estaba bien por una pequeña parte duplicada.
Rectifico, el error posiblemente fue mío, al copiarlo desde el editor a la página.
En cuanto al método de la publicación, aún me estoy familiarizando con los códigos que permites utilizar, disculpen las molestias.
Un saludo.
-------------------------
Hay muchas maneras de matar y una de ellas es el silencio.
Touché!
La verdad es que no hay ninguna etiqueta apropiada para la publicación de código. Prefiero colgar el fichero para descarga, como acabo de hacer ahora con tu segunda versión.
Acabo de aclarar mejor el tema en el formulario para envío de artículos, recomendando el envío por email cuando se incluyan imágenes o código.
código
Tratándose de archivos grandes, es razonable colgarlo para descarga. Pero siendo un script chico como este, sería mejor poder verlo sin tener que descargarlo. Es más ilustrativo para la explicación.
Alejandro Nestor Vargas
http://theflatearthsociety.org/
pamusb
Me temo que pamusb (http://pamusb.org/) ya permite esto y mucho más. En vez de parar el arranque, permite que cada usuario tenga una llave usb, y cosas avanzadas como lanzar el salvapantallas si la llave usb se extrae del ordenador.
no es lo mismo
Pamusb no hace lo mismo sino más bien lo contrario. Pamusb permite acceder a un usuario sin tener que ingresar su clave. El script que propone antonio impide que se arranque el sistema a no ser que se encuentre un dispositivo determinado.
Para los que estén interesados, explico cómo usar pamusb. Lo he probado Mandriva 2009 y debería funcionar en otras distribuciones que sigan la Linux Standard Base (o sea que Debian y Ubuntu pueden ser diferentes):
Primero instalamos el software necesario, instalar los paquetes pam_usb y pmount ya sea con el entorno gráfico o en línea de comandos con:
# urpmi pam_usb pmount
Después (con permiso de root) editamos el archivo /etc/pam.d/system-auth y agregas esto al
PRINCIPIO (pero después de la línea que dice #%PAM-1.0):
Finalmente, configuramos los usuarios y dispositivos: Enchufamos un dispositivo USB y ejecutamos el comando
Donde "llave1" es un nombre que elegimos solamente para identificar al dispositivo si tenemos más de uno. Este comando se puede repetir tantas veces como se quiera para "dar de alta" los distintos dispositivos de que disponemos. Por ahora pongamos sólo uno para simplificar las cosas.
Hecho esto, indicamos que usuarios pueden acceder con este dispositivo. Al haber uno sólo no nos preguntará cuál llave usaremos, sólo el usuario:
Podemos agregar otro más, como por ejemplo si existiera un usuario llamado "hironakamura"
Hecho esto, sólo cuando el dispositivo en cuestión esté enchufado, podremos ingresar con cualquiera de esos dos usuarios sin necesidad de poner la clave. Esto incluye también desactivar el protector de pantalla si tiene clave.
Funcionamiento:
Tal como ya se imaginarán, el programa utiliza el número de serie del dispositivo, pero incluye también el número de fabricante y modelo. A demás, ante la eventualidad de que alguien pudiera falsificar esos datos, el programa GRABA un directorio llamado .pamusb y utiliza una lista de claves de un solo uso. De esta manera, incluso en el caso de que el dispositivo fuera completamente clonado, las claves de un solo uso se desfasarían apenas se usara el segundo dispositivo idéntico en la misma máquina.
Obviamente, ante la imposibilidad de usar el dispositivo correspondiente, siempre se puede seguir ingresando la clave manualmente.
Como verán, la función es muy diferente del script propuesto en este artículo.
Alejandro Nestor Vargas
http://theflatearthsociety.org/
Ampliando un poco
No exactamente. Pam_usb hace muchas cosas, dependiendo de como lo configuremos, pero sí es verdad que su objetivo está centrado en el proceso de login y en ese sentido es diferente a lo que plantea el script de antonio y trabaja a otro nivel.
En cuanto a los modos de autenticación permite tres según como editemos lo necesario en /etc/pam.d, basicamente introduciendo y/o comentando algunas lineas en los ficheros common-auth/system-auth, login, kdm/gdm..
del directorio. Consúltese aquí para más info.
Los tres modos en cuestión son, esquematicamente:
auth required pam_usb.so
#auth required pam_unix.son --> linea comentada
auth sufficient pam_usb.so
auth required pam_unix.so
auth required pam_usb.so
auth required pam_unix.so
Así que, cómo veis, no sustituye necesariamente la introducción de una clave. Además, por lo que he visto de versiones anteriores, se permitía también reforzar el proceso de autenticación por usb generando unas claves rsa de uso único con el comando usbadm:
$: usbadm keygen /ruta/montaje/pen_usb usuario 2048
las cuales quedaban respectivamente almacenadas en un directorio .auth del dispositivo externo y del home del usuario, si bien yo no he conseguido encontrar el binario entre las herramientas del código fuente de la actual versión (0.4.2); no sé si alguien está al corriente de esto último.
En fin, espero que os sirva de ampliación. :)
Muchísimas gracias.
Buenas,
Pues muchas gracias por compartir esa información ^^.
Un saludo.
-------------------------
Hay muchas maneras de matar y una de ellas es el silencio.
matar scripts con ctrl+C
Para evitar que un shell script sea matado, basta con agregar la siguiente linea al comienzo:
Esta instrucción le dice que cuando se de una señal 1, 2 o 3 (ver "man 7 signal" para una lista completa), deberá ejecutar el comando "nada" en lugar de terminar. Tanto en programas binarios como en scripts, cuando un programa recibe una señal, si no la "atrapa" y procesa, el sistema lo mata. En cambio, si la atrapamos, podemos responder hacer que el programa haga lo que queramos, excepto con la señal 9. Esa es "indiscutible" y el programa no puede atraparla. La única manara de que un programa no termine cuando recibe una señal 9 es que no esté ejecutando ninguna instrucción, cosa que ocurre por ejemplo cundo hace un llamado al núcleo y este no ha respondido todavía, como en el caso de intentar acceder a un dispositivo que no funciona o tarda en responder... pero apenas el llamado termine y le toque ejecutar la siguiente instrucción al programa en cuestión, esta no se ejecutará sino que será terminado y su memoria liberada.
Mejoras para el código
Hola, te recomiendo que agregues una variable adicional
CRYPTBIN="md5sum"
que uno pueda cambiar a sha1sum, o lo que el usaurio quiera.
De esa manera no tendrías código replicado:
generar-md5,generar-sha1, check_serial_md5,check_serial_sha1.
Después en t programa cada vez que quieras usar el programa para encriptar simplemente pones $CRYPTOBIN en vez de md5sum o sha1sum.